Tom Werner wrote:
> 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
>

Oh, right, nevermind.

-Justin