3 Catalyst::Delta - Overview of changes between versions of Catalyst
7 This is an overview of the user-visible changes to Catalyst between major
10 =head2 VERSION 5.90060+
12 =head3 Deprecate Catalyst::Utils::ensure_class_loaded
14 Going forward we recommend you use L<Module::Runtime>. In fact we will
15 be converting all uses of L<Class::Load> to L<Module::Runtime>. We will
16 also convert L<Catalyst::Utils\ensure_class_loaded> to be based on
17 L<Module::Runtime> to allow some time for you to update code, however at
18 some future point this method will be removed so you should stop
21 =head3 Support passing Body filehandles directly to your Plack server.
23 We changed the way we return body content (from response) to whatever
24 Plack handler you are using (Starman, FastCGI, etc.) We no longer
25 always use the streaming interface for the cases when the body is a
26 simple scalar, object or filehandle like. In those cases we now just
27 pass the simple response on to the plack handler. This might lead to
28 some minor differences in how streaming is handled. For example, you
29 might notice that streaming starts properly supporting chunked encoding when
30 on a server that supports that, or that previously missing headers
31 (possible content-length) might appear suddenly correct. Also, if you
32 are using middleware like L<Plack::Middleware::XSendfile> and are using
33 a filehandle that sets a readable path, your server might now correctly
34 handle the file (rather than as before where Catalyst would stream it
35 very likely very slowly).
37 In other words, some things might be meaninglessly different and some
38 things that were broken codewise but worked because of Catalyst being
39 incorrect might suddenly be really broken. The behavior is now more
40 correct in that Catalyst plays better with features that Plack offers
41 but if you are making heavy use of the streaming interface there could
42 be some differences so you should test carefully (this is probably not
43 the vast majority of people). In particular if you are developing
44 using one server but deploying using a different one, differences in
45 what those server do with streaming should be noted.
47 Please see note below about changes to filehandle support and existing
48 Plack middleware to aid in backwards compatibility.
50 =head3 Distinguish between body null versus undef.
52 We also now more carefully distingush the different between a body set
53 to '' and a body that is undef. This might lead to situations where
54 again you'll get a content-length were you didn't get one before or
55 where a supporting server will start chunking output. If this is an
56 issue you can apply the middleware L<Plack::Middleware::BufferedStreaming>
57 or report specific problems to the dev team.
59 =head3 More Catalyst Middleware
61 We have started migrating code in Catalyst to equivilent Plack
62 Middleware when such exists and is correct to do so. For example we now use
63 L<Plack::Middleware::ContentLength> to determine content length of a response
64 when none is provided. This replaces similar code inlined with L<Catalyst>
65 The main advantages to doing this is 1) more similar Catalyst core that is
66 focused on the Catalyst special sauce, 2) Middleware is more broadly shared
67 so we benefit from better collaboration with developers outside Catalyst, 3)
68 In the future you'll be able to change or trim the middleware stack to get
69 additional performance when you don't need all the checks and constraints.
71 =head3 Deprecate Filehandle like objects that do read but not getline
73 We also deprecated setting the response body to an object that does 'read'
74 but not 'getline'. If you are using a custom IO-Handle like object for
75 response you should verify that 'getline' is supported in your interface.
76 Unless we here this case is a major issue for people, we will be removing support
77 in a near future release of Catalyst. When the code encounters this it
78 will issue a warning. You also may run into this issue with L<MogileFS::Client>
79 which does read but not getline. For now we will just warn when encountering
80 such an object and fallback to the previous behavior (where L<Catalyst::Engine>
81 itself unrolls the filehandle and performs blocking streams). However
82 this backwards compatibility will be removed in an upcoming release so you should either
83 rewrite your custom filehandle objects to support getline or start using the
84 middleware that adapts read for getline L<Plack::Middleware::AdaptFilehandleRead>.
86 =head3 Response->headers become read-only after finalizing
88 Once the response headers are finalized, trying to change them is not allowed
89 (in the past you could change them and this would lead to unexpected results).
91 =head3 Officially deprecate L<Catalyst::Engine::PSGI>
93 L<Catalyst::Engine::PSGI> is also officially no longer supported. We will
94 no long run test cases against this and can remove backwards compatibility code for it
95 as deemed necessary for the evolution of the platform. You should simply
96 discontinue use of this engine, as L<Catalyst> has been PSGI at the core for
99 =head3 Officially deprecate finding the PSGI $env anyplace other than Request
101 A few early releases of Cataplack had the PSGI $env in L<Catalyst::Engine>.
102 Code has been maintained here for backwards compatibility reasons. This is no
103 longer supported and will be removed in upcoming release, so you should update
104 your code and / or upgrade to a newer version of L<Catalyst>
106 =head3 Deprecate setting Response->body after using write/write_fh
108 Setting $c->res->body to a filehandle after using $c->res->write or
109 $c->res->write_fh is no longer considered allowed, since we can't send
110 the filehandle to the underlying Plack handler. For now we will continue
111 to support setting body to a simple value since this is possible, but at
112 some future release a choice to use streaming indicates that you will do
113 so for the rest of the request.
116 =head2 VERSION 5.90053
118 We are now clarifying the behavior of log, plugins and configuration during
119 the setup phase. Since Plugins might require a log during setup, setup_log
120 must run BEFORE setup_plugins. This has the unfortunate side effect that
121 anyone using the popular ConfigLoader plugin will not be able to supply
122 configuration to custom logs since the configuration is not yet finalized
123 when setup_log is run (when using ConfigLoader, which is a plugin and is
124 not loaded until later.)
126 As a workaround, you can supply custom log configuration directly into
133 my_custom_log_info => { %custom_args },
138 If you wish to configure the custom logger differently based on ENV, you can
147 Catalyst::Utils::merge_hashes(
148 +{ my_custom_log_info => { %base_custom_args } },
149 +{ do __PACKAGE__->path_to( $ENV{WHICH_CONF}."_conf.pl") },
155 Or create a standalone Configuration class that does the right thing.
157 Basically if you want to configure a logger via Catalyst global configuration
158 you can't use ConfigLoader because it will always be loaded too late to be of
159 any use. Patches and workaround options welcomed!
161 =head2 VERSION 5.9XXXX 'cataplack'
163 The Catalyst::Engine sub-classes have all been removed and deprecated,
164 to be replaced with Plack handlers.
166 Plack is an implementation of the L<PSGI> specification, which is
167 a standard interface between web servers and application frameworks.
169 This should be no different for developers, and you should not have to
170 migrate your applications unless you are using a custom engine already.
172 This change benefits Catalyst significantly by reducing the amount of
173 code inside the framework, and means that the framework gets upstream
174 bug fixes in L<Plack>, and automatically gains support for any web server
175 which a L<PSGI> compliant handler is written for.
177 It also allows you more flexibility with your application, and allows
178 the use of cross web framework 'middleware'.
180 Developers are recommended to read L<Catalyst::Upgrading> for notes about
181 upgrading, especially if you are using an unusual deployment method.
183 Documentation for how to take advantage of L<PSGI> can be found in
184 L<Catalyst::PSGI>, and information about deploying your application
185 has been moved to L<Catalyst::Manual::Deployment>.
187 =head3 Updated modules:
189 A number of modules have been updated to pass their tests or not
190 produce deprecation warnings with the latest version of Catalyst.
191 It is recommended that you upgrade any of these that you are using
192 after installing this version of Catalyst.
194 These extensions are:
198 =item L<Catalyst::Engine::HTTP::Prefork>
200 This is now deprecated, see L<Catalyst::Upgrading>.
202 =item L<Test::WWW::Mechanize::Catalyst>
204 Has been updated to not produce deprecation warnings, upgrade recommended.
206 =item Catalyst::ActionRole::ACL
208 Has been updated to fix failing tests (although older versions still
209 function perfectly with this version of Catalyst).
211 =item Catalyst::Plugin::Session::Store::DBIC
213 Has been updated to fix failing tests (although older versions still
214 function perfectly with this version of Catalyst).
216 =item Catalyst::Plugin::Authentication
218 Has been updated to fix failing tests (although older versions still
219 function perfectly with this version of Catalyst).
223 =head1 PREVIOUS VERSIONS
225 =head2 VERSION 5.8XXXX 'catamoose'
229 Please see L<Catalyst::Upgrading> for a full description of how changes in the
230 framework may affect your application.
232 Below is a brief list of features which have been deprecated in this release:
236 =item ::[MVC]:: style naming scheme has been deprecated and will warn
238 =item NEXT is deprecated for all applications and components, use MRO::Compat
240 =item Dispatcher methods which are an implementation detail made private, public versions now warn.
242 =item MyApp->plugin method is deprecated, use L<Catalyst::Model::Adaptor> instead.
244 =item __PACKAGE__->mk_accessors() is supported for backwards compatibility only, use Moose attributes instead in new code.
246 =item Use of Catalyst::Base now warns
256 =item Fix forwarding to Catalyst::Action objects.
258 =item Add the dispatch_type method
264 The development server restarter has been improved to be compatible with
265 immutable Moose classes, and also to optionally use
266 L<B::Hooks::OP::Check::StashChange> to handle more complex application layouts
269 =head3 $c->uri_for_action method.
271 Give a private path to the Catalyst action you want to create a URI for.
275 Log levels have been made additive.
277 =head3 L<Catalyst::Test>
281 =item Change to use L<Sub::Exporter>.
283 =item Support mocking multiple virtual hosts
285 =item New methods like action_ok and action_redirect to write more compact tests
289 =head3 Catalyst::Response
295 New print method which prints @data to the output stream, separated by $,.
296 This lets you pass the response object to functions that want to write to an
301 Added code method as an alias for C<< $res->status >>
305 =head3 Consequences of the Moose back end
311 Components are fully compatible with Moose, and all Moose features, such as
312 method modifiers, attributes, roles, BUILD and BUILDARGS methods are fully
313 supported and may be used in components and applications.
317 Many reusable extensions which would previously have been plugins or base
318 classes are better implemented as Moose roles.
322 L<MooseX::MethodAttributes::Role::AttrContainer::Inheritable> is used to contain action
323 attributes. This means that attributes are represented in the MOP, and
324 decouples action creation from attributes.
328 There is a reasonable API in Catalyst::Controller for working with
329 and registering actions, allowing a controller sub-class to replace
330 subroutine attributes for action declarations with an alternate
335 Refactored capturing of $app from L<Catalyst::Controller> into
336 L<Catalyst::Component::ApplicationAttribute> for easier reuse in other
341 Your application class is forced to become immutable at the end of compilation.
351 Don't ignore SIGCHLD while handling requests with the development server, so that
352 system() and other ways of creating child processes work as expected.
356 Fixes for FastCGI when used with IIS 6.0
360 Fix a bug in uri_for which could cause it to generate paths with multiple
365 Fix a bug in Catalyst::Stats, stopping garbage being inserted into
366 the stats if a user calls begin => but no end