public function remove(string $name): self{
        if(!array_key_exists($name, $this->routes)){
            return $this;
        }

        $route  = $this->routes[$name];
        $node   = $this->leaves[$route];

        unset($this->routes[$name]);
        unset($this->leaves[$route]);

        $node->removeRoute($route);

        while(0 === count($node->getRoutes()) && $node !== $node->getParent()){
            $parent = $node->getParent();

            $parent->removeChildNode($node);

            $node   = $parent;
        }

        return $this;
    }