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