Don't be dumb, auth breaks on new cat, not other way round
[catagits/Catalyst-Runtime.git] / lib / Catalyst / Upgrading.pod
CommitLineData
8c57b129 1=head1 NAME
2
3Catalyst::Upgrading - Instructions for upgrading to the latest Catalyst
4
5d5f4a73 5=head2 Upgrading to Catalyst 5.90
6
7The major change is that L<Plack> now replaces most of the subclasses of
8L<Catalyst::Engine>. If you are using one of the standard subclasses of
040835f0 9L<Catalyst::Engine> this should be a straightforward upgrade for you. It was
5d5f4a73 10a design goal for this release to be as backwardly compatible as possible.
11However since L<Plack> is different from L<Catalyst::Engine> it would be
12possible that edge case differences would exist. Therefore we recommend care
13be taken with this upgrade and that testing should be greater than would be
14the case with a minor point update.
15
16It is highly recommended that you become familar with the L<Plack> ecosystem
17and documentation. Being able to take advantage of L<Plack> development and
18middleware is a major bonus to this upgrade.
19
20If you have created a custom subclass of L<Catalyst:Engine> you will need to
21convert it to be a subclass of L<Plack::Handler>.
22
23If you are using the L<Plack> engine, L<Catalyst::Engine::PSGI>, this new
24release supercedes that code.
25
26If you are using a subclass of L<Catalyst::Engine> that is aimed at nonstandard
27or internal / testing uses, such as L<Catalyst::Engine::Embeddable> you should
28still be able to continue using that engine.
29
30Advice for specific subclasses of L<Catalyst::Engine> follows:
31
040835f0 32=head3 Upgrading the FastCGI Engine
5d5f4a73 33
040835f0 34No upgrade needed if your myapp_fastcgi.pl script is already upgraded
35enough to use L<Catalyst::Script::FastCGI>.
5d5f4a73 36
040835f0 37=head3 Upgrading the mod_perl / Apache Engines
5d5f4a73 38
040835f0 39The engines that are build upon the various iterations of mod_perl,
40L<Catalyst::Engine::Apache::MP13> and
5d5f4a73 41L<Catalyst::Engine::Apache2::MP20> should be seemless upgrades and will
42work using using L<Plack::Handler::Apache1> or L<Plack::Handler::Apache2>
43as required.
44
040835f0 45L<Catalyst::Engine::Apache2::MP19>, is however no longer supported, as Plack
46does not support mod_perl version 1.99??? FIXME - is this true?
5d5f4a73 47
040835f0 48=head3 Upgrading the HTTP Engine
5d5f4a73 49
040835f0 50The default development server that comes with the L<Catalyst> distribution
51should continue to work as expected with no changes as long as your C<myapp_server>
52script is upgraded to use L<Catalyst::Script::HTTP>.
5d5f4a73 53
040835f0 54=head3 Upgrading the CGI Engine
5d5f4a73 55
56If you were using L<Catalyst::Engine::CGI> you should now use...
57
040835f0 58No upgrade needed if your myapp_cgi.pl script is already upgraded
59enough to use L<Catalyst::Script::CGI>.
5d5f4a73 60
040835f0 61=head3 Upgrading the Preforking Engine
5d5f4a73 62
040835f0 63If you were using L<Catalyst::Engine::HTTP::Prefork> then L<Starman>
64is automatically loaded.
5d5f4a73 65
040835f0 66=head3 Upgrading the PSGI Engine
5d5f4a73 67
68If you were using L<Catalyst::Engine::PSGI> this new release supercedes this
040835f0 69engine in supporting L<Plack>. You should remove the.. FIXME
5d5f4a73 70
71=head2 Engines with unknown status
72
73The following engines have untested or unknown compatibility. Reports are
74highly welcomed:
75
76 Catalyst::Engine::Embeddable
77 Catalyst::Engine::XMPP2
78 Catalyst::Engine::SCGI
79 Catalyst::Engine::Mojo
80 Catalyst::Engine::Zeus
81 Catalyst::Engine::JobQueue::POE
82 Catalyst::Engine::Wx
83 Catalyst::Engine::Stomp
84 Catalyst::Engine::Server (Marked as Deprecated)
85 Catalyst::Engine::HTTP::POE (Marked as Deprecated)
86
040835f0 87=head2 Using middleware
88
89XXX Should this be here or elsewhere?
5d5f4a73 90
040835f0 91=head2 Making an app.psgi file
5d5f4a73 92
040835f0 93=head2 Running with plackup?
5d5f4a73 94
7e2ec16e 95=head1 Upgrading to Catalyst 5.80
96
5687c7f9 97Most applications and plugins should run unaltered on Catalyst 5.80.
7e2ec16e 98
8f61d649 99However, a lot of refactoring work has taken place, and several changes have
1a98f036 100been made which could cause incompatibilities. If your application or plugin
8f61d649 101is using deprecated code, or relying on side effects, then you could have
ba03ccca 102issues upgrading to this release.
5687c7f9 103
8f61d649 104Most issues found with pre-existing components have been easy to
105solve. This document provides a complete description of behavior changes
106which may cause compatibility issues, and of new Catalyst warnings which
107be unclear.
7e2ec16e 108
8f61d649 109If you think you have found an upgrade-related issue which is not covered in
110this document, please email the Catalyst list to discuss the problem.
7e2ec16e 111
85f0a66f 112=head1 Moose features
113
8f61d649 114=head2 Application class roles
85f0a66f 115
8f61d649 116You can only apply method modifiers after the application's C<< ->setup >>
85f0a66f 117method has been called. This means that modifiers will not work with methods
118which run during the call to C<< ->setup >>.
119
a6eb852a 120See L<Catalyst::Manual::ExtendingCatalyst> for more information about using
121L<Moose> in your applications.
122
85f0a66f 123=head2 Controller actions in Moose roles
124
d76c88f3 125You can use L<MooseX::MethodAttributes::Role> if you want to declare actions
126inside Moose roles.
85f0a66f 127
d935773d 128=head2 Using Moose in Components
129
130The correct way to use Moose in a component in a both forward and backwards
131compatible way is:
132
133 package TestApp::Controller::Root;
134 use Moose;
135 BEGIN { extends 'Catalyst::Component' }; # Or ::Controller, or whatever
136
137See L<Components which inherit from Moose::Object before Catalyst::Component>.
138
8f61d649 139=head1 Known backwards compatibility breakages
7e2ec16e 140
8f61d649 141=head2 Applications in a single file
85f0a66f 142
143Applications must be in their own file, and loaded at compile time. This
8f61d649 144issue generally only affects the tests of CPAN distributions. Your
145application will fail if you try to define an application inline in a
146block, and use plugins which supply a C< new > method, then use that
147application latter in tests within the same file.
85f0a66f 148
149This is due to the fact that Catalyst is inlining a new method on your
8f61d649 150application class allowing it to be compatible with Moose. The method
151used to do this changed in 5.80004 to avoid the possibility of reporting
152an 'Unknown Error' if your application failed to compile.
85f0a66f 153
38f90e49 154=head2 Issues with Class::C3
155
8f61d649 156Catalyst 5.80 uses the L<Algorithm::C3> method dispatch order. This is
157built into Perl 5.10, and comes via L<Class::C3> for Perl 5.8. This
158replaces L<NEXT> with L<Class::C3::Adopt::NEXT>, forcing all components
159to resolve methods using C3, rather than the unpredictable dispatch
160order of L<NEXT>.
38f90e49 161
5d06547d 162This issue is characterised by your application failing to start due to an
163error message about having a non-linear @ISA.
164
8f61d649 165The Catalyst plugin most often causing this is
166L<Catalyst::Plugin::Session::Store::FastMmap> - if you are using this
167plugin and see issues, then please upgrade your plugins, as it has been
168fixed. Note that Makefile.PL in the distribution will warn about known
169incompatible components.
5d06547d 170
171This issue can, however, be found in your own application - the only solution is
172to go through each base class of the class the error was reported against, until
173you identify the ones in conflict, and resolve them.
174
175To be able to generate a linear @ISA, the list of superclasses for each
176class must be resolvable using the C3 algorithm. Unfortunately, when
177superclasses are being used as mixins (to add functionality used in your class),
178and with multiple inheritence, it is easy to get this wrong.
38f90e49 179
180Most common is the case of:
181
182 package Component1; # Note, this is the common case
183 use base qw/Class::Accessor::Fast Class::Data::Inheritable/;
184
8f61d649 185 package Component2; # Accidentally saying it this way causes a failure
38f90e49 186 use base qw/Class::Data::Inheritable Class::Accessor::Fast/;
187
188 package GoesBang;
189 use base qw/Component1 Component2/;
190
5d06547d 191Any situation like this will cause your application to fail to start.
38f90e49 192
8f61d649 193For additional documentation about this issue, and how to resolve it, see
5d06547d 194L<Class::C3::Adopt::NEXT>.
38f90e49 195
6f04e56a 196=head2 Components which inherit from Moose::Object before Catalyst::Component
7e2ec16e 197
6f04e56a 198Moose components which say:
7e2ec16e 199
6f04e56a 200 package TestApp::Controller::Example;
201 use Moose;
845bfcd2 202 extends qw/Moose::Object Catalyst::Component/;
7e2ec16e 203
8f61d649 204to use the constructor provided by Moose, while working (if you do some hacks
1a98f036 205with the C< BUILDARGS > method), will not work with Catalyst 5.80 as
6f04e56a 206C<Catalyst::Component> inherits from C<Moose::Object>, and so C< @ISA > fails
25f61108 207to linearize.
6f04e56a 208
6f04e56a 209The correct way to use Moose in a component in a both forward and backwards
210compatible way is:
211
212 package TestApp::Controller::Root;
213 use Moose;
214 BEGIN { extends 'Catalyst::Component' }; # Or ::Controller, or whatever
215
ba03ccca 216Note that the C< extends > declaration needs to occur in a begin block for
3df46b1b 217L<attributes> to operate correctly.
218
d935773d 219This way you do not inherit directly from C<Moose::Object>
220yourself. Having components which do not inherit their constructor from
221C<Catalyst::Component> is B<unsupported>, and has never been recommended,
222therefore you're on your own if you're using this technique. You'll need
223to detect the version of Catalyst your application is running, and deal
224with it appropriately.
225
eaae9a92 226You also don't get the L<Moose::Object> constructor, and therefore attribute
227initialization will not work as normally expected. If you want to use Moose
3df46b1b 228attributes, then they need to be made lazy to correctly initialize.
229
230Note that this only applies if your component needs to maintain component
231backwards compatibility for Catalyst versions before 5.71001 - in 5.71001
232attributes work as expected, and the BUILD method is called normally
eaae9a92 233(although BUILDARGS is not).
3df46b1b 234
235If you depend on Catalyst 5.8, then B<all> Moose features work as expected.
8566c0de 236
d935773d 237You will also see this issue if you do the following:
238
239 package TestApp::Controller::Example;
240 use Moose;
241 use base 'Catalyst::Controller';
242
243as C< use base > appends to @ISA.
244
e11cac87 245=head3 use Moose in MyApp
246
247Similar to the above, this will also fail:
248
249 package MyApp;
250 use Moose;
251 use Catalyst qw/
252 ConfigLoader
253 /;
254 __PACKAGE__->setup;
255
256If you need to use Moose in your application class (e.g. for method modifiers
8f61d649 257etc.) then the correct technique is:
e11cac87 258
259 package MyApp;
260 use Moose;
5b6f82d2 261 use Catalyst;
262
e11cac87 263 extends 'Catalyst';
5b6f82d2 264
265 __PACKAGE__->config( name => 'MyApp' );
e11cac87 266 __PACKAGE__->setup(qw/
267 ConfigLoader
268 /);
269
04a48104 270=head2 Anonymous closures installed directly into the symbol table
271
272If you have any code which installs anonymous subroutine references directly
273into the symbol table, you may encounter breakages. The simplest solution is
274to use L<Sub::Name> to name the subroutine. Example:
275
e11cac87 276 # Original code, likely to break:
1a98f036 277 my $full_method_name = join('::', $package_name, $method_name);
04a48104 278 *$full_method_name = sub { ... };
279
e11cac87 280 # Fixed Code
04a48104 281 use Sub::Name 'subname';
282 my $full_method_name = join('::',$package_name, $method_name);
283 *$full_method_name = subname $full_method_name, sub { ... };
284
8f61d649 285Additionally, you can take advantage of Catalyst's use of L<Class::MOP> and
286install the closure using the appropriate metaclass. Example:
04a48104 287
288 use Class::MOP;
289 my $metaclass = Moose::Meta::Class->initialize($package_name);
290 $metaclass->add_method($method_name => sub { ... });
291
780654ad 292=head2 Hooking into application setup
293
8f61d649 294To execute code during application start-up, the following snippet in MyApp.pm
780654ad 295used to work:
296
297 sub setup {
298 my ($class, @args) = @_;
299 $class->NEXT::setup(@args);
300 ... # things to do after the actual setup
301 }
302
8f61d649 303With Catalyst 5.80 this won't work anymore, because Catalyst no longer
304uses NEXT.pm for method resolution. The functionality was only ever
305originally operational as L<NEXT> remembers what methods have already
306been called, and will not call them again.
780654ad 307
1a98f036 308Using this now causes infinite recursion between MyApp::setup and
309Catalyst::setup, due to other backwards compatibility issues related to how
e6c5b548 310plugin setup works. Moose method modifiers like C<< before|after|around setup
1a98f036 311=> sub { ... }; >> also will not operate correctly on the setup method.
780654ad 312
313The right way to do it is this:
314
315 after setup_finalize => sub {
316 ... # things to do after the actual setup
317 };
318
ade00972 319The setup_finalize hook was introduced as a way to avoid this issue.
1a98f036 320
e11cac87 321=head2 Components with a new method which returns false
7e2ec16e 322
8dd2f514 323Previously, if you had a component which inherited from Catalyst::COMPONENT,
8f61d649 324but overrode the new method to return false, then your class's configuration
8dd2f514 325would be blessed into a hash on your behalf, and this would be returned from
a87f5aa5 326the COMPONENT method.
7e2ec16e 327
8f61d649 328This behavior makes no sense, and so has been removed. Implementing your own
329C< new > method in components is B<highly> discouraged. Instead, you should
330inherit the new method from Catalyst::Component, and use Moose's BUILD
1a98f036 331functionality and/or Moose attributes to perform any construction work
332necessary for your class.
7e2ec16e 333
334=head2 __PACKAGE__->mk_accessor('meta');
335
e11cac87 336Won't work due to a limitation of L<Moose>. This is currently being fixed
337inside Moose.
7e2ec16e 338
339=head2 Class::Data::Inheritable side effects
340
8dd2f514 341Previously, writing to a class data accessor would copy the accessor method
342down into your package.
343
8f61d649 344This behavior has been removed. While the class data is still stored
8dd2f514 345per-class, it is stored on the metaclass of the class defining the accessor.
7e2ec16e 346
8f61d649 347Therefore anything relying on the side effect of the accessor being copied down
8dd2f514 348will be broken.
7e2ec16e 349
1a98f036 350The following test demonstrates the problem:
8dd2f514 351
352 {
353 package BaseClass;
354 use base qw/Class::Data::Inheritable/;
355 __PACKAGE__->mk_classdata('foo');
356 }
357
358 {
359 package Child;
360 use base qw/BaseClass/;
361 }
362
363 BaseClass->foo('base class');
364 Child->foo('sub class');
eaae9a92 365
e11cac87 366 use Test::More;
8dd2f514 367 isnt(BaseClass->can('foo'), Child->can('foo'));
7e2ec16e 368
8f61d649 369=head2 Extending Catalyst::Request or other classes in an ad-hoc manner using mk_accessors
7e2ec16e 370
8dd2f514 371Previously, it was possible to add additional accessors to Catalyst::Request
372(or other classes) by calling the mk_accessors class method.
7e2ec16e 373
8f61d649 374This is no longer supported - users should make a subclass of the class whose
375behavior they would like to change, rather than globally polluting the
e11cac87 376Catalyst objects.
8be895a7 377
10011c19 378=head2 Confused multiple inheritance with Catalyst::Component::COMPONENT
8be895a7 379
8f61d649 380Previously, Catalyst's COMPONENT method would delegate to the method on
381the right hand side, which could then delegate back again with
382NEXT. This is poor practice, and in addition, makes no sense with C3
383method dispatch order, and is therefore no longer supported.
bcc773b9 384
ba03ccca 385If a COMPONENT method is detected in the inheritance hierarchy to the right
bcc773b9 386hand side of Catalyst::Component::COMPONENT, then the following warning
387message will be emitted:
7e2ec16e 388
8dd2f514 389 There is a COMPONENT method resolving after Catalyst::Component
5687c7f9 390 in ${next_package}.
8dd2f514 391
8f61d649 392The correct fix is to re-arrange your class's inheritance hierarchy so that the
bcc773b9 393COMPONENT method you would like to inherit is the first (left-hand most)
394COMPONENT method in your @ISA.
7e2ec16e 395
c571d2c8 396=head1 WARNINGS
397
63b546b1 398=head2 Actions in your application class
399
400Having actions in your application class will now emit a warning at application
e256d0e1 401startup as this is deprecated. It is highly recommended that these actions are moved
63b546b1 402into a MyApp::Controller::Root (as demonstrated by the scaffold application
55dd186c 403generated by catalyst.pl).
da73c6af 404
e256d0e1 405This warning, also affects tests. You should move actions in your test,
406creating a myTest::Controller::Root, like the following example:
da73c6af 407
408 package MyTest::Controller::Root;
95a52a01 409
da73c6af 410 use strict;
411 use warnings;
95a52a01 412
da73c6af 413 use parent 'Catalyst::Controller';
95a52a01 414
da73c6af 415 __PACKAGE__->config(namespace => '');
95a52a01 416
da73c6af 417 sub action : Local {
418 my ( $self, $c ) = @_;
419 $c->do_something;
420 }
95a52a01 421
da73c6af 422 1;
63b546b1 423
ac9279b0 424=head2 ::[MVC]:: naming scheme
425
426Having packages called MyApp::[MVC]::XX is deprecated and can no longer be generated
427by catalyst.pl
428
429This is still supported, but it is recommended that you rename your application
430components to Model/View/Controller.
431
432A warning will be issued at application startup if the ::[MVC]:: naming scheme is
433in use.
434
ade00972 435=head2 Catalyst::Base
436
8f61d649 437Any code using L<Catalyst::Base> will now emit a warning; this
438module will be removed in a future release.
ade00972 439
c571d2c8 440=head2 Methods in Catalyst::Dispatcher
441
8f61d649 442The following methods in Catalyst::Dispatcher are implementation
443details, which may change in the 5.8X release series, and therefore their use
bcc773b9 444is highly deprecated.
c571d2c8 445
446=over
447
8dd2f514 448=item tree
c571d2c8 449
8dd2f514 450=item dispatch_types
c571d2c8 451
8dd2f514 452=item registered_dispatch_types
c571d2c8 453
8dd2f514 454=item method_action_class
c571d2c8 455
8dd2f514 456=item action_hash
c571d2c8 457
458=item container_hash
459
460=back
461
462The first time one of these methods is called, a warning will be emitted:
7e2ec16e 463
bcc773b9 464 Class $class is calling the deprecated method Catalyst::Dispatcher::$public_method_name,
465 this will be removed in Catalyst 5.9X
7e2ec16e 466
c571d2c8 467You should B<NEVER> be calling any of these methods from application code.
468
8f61d649 469Plugin authors and maintainers whose plugins currently call these methods
8f5a2bd9 470should change to using the public API, or, if you do not feel the public API
8f61d649 471adequately supports your use case, please email the development list to
8f5a2bd9 472discuss what API features you need so that you can be appropriately supported.
7e2ec16e 473
95b20422 474=head2 Class files with names that don't correspond to the packages they define
7e2ec16e 475
e11cac87 476In this version of Catalyst, if a component is loaded from disk, but no
ba03ccca 477symbols are defined in that component's name space after it is loaded, this
bcc773b9 478warning will be issued:
7e2ec16e 479
bcc773b9 480 require $class was successful but the package is not defined.
7e2ec16e 481
8f61d649 482This is to protect against confusing bugs caused by mistyping package names,
bcc773b9 483and will become a fatal error in a future version.
484
485Please note that 'inner packages' (via L<Devel::InnerPackage>) are still fully
8f61d649 486supported; this warning is only issued when component file naming does not map
bcc773b9 487to B<any> of the packages defined within that component.
7e2ec16e 488
5687c7f9 489=head2 $c->plugin method
490
25f61108 491Calling the plugin method is deprecated, and calling it at run time is B<highly
8dd2f514 492deprecated>.
7e2ec16e 493
95a52a01 494Instead you are recommended to use L<Catalyst::Model::Adaptor> or similar to
ba03ccca 495compose the functionality you need outside of the main application name space.
7e2ec16e 496
4e68badc 497Calling the plugin method will not be supported past Catalyst 5.81.
bcc773b9 498
7e2ec16e 499=cut
4e68badc 500