Over-ride ruby class methods without using 'alias'
Ruby
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
lib
spec
.gitignore
Gemfile
README.mkd
Rakefile
overider.gemspec

README.mkd

Overider

Background

Despite Ruby's clean design and flexibility, the language has no native feature that allows one to over-ride a method without irrevocably losing the original binding of the method name. alias is a well-worn idiom that circumvents this limitation, but blogger Jay Fields wrote an interesting post that reminds us that alias comes with some less-than-desireable side-effects that may not be significant in small scripts and projects but may become a problem for larger projects.

In the same post, Jay offered an interesting alternative to alias, using instead Module#instance_method and Module#define_method. This is much better, but I'm not quite satisfied. While obvious enough to experienced Ruby-hands, people who are newer to Ruby (like me!) might have trouble remembering the syntax of x = self.instance_method(:x) and x.bind(self).call every time they need to use this. What I'd really like is a way to override defined methods that's a no-brainer.

So I thought about how I could take Jay's example one step further and after some trial and lots of error came up with this.

Thanks and credit go to Jay Fields for his post.

Description

A mix-in module that allows for super-clean method over-riding without resorting to alias or making unbound methods visible.

Synopsis

class A
  def hello
    "hello"
  end
end

# Later, I want to overide class A methods

class A
  extend Overider

  overide (:hello) do |*a|
    overiden(*a) + " overide"
  end
end

puts A.new.hello # ==> "hello overide"

See also

LICENSE