On Tue, Aug 29, 2006 at 05:36:39PM +0900, Robert Dober wrote:
> On 8/29/06, Mauricio Fernandez <mfp / acm.org> wrote:
> >The above code effectively removes inherited methods too (as well as those
> >from other modules that were included previously):
[...]
> >Here's another way to do it without clobbering inherited methods; the
> >key difference is that the original module will not be added to the
> >inheritance chain:
[...] 
> 
> Brilliant, the is_a? relation should not hold anyway after a partial
> include, that was kind of where I blocked.

Right, since is_a? doesn't hold anymore, you cannot add methods to the module
either, e.g.

  module B; def foo; "B#foo" end end
  class X; append_from B, :foo end
  module B; def bar; "B#bar" end end
  
  X.new.bar  # ====> would raise a NoMethodError

... and you cannot capture new methods in B.method_added since Ruby won't let
you rebind them. But that's OK, since we wanted *only* the methods explicitly
passed to #append_from to be imported. In fact, you'd have to add some code
(similar to BlankSlate's) to the other solution (the one with a "child module"
and #undef_method) to handle this correctly (and it'd still suffer from the
method shadowing/clobbering problem).

-- 
Mauricio Fernandez  -   http://eigenclass.org   -  singular Ruby