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}\n        @@\#{sym} = nil\n      end\n\n      def self.\#{sym}\n        @@\#{sym}\n      end\n\n      def \#{sym}\n        @@\#{sym}\n      end\n    RUBY\n  end\nend\n", __FILE__, __LINE__ + 1)

#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}\n        @@\#{sym} = nil\n      end\n\n      def self.\#{sym}=(obj)\n        @@\#{sym} = obj\n      end\n    RUBY\n\n    unless options[:instance_writer] == false\n      class_eval(<<-RUBY, __FILE__, __LINE__ + 1)\n        def \#{sym}=(obj)\n          @@\#{sym} = obj\n        end\n      RUBY\n    end\n  end\nend\n", __FILE__, __LINE__ + 1)

#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}\n        return @\#{ivar} if defined?(@\#{ivar})\n        return nil      if self.object_id == \#{self.object_id}\n        ivar = superclass.\#{ivar}\n        return nil if ivar.nil?\n        @\#{ivar} = ivar.try_dup\n      end\n    RUBY\n\n    unless instance_reader == false\n      self.class_eval <<-RUBY, __FILE__, __LINE__ + 1\n        def \#{ivar}\n          self.class.\#{ivar}\n        end\n      RUBY\n    end\n  end\nend\n", __FILE__, __LINE__ + 1

#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)\n        @\#{ivar} = obj\n      end\n    RUBY\n    unless instance_writer == false\n      self.class_eval <<-RUBY, __FILE__, __LINE__ + 1\n        def \#{ivar}=(obj) self.class.\#{ivar} = obj end\n      RUBY\n    end\n  end\nend\n", __FILE__, __LINE__ + 1