package HTML::Template::Default;
use strict;
use Carp;
use base 'HTML::Template';
use LEOCHARRE::Debug;
use vars qw(@EXPORT_OK @ISA %EXPORT_TAGS $VERSION);
@ISA = qw(Exporter);
@EXPORT_OK = qw(get_tmpl);
%EXPORT_TAGS = (
all => \@EXPORT_OK,
);
$VERSION = sprintf "%d.%02d", q$Revision: 1.10 $ =~ /(\d+)/g;
sub _get_abs_tmpl {
my $filename = shift;
$filename or debug('no filename provided') and return;
#$filename or die('missing filename argument to get_tmpl');
my @possible_abs;
for my $envar ( $ENV{HTML_TEMPLATE_ROOT}, $ENV{TMPL_PATH}, $ENV{HTML_TEMPLATE_ROOT} ){
defined $envar or next;
push @possible_abs, "$envar/$filename";
}
# lastly try the filename
push @possible_abs, $filename;
for my $abs ( @possible_abs ){
if( -f $abs ){
debug("file found: $abs");
return $abs;
}
else {
debug("file not found: $abs");
}
}
debug("$filename : not found on disk.\n");
return;
}
sub get_tmpl {
if( scalar @_ > 3 ){
debug('over');
return tmpl(@_);
}
else {
debug('under');
my %arg;
for (@_){
defined $_ or next;
if( ref $_ eq 'SCALAR' ){
$arg{scalarref} = $_;
next;
}
$arg{filename} = $_;
}
# insert my default params
$arg{die_on_bad_params} = 0;
return tmpl(%arg);
}
}
sub tmpl {
my %a = @_;
defined %a or confess('missing argument');
### %a
my $debug = sprintf 'using filename: %s, using scalarref: %s',
( $a{filename} ? $a{filename} : 'undef' ),
( $a{scalarref} ? 1 : 0 ),
;
$a{filename} or $a{scalarref} or confess("no filename or scalarref provided");
if( my $abs = _get_abs_tmpl($a{filename})){
my %_a = %a;
#if there is a scalarref, delete it
delete $_a{scalarref};
#replace filename with what we resolved..
$_a{filename} = $abs;
if ( my $tmpl = HTML::Template->new(%_a) ){
debug("filename, $debug");
return $tmpl;
}
}
if( $a{scalarref} ){
my %_a = %a;
#if there is a filename, delete it
delete $_a{filename};
if ( my $tmpl = HTML::Template->new(%_a) ){
debug("scalarref - $debug");
return $tmpl;
}
}
carp(__PACKAGE__ ."::tmpl() can't instance a template - $debug");
return;
}
# NEW VERSION... by overriding new in HTML::Template....
sub new {
my $class = shift;
my %opt = @_;
# for this to be of any use there must be
$opt{filename} # at least a filename source
and ( $opt{filehandle} or $opt{arrayref} or $opt{scalarref} ) # and at least a default source passed as argument
#or return $class->SUPER::new( %opt ); # otherwise we add nothing, and revert to regular HTML::Template
or return HTML::Template->new( %opt ); # otherwise we add nothing, and revert to regular HTML::Template
# ok, at this point we know we have a filename source and some other source
# we need to test the filename source, if it is valid, remove the other source(s)
if (
HTML::Template::_find_file( # in HTML::Template
{ options => { path => ($opt{path} || []) } }, # pseudo 'self'
$opt{filename},
)
){
$DEBUG and Carp::cluck('# found file, deleting other sources');
delete $opt{filehandle};
delete $opt{arrayref};
delete $opt{scalarref};
}
else {
$DEBUG and Carp::cluck('# did not find file, deleting filename source');
delete $opt{filename};
}
#$class->SUPER::new( %opt );
HTML::Template->new( %opt );
}
1;