protected function convertViewHelperNode(ViewHelperNode $node)
    {
        $initializationPhpCode = '// Rendering ViewHelper ' . $node->getViewHelperClassName() . chr(10);

        // Build up $arguments array
        $argumentsVariableName = $this->variableName('arguments');
        $initializationPhpCode .= sprintf('%s = array();', $argumentsVariableName) . chr(10);

        $alreadyBuiltArguments = array();
        foreach ($node->getArguments() as $argumentName => $argumentValue) {
            $converted = $this->convert($argumentValue);
            $initializationPhpCode .= $converted['initialization'];
            $initializationPhpCode .= sprintf('%s[\'%s\'] = %s;', $argumentsVariableName, $argumentName, $converted['execution']) . chr(10);
            $alreadyBuiltArguments[$argumentName] = true;
        }

        /** @var $argumentDefinition ArgumentDefinition */
        foreach ($node->getUninitializedViewHelper()->prepareArguments() as $argumentName => $argumentDefinition) {
            if (!isset($alreadyBuiltArguments[$argumentName])) {
                $initializationPhpCode .= sprintf('%s[\'%s\'] = %s;', $argumentsVariableName, $argumentName, var_export($argumentDefinition->getDefaultValue(), true)) . chr(10);
            }
        }

        // Build up closure which renders the child nodes
        $renderChildrenClosureVariableName = $this->variableName('renderChildrenClosure');
        $initializationPhpCode .= sprintf('%s = %s;', $renderChildrenClosureVariableName, $this->wrapChildNodesInClosure($node)) . chr(10);

        if ($node->getUninitializedViewHelper() instanceof CompilableInterface) {
            // ViewHelper is compilable
            $viewHelperInitializationPhpCode = '';
            $convertedViewHelperExecutionCode = $node->getUninitializedViewHelper()->compile($argumentsVariableName, $renderChildrenClosureVariableName, $viewHelperInitializationPhpCode, $node, $this);
            $initializationPhpCode .= $viewHelperInitializationPhpCode;
            if ($convertedViewHelperExecutionCode !== self::SHOULD_GENERATE_VIEWHELPER_INVOCATION) {
                return array(
                    'initialization' => $initializationPhpCode,
                    'execution' => $convertedViewHelperExecutionCode
                );
            }
        }

        // ViewHelper is not compilable, so we need to instanciate it directly and render it.
        $viewHelperVariableName = $this->variableName('viewHelper');

        $initializationPhpCode .= sprintf('%s = $self->getViewHelper(\'%s\', $renderingContext, \'%s\');', $viewHelperVariableName, $viewHelperVariableName, $node->getViewHelperClassName()) . chr(10);
        $initializationPhpCode .= sprintf('%s->setArguments(%s);', $viewHelperVariableName, $argumentsVariableName) . chr(10);
        $initializationPhpCode .= sprintf('%s->setRenderingContext($renderingContext);', $viewHelperVariableName) . chr(10);

        $initializationPhpCode .= sprintf('%s->setRenderChildrenClosure(%s);', $viewHelperVariableName, $renderChildrenClosureVariableName) . chr(10);

        $initializationPhpCode .= '// End of ViewHelper ' . $node->getViewHelperClassName() . chr(10);

        return array(
            'initialization' => $initializationPhpCode,
            'execution' => sprintf('%s->initializeArgumentsAndRender()', $viewHelperVariableName)
        );
    }