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