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