From: jweirich@... Date: 2001-08-20T19:46:32+09:00 Subject: [ruby-talk:20012] Re: pose_as >>>>> "David" == David Alan Black writes: David> I don't get the @@use_original logic. When would the first David> (true) part of the 'if' get executed? The only thing that David> ever happens when @@use_original is true is for the poser's David> #new to get called. And that #new, presumably, doesn't David> know or care about @@use_original. If the posing class is a subclass of the original, then the original's version of new is invoked from within the replacement. The test is required to prevent infinite recursion. If you don't ask a subclass to pose as its parent, then you can avoid the extra logic. David> I think you could economize on "<<" operators :-) though David> I'm not 100% sure this code does exactly what yours David> does... see what you think: Your unpose is an improvement. Obviously "self.class_eval" isn't needed. In pose, you dropped the tricky logic needed for subclass support. You also handle block arguments to new (which I missed). You also moved to the error message to inside the instance_eval and replaced "#{other_class.name}" with just "#{name}". Since the string in interpolated before being passed to instance_eval, the "name" method is invoked on the wrong object and the wrong class name appears in the error message. Other that that, they look equivalent to me. David> (And I wonder whether Ruby has some incredible, three-line David> equivalent up its sleeve....) I suppose you've seen Matz's one-liner responce. He takes all the fun out of things. Sigh. :-) -- -- Jim Weirich jweirich@one.net http://w3.one.net/~jweirich --------------------------------------------------------------------- "Beware of bugs in the above code; I have only proved it correct, not tried it." -- Donald Knuth (in a memo to Peter van Emde Boas)