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