Module: MethodDecorators
- Defined in:
- lib/performance_promise/decorators.rb
Class Method Summary
collapse
Instance Method Summary
collapse
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(name, *args, &blk) ⇒ Object
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
# File 'lib/performance_promise/decorators.rb', line 13
def method_missing(name, *args, &blk)
if Object.const_defined?(name)
const = Object.const_get(name)
elsif Decorator.decorators.key?(name)
const = Decorator.decorators[name]
else
return super
end
instance_eval <<-ruby_eval, __FILE__, __LINE__ + 1
def #{name}(*args, &blk)
decorate(#{const.name}, *args, &blk)
end
ruby_eval
send(name, *args, &blk)
end
|
Class Method Details
.extended(klass) ⇒ Object
7
8
9
10
11
|
# File 'lib/performance_promise/decorators.rb', line 7
def self.extended(klass)
class << klass
attr_accessor :decorated_methods
end
end
|
Instance Method Details
#decorate(klass, *args) ⇒ Object
56
57
58
59
|
# File 'lib/performance_promise/decorators.rb', line 56
def decorate(klass, *args)
@decorators ||= []
@decorators << [klass, args]
end
|
#method_added(name) ⇒ Object
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
# File 'lib/performance_promise/decorators.rb', line 31
def method_added(name)
return unless @decorators
decorators = @decorators.dup
@decorators = nil
@decorated_methods ||= Hash.new {|h,k| h[k] = []}
class << self; attr_accessor :decorated_methods; end
decorators.each do |klass, args|
decorator = klass.respond_to?(:new) ? klass.new(self, instance_method(name), *args) : klass
@decorated_methods[name] << decorator
end
class_eval <<-ruby_eval, __FILE__, __LINE__ + 1
def #{name}(*args, &blk)
ret = nil
self.class.decorated_methods[#{name.inspect}].each do |decorator|
ret = decorator.call(self, *args, &blk)
end
ret
end
ruby_eval
end
|