module ActiveSupport::DescendantsTracker
def accumulate_descendants(klass, acc)
def accumulate_descendants(klass, acc) if direct_descendants = @@direct_descendants[klass] direct_descendants.each do |direct_descendant| acc << direct_descendant accumulate_descendants(direct_descendant, acc) end end end
def clear
def clear if defined? ActiveSupport::Dependencies @@direct_descendants.each do |klass, descendants| if Dependencies.autoloaded?(klass) @@direct_descendants.delete(klass) else descendants.reject! { |v| 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) descendants = @@direct_descendants[klass] descendants ? descendants.to_a : [] 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] ||= DescendantsArray.new) << descendant end