lib/core/facets/class/descendents.rb in facets-2.1.3 vs lib/core/facets/class/descendents.rb in facets-2.2.0

- old
+ new

@@ -1,68 +1,41 @@ -# TITLE: -# -# Class Descendent Extensions -# -# SUMMARY: -# -# Extension methods for Class class for accessing -# and even removing subclasses. -# -# CREDITS: -# -# - ? - class Class + # List all descedents of this class. + # + # class X ; end + # class A < X; end + # class B < X; end + # X.descendents #=> [A,B] + # + # NOTE: This is a intesive operation. Do not + # expect it to be super fast. + def descendents subclass = [] ObjectSpace.each_object( Class ) do |c| if c.ancestors.include?( self ) and self != c subclass << c end end return subclass end + # Obvious alias for descendents. + alias_method :subclasses, :descendents + # Remove descendents. This simple deletes the constant + # associated to the descendents name. + def remove_descendents self.descendents.each do |subclass| Object.send(:remove_const, subclass.name) rescue nil end ObjectSpace.garbage_collect end + # Obvious alias for remove_descendents. + 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