Added methods for removing subclasses -- couldnt make it work with the regular nested-module approach (ObjectSpace was being difficult), so this is a straight inclusion

git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@506 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
This commit is contained in:
David Heinemeier Hansson 2005-01-25 17:55:55 +00:00
parent 136962322b
commit c37e8d365b
2 changed files with 45 additions and 0 deletions

View File

@ -0,0 +1,24 @@
class Object #:nodoc:
def remove_subclasses_of(superclass)
subclasses_of(superclass).each { |subclass| Object.send(:remove_const, subclass) rescue nil }
end
def subclasses_of(superclass)
subclasses = []
ObjectSpace.each_object(Class) do |k|
next if !k.ancestors.include?(superclass) || superclass == k || k.to_s.include?("::") || subclasses.include?(k.to_s)
subclasses << k.to_s
end
subclasses
end
end
class Class #:nodoc:
def remove_subclasses
Object.remove_subclasses_of(self)
end
def subclasses
Object.subclasses_of(self)
end
end

View File

@ -0,0 +1,21 @@
require 'test/unit'
require File.dirname(__FILE__) + '/../../lib/core_ext/object_and_class'
class A; end
class B < A; end
class C < B; end
class D < A; end
class ClassExtTest < Test::Unit::TestCase
def test_methods
assert defined?(B)
assert defined?(C)
assert defined?(D)
A.remove_subclasses
assert !defined?(B)
assert !defined?(C)
assert !defined?(D)
end
end