module CouchRest::InheritableAttributes
Public Instance Methods
Defines class-level inheritable attribute accessor. Attributes
are available to subclasses, each subclass has a copy of parent's attribute.
@param *syms<Array[*#to_s, Hash{:instance_writer => Boolean}]> Array of attributes to
define inheritable accessor for.
@option syms :instance_writer<Boolean> if true, instance-level inheritable attribute writer is defined. @return <Array> An Array of attributes turned into inheritable accessors.
@api public
# File lib/couchrest/support/inheritable_attributes.rb, line 102 def couchrest_inheritable_accessor(*syms, &block) couchrest_inheritable_reader(*syms) couchrest_inheritable_writer(*syms, &block) end
Defines class-level inheritable attribute reader. Attributes
are available to subclasses, each subclass has a copy of parent's attribute.
@param *syms
@api public
@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.
# File lib/couchrest/support/inheritable_attributes.rb, line 41 def couchrest_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
Defines class-level inheritable attribute writer. Attributes
are available to subclasses, each subclass has a copy of parent's attribute.
@param *syms<Array[*#to_s, Hash{:instance_writer => Boolean}]> Array of attributes to
define inheritable writer for.
@option syms :instance_writer<Boolean> if true, instance-level inheritable attribute writer is defined. @return <Array> An Array of the attributes that were made into inheritable writers.
@api public
@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.
# File lib/couchrest/support/inheritable_attributes.rb, line 75 def couchrest_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 self.send("#{ivar}=", yield) if block_given? end end