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