/**
  * Call the view helper associated with this object.
  *
  * First, it evaluates the arguments of the view helper.
  *
  * If the view helper implements Tx_Fluid_Core_ViewHelper_Facets_ChildNodeAccessInterface,
  * it calls setChildNodes(array childNodes) on the view helper.
  *
  * Afterwards, checks that the view helper did not leave a variable lying around.
  *
  * @param Tx_Fluid_Core_Rendering_RenderingContextInterface $renderingContext
  * @return object evaluated node after the view helper has been called.
  * @author Sebastian Kurfürst <*****@*****.**>
  * @author Karsten Dambekalns <*****@*****.**>
  * @todo check recreation of viewhelper when revisiting caching
  */
 public function evaluate(Tx_Fluid_Core_Rendering_RenderingContextInterface $renderingContext)
 {
     $objectManager = $renderingContext->getObjectManager();
     $contextVariables = $renderingContext->getTemplateVariableContainer()->getAllIdentifiers();
     if ($this->viewHelpersByContext->contains($renderingContext)) {
         $viewHelper = $this->viewHelpersByContext[$renderingContext];
     } else {
         $viewHelper = clone $this->uninitializedViewHelper;
         $this->viewHelpersByContext->attach($renderingContext, $viewHelper);
     }
     $evaluatedArguments = array();
     $renderMethodParameters = array();
     if (count($viewHelper->prepareArguments())) {
         foreach ($viewHelper->prepareArguments() as $argumentName => $argumentDefinition) {
             if (isset($this->arguments[$argumentName])) {
                 $argumentValue = $this->arguments[$argumentName];
                 $evaluatedArguments[$argumentName] = $this->convertArgumentValue($argumentValue, $argumentDefinition->getType(), $renderingContext);
             } else {
                 $evaluatedArguments[$argumentName] = $argumentDefinition->getDefaultValue();
             }
             if ($argumentDefinition->isMethodParameter()) {
                 $renderMethodParameters[$argumentName] = $evaluatedArguments[$argumentName];
             }
         }
     }
     $viewHelperArguments = $objectManager->create('Tx_Fluid_Core_ViewHelper_Arguments', $evaluatedArguments);
     $viewHelper->setArguments($viewHelperArguments);
     $viewHelper->setTemplateVariableContainer($renderingContext->getTemplateVariableContainer());
     if ($renderingContext->getControllerContext() !== NULL) {
         $viewHelper->setControllerContext($renderingContext->getControllerContext());
     }
     $viewHelper->setViewHelperVariableContainer($renderingContext->getViewHelperVariableContainer());
     $viewHelper->setViewHelperNode($this);
     $viewHelper->setRenderingContext($renderingContext);
     if ($viewHelper instanceof Tx_Fluid_Core_ViewHelper_Facets_ChildNodeAccessInterface) {
         $viewHelper->setChildNodes($this->childNodes);
     }
     $output = $viewHelper->initializeArgumentsAndRender($renderMethodParameters);
     return $output;
 }