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