A recent (and helpful) suggestion reminded me of the use of alias in a
library module to extend its functionality. You do "alias oldmeth meth"
and then redefine meth to do something plus call oldmeth.

But now I remember why that makes me itch. It's tempting to think of
this alias-and-redefine as an operation that is insulated from the rest
of the world, but the binding effect of alias is, of course, not local.
Unless you choose a very obscure name for you alias, you run the risk of
a stack overflow:

  module M
    def foo
      p "foo"
    end
  end

  class C; include M; end

  c = C.new

  module M
   alias oldfoo foo
   def foo
     p "foo1"
     oldfoo
   end
  end

  c.foo

    # ==> "foo1"
    #     "foo"

  module M
   alias oldfoo foo
   def foo
     p "foo2"
     oldfoo
   end
  end

  c.foo

    # SystemStackError

Isn't there some way (perhaps in 1.7?) of getting a copy of M's
implementation of foo as a Proc and redefining foo in terms of a closure
that refers to this proc? That way, instead of using alias, you'd be
able to use a local binding that couldn't affect anyone else.

--
Joel VanderWerf                          California PATH, UC Berkeley
mailto:vjoel / path.berkeley.edu                     Ph. (510) 231-9446
http://www.path.berkeley.edu                       FAX (510) 231-9512