Alias_method 'stickiness'


#1

any idea if this behaviour is intended or not?

mussel:~/eg/ruby/nrtlib/nrtlib-0.0.0 > cat a.rb

the problem

 module NRT
   class Subscription
     def process_incoming
       raise NotImplementedError
     end
     alias_method "run", "process_incoming"
   end
   class OLSSubscription < Subscription
     def process_incoming
       p 42
     end
   end
 end
 begin; NRT::OLSSubscription::new.run ;rescue Exception => e; p e; 

end

an easy solution

 module NRT
   class Subscription
     def self::anonym dst, src
       module_eval %Q[ def #{ dst }(*a, &b) #{ src }(*a, &b) end ]
     end
     anonym "run", "process_incoming"
   end
 end
 NRT::OLSSubscription::new.run

mussel:~/eg/ruby/nrtlib/nrtlib-0.0.0 > ruby a.rb
#<NotImplementedError: NotImplementedError>
42

this seems odd to me.

-a


#2

Ara.T.Howard wrote:

    def process_incoming
      raise NotImplementedError
    end
    alias_method "run", "process_incoming"

Unfortunately (?) what this^^^ does is define run to be a copy of the
method process_incoming, rather than define run as a method that
delegates to process_incoming.

I suppose this behavior is necessary if you want to use alias_method to
wrap an old method, regardless of what gets redefined in child classes.


#3

On Mon, 13 Mar 2006, Joel VanderWerf wrote:

  class Subscription

wrap an old method, regardless of what gets redefined in child classes.
doh! yup - yer right. i like my ‘anonym’ method more and more.
perhaps an
option to alias_method like

alias_method “foo”, “bar”, :dup => false

or, more concise

alias_method “foo”, “bar”, false

though i detest dangling bool arguments (method(true, false, true, true,
false) acckkkk!)…

either that or alias_method should be renamed copy_method :wink:

thoughts?

-a


#4

removed_email_address@domain.invalid wrote:

alias_method “foo”, “bar”, false

though i detest dangling bool arguments (method(true, false, true, true,
false) acckkkk!)…

either that or alias_method should be renamed copy_method :wink:

I’ve just gotten used to using alias only for metaprogramming, and not
for ordinary API definition.

Maybe it would be nice if the alias keyword were reserved for the
delegation style definition, like your anonym method, and the
metaprogramming interface were something like this:

class Foo

alias :m_copy :m # old way

instance_method_at[:m_copy] = instance_method(:m) # new way

now you can wrap :m_copy however you want

end

This makes it more clear that you are making a copy, so it might be less
confusing.


#5

On Tue, 14 Mar 2006, Joel VanderWerf wrote:

now you can wrap :m_copy however you want

end

This makes it more clear that you are making a copy, so it might be less
confusing.

i like that. what do you think about

class Foo
delegate :src, :dst
end

??

-a