# TITLE: # # Class Descendent Extensions # # SUMMARY: # # Extension methods for Class class for accessing # and even removing subclasses. # # CREDITS: # # - ? class Class def descendents subclass = [] ObjectSpace.each_object( Class ) do |c| if c.ancestors.include?( self ) and self != c subclass << c end end return subclass end alias_method :subclasses, :descendents def remove_descendents self.descendents.each do |subclass| Object.send(:remove_const, subclass.name) rescue nil end ObjectSpace.garbage_collect end alias_method :remove_subclasses, :remove_descendents end # _____ _ # |_ _|__ ___| |_ # | |/ _ \/ __| __| # | | __/\__ \ |_ # |_|\___||___/\__| # =begin test require 'test/unit' class TestClassDescendents < Test::Unit::TestCase class A ; end class B < A ; end class C < B ; end def test_descendents assert_equal( [C,B], A.descendents ) end def test_remove_descendents assert_nothing_raised { B.remove_descendents } # doesn't work despite above; not sure why #assert_equal( [B], A.descendents ) end end =end