[Rails-core] Why does Object.subclasses_of ignore subclasses within modules?

Tom Ward tom at popdog.net
Thu Jan 19 10:28:43 GMT 2006


ActiveSupport provides a method Object.subclasses_of, shown below:

def subclasses_of(*superclasses)
    subclasses = []
    ObjectSpace.each_object(Class) do |k|
        next if (k.ancestors & superclasses).empty? ||
superclasses.include?(k) || k.to_s.include?("::") ||
subclasses.include?(k)
        subclasses << k
    end
    subclasses
end

Can anyone shine some light on why it (very deliberately) doesn't
return subclasses defined within modules (ignores classes where
k.to_s.include?("::")).  No tests break if I remove the clause, and
the code appears to have been in the repository since the first
revision, so I can't divine anything looking through changesets. 
Ideally I'd like to use the method myself, but can't unless it works
as I'd expect.  I'd be grateful for any explanation anyone can give.

Tom Ward

P.S. Here's some code to demonstrate what I mean:

class A
end

class B < A
end

Object.subclasses_of(A) # returns [B]

module C
 class D < A
 end
end

Object.subclasses_of(A) # still only returns [B], even though C::D is
also a subclass of A

class E < C::D
end

Object.subclasses_of(A) # returns [B, E], but still not C::D


More information about the Rails-core mailing list