Justin Collins wrote:
> 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?
>>
>> Tom
>>
>
> As I understand it, Ruby adds another "transparent" superclass each 
> time you use extend or include. You can of course do that as many 
> times as you want to get all kinds of mix-in functionality. There are 
> some nice diagrams in the Pickaxe book that show this (I don't have it 
> with me at the moment).
>
>
> -Justin
>
>
But the behavior of the modules is that of a subclass (being able to 
call super to call a method in Klass). If I were to use include inside 
the class definition, then I would indeed get superclass behavior.

Tom

-- 
Tom Werner
Helmets to Hardhats
Software Developer
tom / helmetstohardhats.org
www.helmetstohardhats.org