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