package Catalyst::View::Mason2; BEGIN { $Catalyst::View::Mason2::VERSION = '0.03'; } use Mason; use Scalar::Util qw/blessed/; use strict; use warnings; use base qw(Catalyst::View); __PACKAGE__->mk_accessors(qw(interp)); sub new { my ( $class, $c, $arguments ) = @_; my %config = ( comp_root => $c->path_to( 'root', 'comps' ), mason_root_class => 'Mason', plugins => [], %{ $class->config }, %{$arguments}, ); # Stringify comp_root and data_dir if they are objects # foreach my $key (qw(comp_root data_dir)) { $config{$key} .= "" if blessed( $config{$key} ); } # Add globals # push( @{ $config{allow_globals} }, '$c' ); # Call superclass to create initial object # my $self = $class->next::method( $c, \%config ); $self->config( {%config} ); # Remove non-Mason parameters. # my $mason_root_class = delete( $config{mason_root_class} ); delete @config{qw(catalyst_component_name)}; # Create and store the interp # my $interp = $mason_root_class->new(%config); $self->interp($interp); return $self; } sub get_component_path { my ( $self, $c ) = @_; # If template was specified in stash, use that; otherwise use the action. # my $path = $c->stash->{template} || $c->action; $path = "/$path" if substr( $path, 0, 1 ) ne '/'; return $path; } sub process { my ( $self, $c ) = @_; my $path = $self->get_component_path($c); my $output = $self->render( $c, $path, $c->stash ); unless ( $c->response->content_type ) { $c->response->content_type('text/html; charset=utf-8'); } $c->response->body($output); return 1; } sub render { my ( $self, $c, $path, $args ) = @_; $self->interp->set_global( '$c' => $c ); return $self->interp->run( $path, %$args )->output; } 1; =pod =head1 NAME Catalyst::View::Mason2 - Mason 2.x view class =head1 VERSION version 0.03 =head1 SYNOPSIS # use the helper script/create.pl view Mason2 Mason2 # lib/MyApp/View/Mason2.pm package MyApp::View::Mason2; use base 'Catalyst::View::Mason2'; __PACKAGE__->config( # insert Mason parameters here ); 1; # in a controller package MyApp::Controller::Foo; sub bar : Local { ... $c->stash->{name} = 'Homer'; $c->stash->{template} = 'foo/bar'; # .mc is automatically added } # in root/comps/foo/bar.mc <%args> $.name </%args> Hello <% $.name %>! Your URI was <% $c->req->uri %>. =head1 DESCRIPTION Allows you to use L<Mason 2.x|Mason> for your views. =for readme stop =head1 VIEW CONFIGURATION =over =item mason_root_class Class to use for creating the Mason object. Defaults to 'Mason'. =back =head1 MASON CONSTRUCTOR Other than any special mentioned keys above, the configuration for this view will be passed directly into C<< Mason->new >>. There are a few defaults specific to this view: =over =item comp_root If not provided, defaults C<< $c->path_to('root', 'comps') >>. =item data_dir If not provided, defaults C<< $c->path_to('data') >>. =item allow_globals Automatically includes C<$c>. =back All other defaults are standard Mason. =head1 GLOBALS All components have access to C<$c>, the current Catalyst context. =head1 METHODS =over =item process ($c) Renders the component specified in C<< $c->stash->{template} >> or, if not specified, C<< $c->action >>. The component path is prefixed with a '/' if it does not already have one, and Mason will automatically add a ".mc" extension - to change the latter, you can use __PACKAGE__->config( autoextend_request_path => 0 ); Request arguments are taken from C<< $c->stash >>. =item render ($c, $path, \%args) Renders the component C<$path> with C<\%args>, and returns the output. =back =for readme continue =head1 AUTHOR Jonathan Swartz <swartz@pobox.com> =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011 by Jonathan Swartz. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut __END__