'Insert a new node in the tree.
It\'s recursive: it walks the path of nodes, being each node a
part of the URL, checking every time if needs to create a new
node or just enter in it.
:param parent: the parent to insert the node
:param parts: the rest of the parts to walk the path
:param holder: the dict when what is already exists is stored.
:param rec_cntr: the recursion counter
:return: The new or modified holder'

def _insertNodes(self, parent, parts, holder, rec_cntr):

    if (not parts):
        return {}
    node = parts[0]
    rest = parts[1:]
    if (rec_cntr >= RECURSION_LIMIT):
        newtreenode = self.treestore.append(parent, [RECURSION_MSG])
        self.grapher.limit_node(parent, newtreenode, RECURSION_MSG)
        return holder
    if (node in holder):
        (treenode, children) = holder[node]
        return self._insertNodes(treenode, rest, children, (rec_cntr + 1))
    newtreenode = self.treestore.append(parent, [node])
    self.grapher.new_node(parent, newtreenode, node, (not rest))
    newholdnode = self._insertNodes(newtreenode, rest, {}, (rec_cntr + 1))
    holder[node] = (newtreenode, newholdnode)
    return holder
