Class: Class
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
-
#cattr_accessor(*syms) ⇒ Array<#to_s>
Defines class-level (and optionally instance-level) attribute accessor.
-
#cattr_reader(*syms) ⇒ Array<#to_s>
Defines class-level and instance-level attribute reader.
-
#cattr_writer(*syms) ⇒ Array<#to_s>
Defines class-level (and optionally instance-level) attribute writer.
-
#class_inheritable_accessor(*syms) ⇒ Array<#to_s>
Defines class-level inheritable attribute accessor.
-
#class_inheritable_reader(*ivars) ⇒ Array<#to_s>
Defines class-level inheritable attribute reader.
-
#class_inheritable_writer(*ivars) ⇒ Array<#to_s>
Defines class-level inheritable attribute writer.
Instance Method Details
#cattr_accessor(*syms) ⇒ Array<#to_s>
Defines class-level (and optionally instance-level) attribute accessor.
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>
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(<<-RUBY, __FILE__, __LINE__ + 1) unless defined? @@#{sym} @@#{sym} = nil end def self.#{sym} @@#{sym} end def #{sym} @@#{sym} end RUBY end end |
#cattr_writer(*syms) ⇒ Array<#to_s>
Defines class-level (and optionally instance-level) attribute writer.
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) = syms.last.is_a?(Hash) ? syms.pop : {} syms.flatten.each do |sym| class_eval(<<-RUBY, __FILE__, __LINE__ + 1) unless defined? @@#{sym} @@#{sym} = nil end def self.#{sym}=(obj) @@#{sym} = obj end RUBY unless [:instance_writer] == false class_eval(<<-RUBY, __FILE__, __LINE__ + 1) def #{sym}=(obj) @@#{sym} = obj end RUBY 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.
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>
Do we want to block instance_reader via :instance_reader => false
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 <<-RUBY, __FILE__, __LINE__ + 1 def self.#{ivar} return @#{ivar} if defined?(@#{ivar}) return nil if self.object_id == #{self.object_id} ivar = superclass.#{ivar} return nil if ivar.nil? @#{ivar} = ivar.try_dup end RUBY unless instance_reader == false self.class_eval <<-RUBY, __FILE__, __LINE__ + 1 def #{ivar} self.class.#{ivar} end RUBY end end end |
#class_inheritable_writer(*ivars) ⇒ Array<#to_s>
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 <<-RUBY, __FILE__, __LINE__ + 1 def self.#{ivar}=(obj) @#{ivar} = obj end RUBY unless instance_writer == false self.class_eval <<-RUBY, __FILE__, __LINE__ + 1 def #{ivar}=(obj) self.class.#{ivar} = obj end RUBY end end end |