module ActiveSupport::DescendantsTracker

def self.clear

def self.clear
  @@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
end

def self.descendants(klass)

def self.descendants(klass)
  @@direct_descendants[klass].inject([]) do |descendants, _klass|
    descendants << _klass
    descendants.concat _klass.descendants
  end
end

def self.direct_descendants(klass)

def self.direct_descendants(klass)
  @@direct_descendants[klass]
end

def descendants

def descendants
  DescendantsTracker.descendants(self)
end

def direct_descendants

def direct_descendants
  DescendantsTracker.direct_descendants(self)
end

def inherited(base)

def inherited(base)
  self.direct_descendants << base
  super
end