Phil Tomson wrote: > In article <200602150449.40928.david / vallner.net>, > David Vallner <david / vallner.net> wrote: >> D=C5=88a Streda 15 Febru=C3=A1r 2006 03:23 Phil Tomson nap=C3=ADsal: >>> I think the answer is that A has already been mixed-in so it's not >>> really mixed-in again (true?).=20 >>> >> >> Quite so. >> >>> And how would I go about making this work so that it prints: >>> >>> A::foo >>> B::foo >>> A::foo >>> >>> ? >>> >> >> Make the message printed an instance attribute and change it? *duck* >> >> Mixins aren't plain supposed to do that. They are to add methods, >> not rewri= te=20 >> them at whim. > > Yeah, I just thought it would be a nice, fairly easy solution. > >> If you -have- to do this via metaprogramming, use singleton=20 >> methods. > > Yeah, I could probably do something like that by redefining the > method... Or use the strategy / state pattern. > (BTW: Using extend as above makes foo a singleton method ) > >> Especially in non-trivial code, heavy use of #extend to change=20 >> behaviour over and over again would get really messy. > > The only way to really get it to work would be to remove_method > before doing the extend. The problem with that is that remove_method > doesn't work in that context (removing singleton methods). > > I should probably consider some sort of delegation pattern instead. > One fairly easy way would be to use method_missing and then change > the target object of the message (though I want to avoid overuse of > method_missing because 1) it can make things difficult to debug and > 2) I might need it for another purpose in this application. ) I think you can use SimpleDelegator and change the target in between. Didn't test it myself though. Kind regards robert