module ActiveSupport::DescendantsTracker
def accumulate_descendants(klass, acc)
def accumulate_descendants(klass, acc) if direct_descendants = @@direct_descendants[klass] acc.concat(direct_descendants) direct_descendants.each { |direct_descendant| accumulate_descendants(direct_descendant, acc) } end end
def clear
def clear if defined? ActiveSupport::Dependencies @@direct_descendants.each do |klass, descendants| if ActiveSupport::Dependencies.autoloaded?(klass) @@direct_descendants.delete(klass) else descendants.reject! { |v| ActiveSupport::Dependencies.autoloaded?(v) } end end else @@direct_descendants.clear end end
def descendants(klass)
def descendants(klass) arr = [] accumulate_descendants(klass, arr) arr end
def descendants
def descendants DescendantsTracker.descendants(self) end
def direct_descendants(klass)
def direct_descendants(klass) @@direct_descendants[klass] || [] end
def direct_descendants
def direct_descendants DescendantsTracker.direct_descendants(self) end
def inherited(base)
def inherited(base) DescendantsTracker.store_inherited(self, base) super end
def store_inherited(klass, descendant)
This is the only method that is not thread safe, but is only ever called
def store_inherited(klass, descendant) (@@direct_descendants[klass] ||= []) << descendant end