class EacRubyUtils::Ruby::OnReplaceObjects

def add_replacement(method_name, *args, &block)

def add_replacement(method_name, *args, &block)
  @replacements << replacement_class(method_name).new(*args, &block).apply
end

def clear_replacements

def clear_replacements
  @replacements = []
end

def on_replacement(&block)

def on_replacement(&block)
  clear_replacements
  block.call(self)
ensure
  restore_replacements
end

def replace_instance_method(a_module, method_name, &block)

def replace_instance_method(a_module, method_name, &block)
  add_replacement(__method__, a_module, method_name, &block)
end

def replace_self_method(object, method_name, &block)

def replace_self_method(object, method_name, &block)
  add_replacement(:replace_instance_method, object.singleton_class, method_name, &block)
end

def replacement_class(method_name)

def replacement_class(method_name)
  self.class.const_get(::ActiveSupport::Inflector.camelize(method_name))
end

def restore_replacements

def restore_replacements
  @replacements.reverse.each(&:restore)
end