Class: Class

Inherits:
Object show all
Defined in:
lib/perennial/core_ext/attribute_accessors.rb

Overview

cattr_* and class_inheritable_* are taken from ActiveSupport. Included here to help keep the codebase simple / clean.

Instance Method Summary collapse

Instance Method Details

#cattr_accessor(*syms) ⇒ Object



45
46
47
48
# File 'lib/perennial/core_ext/attribute_accessors.rb', line 45

def cattr_accessor(*syms)
  cattr_reader(*syms)
  cattr_writer(*syms)
end

#cattr_reader(*syms) ⇒ Object



5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# File 'lib/perennial/core_ext/attribute_accessors.rb', line 5

def cattr_reader(*syms)
  syms.flatten.each do |sym|
    next if sym.is_a?(Hash)
    class_eval("      unless defined? @@\#{sym}  # unless defined? @@hair_colors\n        @@\#{sym} = nil          #   @@hair_colors = nil\n      end                       # end\n                                #\n      def self.\#{sym}           # def self.hair_colors\n        @@\#{sym}                #   @@hair_colors\n      end                       # end\n                                #\n      def \#{sym}                # def hair_colors\n        @@\#{sym}                #   @@hair_colors\n      end                       # end\n    EOS\n  end\nend\n", __FILE__, __LINE__ + 1)

#cattr_writer(*syms) ⇒ Object



24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/perennial/core_ext/attribute_accessors.rb', line 24

def cattr_writer(*syms)
  options = syms.extract_options!
  syms.flatten.each do |sym|
    class_eval("      unless defined? @@\#{sym}                       # unless defined? @@hair_colors\n        @@\#{sym} = nil                               #   @@hair_colors = nil\n      end                                            # end\n                                                     #\n      def self.\#{sym}=(obj)                          # def self.hair_colors=(obj)\n        @@\#{sym} = obj                               #   @@hair_colors = obj\n      end                                            # end\n                                                     #\n      \#{\"                                            #\n      def \#{sym}=(obj)                               # def hair_colors=(obj)\n        @@\#{sym} = obj                               #   @@hair_colors = obj\n      end                                            # end\n      \" unless options[:instance_writer] == false }  # # instance writer above is generated unless options[:instance_writer] == false\n    EOS\n  end\nend\n", __FILE__, __LINE__ + 1)

#class_inheritable_accessor(*syms, &block) ⇒ Array[#to_s]

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

Parameters:

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

    Array of attributes to define inheritable accessor for.

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



124
125
126
127
# File 'lib/perennial/core_ext/attribute_accessors.rb', line 124

def class_inheritable_accessor(*syms, &block)
  class_inheritable_reader(*syms)
  class_inheritable_writer(*syms, &block)
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 (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.

Parameters:

  • *syms (Array[#to_s])

    Array of attributes to define inheritable reader for.

Returns:

  • (Array[#to_s])

    Array of attributes converted into inheritable_readers.



63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# File 'lib/perennial/core_ext/attribute_accessors.rb', line 63

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

Parameters:

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

    Array of attributes to define inheritable writer for.

  • syms (Hash)

    a customizable set of options

Returns:

  • (Array[#to_s])

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



97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
# File 'lib/perennial/core_ext/attribute_accessors.rb', line 97

def class_inheritable_writer(*ivars)
  instance_writer = ivars.pop[: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 \n    self.send(\"\#{ivar}=\", yield) if block_given?\n  end\nend\n", __FILE__, __LINE__ + 1