mirror of https://github.com/rails/rails
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:
parent
136962322b
commit
c37e8d365b
|
@ -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
|
|
@ -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
|
Loading…
Reference in New Issue