<?php 
 
/* 
 * This file is part of Twig. 
 * 
 * (c) Fabien Potencier 
 * 
 * For the full copyright and license information, please view the LICENSE 
 * file that was distributed with this source code. 
 */ 
 
namespace Twig; 
 
/** 
 * Exposes a template to userland. 
 * 
 * @author Fabien Potencier <fabien@symfony.com> 
 */ 
final class TemplateWrapper 
{ 
    private $env; 
    private $template; 
 
    /** 
     * This method is for internal use only and should never be called 
     * directly (use Twig\Environment::load() instead). 
     * 
     * @internal 
     */ 
    public function __construct(Environment $env, Template $template) 
    { 
        $this->env = $env; 
        $this->template = $template; 
    } 
 
    /** 
     * Renders the template. 
     * 
     * @param array $context An array of parameters to pass to the template 
     */ 
    public function render(array $context = []): string 
    { 
        // using func_get_args() allows to not expose the blocks argument 
        // as it should only be used by internal code 
        return $this->template->render($context, \func_get_args()[1] ?? []); 
    } 
 
    /** 
     * Displays the template. 
     * 
     * @param array $context An array of parameters to pass to the template 
     */ 
    public function display(array $context = []) 
    { 
        // using func_get_args() allows to not expose the blocks argument 
        // as it should only be used by internal code 
        $this->template->display($context, \func_get_args()[1] ?? []); 
    } 
 
    /** 
     * Checks if a block is defined. 
     * 
     * @param string $name    The block name 
     * @param array  $context An array of parameters to pass to the template 
     */ 
    public function hasBlock(string $name, array $context = []): bool 
    { 
        return $this->template->hasBlock($name, $context); 
    } 
 
    /** 
     * Returns defined block names in the template. 
     * 
     * @param array $context An array of parameters to pass to the template 
     * 
     * @return string[] An array of defined template block names 
     */ 
    public function getBlockNames(array $context = []): array 
    { 
        return $this->template->getBlockNames($context); 
    } 
 
    /** 
     * Renders a template block. 
     * 
     * @param string $name    The block name to render 
     * @param array  $context An array of parameters to pass to the template 
     * 
     * @return string The rendered block 
     */ 
    public function renderBlock(string $name, array $context = []): string 
    { 
        $context = $this->env->mergeGlobals($context); 
        $level = ob_get_level(); 
        if ($this->env->isDebug()) { 
            ob_start(); 
        } else { 
            ob_start(function () { return ''; }); 
        } 
        try { 
            $this->template->displayBlock($name, $context); 
        } catch (\Throwable $e) { 
            while (ob_get_level() > $level) { 
                ob_end_clean(); 
            } 
 
            throw $e; 
        } 
 
        return ob_get_clean(); 
    } 
 
    /** 
     * Displays a template block. 
     * 
     * @param string $name    The block name to render 
     * @param array  $context An array of parameters to pass to the template 
     */ 
    public function displayBlock(string $name, array $context = []) 
    { 
        $this->template->displayBlock($name, $this->env->mergeGlobals($context)); 
    } 
 
    public function getSourceContext(): Source 
    { 
        return $this->template->getSourceContext(); 
    } 
 
    public function getTemplateName(): string 
    { 
        return $this->template->getTemplateName(); 
    } 
 
    /** 
     * @internal 
     * 
     * @return Template 
     */ 
    public function unwrap() 
    { 
        return $this->template; 
    } 
} 
 
class_alias('Twig\TemplateWrapper', 'Twig_TemplateWrapper');