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