From: Logan Capaldo Date: 2007-08-26T00:12:08+09:00 Subject: Re: Bind to an "as if" superclass context On 8/25/07, Trans wrote: > Is there a way to do the "opposite" of binding a superclass method to > the current context? In other words, I want to call a method as if the > current binding were an instance of the superclass. For example, using > the method #public_methods as a basis of demonstration (could be any > method though): > > class X > def a; "a"; end > end > > class Y < X > def b; "b"; end > > def public_methods(all=true) > # ? > > self.class.superclass.instance_method(:public_methods).bind(self).call(all) > end > end > > y = Y.new > > p y.public_methods(false) > > Of course, that produces > > ['b', 'public_methods'] > > But what I want is: > > ['a'] > > I suspect there's no way to do this short of resorting to delegation > rather than subclassing. But I wanted to ask and make sure. > Well, I don't know about in general, but for this particular instance (and similar ones) you could just do class X def a; "a"; end end class Y < X def b; "b"; end def public_methods(all = true) self.class.superclass.public_instance_methods(all) end end Incidently, you do realize that the whole mess of self.class.superclass.instance_method(:public_methods).call(all) is exactly equivalent to super right? At least in the context of overriding public_methods anyway. And of course def foo(); super; end is the same as not writing foo at all, so it's not surprising you get the same result. > Thanks, > T. > > >