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