Module: Class::ClassExtensions

Included in:
Class
Defined in:
lib/ruckus/extensions/class.rb

Constant Summary collapse

EMPTY_INHERITABLE_ATTRIBUTES =

Prevent this constant from being created multiple times

{}.freeze

Instance Method Summary collapse

Instance Method Details

#alias_cmethod(to, from) ⇒ Object



22
23
24
25
26
27
28
29
# File 'lib/ruckus/extensions/class.rb', line 22

def alias_cmethod(to, from)
    # XXX not used
    (class << self;self;end).class_eval {
        define_method to do |*args|
            send(from, *args)
        end
    }
end

#class_inheritable_accessor(*syms) ⇒ Object



102
103
104
105
# File 'lib/ruckus/extensions/class.rb', line 102

def class_inheritable_accessor(*syms)
    class_inheritable_reader(*syms)
    class_inheritable_writer(*syms)
end

#class_inheritable_array(*syms) ⇒ Object



107
108
109
110
# File 'lib/ruckus/extensions/class.rb', line 107

def class_inheritable_array(*syms)
    class_inheritable_reader(*syms)
    class_inheritable_array_writer(*syms)
end

#class_inheritable_array_writer(*syms) ⇒ Object



68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# File 'lib/ruckus/extensions/class.rb', line 68

def class_inheritable_array_writer(*syms)
     options = syms.extract_options!
     syms.each do |sym|
         class_eval <<-EOS
  def self.#{sym}=(obj)
    write_inheritable_array(:#{sym}, obj)
  end

  #{"
  def #{sym}=(obj)
    self.class.#{sym} = obj
  end
  " unless options[:instance_writer] == false }
EOS
    end
end

#class_inheritable_hash(*syms) ⇒ Object



112
113
114
115
# File 'lib/ruckus/extensions/class.rb', line 112

def class_inheritable_hash(*syms)
    class_inheritable_reader(*syms)
    class_inheritable_hash_writer(*syms)
end

#class_inheritable_hash_writer(*syms) ⇒ Object



85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
# File 'lib/ruckus/extensions/class.rb', line 85

def class_inheritable_hash_writer(*syms)
    options = syms.extract_options!
    syms.each do |sym|
        class_eval <<-EOS
def self.#{sym}=(obj)
  write_inheritable_hash(:#{sym}, obj)
end

#{"
def #{sym}=(obj)
  self.class.#{sym} = obj
end
" unless options[:instance_writer] == false }
      EOS
    end
end

#class_inheritable_reader(*syms) ⇒ Object

Allows attributes to be shared within an inheritance hierarchy, but where each descendant gets a copy of their parents’ attributes, instead of just a pointer to the same. This means that the child can add elements to, for example, an array without those additions being shared with either their parent, siblings, or children, which is unlike the regular class-level attributes that are shared across the entire hierarchy.



36
37
38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/ruckus/extensions/class.rb', line 36

def class_inheritable_reader(*syms)
     syms.each do |sym|
         next if sym.is_a?(Hash)
         class_eval <<-EOS
def self.#{sym}
    read_inheritable_attribute(:#{sym})
end

def #{sym}
    self.class.#{sym}
end
EOS
      end
end

#class_inheritable_writer(*syms) ⇒ Object



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

def class_inheritable_writer(*syms)
     options = syms.extract_options!
     syms.each do |sym|
         class_eval <<-EOS
 def self.#{sym}=(obj)
   write_inheritable_attribute(:#{sym}, obj)
 end

 #{"
 def #{sym}=(obj)
   self.class.#{sym} = obj
 end
 " unless options[:instance_writer] == false }
EOS
   end
end

#inheritable_attributesObject



117
118
119
# File 'lib/ruckus/extensions/class.rb', line 117

def inheritable_attributes
    @inheritable_attributes ||= EMPTY_INHERITABLE_ATTRIBUTES
end

#inherits_from?(klass) ⇒ Boolean

Also crazy that this isn’t in the library

Returns:

  • (Boolean)


4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# File 'lib/ruckus/extensions/class.rb', line 4

def inherits_from?(klass)
    return true if self == klass
    return true if self.superclass == klass
    return false if self.superclass == Object

    rec = lambda do |x|
        if x == Object
            false
        elsif x == klass
            true
        else
            rec.call(x.superclass)
        end
    end

    rec.call(self)
end

#read_inheritable_attribute(key) ⇒ Object



138
139
140
# File 'lib/ruckus/extensions/class.rb', line 138

def read_inheritable_attribute(key)
    inheritable_attributes[key]
end

#reset_inheritable_attributesObject



142
143
144
# File 'lib/ruckus/extensions/class.rb', line 142

def reset_inheritable_attributes
    @inheritable_attributes = EMPTY_INHERITABLE_ATTRIBUTES
end

#write_inheritable_array(key, elements) ⇒ Object



128
129
130
131
# File 'lib/ruckus/extensions/class.rb', line 128

def write_inheritable_array(key, elements)
    write_inheritable_attribute(key, []) if read_inheritable_attribute(key).nil?
    write_inheritable_attribute(key, read_inheritable_attribute(key) + elements)
end

#write_inheritable_attribute(key, value) ⇒ Object



121
122
123
124
125
126
# File 'lib/ruckus/extensions/class.rb', line 121

def write_inheritable_attribute(key, value)
    if inheritable_attributes.equal?(EMPTY_INHERITABLE_ATTRIBUTES)
        @inheritable_attributes = {}
    end
    inheritable_attributes[key] = value
end

#write_inheritable_hash(key, hash) ⇒ Object



133
134
135
136
# File 'lib/ruckus/extensions/class.rb', line 133

def write_inheritable_hash(key, hash)
    write_inheritable_attribute(key, {}) if read_inheritable_attribute(key).nil?
    write_inheritable_attribute(key, read_inheritable_attribute(key).merge(hash))
end