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