Beginning meta-programming question

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
#<Class:Parent>
Child1
Child2

I'm not really sure where were you defining those methods, in the
singleton class of the singleton class?

Jesus.

···

On Mon, Jul 26, 2010 at 6:48 AM, Andrew Wagner <wagner.andrew@gmail.com> 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)