module Dry::Core::DescendantsTracker
An implementation of descendants tracker, heavily inspired by the descendants_tracker gem.
@example
class Base extend Dry::Core::DescendantsTracker end class A < Base end class B < Base end class C < A end Base.descendants # => [C, B, A] A.descendants # => [C] B.descendants # => []
Attributes
descendants[R]
Return the descendants of this class
@example
descendants = Parent.descendants
@return [Array<Class>]
@api public
Public Class Methods
setup(target)
click to toggle source
@api private
# File lib/dry/core/descendants_tracker.rb, line 32 def setup(target) target.instance_variable_set(:@descendants, Concurrent::Array.new) end
Private Class Methods
extended(base)
click to toggle source
@api private
Calls superclass method
# File lib/dry/core/descendants_tracker.rb, line 39 def extended(base) super DescendantsTracker.setup(base) end
Protected Instance Methods
add_descendant(descendant)
click to toggle source
@api private
# File lib/dry/core/descendants_tracker.rb, line 59 def add_descendant(descendant) ancestor = superclass if ancestor.respond_to?(:add_descendant, true) ancestor.add_descendant(descendant) end descendants.unshift(descendant) end
Private Instance Methods
inherited(descendant)
click to toggle source
@api private
Calls superclass method
# File lib/dry/core/descendants_tracker.rb, line 70 def inherited(descendant) super DescendantsTracker.setup(descendant) add_descendant(descendant) end