Module: Injector

Defined in:
lib/ioc/injector.rb

Constant Summary collapse

@@decorators =
Hash.new

Instance Method Summary collapse

Instance Method Details

#decorate(name, decorators) ⇒ Object



18
19
20
21
22
23
# File 'lib/ioc/injector.rb', line 18

def decorate name, decorators
  if @@decorators[name].nil?
    @@decorators[name] = []
  end
  @@decorators[name] = {:is_processed => false, :decorators => decorators}
end

#decoratorsObject



14
15
16
# File 'lib/ioc/injector.rb', line 14

def decorators
  @@decorators
end

#method_added(name) ⇒ Object



25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/ioc/injector.rb', line 25

def method_added(name)
  super
  orig_method = instance_method(name)
  decorators = self.decorators[name]
  return if decorators.nil? || decorators[:is_processed] == true

  if private_method_defined?(name);
    visibility = :private
  elsif protected_method_defined?(name);
    visibility = :protected
  else
    visibility = :public
  end

  decorators[:is_processed] = true
  define_method(name) do |*args, &blk|
    decorators[:decorators].each do |decor|
      decor.call(self, *args, &blk)
    end
    orig_method.bind(self).call(*args, &blk)
  end

  case visibility
  when :protected;
    protected name
  when :private;
    private name
  end
end