
package Excel::Template::Plus;
use Moose;

our $VERSION   = '0.05';
our $AUTHORITY = 'cpan:STEVAN';

sub new {
    shift;
    my %options = @_;
    
    my $engine_class = 'Excel::Template::Plus::' . $options{engine};

    eval { Class::MOP::load_class($engine_class) };
    if ($@) {
        confess "Could not load engine class ($engine_class) because " . $@;
    }
    
    my $template = eval { $engine_class->new(%options) };
    if ($@) {
        confess "Could not create template from engine class ($engine_class) because " . $@;
    }    
    
    return $template;
}

no Moose; 1;

__END__

=pod

=head1 NAME 

Excel::Template::Plus - An extension to the Excel::Template module

=head1 SYNOPSIS

  use Excel::Template::Plus;
  
  my $template = Excel::Template::Plus->new(
      engine   => 'TT',
      template => 'greeting.tmpl',
      config   => { INCLUDE  => [ '/templates' ] },
      params   => { greeting => 'Hello' }
  );
  
  $template->param(location => 'World');
  
  $template->write_file('greeting.xls');

=head1 DISCLAIMER

This is the very first release of this module, it is an idea that I and 
Rob Kinyon (the author of Excel::Template) had discussed many times, but 
never got around to doing. This is the first attempt at bring this to 
reality, it may change B<radically> as it evolves, so be warned.

=head1 DESCRIPTION

This module is an extension of the Excel::Template module, which allows 
the user to use various "engines" from which you can create Excel files
through Excel::Template. 

The idea is to use the existing (and very solid) excel file generation 
code in Excel::Template, but to extend its more templatey bits with more
powerful options. 

The only engine currently provided is the Template Toolkit engine, which 
replaces Excel::Template's built in template features (the LOOP, and IF
constructs) with the full power of TT. This is similar to the module 
Excel::Template::TT, but expands on that even further to try and create 
a more extensive system.

You can use this module to create Excel::Template-compatible XML files
using one of the supported engines. For example, with the TT engine you
could create a Excel::Template XML file like:

  <workbook>
    <worksheet name="[% worksheet_name %]">
     [% my_cols = get_list_of_columns %]
      <row>
     [% FOR col = my_cols %]
       <bold><cell>[% col %]</cell></bold>
     [% END %]
      </row>
     [% FOR my_row = get_list_of_objects %]
      <row>
         [% FOR col = my_cols %]
          <cell>[% my_row.$col %]</cell>
         [% END %]
      </row>
     [% END %]
    </worksheet>
  </workbook>

Your TT template thus creates a XML file suitable to handing over to
Excel::Template for processing. Excel::Template::Plus simplifies
the template-creation and handing-over process.

Future engine/plans include:

=over 4

=item Pure Perl

This would allow you to write you Excel::Template files using Perl itself
which would then output the XML for Excel::Template to consume. This would 
be modeled after the recently released L<Template::Declare> module perhaps.

=item TT Plugins/Macros/Wrappers

This is basically anything which will make the TT engine easier to write
templates for. I have experimented with some of these things, but I was not
happy with any of them enough to release them yet. 

=item HTML::Template 

Excel::Template's templating features are based on HTML::Template, but the 
HTML::Template plugins and other goodies are not compatible. This engine 
would bring those things to Excel::Template.

=back 

=head1 METHODS

=over 4

=item B<new (%options)>

This method basically serves as a factory for creating new engine instances 
(for which L<Excel::Template::Plus::TT> is the only one currently). The only 
parameter that it requires is I<engine>, all other parameters are passed 
onto the engine's constructor (see the individual docs for more details on 
what is required). 

=item B<meta>

Access to the metaclass. 

=back

=head1 BUGS

All complex software has bugs lurking in it, and this module is no 
exception. If you find a bug please either email me, or add the bug
to cpan-RT.

=head1 ACKNOWLEDGEMENTS

=over 4

=item This module came out of several discussions I had with Rob Kinyon.

=back

=head1 AUTHOR

Stevan Little E<lt>stevan@iinteractive.comE<gt>

=head1 COPYRIGHT AND LICENSE

Copyright 2007-2010 by Infinity Interactive, Inc.

L<http://www.iinteractive.com>

This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself. 

=cut
