From: Logan Capaldo Date: 2006-02-07T06:25:12+09:00 Subject: Re: inheritence of aliases methods - suprise! On Feb 6, 2006, at 4:06 PM, ara.t.howard@noaa.gov wrote: > > this suprised me today: > > harp:~ > cat a.rb > class A > def assertion > raise NotImplementedError > end > alias_method "assertion?", "assertion" > end > > class B < A > def assertion > true > end > end > > B::new.assertion? > > > harp:~ > ruby a.rb > a.rb:3:in `assertion?': NotImplementedError (NotImplementedError) > from a.rb:14 > > > this only way i can seem to make this work is through some > self::inherited > hacks or to actually define assertion? in the base class. is there > no clean > way to inherit aliases? > > regards. > > -a > > -- > happiness is not something ready-made. it comes from your own > actions. > - h.h. the 14th dali lama > This makes sense, If you consider the common idiom of alias'ing a method to wrap additional functionality around it. If alias(_method) didn't work like that you couldn't use it like this. alias_method doesn't work like assignment in ruby, its more like it creates a new method with the same source as the original method. As a poorly conceived alternative: % cat a.rb class Class def shallow_alias(new_name, current_name) self.module_eval <<-END def #{new_name}(*args, &block) #{current_name}(*args, &block) end END end end class A def assertion raise NotImplementedError end shallow_alias "assertion?", "assertion" end class B < A def assertion true end end B.new.assertion? % ruby a.rb %