def METHOD_NAME(
    self,
    node: _ArgTree,
    source: _RawArgTree,
) -> '_ArgTree':
    """
    Builds argument tree.
    Each argument can point to zero, one, or more other nodes.
    Arguments that have zero children are treated as bottom (last) ones.
    Arguments that have just one child are meant to be regular functions.
    Arguments that have more than one child are treated as overloads.
    """
    def factory(
        args: _RawArgTree,
    ) -> Iterator[Tuple[List[FuncArg], _RawArgTree]]:
        if not args or not args[0]:
            return  # we have reached an end of arguments
        yield from (
            (case, [group[1:] for group in grouped])
            for case, grouped in groupby(args, itemgetter(0))
        )
    for case, rest in factory(source):
        new_node = _ArgTree(
            Intermediate(self._default).with_signature(case),
        )
        node.children.append(new_node)
        self.METHOD_NAME(source=rest, node=new_node)
    return node