The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package DTL::Fast::Tag::BlockSuper;
use strict;
use utf8;
use warnings FATAL => 'all';
use parent 'DTL::Fast::Tag::Simple';

$DTL::Fast::TAG_HANDLERS{block_super} = __PACKAGE__;

#@Override
sub render
{
    my ( $self, $context ) = @_;
    my $result = '';

    my $ns = $context->{ns}->[- 1];

    if (# there is an inheritance and we are in block
        my $descendants = $ns->{_dtl_descendants}
            and exists $ns->{_dtl_rendering_block}
    )
    {
        my $current_template = $ns->{_dtl_rendering_template};
        my $current_block_name = $ns->{_dtl_rendering_block}->{block_name};

        for (my $i = 0; $i < scalar @$descendants; $i++)
        {
            if ($descendants->[$i] == $current_template) # found self
            {
                for (my $j = $i + 1; $j < scalar @$descendants; $j++)
                {
                    if ($descendants->[$j]->{blocks}->{$current_block_name}) # found parent block
                    {
                        $context->push_scope();
                        $ns->{_dtl_rendering_template} = $descendants->[$j];
                        $ns->{_dtl_rendering_block} = $descendants->[$j]->{blocks}->{$current_block_name};

                        $result = $descendants->[$j]->{blocks}->{$current_block_name}->SUPER::render($context);

                        $context->pop_scope();
                        last;
                    }

                }
                last;
            }

        }
    }

    return $result;
}

1;