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