From: "saturnflyer (Jim Gay)" Date: 2013-05-25T03:06:46+09:00 Subject: [ruby-core:55158] [ruby-trunk - Feature #4254] Allow method transplanting Issue #4254 has been updated by saturnflyer (Jim Gay). =begin I am interested in this feature although with a different use. It appears that 2.0.0-p0 allowed methods to be unbound from a module and bound to any object. I've forked rubyspec and created a failing spec (()) In 2.0.0-p0 this code works: (({SomeModule.instance_method(:the_method).bind(Object.new)})) but this seems to be broken in 2.1-dev (and is not present in previous versions) This project uses this feature to temporarily add behavior to an object (()) and Travis CI is running the tests at (()) The specs fail on ruby-head (()) but pass for 2.0 (()) This feature is useful in allowing an object to run methods inside a block: object.hello_world #=> NoMethodError Casting.delegating(object => GreetingModule) do object.hello_world #=> "Hello world!" end object.hello_world #=> NoMethodError The above example uses method_missing to unbind methods from the given module then bind them to self and call them. If there is a better place to post this, or if I should open a new ticket, please correct me. =end ---------------------------------------- Feature #4254: Allow method transplanting https://bugs.ruby-lang.org/issues/4254#change-39523 Author: zimbatm (Jonas Pfenniger) Status: Closed Priority: Normal Assignee: matz (Yukihiro Matsumoto) Category: core Target version: 2.0.0 =begin Is there a technical reason to not allow re-binding a method from one module to any other module ? module M def foo; "foo"; end end module N; end N.send(:define_method, :foo, M.instance_method(:foo)) #=> should not raise It's like monkey-patching. Powerful, dangerous, but also really useful. It could allow different variations of method_wrap or alias_method_chain that are not possible right now. =end -- http://bugs.ruby-lang.org/