def METHOD_NAME(cls, element_path: ElementPath, parent_element: Element) -> Tuple[RemoveAction, Element]:
    """For the element_path, remove a model from the parent_element of a given parent_model.
    First we check if there is an existing element at that path
    If not, we complain.
    Then we set up an action plan to update the model (specified by file_path) in memory,
    return the action and return the parent_element.
    LIMITATIONS:
    1. This does not remove elements of a list or dict. Instead, the entire list or dict is removed.
    2. This cannot remove arbitrarily named elements that are not specified in the schema.
    For example, "responsible-parties" contains named elements, e.g., "organisation". The tool will not
    remove the "organisation" as it is not in the schema, but one can remove its elements, e.g., "party-uuids".
    """
    element_path_list = element_path.get_full_path_parts()
    if '*' in element_path_list:
        raise err.TrestleError('trestle remove does not support Wildcard element path.')
    deleting_element = parent_element.get_at(element_path)
    if deleting_element is not None:
        # The element already exists
        if type(deleting_element) is list:
            logger.warning(
                'Warning: trestle remove does not support removing elements of a list: '
                'this removes the entire list'
            )
        elif type(deleting_element) is dict:
            logger.warning(
                'Warning: trestle remove does not support removing dict elements: '
                'this removes the entire dict element'
            )
    else:
        raise err.TrestleError(f'Bad element path: {str(element_path)}')
    remove_action = RemoveAction(parent_element, element_path)
    return remove_action, parent_element