The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
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
    </%args>

    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;