Module: ActiveSupport::DescendantsTracker
- Defined in:
- lib/active_support/descendants_tracker.rb
Overview
This module provides an internal implementation to track descendants which is faster than iterating through ObjectSpace.
Defined Under Namespace
Classes: DescendantsArray
Constant Summary collapse
- @@direct_descendants =
{}
Class Method Summary collapse
- .clear ⇒ Object
- .descendants(klass) ⇒ Object
- .direct_descendants(klass) ⇒ Object
-
.store_inherited(klass, descendant) ⇒ Object
This is the only method that is not thread safe, but is only ever called during the eager loading phase.
Instance Method Summary collapse
Class Method Details
.clear ⇒ Object
[View source]
23 24 25 26 27 28 29 30 31 32 33 34 35 |
# File 'lib/active_support/descendants_tracker.rb', line 23 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 |
.descendants(klass) ⇒ Object
[View source]
17 18 19 20 21 |
# File 'lib/active_support/descendants_tracker.rb', line 17 def descendants(klass) arr = [] accumulate_descendants(klass, arr) arr end |
.direct_descendants(klass) ⇒ Object
[View source]
12 13 14 15 |
# File 'lib/active_support/descendants_tracker.rb', line 12 def direct_descendants(klass) descendants = @@direct_descendants[klass] descendants ? descendants.to_a : [] end |
.store_inherited(klass, descendant) ⇒ Object
This is the only method that is not thread safe, but is only ever called during the eager loading phase.
39 40 41 |
# File 'lib/active_support/descendants_tracker.rb', line 39 def store_inherited(klass, descendant) (@@direct_descendants[klass] ||= DescendantsArray.new) << descendant end |
Instance Method Details
#descendants ⇒ Object
[View source]
63 64 65 |
# File 'lib/active_support/descendants_tracker.rb', line 63 def descendants DescendantsTracker.descendants(self) end |
#direct_descendants ⇒ Object
[View source]
59 60 61 |
# File 'lib/active_support/descendants_tracker.rb', line 59 def direct_descendants DescendantsTracker.direct_descendants(self) end |
#inherited(base) ⇒ Object
[View source]
54 55 56 57 |
# File 'lib/active_support/descendants_tracker.rb', line 54 def inherited(base) DescendantsTracker.store_inherited(self, base) super end |