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