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::aliased_pkg;
use base qw/Template::Declare/;
use Template::Declare::Tags;

template 'relative'     => sub { show('local') };
template 'relative_dot' => sub { show('./local') };
template 'fullpath'     => sub { show('/aliased_pkg/local') };
template 'root'         => sub { show('/local') };
template 'parent'       => sub { show('../local') };

template 'local' => sub {
    div { outs( 'This is a template local to ' . __PACKAGE__ ) };
};

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

alias Wifty::UI::aliased_pkg under '/aliased_pkg';

template 'relative'     => sub { show('local') };
template 'relative_dot' => sub { show('./local') };
template 'root'         => sub { show('/local') };

template 'local' => sub {
    div { outs( 'This is a template local to ' . __PACKAGE__ ) };
};

# test '..' inside template name, not leading, may be it's rare, but people
# do crazy things
template 'up_level_inside/test'  => sub { show('local/../local') };
template 'up_level_inside/local' => sub { div { "This is up_level_inside/local" } };


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

use Test::More tests => 25;

ok( Wifty::UI::aliased_pkg->has_template('local') );
ok( Wifty::UI->has_template('local') );
ok( Template::Declare->has_template('aliased_pkg/local') );

{
    my $simple = ( show('local') );
    like( $simple, qr'template local' );
    like( $simple, qr'Wifty::UI', 'Correct package');
}

{
    my $simple = ( show('aliased_pkg/local') );
    like( $simple, qr'template local' );
    like( $simple, qr'Wifty::UI::aliased_pkg', 'Correct package');
}

for my $template (qw(aliased_pkg/relative aliased_pkg/relative_dot aliased_pkg/fullpath)) {
    my $simple = ( show( $template ) );
    like( $simple, qr'template local' );
    like( $simple, qr'Wifty::UI::aliased_pkg', 'Correct package for '.$template);
}

for my $template (qw(aliased_pkg/root aliased_pkg/parent relative relative_dot root)) {
    my $simple = ( show( $template ) );
    like( $simple, qr'template local' );
    like( $simple, qr'Wifty::UI', 'Correct package for '.$template);
}

{
    my $simple = ( show('up_level_inside/test') );
    like( $simple, qr{This is up_level_inside/local} );
}

{
    my $simple = ( show('/up_level_inside/any/../local') );
    like( $simple, qr{This is up_level_inside/local} );
}

1;