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