6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
# File 'lib/methodsolver.rb', line 6
def self.call(&block)
raise ArgumentError, 'no block given' unless block_given?
begin
Object.class_eval('def method_missing(name, *args); throw :method_missing, [self, name]; end')
method_missing = catch :method_missing do block.call; nil end
ensure
Object.class_eval('remove_method :method_missing')
end
raise ArgumentError, 'no missing method found' unless method_missing
object, message = method_missing
found = methods_for(object).select do |each|
begin
object.class.class_eval("alias #{message.inspect} #{each.inspect}")
true === block.call
rescue
false
ensure
object.class.class_eval("remove_method #{message.inspect}")
end
end
return object, found
end
|