class Cucumber::Formatter::Interceptor::Pipe

def self.unwrap!(pipe)

def self.unwrap!(pipe)
  validate_pipe pipe
  wrapped = nil
  case pipe
  when :stdout
    wrapped = $stdout
    $stdout = wrapped.unwrap! if $stdout.respond_to?(:unwrap!)
  when :stderr
    wrapped = $stderr
    $stderr = wrapped.unwrap! if $stderr.respond_to?(:unwrap!)
  end
  wrapped
end

def self.validate_pipe(pipe)

def self.validate_pipe(pipe)
  raise ArgumentError, '#wrap only accepts :stderr or :stdout' unless %i[stdout stderr].include? pipe
end

def self.wrap(pipe)

def self.wrap(pipe)
  validate_pipe pipe
  case pipe
  when :stderr
    $stderr = new($stderr)
    return $stderr
  when :stdout
    $stdout = new($stdout)
    return $stdout
  end
end

def buffer_string

def buffer_string
  @lock.synchronize do
    return @buffer.string.dup
  end
end

def initialize(pipe)

def initialize(pipe)
  @pipe = pipe
  @buffer = StringIO.new
  @wrapped = true
  @lock = Mutex.new
end

def method_missing(method, *args, &blk)

def method_missing(method, *args, &blk)
  @pipe.send(method, *args, &blk) || super
end

def respond_to_missing?(method, include_private = false)

def respond_to_missing?(method, include_private = false)
  super || @pipe.respond_to?(method, include_private)
end

def unwrap!

def unwrap!
  @wrapped = false
  @pipe
end

def write(str)

def write(str)
  @lock.synchronize do
    @buffer << str if @wrapped
    return @pipe.write(str)
  end
end