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