Add note about another syntax used screw your self with C3
[catagits/Catalyst-Runtime.git] / lib / Catalyst / Upgrading.pod
CommitLineData
7e2ec16e 1=head1 Upgrading to Catalyst 5.80
2
5687c7f9 3Most applications and plugins should run unaltered on Catalyst 5.80.
7e2ec16e 4
5687c7f9 5However as a lot of refactoring work has taken place, several changes
10011c19 6have been made which could cause incompatibilities, if your application
5687c7f9 7or plugin is using deprecated code, or relying on side-effects then
8there could be incompatibility.
9
10Most issues found with pre-existing components have been easy to solve,
11and a complete description of behavior changes which may cause compatibility
12issues, or warnings to be emitted is included below to help if you have
13problems.
7e2ec16e 14
5687c7f9 15If you think you have found an upgrade related issue which is not covered in
16this document, then please email the Catalyst list to discuss the problem.
7e2ec16e 17
5687c7f9 18=head1 Known backwards compatibility breakages.
7e2ec16e 19
20=head2 Moose applications
21
845bfcd2 22Moose components for Catalyst 5.70 needed to do
7e2ec16e 23
845bfcd2 24 extends qw/Moose::Object Catalyst::Component/;
7e2ec16e 25
845bfcd2 26to be able to use the constructor provided by Moose. In 5.80
8566c0de 27C<Catalyst::Component> already inherits from C<Moose::Object>. Therefore you
845bfcd2 28shouldn't directly inherit from C<Moose::Object> yourself, otherwise your
10011c19 29Class' @ISA will not linearize with C3.
7e2ec16e 30
8566c0de 31You will also see this issue if you do the following:
32
33 use Moose;
34 use base 'Catalyst::Controller';
35
36as C< use base > appends to @ISA.
37
38FIXME - Add note about the appropriate magic to detect $Catalyst::VERSION
39and work around it at compile time.
40
04a48104 41=head2 Anonymous closures installed directly into the symbol table
42
43If you have any code which installs anonymous subroutine references directly
44into the symbol table, you may encounter breakages. The simplest solution is
45to use L<Sub::Name> to name the subroutine. Example:
46
47 #Originalcode, likely to break:
48 my $full_method_name = join('::',$package_name, $method_name);
49 *$full_method_name = sub { ... };
50
51 #Fixed Code
52 use Sub::Name 'subname';
53 my $full_method_name = join('::',$package_name, $method_name);
54 *$full_method_name = subname $full_method_name, sub { ... };
55
56Additionally, you can take advantage of Catalyst's use of L<Class::MOP> and
57install the closure using the appropriate metaclass. Example:
58
59 use Class::MOP;
60 my $metaclass = Moose::Meta::Class->initialize($package_name);
61 $metaclass->add_method($method_name => sub { ... });
62
5687c7f9 63=head2 Components whos new method returns false
7e2ec16e 64
5687c7f9 65Previously if your new method returned a false value,
7e2ec16e 66
5687c7f9 67Previously, if you had a component which inherited from Catalyst::COMPONENT, but
68overrode the new method, to return false, then your class' configuration would be blessed into a hash on your behalf,
69and this would be returned from the COMPONENT method. T
7e2ec16e 70
5687c7f9 71This behaviour makes no sense, and so has been removed.. You are recommended to implement your own new method
72in components, instead, you should inherit the new method from Catalyst::Component, and use Moose's BUILD functionality
73to perform any construction work necessary for your sub-class.
7e2ec16e 74
75=head2 __PACKAGE__->mk_accessor('meta');
76
5687c7f9 77Won't work due to a limitation of L<Moose>
7e2ec16e 78
5687c7f9 79This is currently being fixed inside core Moose.
7e2ec16e 80
81=head2 Class::Data::Inheritable side effects
82
5687c7f9 83Previously, writing to a class data accessor would copy the accessor method down into your package.
7e2ec16e 84
5687c7f9 85This behavior has been removed. Whilst the class data is still stored per-class, it is stored on
86the metaclass of the class defining the accessor.
7e2ec16e 87
5687c7f9 88Therefore anything relying on the side-effect of the accessor being copied down will be broken.
7e2ec16e 89
5687c7f9 90=head2 Extending Catalyst::Request or other classes in an ad-hoc manor using mk_accessors
7e2ec16e 91
5687c7f9 92Previously, it was possible to add additional accessors to Catalyst::Request (or other classes)
93by calling the mk_accessors class method.
7e2ec16e 94
5687c7f9 95This is no longer supported - users should make a sub-class of the class who's behavior they would
96like to change, rather than globally polluting the Catalyst objects.
8be895a7 97
10011c19 98=head2 Confused multiple inheritance with Catalyst::Component::COMPONENT
8be895a7 99
5687c7f9 100Warning message:
7e2ec16e 101
5687c7f9 102 There is a COMPONENT method resolving after Catalyst::Component
103 in ${next_package}.
104
105This means that one of the packages on the right hand side of
106Catalyst::Component in your Class' inheritance hierarchy defines
107a COMPONENT method.
7e2ec16e 108
5687c7f9 109Previously, Catalyst's COMPONENT method would delegate to the
110method on the right hand side, which could then delegate back again
111with NEXT. This (as it is insane), is no longer supported, as it
112makes no sense with C3 method dispatch order.
113
114Therefore the correct fix is to re-arrange your class' inheritance
115hierarchy so that the COMPONENT method you would like to inherit is
116the first COMPONENT method in your @ISA.
7e2ec16e 117
6c04a1ea 118=head2 Assigning lists to accessors
119
cb092ef3 120Accessors generated by Class::Accessor::Fast will, when multiple values
121are assigned to them, store a reference to a list automatically for you.
122
123This is not currently supported by MooseX::Emulate::Class::Accessor::Fast,
124and only the first value in the list will be stored.
125
126If you are relying on this behavior, and inheriting mk_accessors from a
127Catalyst component, then your code will fail.
6c04a1ea 128
c571d2c8 129=head1 WARNINGS
130
131=head2 Methods in Catalyst::Dispatcher
132
133The following methods in Catalyst::Dispatcher are likely to change
134significantly in the 5.8X release series, and therefore their use is highly
135deprecated.
136
137=over
138
139=item tree
140
141=item dispatch_types
142
143=item registered_dispatch_types
144
145=item method_action_class
146
147=item action_hash
148
149=item container_hash
150
151=back
152
153The first time one of these methods is called, a warning will be emitted:
7e2ec16e 154
155 Class $class is calling the deprecated method Catalyst::Dispatcher::$public_method_name,\n"
156 . "this will be removed in Catalyst 5.9X"
157
c571d2c8 158You should B<NEVER> be calling any of these methods from application code.
159
160Plugins authors and maintainers whos plugins need to call these methods
161should email the development list to discuss your use-case, and what a
162better API should look like.
7e2ec16e 163
5687c7f9 164=head2 require $class was successful but the package is not defined.
7e2ec16e 165
5687c7f9 166In this version of Catalyst, if a component is loaded from disk, but no symbols are defined in that component's namespace
167after it is loaded, this warning will be issued.
7e2ec16e 168
10011c19 169This is to protect against confusing bugs caused by mis-typing package names.
7e2ec16e 170
5687c7f9 171This will become a fatal error in a future version.
7e2ec16e 172
5687c7f9 173=head2 $c->plugin method
174
175Calling the plugin method is deprecated, and calling it at runtime is B<highly deprecated>.
7e2ec16e 176
5687c7f9 177Instead you are recommended to use L< Catalyst::Model::Adaptor > or similar to compose the functionality
178you need outside of the main application namespace.
7e2ec16e 179
180=cut