I wanted a nice way of being able to pull TT2 or HTML::Template templates from a database and handle them in some kind of unified way. This is my first attempt and seems rather hackish :)
Is there a nicer way to do this?
package My::Burner;
sub new {
my (undef, $type, $data) = @_;
my $class = "My::Burner::$type";
return $class->new($data);
}
package My::Burner::Template;
use Template;
sub new {
my ($class, $data) = @_;
my $self = { handler => Template->new, tmpl => $data };
bless $self, $class;
}
sub param {
my ($self, $param, $value) = @_;
$self->{params}->{$param} = $value;
}
sub process {
my $self = shift;
$self->{handler}->process($self->{tmpl}, $self->{params});
}
package My::Burner::HTML::Template;
use HTML::Template;
sub new {
my ($class, $data) = @_;
my $self = { handler => HTML::Template->new(scalarref => $data) };
bless $self, $class;
}
sub param {
my $self = shift;
$self->{handler}->param(@_);
}
sub process {
my $self = shift;
print $self->{handler}->output;
}
But I really like your idea of a "Burner" object. This reminds me of the approach used in Bricolagem which gives you flexibility in what template system you use. I think I'm going to redo things to implement this methodology. It's a little tricky as you saw because H:T & TT use different paradigms for setting up the template & loading template data. But it's not insurmountable. Thanks for the idea!
Re:Just did that
gav on 2002-08-13T17:07:45
I stole the name and idea from Bricolage:) Loading the modules isn't an issue to me as I use PerlModule with mod_perl to preload those modules anyway. I've also been thinking about how things work and I've changed it to reuse the same TT2 object each time.
I'll post more when I have fleshed things out even more, perhaps Template::Burner may be CPAN worthy someday...