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