module ActiveSupport::Deprecation::DeprecatedConstantAccessor

def self.included(base)

def self.included(base)
  require "active_support/inflector/methods"
  extension = Module.new do
    def const_missing(missing_const_name)
      if class_variable_defined?(:@@_deprecated_constants)
        if (replacement = class_variable_get(:@@_deprecated_constants)[missing_const_name.to_s])
          replacement[:deprecator].warn(replacement[:message] || "#{name}::#{missing_const_name} is deprecated! Use #{replacement[:new]} instead.", caller_locations)
          return ActiveSupport::Inflector.constantize(replacement[:new].to_s)
        end
      end
      super
    end
    def deprecate_constant(const_name, new_constant, message: nil, deprecator: ActiveSupport::Deprecation.instance)
      class_variable_set(:@@_deprecated_constants, {}) unless class_variable_defined?(:@@_deprecated_constants)
      class_variable_get(:@@_deprecated_constants)[const_name.to_s] = { new: new_constant, message: message, deprecator: deprecator }
    end
  end
  base.singleton_class.prepend extension
end

def const_missing(missing_const_name)

def const_missing(missing_const_name)
  if class_variable_defined?(:@@_deprecated_constants)
    if (replacement = class_variable_get(:@@_deprecated_constants)[missing_const_name.to_s])
      replacement[:deprecator].warn(replacement[:message] || "#{name}::#{missing_const_name} is deprecated! Use #{replacement[:new]} instead.", caller_locations)
      return ActiveSupport::Inflector.constantize(replacement[:new].to_s)
    end
  end
  super
end

def deprecate_constant(const_name, new_constant, message: nil, deprecator: ActiveSupport::Deprecation.instance)

def deprecate_constant(const_name, new_constant, message: nil, deprecator: ActiveSupport::Deprecation.instance)
  class_variable_set(:@@_deprecated_constants, {}) unless class_variable_defined?(:@@_deprecated_constants)
  class_variable_get(:@@_deprecated_constants)[const_name.to_s] = { new: new_constant, message: message, deprecator: deprecator }
end