MsOffice-Word-Template
view release on metacpan or search on metacpan
lib/MsOffice/Word/Template.pm view on Meta::CPAN
package MsOffice::Word::Template;
use 5.024;
use Moose;
use MooseX::StrictConstructor;
use Carp qw(croak);
use MsOffice::Word::Surgeon 2.0;
# syntactic sugar for attributes
sub has_inner ($@) {my $attr = shift; has($attr => @_, init_arg => undef, lazy => 1, builder => "_$attr")}
use namespace::clean -except => 'meta';
our $VERSION = '2.05';
#======================================================================
# ATTRIBUTES
#======================================================================
# constructor attributes for interacting with MsWord
# See also BUILDARGS: the constructor can also take a "docx" arg
# that will be automatically translated into a "surgeon" attribute
has 'surgeon' => (is => 'ro', isa => 'MsOffice::Word::Surgeon', required => 1);
has 'data_color' => (is => 'ro', isa => 'Str', default => "yellow");
has 'control_color' => (is => 'ro', isa => 'Str', default => "green");
has 'part_names' => (is => 'ro', isa => 'ArrayRef[Str]', lazy => 1,
default => sub {[keys shift->surgeon->parts->%*]});
has 'property_files'=> (is => 'ro', isa => 'ArrayRef[Str]',
default => sub {[qw(docProps/core.xml docProps/app.xml docProps/custom.xml)]});
# constructor attributes for building a templating engine
has 'engine_class' => (is => 'ro', isa => 'Str', default => 'TT2');
has 'engine_args' => (is => 'ro', isa => 'ArrayRef', default => sub {[]});
# attributes lazily constructed by the module -- not received through the constructor
has_inner 'engine' => (is => 'ro', isa => 'MsOffice::Word::Template::Engine');
#======================================================================
# BUILDING INSTANCES
#======================================================================
# syntactic sugar for supporting ->new($surgeon) instead of ->new(surgeon => $surgeon)
around BUILDARGS => sub {
my $orig = shift;
my $class = shift;
# if there is a unique arg without any keyword ...
if ( @_ == 1) {
# if the unique arg is an instance of Surgeon, it's the "surgeon" parameter
unshift @_, 'surgeon' if $_[0]->isa('MsOffice::Word::Surgeon');
# if the unique arg is a string, it's the "docx" parameter
unshift @_, 'docx' if $_[0] && !ref $_[0];
}
# translate the "docx" parameter into a "surgeon" parameter
my %args = @_;
if (my $docx = delete $args{docx}) {
$args{surgeon} = MsOffice::Word::Surgeon->new(docx => $docx);
}
# now call the regular Moose method
return $class->$orig(%args);
};
#======================================================================
# LAZY ATTRIBUTE CONSTRUCTORS
#======================================================================
sub _engine {
my ($self) = @_;
# instantiate the templating engine
my $engine_class = $self->engine_class;
my $engine;
my @load_errors;
CLASS:
for my $class ("MsOffice::Word::Template::Engine::$engine_class", $engine_class) {
eval "require $class; 1" or push @load_errors, $@ and next CLASS;
$engine = $class->new(word_template => $self,
$self->engine_args->@*) and last CLASS;
}
$engine or die "could not load engine class '$engine_class'", @load_errors;
return $engine;
}
( run in 1.645 second using v1.01-cache-2.11-cpan-ceb78f64989 )