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.
-
#extlib_inheritable_accessor(*syms) ⇒ Array[#to_s]
Defines class-level inheritable attribute accessor.
-
#extlib_inheritable_reader(*ivars) ⇒ Array[#to_s]
Defines class-level inheritable attribute reader.
-
#extlib_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.
94 95 96 97 |
# File 'lib/couchrest/support/class.rb', line 94 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.
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
# File 'lib/couchrest/support/class.rb', line 38 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.
64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
# File 'lib/couchrest/support/class.rb', line 64 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 |
#extlib_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.
171 172 173 174 |
# File 'lib/couchrest/support/class.rb', line 171 def extlib_inheritable_accessor(*syms) extlib_inheritable_reader(*syms) extlib_inheritable_writer(*syms) end |
#extlib_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.
112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 |
# File 'lib/couchrest/support/class.rb', line 112 def extlib_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 self.object_id == #{self.object_id} || defined?(@#{ivar}) ivar = superclass.#{ivar} return nil if ivar.nil? && !#{self}.instance_variable_defined?("@#{ivar}") @#{ivar} = ivar && !ivar.is_a?(Module) && !ivar.is_a?(Numeric) && !ivar.is_a?(TrueClass) && !ivar.is_a?(FalseClass) ? ivar.dup : ivar end RUBY unless instance_reader == false self.class_eval <<-RUBY, __FILE__, __LINE__ + 1 def #{ivar} self.class.#{ivar} end RUBY end end end |
#extlib_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.
146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 |
# File 'lib/couchrest/support/class.rb', line 146 def extlib_inheritable_writer(*ivars) instance_writer = ivars.pop[: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 |