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