module Faker::Deprecator

def self.included(base)

def self.included(base)
  extension = Module.new do
    def const_missing(missing_const_name)
      if class_variable_defined?(:@@_deprecated_constants) && (replacement = class_variable_get(:@@_deprecated_constants)[missing_const_name.to_s])
        unless Faker::Deprecator.skip_warning?
          deprecated_message = "#{name}::#{replacement[:old_generator]} is deprecated."
          replacement_message = "Use #{replacement[:new_constant]} instead."
          $stdout.puts("DEPRECATION WARNING: #{deprecated_message} #{replacement_message}")
        end
        return replacement[:new_constant]
      end
      super
    end
    def deprecate_generator(old_generator_name, new_generator_constant)
      class_variable_set(:@@_deprecated_constants, {}) unless class_variable_defined?(:@@_deprecated_constants)
      class_variable_get(:@@_deprecated_constants)[old_generator_name] = {
        new_constant: new_generator_constant,
        old_generator: old_generator_name
      }
    end
  end
  base.singleton_class.prepend extension
end