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