# File lib/composite_io.rb, line 23
  def read(amount = nil, buf = nil)
    buffer = buf || ''
    done = if amount; nil; else ''; end
    partial_amount = amount
    parts = @ios.dup

    loop do
      result = done

      while !parts.empty? && (result = parts.first.read(partial_amount)) == done
        parts.shift
      end

      result.force_encoding("BINARY") if result.respond_to?(:force_encoding)
      buffer << result if result
      partial_amount -= result.length if partial_amount && result != done

      break if partial_amount && partial_amount <= 0
      break if result == done
    end

    if buffer.length > 0
      buffer
    else
      done
    end
  end