Forcing Kernel::method_name to be called in Ruby
        Posted  
        
            by Peter
        on Stack Overflow
        
        See other posts from Stack Overflow
        
            or by Peter
        
        
        
        Published on 2010-05-25T01:04:57Z
        Indexed on 
            2010/05/25
            1:11 UTC
        
        
        Read the original article
        Hit count: 309
        
ruby
I want to add a foo method to Ruby's Kernel module, so I can write foo(obj) anywhere and have it do something to obj. Sometimes I want a class to override foo, so I do this:
module Kernel
  private  # important; this is what Ruby does for commands like 'puts', etc.
  def foo x
    if x.respond_to? :foo
      x.foo  # use overwritten method.
    else
      # do something to x.
    end
  end
end
this is good, and works. but, what if I want to use the default Kernel::foo in some other object that overwrites foo? Since I've got an instance method foo, I've lost the original binding to Kernel::foo.
class Bar
  def foo  # override behaviour of Kernel::foo for Bar objects.
    foo(3) # calls Bar::foo, not the desired call of Kernel::foo.
    Kernel::foo(3)  # can't call Kernel::foo because it's private.
    # question: how do I call Kernel::foo on 3?
  end
end
Is there any clean way to get around this? I'd rather not have two different names, and I definitely don't want to make Kernel::foo public. 
© Stack Overflow or respective owner