tweak the docs a bit
[catagits/Catalyst-Runtime.git] / lib / Catalyst / Upgrading.pod
CommitLineData
8c57b129 1=head1 NAME
2
3Catalyst::Upgrading - Instructions for upgrading to the latest Catalyst
4
7a504990 5=head1 Upgrading to Catalyst 5.90085
6
7In this version of Catalyst we made a small change to Chained Dispatching so
8that when two or more actions all have the same path specification AND they
9all have Args(0), we break the tie by choosing the last action defined, and
10not the first one defined. This was done to normalize Chaining to following
11the 'longest Path wins, and when several actions match the same Path specification
12we choose the last defined.' rule. Previously Args(0) was hard coded to be a special
13case such that the first action defined would match (which is not the case when
14Args is not zero.)
15
16Its possible that this could be a breaking change for you, if you had used
17action roles (custom or otherwise) to add additional matching rules to differentiate
18between several Args(0) actions that share the same root action chain. For
19example if you have code now like this:
20
21 sub check_default :Chained(/) CaptureArgs(0) { ... }
22
23 sub default_get :Chained('check_default') PathPart('') Args(0) GET {
24 pop->res->body('get3');
25 }
26
27 sub default_post :Chained('check_default') PathPart('') Args(0) POST {
28 pop->res->body('post3');
29 }
30
31 sub chain_default :Chained('check_default') PathPart('') Args(0) {
32 pop->res->body('chain_default');
33 }
34
35The way that chaining will work previous is that when two or more equal actions can
36match, the 'top' one wins. So if the request is "GET .../check_default" BOTH
37actions 'default_get' AND 'chain_default' would match. To break the tie in
38the case when Args is 0, we'd previous take the 'top' (or first defined) action.
39Unfortunately this treatment of Args(0) is special case. In all other cases
40we choose the 'last defined' action to break a tie. So this version of
41Catalyst changed the dispatcher to make Args(0) no longer a special case for
42breaking ties. This means that the above code must now become:
43
44 sub check_default :Chained(/) CaptureArgs(0) { ... }
45
46 sub chain_default :Chained('check_default') PathPart('') Args(0) {
47 pop->res->body('chain_default');
48 }
49
50 sub default_get :Chained('check_default') PathPart('') Args(0) GET {
51 pop->res->body('get3');
52 }
53
54 sub default_post :Chained('check_default') PathPart('') Args(0) POST {
55 pop->res->body('post3');
56 }
57
58If we want it to work as expected (for example we we GET to match 'default_get' and
59POST to match 'default_post' and any other http Method to match 'chain_default').
60
61In other words Arg(0) and chained actions must now follow the normal rule where
62in a tie the last defined action wins and you should place all your less defined
63or 'catch all' actions first.
64
65If this causes you trouble and you can't fix your code to conform, you may set the
66application configuration setting "use_chained_args_0_special_case" to true and
67that will revert you code to the previous behavior.
68
b8b29bac 69=head1 Upgrading to Catalyst 5.90080
70
71UTF8 encoding is now default. For temporary backwards compatibility, if this
72change is causing you trouble, you can disable it by setting the application
73configuration option to undef:
74
75 MyApp->config(encoding => undef);
76
77But please consider this a temporary measure since it is the intention that
78UTF8 is enabled going forwards and the expectation is that other ecosystem
79projects will assume this as well. At some point you application will not
80correctly function without this setting.
81
0d94e986 82As of 5.90084 we've added two additional configuration flags for more selective
83control over some encoding changes: 'skip_body_param_unicode_decoding' and
84'skip_complex_post_part_handling'. You may use these to more selectively
85disable new features while you are seeking a long term fix. Please review
86CONFIGURATION in L<Catalyst>.
87
d63cc9c8 88For further information, please see L<Catalyst::UTF8>
89
b8b29bac 90A number of projects in the wider ecosystem required minor updates to be able
91to work correctly. Here's the known list:
92
93L<Catalyst::View::TT>, L<Catalyst::View::Mason>, L<Catalyst::View::HTML::Mason>,
94L<Catalyst::View::Xslate>, L<Test::WWW::Mechanize::Catalyst>
95
96You will need to update to modern versions in most cases, although quite a few
97of these only needed minor test case and documentation changes so you will need
98to review the changelog of each one that is relevant to you to determine your
99true upgrade needs.
100
78acc1f7 101=head1 Upgrading to Catalyst 5.90060
102
103Starting in the v5.90059_001 development release, the regexp dispatch type is
104no longer automatically included as a dependency. If you are still using this
105dispatch type, you need to add L<Catalyst::DispatchType::Regex> into your build
106system.
107
108The standalone distribution of Regexp will be supported for the time being, but
109should we find that supporting it prevents us from moving L<Catalyst> forward
110in necessary ways, we reserve the right to drop that support. It is highly
111recommended that you use this last stage of deprecation to change your code.
112
ba7766f8 113=head1 Upgrading to Catalyst 5.90040
717fc5c9 114
8275d3b9 115=head2 Catalyst::Plugin::Unicode::Encoding is now core
116
117The previously stand alone Unicode support module L<Catalyst::Plugin::Unicode::Encoding>
118has been brought into core as a default plugin. Going forward, all you need is
119to add a configuration setting for the encoding type. For example:
120
121 package Myapp::Web;
122
123 use Catalyst;
124
125 __PACKAGE__->config( encoding => 'UTF-8' );
126
127Please note that this is different from the old stand alone plugin which applied
128C<UTF-8> encoding by default (that is, if you did not set an explicit
5fa5b709 129C<encoding> configuration value, it assumed you wanted UTF-8). In order to
8275d3b9 130preserve backwards compatibility you will need to explicitly turn it on via the
131configuration setting. THIS MIGHT CHANGE IN THE FUTURE, so please consider
132starting to test your application with proper UTF-8 support and remove all those
133crappy hacks you munged into the code because you didn't know the Plugin
134existed :)
135
136For people that are using the Plugin, you will note a startup warning suggesting
137that you can remove it from the plugin list. When you do so, please remember to
138add the configuration setting, since you can no longer rely on the default being
139UTF-8. We'll add it for you if you continue to use the stand alone plugin and
140we detect this, but this backwards compatibility shim will likely be removed in
141a few releases (trying to clean up the codebase after all).
142
143If you have trouble with any of this, please bring it to the attention of the
144Catalyst maintainer group.
145
146=head2 basic async and event loop support
147
717fc5c9 148This version of L<Catalyst> offers some support for using L<AnyEvent> and
e37f92f5 149L<IO::Async> event loops in your application. These changes should work
150fine for most applications however if you are already trying to perform
151some streaming, minor changes in this area of the code might affect your
4e6e0ab2 152functionality. Please see L<Catalyst::Response\write_fh> for more and for a
153basic example.
8275d3b9 154
155We consider this feature experimental. We will try not to break it, but we
156reserve the right to make necessary changes to fix major issues that people
157run into when the use this functionality in the wild.
717fc5c9 158
ba7766f8 159=head1 Upgrading to Catalyst 5.90030
160
161=head2 Regex dispatch type is deprecated.
162
163The Regex dispatchtype (L<Catalyst::DispatchType::Regex>) has been deprecated.
164
165You are encouraged to move your application to Chained dispatch (L<Catalyst::DispatchType::Chained>).
166
167If you cannot do so, please add a dependency to Catalyst::DispatchType::Regex to your application's
168Makefile.PL
169
dacd8b0e 170=head1 Upgrading to Catalyst 5.9
5d5f4a73 171
e6006848 172The major change is that L<Plack>, a toolkit for using the L<PSGI>
862a7989 173specification, now replaces most of the subclasses of L<Catalyst::Engine>. If
e6006848 174you are using one of the standard subclasses of L<Catalyst::Engine> this
175should be a straightforward upgrade for you. It was a design goal for
176this release to preserve as much backwards compatibility as possible.
177However, since L<Plack> is different from L<Catalyst::Engine>, it is
178possible that differences exist for edge cases. Therefore, we recommend
179that care be taken with this upgrade and that testing should be greater
180than would be the case with a minor point update. Please inform the
181Catalyst developers of any problems so that we can fix them and
182incorporate tests.
5d5f4a73 183
773b3b08 184It is highly recommended that you become familiar with the L<Plack> ecosystem
ae908e7e 185and documentation. Being able to take advantage of L<Plack> development and
186middleware is a major bonus to this upgrade. Documentation about how to
187take advantage of L<Plack::Middleware> by writing your own C<< .psgi >> file
188is contained in L<Catalyst::PSGI>.
5d5f4a73 189
e6006848 190If you have created a custom subclass of L<Catalyst:Engine>, you will
191need to convert it to be a subclass of L<Plack::Handler>.
5d5f4a73 192
193If you are using the L<Plack> engine, L<Catalyst::Engine::PSGI>, this new
773b3b08 194release supersedes that code.
5d5f4a73 195
e6006848 196If you are using a subclass of L<Catalyst::Engine> that is aimed at
197nonstandard or internal/testing uses, such as
198L<Catalyst::Engine::Embeddable>, you should still be able to continue
199using that engine.
5d5f4a73 200
201Advice for specific subclasses of L<Catalyst::Engine> follows:
202
93d60cae 203=head2 Upgrading the FastCGI Engine
5d5f4a73 204
e6006848 205No upgrade is needed if your myapp_fastcgi.pl script is already upgraded
206to use L<Catalyst::Script::FastCGI>.
5d5f4a73 207
93d60cae 208=head2 Upgrading the mod_perl / Apache Engines
5d5f4a73 209
e6006848 210The engines that are built upon the various iterations of mod_perl,
14148e06 211L<Catalyst::Engine::Apache::MP13> (for mod_perl 1, and Apache 1.x) and
862a7989 212L<Catalyst::Engine::Apache2::MP20> (for mod_perl 2, and Apache 2.x),
bd85860b 213should be seamless upgrades and will work using L<Plack::Handler::Apache1>
14148e06 214or L<Plack::Handler::Apache2> as required.
5d5f4a73 215
e6006848 216L<Catalyst::Engine::Apache2::MP19>, however, is no longer supported, as
862a7989 217Plack does not support mod_perl version 1.99. This is unlikely to be a
218problem for anyone, as 1.99 was a brief beta-test release for mod_perl
2192, and all users of mod_perl 1.99 are encouraged to upgrade to a
220supported release of Apache 2 and mod_perl 2.
5d5f4a73 221
93d60cae 222=head2 Upgrading the HTTP Engine
5d5f4a73 223
040835f0 224The default development server that comes with the L<Catalyst> distribution
225should continue to work as expected with no changes as long as your C<myapp_server>
226script is upgraded to use L<Catalyst::Script::HTTP>.
5d5f4a73 227
93d60cae 228=head2 Upgrading the CGI Engine
5d5f4a73 229
697a3e9e 230If you were using L<Catalyst::Engine::CGI> there is no upgrade needed if your
e6006848 231myapp_cgi.pl script is already upgraded to use L<Catalyst::Script::CGI>.
5d5f4a73 232
cf8eab35 233=head2 Upgrading Catalyst::Engine::HTTP::Prefork
5d5f4a73 234
040835f0 235If you were using L<Catalyst::Engine::HTTP::Prefork> then L<Starman>
da9eab5a 236is automatically loaded. You should (at least) change your C<Makefile.PL>
237to depend on Starman.
0ea8962d 238
da9eab5a 239You can regenerate your C<myapp_server.pl> script with C<catalyst.pl>
240and implement a C<MyApp::Script::Server> class that looks like this:
241
242 package MyApp::Script::Server;
243 use Moose;
244 use namespace::autoclean;
245
246 extends 'CatalystX::Script::Server::Starman';
247
248 1;
249
e6006848 250This takes advantage of the new script system, and will add a number of
251options to the standard server script as extra options are added by
252Starman.
da9eab5a 253
254More information about these options can be seen at
255L<CatalystX::Script::Server::Starman/SYNOPSIS>.
256
257An alternate route to implement this functionality is to write a simple .psgi
e6006848 258file for your application, and then use the L<plackup> utility to start the
da9eab5a 259server.
5d5f4a73 260
93d60cae 261=head2 Upgrading the PSGI Engine
5d5f4a73 262
e6006848 263If you were using L<Catalyst::Engine::PSGI>, this new release supersedes
264this engine in supporting L<Plack>. By default the Engine is now always
265L<Plack>. As a result, you can remove the dependency on
266L<Catalyst::Engine::PSGI> in your C<Makefile.PL>.
8f912f0b 267
268Applications that were using L<Catalyst::Engine::PSGI>
269previously should entirely continue to work in this release with no changes.
270
e6006848 271However, if you have an C<app.psgi> script, then you no longer need to
272specify the PSGI engine. Instead, the L<Catalyst> application class now
273has a new method C<psgi_app> which returns a L<PSGI> compatible coderef
274which you can wrap in the middleware of your choice.
8f912f0b 275
276Catalyst will use the .psgi for your application if it is located in the C<home>
e6006848 277directory of the application.
697a3e9e 278
93a57b4b 279For example, if you were using L<Catalyst::Engine::PSGI> in the past, you will
8f912f0b 280have written (or generated) a C<script/myapp.psgi> file similar to this one:
697a3e9e 281
282 use Plack::Builder;
283 use MyCatalytApp;
284
285 MyCatalystApp->setup_engine('PSGI');
286
287 builder {
288 enable ... # enable your desired middleware
289 sub { MyCatalystApp->run(@_) };
290 };
291
8f912f0b 292Instead, you now say:
697a3e9e 293
294 use Plack::Builder;
295 use MyCatalystApp;
296
297 builder {
298 enable ... #enable your desired middleware
75d68821 299 MyCatalystApp->psgi_app;
697a3e9e 300 };
5d5f4a73 301
34effbc7 302In the simplest case:
8f912f0b 303
34effbc7 304 MyCatalystApp->setup_engine('PSGI');
305 my $app = sub { MyCatalystApp->run(@_) }
306
307becomes
308
34effbc7 309 my $app = MyCatalystApp->psgi_app(@_);
310
311B<NOT>:
312
313 my $app = sub { MyCatalystApp->psgi_app(@_) };
314 # If you make ^^ this mistake, your app won't work, and will confuse the hell out of you!
315
e6006848 316You can now move C<< script/myapp.psgi >> to C<< myapp.psgi >>, and the built-in
773b3b08 317Catalyst scripts and your test suite will start using your .psgi file.
ad15c817 318
e6006848 319B<NOTE:> If you rename your .psgi file without these modifications, then
320any tests run via L<Catalyst::Test> will not be compatible with the new
321release, and will result in the development server starting, rather than
322the expected test running.
93a57b4b 323
c47cd2ce 324B<NOTE:> If you are directly accessing C<< $c->req->env >> to get the PSGI
325environment then this accessor is moved to C<< $c->engine->env >>,
326you will need to update your code.
327
e6006848 328=head2 Engines which are known to be broken
93a57b4b 329
e6006848 330The following engines B<DO NOT> work as of Catalyst version 5.9. The
331core team will be happy to work with the developers and/or users of
332these engines to help them port to the new Plack/Engine system, but for
333now, applications which are currently using these engines B<WILL NOT>
334run without modification to the engine code.
93a57b4b 335
336=over
337
338=item Catalyst::Engine::Wx
339
ad15c817 340=item Catalyst::Engine::Zeus
341
342=item Catalyst::Engine::JobQueue::POE
343
344=item Catalyst::Engine::XMPP2
345
346=item Catalyst::Engine::SCGI
347
93a57b4b 348=back
349
5d5f4a73 350=head2 Engines with unknown status
351
e6006848 352The following engines are untested or have unknown compatibility.
353Reports are highly encouraged:
5d5f4a73 354
ad15c817 355=over
356
357=item Catalyst::Engine::Mojo
358
e6006848 359=item Catalyst::Engine::Server (marked as Deprecated)
ad15c817 360
e6006848 361=item Catalyst::Engine::HTTP::POE (marked as Deprecated)
ad15c817 362
363=back
5d5f4a73 364
3f22de0b 365=head2 Plack functionality
040835f0 366
3f22de0b 367See L<Catalyst::PSGI>.
0aafa77a 368
dacd8b0e 369=head2 Tests in 5.9
4db14a9a 370
e6006848 371Tests should generally work the same in Catalyst 5.9, but there are
372some differences.
4db14a9a 373
e6006848 374Previously, if using L<Catalyst::Test> and doing local requests (against
375a local server), if the application threw an exception then this
376exception propagated into the test.
4db14a9a 377
e6006848 378This behavior has been removed, and now a 500 response will be returned
379to the test. This change standardizes behavior, so that local test
380requests behave similarly to remote requests.
4db14a9a 381
7e2ec16e 382=head1 Upgrading to Catalyst 5.80
383
5687c7f9 384Most applications and plugins should run unaltered on Catalyst 5.80.
7e2ec16e 385
8f61d649 386However, a lot of refactoring work has taken place, and several changes have
1a98f036 387been made which could cause incompatibilities. If your application or plugin
8f61d649 388is using deprecated code, or relying on side effects, then you could have
ba03ccca 389issues upgrading to this release.
5687c7f9 390
cf8eab35 391Most issues found with existing components have been easy to
8f61d649 392solve. This document provides a complete description of behavior changes
393which may cause compatibility issues, and of new Catalyst warnings which
773b3b08 394might be unclear.
7e2ec16e 395
8f61d649 396If you think you have found an upgrade-related issue which is not covered in
397this document, please email the Catalyst list to discuss the problem.
7e2ec16e 398
85f0a66f 399=head1 Moose features
400
8f61d649 401=head2 Application class roles
85f0a66f 402
8f61d649 403You can only apply method modifiers after the application's C<< ->setup >>
85f0a66f 404method has been called. This means that modifiers will not work with methods
773b3b08 405run during the call to C<< ->setup >>.
85f0a66f 406
a6eb852a 407See L<Catalyst::Manual::ExtendingCatalyst> for more information about using
408L<Moose> in your applications.
409
85f0a66f 410=head2 Controller actions in Moose roles
411
d76c88f3 412You can use L<MooseX::MethodAttributes::Role> if you want to declare actions
413inside Moose roles.
85f0a66f 414
d935773d 415=head2 Using Moose in Components
416
417The correct way to use Moose in a component in a both forward and backwards
418compatible way is:
419
420 package TestApp::Controller::Root;
421 use Moose;
422 BEGIN { extends 'Catalyst::Component' }; # Or ::Controller, or whatever
423
424See L<Components which inherit from Moose::Object before Catalyst::Component>.
425
8f61d649 426=head1 Known backwards compatibility breakages
7e2ec16e 427
8f61d649 428=head2 Applications in a single file
85f0a66f 429
430Applications must be in their own file, and loaded at compile time. This
8f61d649 431issue generally only affects the tests of CPAN distributions. Your
432application will fail if you try to define an application inline in a
433block, and use plugins which supply a C< new > method, then use that
434application latter in tests within the same file.
85f0a66f 435
436This is due to the fact that Catalyst is inlining a new method on your
8f61d649 437application class allowing it to be compatible with Moose. The method
438used to do this changed in 5.80004 to avoid the possibility of reporting
439an 'Unknown Error' if your application failed to compile.
85f0a66f 440
38f90e49 441=head2 Issues with Class::C3
442
8f61d649 443Catalyst 5.80 uses the L<Algorithm::C3> method dispatch order. This is
444built into Perl 5.10, and comes via L<Class::C3> for Perl 5.8. This
445replaces L<NEXT> with L<Class::C3::Adopt::NEXT>, forcing all components
446to resolve methods using C3, rather than the unpredictable dispatch
447order of L<NEXT>.
38f90e49 448
cf8eab35 449This issue manifests itself by your application failing to start due to an
5d06547d 450error message about having a non-linear @ISA.
451
8f61d649 452The Catalyst plugin most often causing this is
453L<Catalyst::Plugin::Session::Store::FastMmap> - if you are using this
454plugin and see issues, then please upgrade your plugins, as it has been
455fixed. Note that Makefile.PL in the distribution will warn about known
456incompatible components.
5d06547d 457
458This issue can, however, be found in your own application - the only solution is
459to go through each base class of the class the error was reported against, until
460you identify the ones in conflict, and resolve them.
461
462To be able to generate a linear @ISA, the list of superclasses for each
463class must be resolvable using the C3 algorithm. Unfortunately, when
464superclasses are being used as mixins (to add functionality used in your class),
ae7da8f5 465and with multiple inheritance, it is easy to get this wrong.
38f90e49 466
467Most common is the case of:
468
469 package Component1; # Note, this is the common case
470 use base qw/Class::Accessor::Fast Class::Data::Inheritable/;
471
8f61d649 472 package Component2; # Accidentally saying it this way causes a failure
38f90e49 473 use base qw/Class::Data::Inheritable Class::Accessor::Fast/;
474
475 package GoesBang;
476 use base qw/Component1 Component2/;
477
5d06547d 478Any situation like this will cause your application to fail to start.
38f90e49 479
8f61d649 480For additional documentation about this issue, and how to resolve it, see
5d06547d 481L<Class::C3::Adopt::NEXT>.
38f90e49 482
6f04e56a 483=head2 Components which inherit from Moose::Object before Catalyst::Component
7e2ec16e 484
6f04e56a 485Moose components which say:
7e2ec16e 486
6f04e56a 487 package TestApp::Controller::Example;
488 use Moose;
845bfcd2 489 extends qw/Moose::Object Catalyst::Component/;
7e2ec16e 490
8f61d649 491to use the constructor provided by Moose, while working (if you do some hacks
1a98f036 492with the C< BUILDARGS > method), will not work with Catalyst 5.80 as
6f04e56a 493C<Catalyst::Component> inherits from C<Moose::Object>, and so C< @ISA > fails
25f61108 494to linearize.
6f04e56a 495
6f04e56a 496The correct way to use Moose in a component in a both forward and backwards
497compatible way is:
498
499 package TestApp::Controller::Root;
500 use Moose;
501 BEGIN { extends 'Catalyst::Component' }; # Or ::Controller, or whatever
502
ba03ccca 503Note that the C< extends > declaration needs to occur in a begin block for
3df46b1b 504L<attributes> to operate correctly.
505
d935773d 506This way you do not inherit directly from C<Moose::Object>
507yourself. Having components which do not inherit their constructor from
508C<Catalyst::Component> is B<unsupported>, and has never been recommended,
509therefore you're on your own if you're using this technique. You'll need
510to detect the version of Catalyst your application is running, and deal
511with it appropriately.
512
eaae9a92 513You also don't get the L<Moose::Object> constructor, and therefore attribute
514initialization will not work as normally expected. If you want to use Moose
3df46b1b 515attributes, then they need to be made lazy to correctly initialize.
516
517Note that this only applies if your component needs to maintain component
518backwards compatibility for Catalyst versions before 5.71001 - in 5.71001
519attributes work as expected, and the BUILD method is called normally
eaae9a92 520(although BUILDARGS is not).
3df46b1b 521
522If you depend on Catalyst 5.8, then B<all> Moose features work as expected.
8566c0de 523
d935773d 524You will also see this issue if you do the following:
525
526 package TestApp::Controller::Example;
527 use Moose;
528 use base 'Catalyst::Controller';
529
530as C< use base > appends to @ISA.
531
e11cac87 532=head3 use Moose in MyApp
533
534Similar to the above, this will also fail:
535
536 package MyApp;
537 use Moose;
538 use Catalyst qw/
539 ConfigLoader
540 /;
541 __PACKAGE__->setup;
542
543If you need to use Moose in your application class (e.g. for method modifiers
8f61d649 544etc.) then the correct technique is:
e11cac87 545
546 package MyApp;
547 use Moose;
5b6f82d2 548 use Catalyst;
549
e11cac87 550 extends 'Catalyst';
5b6f82d2 551
552 __PACKAGE__->config( name => 'MyApp' );
e11cac87 553 __PACKAGE__->setup(qw/
554 ConfigLoader
555 /);
556
04a48104 557=head2 Anonymous closures installed directly into the symbol table
558
559If you have any code which installs anonymous subroutine references directly
560into the symbol table, you may encounter breakages. The simplest solution is
561to use L<Sub::Name> to name the subroutine. Example:
562
e11cac87 563 # Original code, likely to break:
1a98f036 564 my $full_method_name = join('::', $package_name, $method_name);
04a48104 565 *$full_method_name = sub { ... };
566
e11cac87 567 # Fixed Code
04a48104 568 use Sub::Name 'subname';
569 my $full_method_name = join('::',$package_name, $method_name);
570 *$full_method_name = subname $full_method_name, sub { ... };
571
8f61d649 572Additionally, you can take advantage of Catalyst's use of L<Class::MOP> and
573install the closure using the appropriate metaclass. Example:
04a48104 574
575 use Class::MOP;
576 my $metaclass = Moose::Meta::Class->initialize($package_name);
577 $metaclass->add_method($method_name => sub { ... });
578
780654ad 579=head2 Hooking into application setup
580
8f61d649 581To execute code during application start-up, the following snippet in MyApp.pm
780654ad 582used to work:
583
584 sub setup {
585 my ($class, @args) = @_;
586 $class->NEXT::setup(@args);
587 ... # things to do after the actual setup
588 }
589
8f61d649 590With Catalyst 5.80 this won't work anymore, because Catalyst no longer
591uses NEXT.pm for method resolution. The functionality was only ever
592originally operational as L<NEXT> remembers what methods have already
593been called, and will not call them again.
780654ad 594
1a98f036 595Using this now causes infinite recursion between MyApp::setup and
596Catalyst::setup, due to other backwards compatibility issues related to how
e6c5b548 597plugin setup works. Moose method modifiers like C<< before|after|around setup
1a98f036 598=> sub { ... }; >> also will not operate correctly on the setup method.
780654ad 599
600The right way to do it is this:
601
602 after setup_finalize => sub {
603 ... # things to do after the actual setup
604 };
605
ade00972 606The setup_finalize hook was introduced as a way to avoid this issue.
1a98f036 607
e11cac87 608=head2 Components with a new method which returns false
7e2ec16e 609
8dd2f514 610Previously, if you had a component which inherited from Catalyst::COMPONENT,
8f61d649 611but overrode the new method to return false, then your class's configuration
8dd2f514 612would be blessed into a hash on your behalf, and this would be returned from
a87f5aa5 613the COMPONENT method.
7e2ec16e 614
8f61d649 615This behavior makes no sense, and so has been removed. Implementing your own
616C< new > method in components is B<highly> discouraged. Instead, you should
617inherit the new method from Catalyst::Component, and use Moose's BUILD
1a98f036 618functionality and/or Moose attributes to perform any construction work
619necessary for your class.
7e2ec16e 620
621=head2 __PACKAGE__->mk_accessor('meta');
622
e11cac87 623Won't work due to a limitation of L<Moose>. This is currently being fixed
624inside Moose.
7e2ec16e 625
626=head2 Class::Data::Inheritable side effects
627
8dd2f514 628Previously, writing to a class data accessor would copy the accessor method
629down into your package.
630
8f61d649 631This behavior has been removed. While the class data is still stored
8dd2f514 632per-class, it is stored on the metaclass of the class defining the accessor.
7e2ec16e 633
8f61d649 634Therefore anything relying on the side effect of the accessor being copied down
8dd2f514 635will be broken.
7e2ec16e 636
1a98f036 637The following test demonstrates the problem:
8dd2f514 638
639 {
640 package BaseClass;
641 use base qw/Class::Data::Inheritable/;
642 __PACKAGE__->mk_classdata('foo');
643 }
644
645 {
646 package Child;
647 use base qw/BaseClass/;
648 }
649
650 BaseClass->foo('base class');
651 Child->foo('sub class');
eaae9a92 652
e11cac87 653 use Test::More;
8dd2f514 654 isnt(BaseClass->can('foo'), Child->can('foo'));
7e2ec16e 655
f4dda4a8 656=head2 Extending Catalyst::Request or other classes in an ad hoc manner using mk_accessors
7e2ec16e 657
8dd2f514 658Previously, it was possible to add additional accessors to Catalyst::Request
659(or other classes) by calling the mk_accessors class method.
7e2ec16e 660
8f61d649 661This is no longer supported - users should make a subclass of the class whose
662behavior they would like to change, rather than globally polluting the
e11cac87 663Catalyst objects.
8be895a7 664
10011c19 665=head2 Confused multiple inheritance with Catalyst::Component::COMPONENT
8be895a7 666
8f61d649 667Previously, Catalyst's COMPONENT method would delegate to the method on
668the right hand side, which could then delegate back again with
669NEXT. This is poor practice, and in addition, makes no sense with C3
670method dispatch order, and is therefore no longer supported.
bcc773b9 671
ba03ccca 672If a COMPONENT method is detected in the inheritance hierarchy to the right
bcc773b9 673hand side of Catalyst::Component::COMPONENT, then the following warning
674message will be emitted:
7e2ec16e 675
8dd2f514 676 There is a COMPONENT method resolving after Catalyst::Component
5687c7f9 677 in ${next_package}.
8dd2f514 678
8f61d649 679The correct fix is to re-arrange your class's inheritance hierarchy so that the
bcc773b9 680COMPONENT method you would like to inherit is the first (left-hand most)
681COMPONENT method in your @ISA.
7e2ec16e 682
7e9340de 683=head2 Development server relying on environment variables
684
685Previously, the development server would allow propagation of system
686environment variables into the request environment, this has changed with the
687adoption of Plack. You can use L<Plack::Middleware::ForceEnv> to achieve the
688same effect.
689
c571d2c8 690=head1 WARNINGS
691
63b546b1 692=head2 Actions in your application class
693
694Having actions in your application class will now emit a warning at application
e256d0e1 695startup as this is deprecated. It is highly recommended that these actions are moved
63b546b1 696into a MyApp::Controller::Root (as demonstrated by the scaffold application
5fa5b709 697generated by catalyst.pl).
da73c6af 698
e256d0e1 699This warning, also affects tests. You should move actions in your test,
700creating a myTest::Controller::Root, like the following example:
da73c6af 701
702 package MyTest::Controller::Root;
95a52a01 703
da73c6af 704 use strict;
705 use warnings;
95a52a01 706
da73c6af 707 use parent 'Catalyst::Controller';
95a52a01 708
da73c6af 709 __PACKAGE__->config(namespace => '');
95a52a01 710
da73c6af 711 sub action : Local {
712 my ( $self, $c ) = @_;
5fa5b709 713 $c->do_something;
da73c6af 714 }
95a52a01 715
da73c6af 716 1;
63b546b1 717
ac9279b0 718=head2 ::[MVC]:: naming scheme
719
720Having packages called MyApp::[MVC]::XX is deprecated and can no longer be generated
721by catalyst.pl
722
723This is still supported, but it is recommended that you rename your application
724components to Model/View/Controller.
725
726A warning will be issued at application startup if the ::[MVC]:: naming scheme is
727in use.
728
ade00972 729=head2 Catalyst::Base
730
8f61d649 731Any code using L<Catalyst::Base> will now emit a warning; this
732module will be removed in a future release.
ade00972 733
c571d2c8 734=head2 Methods in Catalyst::Dispatcher
735
8f61d649 736The following methods in Catalyst::Dispatcher are implementation
737details, which may change in the 5.8X release series, and therefore their use
bcc773b9 738is highly deprecated.
c571d2c8 739
740=over
741
8dd2f514 742=item tree
c571d2c8 743
8dd2f514 744=item dispatch_types
c571d2c8 745
8dd2f514 746=item registered_dispatch_types
c571d2c8 747
8dd2f514 748=item method_action_class
c571d2c8 749
8dd2f514 750=item action_hash
c571d2c8 751
752=item container_hash
753
754=back
755
756The first time one of these methods is called, a warning will be emitted:
7e2ec16e 757
bcc773b9 758 Class $class is calling the deprecated method Catalyst::Dispatcher::$public_method_name,
dacd8b0e 759 this will be removed in Catalyst 5.9
7e2ec16e 760
c571d2c8 761You should B<NEVER> be calling any of these methods from application code.
762
8f61d649 763Plugin authors and maintainers whose plugins currently call these methods
8f5a2bd9 764should change to using the public API, or, if you do not feel the public API
8f61d649 765adequately supports your use case, please email the development list to
8f5a2bd9 766discuss what API features you need so that you can be appropriately supported.
7e2ec16e 767
95b20422 768=head2 Class files with names that don't correspond to the packages they define
7e2ec16e 769
e11cac87 770In this version of Catalyst, if a component is loaded from disk, but no
ba03ccca 771symbols are defined in that component's name space after it is loaded, this
bcc773b9 772warning will be issued:
7e2ec16e 773
bcc773b9 774 require $class was successful but the package is not defined.
7e2ec16e 775
8f61d649 776This is to protect against confusing bugs caused by mistyping package names,
bcc773b9 777and will become a fatal error in a future version.
778
779Please note that 'inner packages' (via L<Devel::InnerPackage>) are still fully
8f61d649 780supported; this warning is only issued when component file naming does not map
bcc773b9 781to B<any> of the packages defined within that component.
7e2ec16e 782
5687c7f9 783=head2 $c->plugin method
784
25f61108 785Calling the plugin method is deprecated, and calling it at run time is B<highly
8dd2f514 786deprecated>.
7e2ec16e 787
95a52a01 788Instead you are recommended to use L<Catalyst::Model::Adaptor> or similar to
ba03ccca 789compose the functionality you need outside of the main application name space.
7e2ec16e 790
4e68badc 791Calling the plugin method will not be supported past Catalyst 5.81.
bcc773b9 792
7e2ec16e 793=cut
4e68badc 794