dblack / wobblini.net wrote: > Hi -- > > On Thu, 20 Jul 2006, Tom Werner wrote: > >> I've got a question regarding the inner workings of extend. Consider >> the following code that uses Object#extend twice: >> >> class Klass >> def hello(options = {}) >> p options >> end >> end >> >> module Mod1 >> def hello(options = {}) >> super(options.merge({:mod1 => true})) >> end >> end >> >> module Mod2 >> def hello(options = {}) >> super(options.merge({:mod2 => true})) >> end >> end >> >> k = Klass.new >> k.hello #=> {} >> >> k.extend(Mod1) >> k.hello #=> {:mod1=>true} >> >> k.extend(Mod2) >> k.hello #=> {:mod2=>true, :mod1=>true} >> >> I was a bit surprised that the second extend didn't clobber the >> first. How is this handled by the Ruby interpreter? Is it creating >> more than one eigenclass? > > No, it's just inserting the modules along the method lookup chain. > You can examine it like this: > > class << k > p ancestors > end > > which gives you: > > [Mod2, Mod1, Klass, Object, Kernel] > > So Mod2 comes before Mod1, but the class (k's singleton class) still > has Mod1 mixed in. > > > David > Ah! Have I said I love Ruby today? Thanks David. Tom -- Tom Werner Helmets to Hardhats Software Developer tom / helmetstohardhats.org www.helmetstohardhats.org