Class: Class

Inherits:
Object
  • Object
show all
Defined in:
lib/fap/support/class.rb

Overview

Extends the class object with class and instance accessors for class attributes, just like the native attr* accessors for instance attributes.

class Person
  cattr_accessor :hair_colors
end

Person.hair_colors = [:brown, :black, :blonde, :red]

Instance Method Summary collapse

Instance Method Details

#cattr_accessor(*syms) ⇒ Object



74
75
76
77
# File 'lib/fap/support/class.rb', line 74

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

#cattr_reader(*syms) ⇒ Object



34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/fap/support/class.rb', line 34

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



53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# File 'lib/fap/support/class.rb', line 53

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)

#extlib_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:

  • Array of attributes to define inheritable accessor for.

  • a customizable set of options

Options Hash (*syms):

  • :instance_writer (Boolean)

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

Returns:

  • An Array of attributes turned into inheritable accessors.

API:

  • public



153
154
155
156
# File 'lib/fap/support/class.rb', line 153

def extlib_inheritable_accessor(*syms, &block)
  extlib_inheritable_reader(*syms)
  extlib_inheritable_writer(*syms, &block)
end

#extlib_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:

  • Array of attributes to define inheritable reader for.

Returns:

  • Array of attributes converted into inheritable_readers.

API:

  • public



92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
# File 'lib/fap/support/class.rb', line 92

def extlib_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

#extlib_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:

  • Array of attributes to define inheritable writer for.

  • a customizable set of options

Returns:

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

API:

  • public



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

def extlib_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