def METHOD_NAME(self, size=-1):
    if size < 0:
        return self.readall()
    if not size or self._eof:
        return b""
    data = None  # Default if EOF is encountered
    # Depending on the input data, our call to the decompressor may not
    # return any data. In this case, try again after reading another block.
    while True:
        if self._decompressor.eof:
            rawblock = (self._decompressor.unused_data or
                        self._fp.METHOD_NAME(BUFFER_SIZE))
            if not rawblock:
                break
            # Continue to next stream.
            self._decompressor = self._decomp_factory(
                **self._decomp_args)
            try:
                data = self._decompressor.decompress(rawblock, size)
            except self._trailing_error:
                # Trailing data isn't a valid compressed stream; ignore it.
                break
        else:
            if self._decompressor.needs_input:
                rawblock = self._fp.METHOD_NAME(BUFFER_SIZE)
                if not rawblock:
                    raise EOFError("Compressed file ended before the "
                                   "end-of-stream marker was reached")
            else:
                rawblock = b""
            data = self._decompressor.decompress(rawblock, size)
        if data:
            break
    if not data:
        self._eof = True
        self._size = self._pos
        return b""
    self._pos += len(data)
    return data