use warnings;
use strict;
##############################################################################
package Wifty::UI::imported_pkg;
use base qw/Template::Declare/;
use Template::Declare::Tags;
template 'imported' => sub {
my $self = shift;
div { outs_raw "Invocant: '$self'" };
};
##############################################################################
package Wifty::UI::imported_subclass_pkg;
use base qw/Wifty::UI::imported_pkg/;
use Template::Declare::Tags;
##############################################################################
package Wifty::UI;
use base qw/Template::Declare/;
use Template::Declare::Tags;
template simple => sub {
print '# ', ref +shift, $/;
html {
head {};
body { show 'private-content'; };
}
};
private template 'private-content' => sub {
my $self = shift;
with ( id => 'body' ), div {
outs( 'This is my content from' . $self );
};
};
import_templates Wifty::UI::imported_pkg under '/imported_pkg';
import_templates Wifty::UI::imported_subclass_pkg under '/imported_subclass_pkg';
##############################################################################
package Wifty::OtherUI;
use base qw/Template::Declare/;
use Template::Declare::Tags;
import_templates Wifty::UI::imported_pkg under '/other_pkg';
import_templates Wifty::UI::imported_subclass_pkg under '/other_subclass';
##############################################################################
package main;
use Template::Declare::Tags;
Template::Declare->init( dispatch_to => ['Wifty::UI'] );
use Test::More tests => 18;
#use Test::More 'no_plan';
require "t/utils.pl";
# Visibility.
ok( Wifty::UI::imported_pkg->has_template('imported'),
'Original template should be visible in its own class' );
ok( Wifty::UI::imported_subclass_pkg->has_template('imported'),
'And be visible in a subclass');
ok( !Template::Declare->has_template('imported'),
'But it should not be visible in Template::Declare');
ok( !Wifty::UI->has_template('imported'),
'Nor in the packge it was imported into' );
ok( Template::Declare->has_template('imported_pkg/imported'),
'But it should be visible in its imported path' );
ok( Template::Declare->has_template('imported_subclass_pkg/imported'),
'And it should be visible when imported from a subclass' );
ok( !Template::Declare->has_template('other_pkg/imported'),
'The imported template should not be visible when imported into non-root package' );
# Translate the path to where it was imported.
TODO: {
local $TODO = 'path_for is confused', 1;
is(
Wifty::UI::imported_subclass_pkg->path_for('imported'),
'/imported_subclass_pkg/imported',
'The path for the imported template should be correct'
);
}
is(
Wifty::UI::imported_subclass_pkg->path_for('imported'),
'/other_subclass/imported',
'The imported template path should be correct for the last package it was imported into'
);
is( Wifty::UI->path_for('simple'), '/simple', 'Simple template should be in the root path' );
{
ok my $simple = ( show('imported_pkg/imported') ), 'Should get output for imported template';
like( $simple, qr'Invocant:', 'Its output should be correct' );
like( $simple, qr{'Wifty::UI'}, '$self is correct in template block' );
ok_lint($simple);
}
{
ok my $simple = ( show('imported_subclass_pkg/imported') ),
'Should get output from imported template from subclass';
like(
$simple,
qr'Invocant:',
"We got the imported version in the subclass"
);
like(
$simple,
qr{'Wifty::UI'},
'$self is correct in template block'
);
ok_lint($simple);
}
1;