File Coverage

blib/lib/Class/DBI/Template.pm
Criterion Covered Total %
statement 12 12 100.0
branch n/a
condition n/a
subroutine 4 4 100.0
pod n/a
total 16 16 100.0


line stmt bran cond sub pod time code
1             package Class::DBI::Template;
2 1     1   33997 use strict;
  1         3  
  1         44  
3 1     1   5 use warnings;
  1         1  
  1         42  
4 1     1   2568991 use Template;
  1         2227403  
  1         42  
5             our $VERSION = '0.03';
6 1     1   9 use base qw/Class::Data::Inheritable Exporter/;
  1         1  
  1         763  
7             use Class::DBI::Template::Stash;
8             use Carp qw/cluck croak/;
9              
10             our @EXPORT = qw/
11             template_define
12             template_configure
13             template_data
14             template_render
15             template_build_data
16             /;
17              
18             __PACKAGE__->mk_classdata("_template_$_") for qw/configure define data/;
19              
20             sub _template_hash {
21             my $item = shift;
22              
23             my $classdata = "_template_$item";
24             my %data = %{__PACKAGE__->$classdata() || {}};
25             if(@_ > 1) {
26             my %new = @_;
27             foreach(keys %new) { $data{$_} = $new{$_}; }
28             __PACKAGE__->$classdata(\%data);
29             } elsif(@_ == 1) {
30             return $data{shift()};
31             } else {
32             return %data;
33             }
34             }
35             sub template_define { shift; _template_hash('define',@_); }
36             sub template_data { shift; _template_hash('data',@_); }
37             my %configure_defaults = (
38             stash_order => $Class::DBI::Template::Stash::default_order,
39             stash_preload => $Class::DBI::Template::Stash::default_preload,
40             stash_cache => 1,
41             );
42             sub template_configure {
43             my $self = shift;
44              
45             my $data = __PACKAGE__->_template_configure();
46             if(! $data) {
47             $data = {%configure_defaults};
48             __PACKAGE__->_template_configure($data);
49             }
50             if(@_ > 1) {
51             my %new = @_;
52             while(my($var,$val) = each %new) {
53             $var =~ s/^\-//;
54             $data->{lc($var)} = $val;
55             }
56             __PACKAGE__->_template_configure($data);
57             } elsif(@_ == 1) {
58             my $item = lc(shift());
59             $item =~ s/^\-//;
60             return $data->{$item};
61             } else {
62             return wantarray ? %{$data} : $data;
63             }
64             }
65              
66             sub template_render {
67             my $self = shift;
68             my $which = shift;
69             my %args = @_;
70              
71             my %vars = ();
72             my $tmpl = $self->template_define($which) || $which;
73              
74             my @stash_order = Class::DBI::Template::Stash::unfold(
75             $self->template_configure('stash_order')
76             );
77             my %pre = ();
78             foreach my $pre (@{$self->template_configure('stash_preload')}) {
79             $pre{$pre}++;
80             if($pre eq 'columns') {
81             foreach($self->columns) { $vars{$_} = $self->get($_); }
82             } elsif($pre eq 'template_data') {
83             my %new = __PACKAGE__->template_data();
84             @vars{keys %new} = values %new;
85             } elsif($pre eq 'environment') {
86             @vars{keys %ENV} = values %ENV;
87             } elsif($pre eq 'arguments') {
88             @vars{keys %args} = values %args;
89             } else {
90             die "Cannot preload $pre\n";
91             }
92             @stash_order = grep { $_ ne $pre } @stash_order;
93             }
94             $vars{_PRELOADED} = \%pre;
95              
96             my %opts = %{__PACKAGE__->template_configure('template_options') || {}};
97             $opts{STASH} = Class::DBI::Template::Stash->new({});
98              
99             $vars{_SELF} = $self;
100             $vars{_ARGS} = \%args;
101             $vars{_CONF} = __PACKAGE__->_template_configure;
102              
103             my $out = '';
104             eval {
105             my $template = Template->new(\%opts);
106             if($out = $self->template_configure('output')) {
107             $template->process($tmpl, \%vars, \$out) || die $template->error;
108             return;
109             } else {
110             $template->process($tmpl, \%vars, \$out) || die $template->error;
111             }
112             };
113             if($@) {
114             croak "Template processing failed: $@";
115             }
116             if($out) {
117             return $out;
118             } else {
119             die "No output found\n";
120             }
121             }
122              
123             1;
124             __END__