Sha256: f8bf2393074d93feb38a6f04fea3067da7fa0a9467499e1f5aaf142fc5170d79

Contents?: true

Size: 1.15 KB

Versions: 2

Compression:

Stored size: 1.15 KB

Contents

# encoding: utf-8

# Module that adds descendant tracking to a class
module DescendantsTracker

  # @private
  def self.extended(descendant)
    setup(descendant)
  end
  private_class_method :extended

  # @return [Array]
  #
  # @private
  def self.setup(descendant)
    descendant.instance_variable_set('@descendants', [])
  end
  private_class_method :extended

  # Return the descendants of this class
  #
  # @example
  #   descendants = ParentClass.descendants
  #
  # @return [Array<Class>]
  #
  # @api public
  def descendants
    @descendants
  end

  # Add the descendant to this class and the superclass
  #
  # @param [Class] descendant
  #
  # @return [self]
  #
  # @api private
  def add_descendant(descendant)
    ancestor = superclass
    if ancestor.respond_to?(:add_descendant)
      ancestor.add_descendant(descendant)
    end
    descendants.unshift(descendant)
    self
  end

private

  # Hook called when class is inherited
  #
  # @param [Class] descendant
  #
  # @return [self]
  #
  # @api private
  def inherited(descendant)
    super
    DescendantsTracker.setup(descendant)
    add_descendant(descendant)
  end

end # module DescendantsTracker

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
descendants_tracker-0.0.3 lib/descendants_tracker.rb
descendants_tracker-0.0.2 lib/descendants_tracker.rb