Skip to content

lsiden/overider

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

12 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

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

About

Over-ride ruby class methods without using 'alias'

Resources

Stars

Watchers

Forks

Packages

No packages published

Languages