def METHOD_NAME(self, path: str, match_context):
    """
    Try to find a match on given data for the test model and the selected branch.
    @param path the model path to the parent model element invoking this method.
    @param match_context an instance of MatchContext class holding the data context to match against.
    @return the matchElement or None if the test model did not match, no branch was selected or the branch did not match.
    """
    current_path = f"{path}/{self.element_id}"
    start_data = match_context.match_data
    model_match = self.value_model.METHOD_NAME(current_path, match_context)
    if model_match is None:
        return None
    # Now extract the test path value from the model_match. From here on, the matchContext is already modified so we must NEVER just
    # return but revert the changes in the context first.
    remaining_value_path = self.value_path
    test_match = model_match
    current_test_path = test_match.get_path()
    while remaining_value_path is not None:
        next_part_pos = remaining_value_path.find('/')
        if next_part_pos <= 0:
            current_test_path += '/' + remaining_value_path
            remaining_value_path = None
        else:
            current_test_path += '/' + remaining_value_path[:next_part_pos]
            remaining_value_path = remaining_value_path[next_part_pos + 1:]
        match_children = test_match.get_children()
        test_match = None
        if match_children is None:
            break
        for child in match_children:
            if child.get_path() == current_test_path:
                test_match = child
                break
    branch_match = None
    if test_match is not None:
        if isinstance(test_match.get_match_object(), bytes):
            branch_model = self.branch_model_dict.get(test_match.get_match_object().decode(AminerConfig.ENCODING), self.default_branch)
        else:
            branch_model = self.branch_model_dict.get(test_match.get_match_object(), self.default_branch)
        if branch_model is not None:
            branch_match = branch_model.METHOD_NAME(current_path, match_context)
    if branch_match is None:
        match_context.match_data = start_data
        return None
    return MatchElement(current_path, start_data[:len(start_data) - len(match_context.match_data)],
                        start_data[:len(start_data) - len(match_context.match_data)], [model_match, branch_match])