Sha256: 6571c5493f5deebe23ce415cce3c54f97835d71cce29093ecd08ce5fd98c2885
Contents?: true
Size: 1.26 KB
Versions: 12
Compression:
Stored size: 1.26 KB
Contents
module MotionSupport # 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 @@direct_descendants.clear 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
12 entries across 12 versions & 2 rubygems