[Catalyst-commits] r10306 -
Catalyst-Manual/5.80/trunk/lib/Catalyst/Manual
hkclark at dev.catalyst.perl.org
hkclark at dev.catalyst.perl.org
Wed May 27 02:41:18 GMT 2009
Author: hkclark
Date: 2009-05-27 02:41:17 +0000 (Wed, 27 May 2009)
New Revision: 10306
Added:
Catalyst-Manual/5.80/trunk/lib/Catalyst/Manual/CatalystAndMoose.pod
Log:
Contribution by Sebastian Willert about Cat 5.8 and Moose (thanks Sebastian!)
Added: Catalyst-Manual/5.80/trunk/lib/Catalyst/Manual/CatalystAndMoose.pod
===================================================================
--- Catalyst-Manual/5.80/trunk/lib/Catalyst/Manual/CatalystAndMoose.pod (rev 0)
+++ Catalyst-Manual/5.80/trunk/lib/Catalyst/Manual/CatalystAndMoose.pod 2009-05-27 02:41:17 UTC (rev 10306)
@@ -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<Moose>. 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<Moose> in your Catalyst application.
+
+This document provides you with a short overview of common caveats and
+best practices to use L<Moose>-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<Moose> 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<Moose> 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<Moose> attributes.
+
+Most of the accessors to information gathered during compile time is
+managed by C<Catalyst::ClassData>, which is a L<Moose>-aware version
+of L<Class::Data::Inheritable> but not compatible with
+L<MooseX::ClassAttribute>.
+
+
+=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<Moose> and take advantage of
+L<Moose::Manual::MethodModifiers|method modifiers> 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<Catalyst::Controller> 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!]
More information about the Catalyst-commits
mailing list