diff options
Diffstat (limited to 'activesupport/lib')
-rw-r--r-- | activesupport/lib/active_support/core_ext/object/extending.rb | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/activesupport/lib/active_support/core_ext/object/extending.rb b/activesupport/lib/active_support/core_ext/object/extending.rb index 0815909410..7c79d73f21 100644 --- a/activesupport/lib/active_support/core_ext/object/extending.rb +++ b/activesupport/lib/active_support/core_ext/object/extending.rb @@ -5,17 +5,21 @@ class Object def subclasses_of(*superclasses) #:nodoc: subclasses = [] + + # Exclude this class unless it's a subclass of our supers and is defined. + # We check defined? in case we find a removed class that has yet to be + # garbage collected. This also fails for anonymous classes -- please + # submit a patch if you have a workaround. ObjectSpace.each_object(Class) do |k| - next unless # Exclude this class unless - superclasses.any? { |superclass| k < superclass } && # It *is* a subclass of our supers - eval("defined?(::#{k}) && ::#{k}.object_id == k.object_id") # It *is* defined - # Note that we check defined? in case we find a removed class that has - # yet to be garbage collected. - subclasses << k + if superclasses.any? { |superclass| k < superclass } && + (k.name.blank? || eval("defined?(::#{k}) && ::#{k}.object_id == k.object_id")) + subclasses << k + end end + subclasses end - + def extended_by #:nodoc: ancestors = class << self; ancestors end ancestors.select { |mod| mod.class == Module } - [ Object, Kernel ] |