class gzip_open_func(object):
    """gzip open func
    modes:
    (r) read using gzip.GzipFile
    (w) write using system gzip
    (P) PIPE from `gzip -d` for
    """
    def __init__(self, filename, mode='r', path_to_gzip='gzip'):
        self._filename = filename
        self._mode = mode
        self._path_to_gzip = path_to_gzip
        self._pickle_safe_init()

    def _pickle_safe_init(self):
        filename = self._filename
        if self._mode[0] == 'w':
            args = [self._path_to_gzip, '-f', '-c', '-']
            stdout = open(filename, 'wb')
            self._stdout = stdout
            self.proc = Popen(args, stdin=PIPE, bufsize=0,
                              stderr=stderr,
                              stdout=stdout)
            self.write = self.proc.stdin.write
            self.close = self._close_w
            self.filename = filename
        elif self._mode[0] == 'r':
            self._file = GzipFile(filename, 'rb')
            self.read = self._file.read
            self.readline = self._file.readline
            self.close = self._file.close
        else:
            raise NotImplementedError

    def __getnewargs__(self):
        return (self._mode, self._filename)

    def __getstate__(self):
        result = {}
        result['_mode'] = self._mode
        result['_filename'] = self._filename
        result['_path_to_gzip'] = self._path_to_gzip
        return result

    def __iter__(self):
        if not self._mode == 'r':
            raise IOError('cannot iterate over file in write mode')
        return self._file.__iter__()

    def _close_w(self):
        """returns returncode
        """
        self.proc.stdin.flush()
        self._stdout.flush()
#            self.proc.stdout.flush()
        self._stdout.close()
#            self.proc.communicate('\x1a')
        return