evan.musing << current

life and tech stuff by Evan Phoenix

Archive for April 2nd, 2008

super is your friend

with 4 comments

Sitting here in Copenhagen, at RubyFools, I thought I’d share a technique that I’ve known about for some time, but seems to not have gotten into the normal ruby vernacular.

This trick is the use of super in methods contained in a Module. Consider the following code:

module N
  def go
    puts "N#go"
    super
  end
end

class B
  def go
    puts "B#go"
  end
end

class A < B
  include N
end

A.new.go

Will print:

N#go
B#go

This is HIGHLY useful implementing rails plugins, where normally you’d use alias_method_chain to change a method directly inside ActiveRecord::Base. Instead, simply call super in the method that provides the new functionality, and when your module is included in your module class (which is a subclass of ActiveRecord::Base), and the main, ActiveRecord::Base implementation will be called.

NOTE: This trick only works if the method you wish to wrap is located in a superclass of the class you have defined the module in. IE, if N were included in B directly rather than A, N#go would never be called.

Written by evanphx

April 2, 2008 at 5:48 am

Posted in ruby