Sha256: 61e75782492bddef682e3f9194f001b5c4f32d0fd8e29c605d7b2a552321a949
Contents?: true
Size: 1.63 KB
Versions: 207
Compression:
Stored size: 1.63 KB
Contents
module ActiveSupport # This module provides an internal implementation to track descendants # which is faster than iterating through ObjectSpace. module DescendantsTracker @@direct_descendants = {} class << self def direct_descendants(klass) @@direct_descendants[klass] || [] end def descendants(klass) arr = [] accumulate_descendants(klass, arr) arr end 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 # This is the only method that is not thread safe, but is only ever called # during the eager loading phase. def store_inherited(klass, descendant) (@@direct_descendants[klass] ||= []) << descendant end private 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 end def inherited(base) DescendantsTracker.store_inherited(self, base) super end def direct_descendants DescendantsTracker.direct_descendants(self) end def descendants DescendantsTracker.descendants(self) end end end
Version data entries
207 entries across 198 versions & 19 rubygems