Module: CouchRest::ClassExtension::InstanceMethods

Defined in:
lib/couchrest/support/class.rb

Instance Method Summary collapse

Instance Method Details

#cattr_accessor(*syms) ⇒ Array[#to_s]

Defines class-level (and optionally instance-level) attribute accessor.

Parameters:

  • *syms (Array[*#to_s, Hash{:instance_writer => Boolean}])

    Array of attributes to define accessor for.

  • syms (Hash)

    a customizable set of options

Options Hash (*syms):

  • :instance_writer (Boolean)

    if true, instance-level attribute writer is defined.

Returns:

  • (Array[#to_s])

    List of attributes that were made into accessors



106
107
108
109
# File 'lib/couchrest/support/class.rb', line 106

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

Defines class-level and instance-level attribute reader.

an instance_reader via :instance_reader => false

Parameters:

  • *syms (Array)

    Array of attributes to define reader for.

Returns:

  • (Array[#to_s])

    List of attributes that were made into cattr_readers



50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/couchrest/support/class.rb', line 50

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.

Parameters:

  • Array (Array[*#to_s, Hash{:instance_writer => Boolean}])

    of attributes to define writer for.

  • syms (Hash)

    a customizable set of options

Options Hash (*syms):

  • :instance_writer (Boolean)

    if true, instance-level attribute writer is defined.

Returns:

  • (Array[#to_s])

    List of attributes that were made into cattr_writers



76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
# File 'lib/couchrest/support/class.rb', line 76

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.

define inheritable accessor for.

Parameters:

  • *syms (Array[*#to_s, Hash{:instance_writer => Boolean}])

    Array of attributes to

  • syms (Hash)

    a customizable set of options

Options Hash (*syms):

  • :instance_writer (Boolean)

    if true, instance-level inheritable attribute writer is defined.

Returns:

  • (Array[#to_s])

    An Array of attributes turned into inheritable accessors.



183
184
185
186
# File 'lib/couchrest/support/class.rb', line 183

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

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

(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.

Parameters:

  • *syms (Array[#to_s])

    Array of attributes to define inheritable reader for.

Returns:

  • (Array[#to_s])

    Array of attributes converted into inheritable_readers.



124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
# File 'lib/couchrest/support/class.rb', line 124

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 self.object_id == \#{self.object_id} || defined?(@\#{ivar})\n    ivar = superclass.\#{ivar}\n    return nil if ivar.nil? && !\#{self}.instance_variable_defined?(\"@\#{ivar}\")\n    @\#{ivar} = ivar && !ivar.is_a?(Module) && !ivar.is_a?(Numeric) && !ivar.is_a?(TrueClass) && !ivar.is_a?(FalseClass) && !ivar.is_a?(Symbol) ? ivar.dup : ivar\n    end\n    RUBY\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

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

define inheritable writer for. class_eval(<<-RUBY, __FILE__, __LINE__), but we should codify it somewhere.

Parameters:

  • *syms (Array[*#to_s, Hash{:instance_writer => Boolean}])

    Array of attributes to

  • syms (Hash)

    a customizable set of options

Returns:

  • (Array[#to_s])

    An Array of the attributes that were made into inheritable writers.



158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
# File 'lib/couchrest/support/class.rb', line 158

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