Module: MPatch::Include::Class

Defined in:
lib/mpatch/class.rb

Instance Method Summary collapse

Instance Method Details

#class_attr_accessor(name) ⇒ Object

create singleton attribute



59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/mpatch/class.rb', line 59

def class_attr_accessor(name)

  ### GET
  begin
    define_method name do
      class_variable_get "@@#{name}"
    end
  end

  ### SET
  begin
    define_method "#{name}=" do |new_val|
      class_variable_set "@@#{name}", new_val
    end
  end

end

#class_methodsObject

get singleton methods to target class without super class methods



8
9
10
# File 'lib/mpatch/class.rb', line 8

def class_methods
  self.methods - ::Object.methods
end

#create_class_method(method, &block) ⇒ Object

bind a singleton method to a class object



13
14
15
16
17
18
19
# File 'lib/mpatch/class.rb', line 13

def create_class_method(method,&block)
  self.class_eval do
    define_singleton_method method do |*args|
      block.call *args
    end
  end
end

#create_instance_method(method, &block) ⇒ Object

create an instance method



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

def create_instance_method(method,&block)
  self.class_eval do
    define_method method do |*args|
      block.call *args
    end
  end
end

#each_subclassObject

Iterates over all subclasses (direct and indirect)



31
32
33
34
35
36
37
38
39
# File 'lib/mpatch/class.rb', line 31

def each_subclass
  ::ObjectSpace.each_object(::Class) { | candidate |
    begin
      yield candidate if candidate < self
    rescue ::ArgumentError
      # comparison of Class with Class failed (ArgumentError)
    end
  }
end

#instance_attr_accessor(name) ⇒ Object

create class instance attribute



78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
# File 'lib/mpatch/class.rb', line 78

def instance_attr_accessor(name)

  ### GET
  begin
    define_method name do
      instance_variable_get "@#{name}"
    end
  end

  ### SET
  begin
    define_method "#{name}=" do |new_val|
      instance_variable_set "@#{name}", new_val
    end
  end

end

#subclassesObject Also known as: subclass

Returns an Array of direct subclasses



51
52
53
54
55
# File 'lib/mpatch/class.rb', line 51

def subclasses
  ret = []
  each_subclass {|c| ret.push(c) if c.superclass == self }
  ret
end

#subclasses_allObject Also known as: all_subclasses

Returns an Array of subclasses (direct and indirect)



42
43
44
45
46
# File 'lib/mpatch/class.rb', line 42

def subclasses_all
  ret = []
  each_subclass {|c| ret.push c}
  ret
end