Module: Attic::InstanceMethods

Defined in:
lib/attic/instance_methods.rb

Overview

Adds a few methods for object instances to access the attic variables of their class.

Instance Method Summary collapse

Instance Method Details

#atticObject



10
11
12
13
14
15
16
17
# File 'lib/attic/instance_methods.rb', line 10

def attic
  raise NoSingletonError, self, caller unless attic?

  singleton_class

rescue TypeError
  NoSingletonError.add_member self
end

#attic?Boolean

A quick way to check if this object instance already has a dedicated singleton class. We like to know this upfront because this is where our attic variables are to be stored.

Returns:

  • (Boolean)


22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/attic/instance_methods.rb', line 22

def attic?
  return false if NoSingletonError.member? self

  # NOTE: Calling this on an object for the first time lazily
  # creates a singleton class for itself. Another way of doing
  # the same thing is to attempt defining a singleton method
  # for the object. In either case, objects that cannot have
  # cannot have a dedicated singleton class (e.g. nil, true,
  # false) will raise a TypeError. We rescue this and add the
  # object to the NoSingletonError list so we don't keep
  # trying to access its singleton class over and over.
  #
  # NOTE 2: Module#singleton_class? is only available for
  # modules and classes (which are also modules); it is not
  # available for instances of classes.
  #
  !singleton_class.nil?

rescue TypeError
  # Remember for next time.
  NoSingletonError.add_member self
  false
end

#attic_variable?(name) ⇒ Boolean

Returns:

  • (Boolean)


50
51
52
# File 'lib/attic/instance_methods.rb', line 50

def attic_variable?(name)
  self.class.attic_variable? name
end

#attic_variable_get(name) ⇒ Object



60
61
62
# File 'lib/attic/instance_methods.rb', line 60

def attic_variable_get(name)
  attic.instance_variable_get("@___attic_#{name}")
end

#attic_variable_set(name, val) ⇒ Object

Raises:

  • (FrozenError)


54
55
56
57
58
# File 'lib/attic/instance_methods.rb', line 54

def attic_variable_set(name, val)
  raise FrozenError, self, caller if frozen?
  attic_variables << name unless attic_variable? name
  attic.instance_variable_set("@___attic_#{name}", val)
end

#attic_variablesObject



46
47
48
# File 'lib/attic/instance_methods.rb', line 46

def attic_variables
  self.class.attic_variables
end