protected function resolve($id)
    {
        $keys = explode(self::SEPARATOR, $id);
        $node = & $this->components;

        while ($key = array_shift($keys)) {
            if (!is_array($node) || !array_key_exists($key, $node)) {
                throw new ContainerException(sprintf('Invalid or unknown component/parameter identifier "%s"', $id));
            }

            $node = & $node[$key];
        }

        return is_callable($node) ? $node($this) : $node;
    }