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