Ruby provides a Module#ancestors, but no Class#descendants.
Here’s a working implementation:
class Class
def inherited(klass)
subclasses << klass
end
def subclasses
@subclasses ||= []
end
def descendants
subclasses.inject(subclasses) do |all, subclass|
all + subclass.descendants
end
end
end
Class class has been extended.Class become class methods of Class instances.class A; end
class B < A; end
class C < B; end
A.subclasses # => [B]
A.descendants # => [B, C]
Ruby Facets provides a Class#descendents that uses ObjectSpace instead of Class#inherited.