Creating and using own Twig features with Twig tags

Code
<?php

// creating Twig Tag as Extension
class MyTwigTags extends Twig_Extension
{
    public function 
getName()
    {
        return 
'MyTags';
    }
    
    public function 
getTokenParsers()
    {
        return [new 
ListTokenParser()];
    }
}

// parser of the new tag
class ListTokenParser extends Twig_TokenParser
{
    public function 
getTag()
    {
        return 
'list';
    }
    
    public function 
parse(Twig_Token $token)
    {
        
$this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);
        
$body $this->parser->subparse(array($this'decideSpacelessEnd'), true);
        
$this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);
        
        return new 
ListNode($body$token->getLine(), $this->getTag());
    }
    
    public function 
decideSpacelessEnd(Twig_Token $token)
    {
        return 
$token->test('endlist');
    }
}

// interpretation and execution of tag and its values
class ListNode extends Twig_Node
{
    public function 
__construct($body$line$tag
    { 
        
parent::__construct(array('body' => $body), array(), $line$tag);
    }
    
    public function 
compile(Twig_Compiler $compiler)
    {
        
$compiler
            
->addDebugInfo($this)
            ->
write('ob_start();' PHP_EOL)
            ->
subcompile($this->getNode('body'))
            ->
write('$list = explode(PHP_EOL, trim(ob_get_clean()));' PHP_EOL)
            ->
write('echo \'<ul>\';' PHP_EOL)
            ->
write('foreach ($list as $node) {' PHP_EOL)
            ->
write('echo \'<li>\' . $node . \'</li>\';' PHP_EOL)
            ->
write('}' PHP_EOL)
            ->
write('echo \'</ul>\';' PHP_EOL);
    }
}

$path __DIR__ '/templates/';
$file 'list.html.twig';

echo 
'<b>- template content:</b>' PHP_EOL;
echo 
file_get_contents($path $file) . PHP_EOL;

$loader = new Twig_Loader_Filesystem($path);
$twig = new Twig_Environment($loader);
$twig->addExtension(new MyTwigTags());

echo 
'<b>- rendered template:</b>' PHP_EOL;
echo 
$twig->render($file);
Result
- template content:
My list:
{% list %}
step 1
step 2
step 3
{% endlist %}
- rendered template:
My list:
  • step 1
  • step 2
  • step 3