package MasonX::StaticBuilder::Component; use strict; use warnings; use base qw(Class::Accessor); MasonX::StaticBuilder::Component->mk_accessors(qw(comp_root comp_name)); use Carp; use File::Spec; use HTML::Mason; =head1 NAME MasonX::StaticBuilder::Component -- fill in a single template file =head1 SYNOPSIS my $tmpl = MasonX::StaticBuilder::Component->new($file); my $output = $tmpl->fill_in(%args); print $output; =head1 DESCRIPTION =head2 new() Constructor. Give it a hashref containing the following args: =over 4 =item * comp_root =item * comp_name =back =begin testing use_ok('MasonX::StaticBuilder::Component'); my $t = MasonX::StaticBuilder::Component->new({ comp_root => "t", comp_name => "/test-component" }); isa_ok($t, 'MasonX::StaticBuilder::Component'); can_ok($t, qw(comp_root comp_name)); like($t->comp_root(), qr!/t$!, "comp_root()"); is($t->comp_name(), "/test-component", "comp_name()"); my $no = MasonX::StaticBuilder::Component->new({ comp_root => "t", comp_name => "/this/file/does/not/exist", }); is($no, undef, "new returns undef if the file can't be loaded"); =end testing =cut sub new { my ($class, $args) = @_; my $comp_root = File::Spec->rel2abs($args->{comp_root}); my $comp_name = $args->{comp_name}; my $filename = $comp_root . $comp_name; if ($filename && -e $filename && -T $filename) { my $self = {}; bless $self, $class; $self->comp_root($comp_root); $self->comp_name($comp_name); return $self; } else { return undef; } } =head2 fill_in() Fill in the template, by running all the mason code in the template files. Any parameters passed to this method will be available to the template as named args. For example: $tmpl->fill_in( foo => "bar"); And in the template: <%args> $foo => undef Foo is <% $foo %> =begin testing my $t = MasonX::StaticBuilder::Component->new({ comp_root => "t", comp_name => "/test-component" }); my $out = $t->fill_in( foo => "bar" ); like($out, qr/This is a test/, "template handles simple text"); like($out, qr/42/, "template handles mason directives"); like($out, qr/foo is bar/, "template handles args"); =end testing =cut sub fill_in { my ($self, @args) = @_; my $output; my $interp = HTML::Mason::Interp->new( comp_root => $self->comp_root(), out_method => \$output ); $interp->exec($self->comp_name(), @args); return $output; } 1;