This will save an array of subclasses in a class attribute named
`subclasses'. It may not be the most efficient way of doing it, but it
works.
class Class
def inherited(subclass)
if superclass.respond_to? :inherited
superclass.inherited(subclass)
end
@subclasses ||= []
@subclasses << subclass
end
def subclasses
@subclasses
end
end
class SuperClass; end
class A < SuperClass; end
class B < SuperClass; end
class C < SuperClass; end
class D < A; end
puts SuperClass.subclasses.join(", ") # A, B, C, D
If you only need one superclass, this is more efficient:
class MyClass
def self.inherited(subclass)
if superclass.respond_to? :inherited
superclass.inherited(subclass)
end
@subclasses ||= []
@subclasses << subclass
end
def self.subclasses
@subclasses
end
end
Cheers,
Daniel