parse_tree даст вам ключевой шаг, который вам понадобится:
http://github.com/seattlerb/parsetree/tree/master
Я думаю, что это происходит самым быстрым / хакерским / самым небезопасным способом:
require 'parse_tree'
require 'parse_tree_extensions'
require 'ruby2ruby'
class Object
def method_source(name)
(class << self; self; end).instance_method(name).to_ruby
end
def exec(ruby, *args)
code = eval(ruby, binding)
code.call(*args)
end
end
Я добавлю, что мне трудно понять, как это хорошая идея ... Но вот она у вас есть. : -)
[править]
Также обратите внимание, что ваш пример обанкротился: ваш метод 'fancy_thing' требует аргумента (приложение).
[править 2]
Если подумать, вот ваш тестовый код с исправленными ошибками (так, как я думаю, вы этого хотели):
class String
def fancy_thing(appendix)
reverse << appendix || nil
end
end
code = "cob".method_source :fancy_thing
# => "proc {|appendix| reverse << appendix }" *
"cob".exec code, '!'
# => "boc!"