module Dry::Core::DescendantsTracker

def add_descendant(descendant)

Other tags:
    Api: - private
def add_descendant(descendant)
  ancestor = superclass
  if ancestor.respond_to?(:add_descendant, true)
    ancestor.add_descendant(descendant)
  end
  descendants.unshift(descendant)
end

def extended(base)

Other tags:
    Api: - private
def extended(base)
  super
  DescendantsTracker.setup(base)
end

def inherited(descendant)

Other tags:
    Api: - private
def inherited(descendant)
  super
  DescendantsTracker.setup(descendant)
  add_descendant(descendant)
end

def setup(target)

Other tags:
    Api: - private
def setup(target)
  target.instance_variable_set(:@descendants, ::Concurrent::Array.new)
end