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 20
      def clear
        if defined? ActiveSupport::Dependencies
          @@direct_descendants.each do |klass, descendants|
            if ActiveSupport::Dependencies.autoloaded?(klass)
              @@direct_descendants.delete(klass)
            else
              descendants.reject! { |v| ActiveSupport::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 14
      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 10
      def direct_descendants(klass)
        @@direct_descendants[klass] || []
      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 36
      def store_inherited(klass, descendant)
        (@@direct_descendants[klass] ||= []) << descendant
      end
🔎 See on GitHub

Instance Public methods

descendants()

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

direct_descendants()

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

inherited(base)

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