Class: Class

Inherits:
Object show all
Defined in:
lib/extlib/class.rb

Overview

Allows attributes to be shared within an inheritance hierarchy, but where each descendant gets a copy of their parents' attributes, instead of just a pointer to the same. This means that the child can add elements to, for example, an array without those additions being shared with either their parent, siblings, or children, which is unlike the regular class-level attributes that are shared across the entire hierarchy.

Instance Method Summary collapse

Instance Method Details

#cattr_accessor(*syms) ⇒ Array<#to_s>

Defines class-level (and optionally instance-level) attribute accessor.

Options Hash (*syms):

  • :instance_writer (Boolean)

    if true, instance-level attribute writer is defined.


96
97
98
99
# File 'lib/extlib/class.rb', line 96

def cattr_accessor(*syms)
  cattr_reader(*syms)
  cattr_writer(*syms)
end

#cattr_reader(*syms) ⇒ Array<#to_s>

TODO:

Is this inconsistent in that it does not allow you to prevent an instance_reader via :instance_reader => false

Defines class-level and instance-level attribute reader.


40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/extlib/class.rb', line 40

def cattr_reader(*syms)
  syms.flatten.each do |sym|
    next if sym.is_a?(Hash)
    class_eval("unless defined? @@\#{sym}\[email protected]@\#{sym} = nil\nend\n\ndef self.\#{sym}\[email protected]@\#{sym}\nend\n\ndef \#{sym}\[email protected]@\#{sym}\nend\n", __FILE__, __LINE__ + 1)
  end
end

#cattr_writer(*syms) ⇒ Array<#to_s>

Defines class-level (and optionally instance-level) attribute writer.

Options Hash (*syms):

  • :instance_writer (Boolean)

    if true, instance-level attribute writer is defined.


66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
# File 'lib/extlib/class.rb', line 66

def cattr_writer(*syms)
  options = syms.last.is_a?(Hash) ? syms.pop : {}
  syms.flatten.each do |sym|
    class_eval("unless defined? @@\#{sym}\[email protected]@\#{sym} = nil\nend\n\ndef self.\#{sym}=(obj)\[email protected]@\#{sym} = obj\nend\n", __FILE__, __LINE__ + 1)

    unless options[:instance_writer] == false
      class_eval("def \#{sym}=(obj)\[email protected]@\#{sym} = obj\nend\n", __FILE__, __LINE__ + 1)
    end
  end
end

#class_inheritable_accessor(*syms) ⇒ Array<#to_s>

Defines class-level inheritable attribute accessor. Attributes are available to subclasses, each subclass has a copy of parent's attribute.

Options Hash (*syms):

  • :instance_writer (Boolean)

    if true, instance-level inheritable attribute writer is defined.


175
176
177
178
# File 'lib/extlib/class.rb', line 175

def class_inheritable_accessor(*syms)
  class_inheritable_reader(*syms)
  class_inheritable_writer(*syms)
end

#class_inheritable_reader(*ivars) ⇒ Array<#to_s>

TODO:

Do we want to block instance_reader via :instance_reader => false

TODO:

It would be preferable that we do something with a Hash passed in (error out or do the same as other methods above) instead of silently moving on). In particular, this makes the return value of this function less useful.

Defines class-level inheritable attribute reader. Attributes are available to subclasses, each subclass has a copy of parent's attribute.


114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
# File 'lib/extlib/class.rb', line 114

def class_inheritable_reader(*ivars)
  instance_reader = ivars.pop[:reader] if ivars.last.is_a?(Hash)

  ivars.each do |ivar|
    self.class_eval "def self.\#{ivar}\nreturn @\#{ivar} if defined?(@\#{ivar})\nreturn nil      if self.object_id == \#{self.object_id}\nivar = superclass.\#{ivar}\nreturn nil if ivar.nil?\[email protected]\#{ivar} = ivar.try_dup\nend\n", __FILE__, __LINE__ + 1

    unless instance_reader == false
      self.class_eval "def \#{ivar}\nself.class.\#{ivar}\nend\n", __FILE__, __LINE__ + 1
    end
  end
end

#class_inheritable_writer(*ivars) ⇒ Array<#to_s>

TODO:

We need a style for class_eval <<-HEREDOC. I'd like to make it class_eval(<<-RUBY, __FILE__, __LINE__), but we should codify it somewhere.

Defines class-level inheritable attribute writer. Attributes are available to subclasses, each subclass has a copy of parent's attribute.


150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
# File 'lib/extlib/class.rb', line 150

def class_inheritable_writer(*ivars)
  instance_writer = ivars.pop[:instance_writer] if ivars.last.is_a?(Hash)
  ivars.each do |ivar|
    self.class_eval "def self.\#{ivar}=(obj)\[email protected]\#{ivar} = obj\nend\n", __FILE__, __LINE__ + 1
    unless instance_writer == false
      self.class_eval "def \#{ivar}=(obj) self.class.\#{ivar} = obj end\n", __FILE__, __LINE__ + 1
    end
  end
end