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