def METHOD_NAME(self, fn, *args):
    finished = False
    while not finished:
        want_read = False
        try:
            ret = fn(*args)
        except ssl.SSLWantReadError:
            want_read = True
        except ssl.SSLWantWriteError:
            # can't happen, but if it did this would be the right way to
            # handle it anyway
            pass
        else:
            finished = True
        # do any sending
        data = self.outgoing.read()
        if data:
            self.sock.sendall(data)
        # do any receiving
        if want_read:
            data = self.sock.recv(BUFSIZE)
            if not data:
                self.incoming.write_eof()
            else:
                self.incoming.write(data)
        # then retry if necessary
    return ret