This module provides an internal implementation to track descendants which is faster than iterating through ObjectSpace.

Methods

Class Public methods

clear()

📝 Source code
# File activesupport/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
🔎 See on GitHub

descendants(klass)

📝 Source code
# File activesupport/lib/active_support/descendants_tracker.rb, line 17
      def descendants(klass)
        arr = []
        accumulate_descendants(klass, arr)
        arr
      end
🔎 See on GitHub

direct_descendants(klass)

📝 Source code
# File activesupport/lib/active_support/descendants_tracker.rb, line 12
      def direct_descendants(klass)
        descendants = @@direct_descendants[klass]
        descendants ? descendants.to_a : []
      end
🔎 See on GitHub

store_inherited(klass, descendant)

This is the only method that is not thread safe, but is only ever called during the eager loading phase.

📝 Source code
# File activesupport/lib/active_support/descendants_tracker.rb, line 39
      def store_inherited(klass, descendant)
        (@@direct_descendants[klass] ||= DescendantsArray.new) << descendant
      end
🔎 See on GitHub

Instance Public methods

descendants()

📝 Source code
# File activesupport/lib/active_support/descendants_tracker.rb, line 63
    def descendants
      DescendantsTracker.descendants(self)
    end
🔎 See on GitHub

direct_descendants()

📝 Source code
# File activesupport/lib/active_support/descendants_tracker.rb, line 59
    def direct_descendants
      DescendantsTracker.direct_descendants(self)
    end
🔎 See on GitHub

inherited(base)

📝 Source code
# File activesupport/lib/active_support/descendants_tracker.rb, line 54
    def inherited(base)
      DescendantsTracker.store_inherited(self, base)
      super
    end
🔎 See on GitHub