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