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