The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use warnings;
use strict;

package Wifty::UI;
use base qw/Template::Declare/;
use Template::Declare::Tags;

sub test_smart_tag (&) {
    my $code = shift;

    smart_tag_wrapper {
        my %args = @_;
        outs(   "START "
              . join( ', ', map { "$_: $args{$_}" } sort keys %args )
              . "\n" );
        $code->();
        outs("END\n");
    };
}

template simple => sub {
    with( foo => 'bar' ),    #
      test_smart_tag { outs("simple\n"); };
};

template leak_check => sub {
    with( foo => 'bar' ),    #
      test_smart_tag { outs("first\n"); };
    test_smart_tag   { outs("second\n"); };
};

package main;
use Template::Declare::Tags;
Template::Declare->init( roots => ['Wifty::UI'] );

use Test::More tests => 2;
require "t/utils.pl";

my $simple = show('simple');
is(
    $simple,
    "\nSTART foo: bar\nsimple\nEND\n",
    "got correct output for simple"
);

my $leak_check = show('leak_check');
is(
    $leak_check,                        #
    "\nSTART foo: bar\nfirst\nEND\n"    #
      . "\nSTART \nsecond\nEND\n",      #
    "got correct output for simple"
);