Module: CouchRest::InheritableAttributes

Included in:
Document
Defined in:
lib/couchrest/support/inheritable_attributes.rb

Instance Method Summary (collapse)

Instance Method Details

- (Array[#to_s]) couchrest_inheritable_accessor(*syms, &block)

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



102
103
104
105
# 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

- (Array[#to_s]) couchrest_inheritable_reader(*ivars)

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.



41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# 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

- (Array[#to_s]) couchrest_inheritable_writer(*ivars)

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.



75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
# 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