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