@classmethod
def with_params(cls, xid, path, watch, data, offset, size, client, server):
    """
    Build a ClientMessage with the given params, possibly parsing some more.

    This must be overridden by subclasses so the specific parameters to each subclass
    can be extracted.

    :param xid: the transaction id associated with this ClientMessage
    :param path: the path associated with this ClientMessage, if any
    :param watch: a boolean indicating if watch on the path should be set
    :param data: the remaining data of the associated data packet
    :param offset: the offset from which the data should be read
    :param size: the total size of this ClientMessage
    :param client: the ip:port generating this ClientMessage

    :returns: Returns an instance of the specific ClientMessage subclass.
    :raises DeserializationError: if parsing the ClientMessage fails.
    """
    return cls(size, xid, path, client, watch, server)
