package Catalyst::Helper::View::Xslate; use strict; =head1 NAME Catalyst::Helper::View::Xslate - Helper for Xslate Views =head1 SYNOPSIS For a standard (Kolon) syntax script/create.pl view HTML Xslate Alternatively, for a Template-Toolkit syntax: script/create.pl view HTML Xslate bridge=TT2 syntax=TTerse =head1 DESCRIPTION This is a helper module for Xslate Views. It is not meant to be used directly. Instead, you should use your Catalyst app's "create" script (see the SYNOPSIS for syntax). =head2 Arguments As any other view helper, the first argument is your View's name. In the synopsys example we used "HTML", and it's usually a good name :) The Xslate helper accepts the same construction arguments as L. List arguments can be separated by comma: script/create.pl view HTML Xslate cache=2 header=foo.tx,bar.tx suffix=.tt For convenience, it also takes the following argument: C - The optional bridge method. It can be set to C for L compatibility, or C for a similar layer, but that doesn't require Template-Toolkit installed at all. So, if you specify C (for example), you'll automatically get: module => [ 'Text::Xslate::Bridge::TT2Like' ] If you also wish to use TT's syntax, remember to also pass C on the command line. =head2 METHODS =head3 mk_compclass This method is used by the Catalyst helper engine to generate files properly. =cut sub mk_compclass { my ( $self, $helper, @args ) = @_; my $file = $helper->{file}; my $template = 'compclass'; if ( @args ) { $helper->{loader_args} = _build_strings(_parse_args(@args)); $template .= 'extended'; } $helper->render_file( $template, $file ); } sub _parse_args { my $args = {}; my %need_array = map { $_, 1 } qw(path module header footer); my %need_hash = map { $_, 1 } qw(function); foreach my $item (@_) { my ($key, $value) = split /=(?![>])/, $item; # the bridge key is a special case if ($key eq 'bridge') { $key = 'module'; $value = 'Text::Xslate::Bridge::' . $value; } if ( exists $need_array{$key} ) { push @{ $args->{$key} }, split /,/, $value; } elsif (exists $need_hash{$key} ) { $args->{$key}->{'data'} = $value; } else { $args->{$key} = $value; } } return $args; } sub _build_strings { my $args = shift; my $return = {}; foreach my $key (keys %$args) { my $ref = ref $args->{$key}; my $value = ''; if (!$ref) { $value = q[ default => '] . $args->{$key} . q[' ]; } elsif ($ref eq 'HASH') { $value = $/ . ' default => sub { { ' . $args->{$key}->{'data'} . ' } }' . $/ ; } elsif ($ref eq 'ARRAY') { $value = $/ . ' default => sub { [ ' . (join ', ', map { "'$_'" } @{$args->{$key}} ) . ' ] }' . $/ ; } $return->{$key} = $value; } return $return; } =head1 SEE ALSO L, L, L, L. =head1 AUTHOR Breno G. de Oliveira C<< >> =head1 LICENSE This library is free software . You can redistribute it and/or modify it under the same terms as perl itself. =cut 1; __DATA__ =begin pod_to_ignore __compclass__ package [% class %]; use strict; use warnings; use base 'Catalyst::View::Xslate'; __PACKAGE__->config( template_extension => '.tx', ); 1; =head1 NAME [% class %] - Xslate View for [% app %] =head1 DESCRIPTION Xslate View for [% app %]. =cut __compclassextended__ package [% class %]; use Moose; extends 'Catalyst::View::Xslate'; [% FOREACH key = loader_args.keys -%] has '+[% key %]' => ([% loader_args.${key} %]); [% END -%] 1; =head1 NAME [% class %] - Xslate View for [% app %] =head1 DESCRIPTION Xslate View for [% app %]. =cut