'Add a new lockstring to handler.
Args:
lockstring (str): A string on the form
`"<access_type>:<functions>"`.  Multiple access types
should be separated by semicolon (`;`).
Returns:
success (bool): The outcome of the addition, `False` on
error.'

def add(self, lockstring):

    for lockdef in lockstring.split(';'):
        if (not (':' in lockstring)):
            self._log_error((_("Lock:    '%s'    contains    no    colon    (:).") % lockdef))
            return False
        (access_type, rhs) = [part.strip() for part in lockdef.split(':', 1)]
        if (not access_type):
            self._log_error((_("Lock:    '%s'    has    no    access_type    (left-side    of    colon    is    empty).") % lockdef))
            return False
        if (rhs.count('(') != rhs.count(')')):
            self._log_error((_("Lock:    '%s'    has    mismatched    parentheses.") % lockdef))
            return False
        if (not _RE_FUNCS.findall(rhs)):
            self._log_error((_("Lock:    '%s'    has    no    valid    lock    functions.") % lockdef))
            return False
    storage_lockstring = self.obj.lock_storage
    if storage_lockstring:
        storage_lockstring = ((storage_lockstring + ';') + lockstring)
    else:
        storage_lockstring = lockstring
    self._cache_locks(storage_lockstring)
    self._save_locks()
    return True
