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 ((<URL:https://github.com/saturnflyer/rubyspec/compare/a4b320efc34c...668f4be5f99852a>))

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 ((<URL:https://github.com/saturnflyer/casting>)) and Travis CI is running the tests at ((<URL:https://travis-ci.org/saturnflyer/casting/builds/7432955>))

The specs fail on ruby-head ((<URL:https://travis-ci.org/saturnflyer/casting/jobs/7432959>)) but pass for 2.0 ((<URL:https://travis-ci.org/saturnflyer/casting/jobs/7432957>))

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/