3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
# File 'lib/pickle/injector.rb', line 3
def self.inject(delegate_class, options = {})
target_class = options[:into] || raise('inject requires a target class specified with :into')
delegate_name = options[:name] || delegate_class.name.underscore.gsub('/','_')
init_delegate = options[:init] || lambda { new }
target_class.send(:define_method, delegate_name) do
instance_variable_get("@#{delegate_name}") || instance_variable_set("@#{delegate_name}", delegate_class.instance_eval(&init_delegate))
end
delegate_methods = delegate_class.public_instance_methods - Object.instance_methods
target_class.delegate *(delegate_methods + [{:to => delegate_name}])
end
|