I’m not the first to post about this, but it’s worth re-posting since not everyone knows how to do it.
Ruby makes it easy to call an objects’ superclass methods:
class Parent def foo # ... end end class Child < Parent def foo super end end
But what if we want to call the super-superclass method, skipping over the superclass definition? Or what if an included module has overridden the superclass method?
class Parent def foo # ... end end module Interloper def foo puts "Bwahaha all your foos are belong to us!" end end class Child < Parent include Interloper def foo # ??? end end
You can do it, of course (this is Ruby); but the means may not be immediately obvious:
class Child < Parent include Interloper def foo Parent.instance_method(:foo).bind(self).call end end
If it’s not clear what’s going on here: we’re creating an
UnboundMethod object representing the
Parent#foo method, binding that method to the child class instance, and immediately invoking it. It’s a bit unwieldy, but when you want to be absolutely sure of which method implementation you are calling, this is the best way to go.