From: "Jesús Gabriel y Galán" Date: 2010-07-26T15:33:48+09:00 Subject: Re: Beginning meta-programming question On Mon, Jul 26, 2010 at 6:48 AM, Andrew Wagner wrote: > I'm pretty new to ruby, and just playing around. I can't work out why the > following won't work, though: > >   1.  module TrackInheritors >   2.    def self.extended(parent) >   3.      class << parent >   4.        puts self >   5.        @@inheritors = [] >   6. >   7.        def self.inheritors >   8.          @@inheritors >   9.        end >   10. >   11.        def self.inherited(child) >   12.          @@inheritors << child >   13.        end >   14.      end >   15.    end >   16.  end >   17. >   18.  class Parent >   19.    extend TrackInheritors >   20.  end >   21. >   22.  class Child1 < Parent >   23.  end >   24. >   25.  class Child2 < Parent >   26.  end >   27. >   28.  puts Parent.inheritors >   29. >   30.  # -:28: undefined method `inheritors' for Parent:Class >   (NoMethodError) > When you open the singleton class of parent, you don't need to define the methods for "self.", just define them directly, cause you are already on the singleton class: module TrackInheritors def self.extended(parent) class << parent puts self @@inheritors = [] def inheritors @@inheritors end def inherited(child) @@inheritors << child end end end end class Parent extend TrackInheritors end class Child1 < Parent end class Child2 < Parent end puts Parent.inheritors $ ruby inheritors.rb # Child1 Child2 I'm not really sure where were you defining those methods, in the singleton class of the singleton class? Jesus.