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