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