module FakeFS::Kernel

def self.hijack(name, &block)

NOTE: maybe private
def self.hijack(name, &block)
  captives[:original][name] = ::Kernel.method(name.to_sym)
  captives[:hijacked][name] = block || proc { |_args| }
end

def self.hijack!

def self.hijack!
  captives[:hijacked].each do |name, prc|
    ::Kernel.send(:remove_method, name.to_sym)
    ::Kernel.send(:define_method, name.to_sym, &prc)
    ::Kernel.send(:private, name.to_sym)
  end
end

def self.unhijack!

def self.unhijack!
  captives[:original].each_key do |name|
    ::Kernel.send(:remove_method, name.to_sym)
    ::Kernel.send(:define_method, name.to_sym, proc do |*args, **kwargs, &block|
      ::FakeFS::Kernel.captives[:original][name].call(*args, **kwargs, &block)
    end)
    ::Kernel.send(:private, name.to_sym)
  end
end