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( dispatch_to => ['Wifty::UI'] );

use Test::More tests => 4;
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"
);

##############################################################################
# Documentation example.
    package My::Template;
    use Template::Declare::Tags;
    use base 'Template::Declare';

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

        smart_tag_wrapper {
            my %params = @_; # set using 'with'
            form {
                attr { map {$_ => $params{attr}{$_} } sort keys %{ $params{attr} } };
                $code->();
                input { attr { type => 'submit', value => $params{value} } };
            };
        };
    }

    template edit_prefs => sub {
        with(
            attr  => { id => 'edit_prefs', action => 'edit.html' },
            value => 'Save'
        ), myform {
            label { 'Time Zone' };
            input { type is 'text'; name is 'tz' };
        };
    };

    package main;
    Template::Declare->init( dispatch_to => ['My::Template'] );

ok my $output = Template::Declare->show('edit_prefs'), 'Get edit_prefs output';
is(
    $output,
    qq{

<form action="edit.html" id="edit_prefs">
 <label>Time Zone</label>
 <input type="text" name="tz" />
 <input type="submit" value="Save" />
</form>}, "got correct output for simple"
);