Bind to an "as if" superclass context

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.

Thanks,
T.

On 8/25/07, Trans [email protected] wrote:

class Y < X

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.

On Aug 25, 8:12 am, “Logan C.” [email protected] wrote:

 self.class.superclass.public_instance_methods(all)

end
end

Yep. I was hoping to avoid that if possible. It will a chore to makes
sure I cover all the ones that matter, and that I’ve emulated
properly.

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.

Sure. That was just the “opposite” example of what I was trying to do.
Ie. rather than binding a super method to the current context, I’m
trying to bind a method “as if” to a super context.

Also, I realized that delegation is out of the question for what I’m
trying to do. So I will have to deal with this issue in some fashion.

Thanks,
T.

On 8/25/07, Trans [email protected] wrote:

Sure. That was just the “opposite” example of what I was trying to do.
Ie. rather than binding a super method to the current context, I’m
trying to bind a method “as if” to a super context.

Also, I realized that delegation is out of the question for what I’m
trying to do. So I will have to deal with this issue in some fashion.

Had a thought, what if you do “reverse” delegation?
Instead of having a subclass instance delegate to an instance of super
class, have a super class delegate to an instance of a subclass

I don’t know how feasible this idea is, as I don’t know your class
hierarchy, but it’s an idea.

On Aug 26, 6:00 pm, “Logan C.” [email protected] wrote:

Had a thought, what if you do “reverse” delegation?
Instead of having a subclass instance delegate to an instance of super
class, have a super class delegate to an instance of a subclass

I don’t know how feasible this idea is, as I don’t know your class
hierarchy, but it’s an idea.

Thanks. A fair suggestion, that under other circumstances might do the
trick. Unfortunately, my purposes are quite a bit more difficult. I’m
attempting to implement Cuts (transparent subclasses) in pure Ruby.
The essential operation of this is to subclass the original class, but
have the subclass behave for all “meta-purposes” as if it were the
original class.

T.