public function evaluate(RenderingContextInterface $renderingContext)
    {
        if ($this->viewHelpersByContext->contains($renderingContext)) {
            $viewHelper = $this->viewHelpersByContext->offsetGet($renderingContext);
            $viewHelper->resetState();
        } else {
            $viewHelper = clone $this->uninitializedViewHelper;
            $this->viewHelpersByContext->attach($renderingContext, $viewHelper);
        }

        $evaluatedArguments = array();
        if (count($viewHelper->prepareArguments())) {
            /** @var $argumentDefinition ArgumentDefinition */
            foreach ($viewHelper->prepareArguments() as $argumentName => $argumentDefinition) {
                if (isset($this->arguments[$argumentName])) {
                    /** @var $argumentValue NodeInterface */
                    $argumentValue = $this->arguments[$argumentName];
                    $evaluatedArguments[$argumentName] = $argumentValue->evaluate($renderingContext);
                } else {
                    $evaluatedArguments[$argumentName] = $argumentDefinition->getDefaultValue();
                }
            }
        }

        $viewHelper->setArguments($evaluatedArguments);
        $viewHelper->setViewHelperNode($this);
        $viewHelper->setRenderingContext($renderingContext);

        if ($viewHelper instanceof ChildNodeAccessInterface) {
            $viewHelper->setChildNodes($this->childNodes);
        }

        $output = $viewHelper->initializeArgumentsAndRender();

        return $output;
    }