class Object

def stub name, val_or_callable, *block_args, **block_kwargs, &block

def stub name, val_or_callable, *block_args, **block_kwargs, &block
  new_name = "__minitest_stub__#{name}"
  metaclass = class << self; self; end
  if respond_to? name and not methods.map(&:to_s).include? name.to_s then
    metaclass.send :define_method, name do |*args, **kwargs|
      super(*args, **kwargs)
    end
  end
  metaclass.send :alias_method, new_name, name
  if ENV["MT_KWARGS_HAC\K"] then
    metaclass.send :define_method, name do |*args, &blk|
      if val_or_callable.respond_to? :call then
        val_or_callable.call(*args, &blk)
      else
        blk.call(*block_args, **block_kwargs) if blk
        val_or_callable
      end
    end
  else
    metaclass.send :define_method, name do |*args, **kwargs, &blk|
      if val_or_callable.respond_to? :call then
        if kwargs.empty? then # FIX: drop this after 2.7 dead
          val_or_callable.call(*args, &blk)
        else
          val_or_callable.call(*args, **kwargs, &blk)
        end
      else
        if blk then
          if block_kwargs.empty? then # FIX: drop this after 2.7 dead
            blk.call(*block_args)
          else
            blk.call(*block_args, **block_kwargs)
          end
        end
        val_or_callable
      end
    end
  end
  block[self]
ensure
  metaclass.send :undef_method, name
  metaclass.send :alias_method, name, new_name
  metaclass.send :undef_method, new_name
end