From: dblack@... Date: 2006-07-27T09:47:27+09:00 Subject: Re: Issue extending a delegated class Hi -- On Thu, 27 Jul 2006, rak rok wrote: > Hi, > > I have a simple class that I'm extending via delegation: > > class A > def one ; puts "A::one" ; two ; end > def two ; puts "A::two" ; end > end > > class B < SimpleDelegator > > def initialize > a = A.new > > # do some stuff to a > > __setobj__ a > super( a ) > end > end > > > I then instantiate B, and use that, all is well. However, i'm running into > issues whenever I try to override a method in B: > b = B.new > class << b You're not overriding anything in B here; rather, you're adding an instance method to the singleton class of the instance b. > def two ; puts "foo" ; end > end > > I would have expected b.one to output: > A::one > custom (Do you mean "foo" rather than "custom"?) > But instead i get: > A::one > A::two > > However, calling the overriden method directly produces the expected > result. I'm guessing the extend is really only adding the function to the B > instance and not to A? Is there a way to get to A? Your guess is right :-) When a handles the delegate call to #one, part of that call is a call to #two -- which, as far as a is concerned, is A#two. You can always override A#two, but I imagine that's not what you have in mind. I'm not sure exactly what you are trying to do, though. David -- http://www.rubypowerandlight.com => Ruby/Rails training & consultancy http://www.manning.com/black => RUBY FOR RAILS (reviewed on Slashdot, 7/12/2006!) http://dablog.rubypal.com => D[avid ]A[. ]B[lack's][ Web]log dblack@wobblini.net => me