From: Kennedy Clark Date: Wed, 27 May 2009 02:41:17 +0000 (+0000) Subject: Contribution by Sebastian Willert about Cat 5.8 and Moose (thanks Sebastian!) X-Git-Tag: v5.8005~134 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=catagits%2FCatalyst-Manual.git;a=commitdiff_plain;h=8a1018906a287d8f9e2896210f0556b58ae5452d Contribution by Sebastian Willert about Cat 5.8 and Moose (thanks Sebastian!) --- diff --git a/lib/Catalyst/Manual/CatalystAndMoose.pod b/lib/Catalyst/Manual/CatalystAndMoose.pod new file mode 100644 index 0000000..fe5ba5b --- /dev/null +++ b/lib/Catalyst/Manual/CatalystAndMoose.pod @@ -0,0 +1,123 @@ +=head1 NAME + +Catalyst::Manual::CatalystAndMoose - How Catalyst 5.8+ and Moose relate + + +=head1 DESCRIPTION + +Since version 5.8 the core of Catalyst is based on L. Although +the developers went through great lengths to allow for a seamless +transition, there are still a few things to keep in mind when trying +to exploit the power of L in your Catalyst application. + +This document provides you with a short overview of common caveats and +best practices to use L-based classes within Catalyst. + + +=head1 THE CONTEXT CLASS + +A Moose-ified version of the context class should look like this: + + package MyApp; + + use Moose; + use Catalyst; + + $app->config( name => 'MyApp' ); + $app->setup( + # your roles and plugins + ); + + # method modifiers must be created after setup because otherwise they will + # conflict with plugin overrides + + after 'finalize' => sub{ + my $c = shift; + $c->log->info( 'done!' ); + } + +You should also be aware, that roles in C<< $c->setup >> are applied +after the last plugin with all the benefits of using a single C<< +with() >> statement in an ordinary L class and that your class +is automatically made immutable for you after the call to setup +(method modifiers in your class will work, though). + +CAVEAT: using roles in C<< $c->setup >> was implemented in Catalyst +version 5.80004. In prior versions you might get away with + + after 'setup_plugins' => sub{ with( + # your roles + )}; + + $app->setup( + # your plugins + ); + +but this is discouraged and you should upgrade to 5.80004 anyway, +because it fixes a few important regression against 5.71 + +[Q: COULD THIS BE USED TO RESOLVE CONFLICTS IN ROLES?]. + + +=head2 ACCESSORS + +Most of the request specific attributes like C<$c->stash>, +C<$c->request> and C<$c->response> have been converted to +L attributes but without type constraints, attribute helpers or +builder methods. This ensures that Catalyst 5.8 is fully backwards +compatible to applications using the published API of Catalyst 5.7 but +slightly limits the gains that could be had by wielding the full power +of L attributes. + +Most of the accessors to information gathered during compile time is +managed by C, which is a L-aware version +of L but not compatible with +L. + + +=head2 ROLES AND METHOD MODIFIERS + +Since the release of Catalyst version 5.8 the only reason for creating +a Catalyst extension as a plugin is to provide backward compatibility +to applications still using version 5.7 but even then you should +consider building your plugin using L and take advantage of +L instead of +overriding methods to alter Catalyst's request lifecycle behavior. + +If backward compatibility is of no concern to you, you could as easily +rewrite your plugins as roles and enjoy all the benefits of automatic +method re-dispatching of C<< before >> and C<< after >> method +modifiers, naming conflict detecting and generally cleaner code. + +Plugins and roles should never use + + after 'setup' => sub { ... } # wrong + +but rely on + + after 'setup_finalize' => sub { ... } # this will work + +to run their own setup code if needed. If they need to influence the +setup process itself, they can modify C<< setup_dispatcher() >>, +C<< setup_engine()>>, C<< setup_stats() >>, C<< setup_components() >> +and C<< setup_actions() >>, but this should be done with due +consideration and as late as possible. + + +=head1 CONTROLLERS + +To activate Catalyst's action attributes, Moose-ified controller +classes need to extend L at compile time before +the actions themselves are declared: + + package Catalyst::Controller::Root; + + use Moose; + BEGIN{ + extends 'Catalyst::Controller'; + with( + # your controller roles + ); + } + +[MORE TO BE DONE!]