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

def self.skip

def self.skip
  @skip ||= false
end

def self.skip=(value)

def self.skip=(value)
  @skip = value
end

def self.skip_warning

# => nil
end
Faker::Generator.generate
Faker::Deprecator.skip_warning do

# => DEPRECATION WARNING: Faker::Generator is deprecated. Use Faker::NewGenerator instead.
Faker::Generator.generate

Silence deprecation warnings within the block.
def self.skip_warning
  original = Faker::Deprecator.skip
  Faker::Deprecator.skip = true
  yield
ensure
  Faker::Deprecator.skip = original
end

def self.skip_warning?

def self.skip_warning?
  skip == true
end

def const_missing(missing_const_name)

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)

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