more release docs updates, and fixed some config options;
[catagits/Catalyst-Runtime.git] / lib / Catalyst / Delta.pod
CommitLineData
8c57b129 1=head1 NAME
6c18e892 2
8c57b129 3Catalyst::Delta - Overview of changes between versions of Catalyst
4
5=head1 DESCRIPTION
6
46fff667 7This is an overview of the user-visible changes to Catalyst between major
8Catalyst releases.
9
77b5811a 10=head2 VERSION 5.90080+
11
12The biggest change in this release is that UTF8 encoding is now enabled by
13default. So you no longer need any plugins (such as L<Catalyst::Plugin::Unicode::Encoding>)
14which you can just no go ahead and remove. You also don't need to set
15the encoding configuration (__PACKAGE__->config(encoding=>'UTF-8')) anymore
16as well (although its presense hurts nothing).
17
18If this change causes you trouble, you can disable it:
19
20 __PACKAGE__->config(encoding=>undef);
21
22But please report bugs. You will find that a number of common Views have been
23updated for this release (such as L<Catalyst::View::TT>). In all cases that the
24author is aware of these updates were to fix test cases only. You shouldn't
25need to update unless you are installing fresh and want tests to pass.
26
27L<Catalyst::Plugin::Compress> was updated to be compatible with this release.
28You will need to upgrade if you are using this plugin.
29
30A small change is that the configuration setting C<using_frontend_proxy>
31was not doing the right thing if you started your application with C<psgi_app>
32and dod not apply the default middleware. This setting is now honored in
33all the ways an application may be started. This could cause trouble if you
34are using the configuration value and also adding the proxy middleware
35manually with a custom application startup. The solution is that you only
36need the configuration value set, or the middleware manually added (not both).
37
46fff667 38=head2 VERSION 5.90060+
39
8f3c0676 40=head3 Catalyst::Log object autoflush on by default
41
42Starting in 5.90065, the Catalyst::Log object has 'autoflush' which is on
43by default. This causes all messages to be written to the log immediately
44instead of at the end of startup and then at the end of each request. In
45order to access the old behavior, you must now call:
46
47 $c->log->autoflush(0);
48
efa8265f 49=head3 Deprecate Catalyst::Utils::ensure_class_loaded
3dc04d08 50
51Going forward we recommend you use L<Module::Runtime>. In fact we will
52be converting all uses of L<Class::Load> to L<Module::Runtime>. We will
53also convert L<Catalyst::Utils\ensure_class_loaded> to be based on
54L<Module::Runtime> to allow some time for you to update code, however at
55some future point this method will be removed so you should stop
56using it now.
57
fb29a8be 58=head3 Support passing Body filehandles directly to your Plack server.
0fb94688 59
46fff667 60We changed the way we return body content (from response) to whatever
61Plack handler you are using (Starman, FastCGI, etc.) We no longer
62always use the streaming interface for the cases when the body is a
63simple scalar, object or filehandle like. In those cases we now just
64pass the simple response on to the plack handler. This might lead to
65some minor differences in how streaming is handled. For example, you
efa8265f 66might notice that streaming starts properly supporting chunked encoding when
46fff667 67on a server that supports that, or that previously missing headers
68(possible content-length) might appear suddenly correct. Also, if you
69are using middleware like L<Plack::Middleware::XSendfile> and are using
70a filehandle that sets a readable path, your server might now correctly
71handle the file (rather than as before where Catalyst would stream it
72very likely very slowly).
73
74In other words, some things might be meaninglessly different and some
75things that were broken codewise but worked because of Catalyst being
76incorrect might suddenly be really broken. The behavior is now more
77correct in that Catalyst plays better with features that Plack offers
78but if you are making heavy use of the streaming interface there could
79be some differences so you should test carefully (this is probably not
80the vast majority of people). In particular if you are developing
81using one server but deploying using a different one, differences in
82what those server do with streaming should be noted.
83
0fb94688 84Please see note below about changes to filehandle support and existing
efa8265f 85Plack middleware to aid in backwards compatibility.
0fb94688 86
87=head3 Distinguish between body null versus undef.
88
46fff667 89We also now more carefully distingush the different between a body set
90to '' and a body that is undef. This might lead to situations where
91again you'll get a content-length were you didn't get one before or
92where a supporting server will start chunking output. If this is an
93issue you can apply the middleware L<Plack::Middleware::BufferedStreaming>
94or report specific problems to the dev team.
b31499bc 95
0fb94688 96=head3 More Catalyst Middleware
97
98We have started migrating code in Catalyst to equivilent Plack
99Middleware when such exists and is correct to do so. For example we now use
100L<Plack::Middleware::ContentLength> to determine content length of a response
101when none is provided. This replaces similar code inlined with L<Catalyst>
102The main advantages to doing this is 1) more similar Catalyst core that is
103focused on the Catalyst special sauce, 2) Middleware is more broadly shared
104so we benefit from better collaboration with developers outside Catalyst, 3)
105In the future you'll be able to change or trim the middleware stack to get
106additional performance when you don't need all the checks and constraints.
107
efa8265f 108=head3 Deprecate Filehandle like objects that do read but not getline
8e098614 109
110We also deprecated setting the response body to an object that does 'read'
111but not 'getline'. If you are using a custom IO-Handle like object for
112response you should verify that 'getline' is supported in your interface.
e27f6633 113Unless we here this case is a major issue for people, we will be removing support
0fb94688 114in a near future release of Catalyst. When the code encounters this it
115will issue a warning. You also may run into this issue with L<MogileFS::Client>
116which does read but not getline. For now we will just warn when encountering
117such an object and fallback to the previous behavior (where L<Catalyst::Engine>
118itself unrolls the filehandle and performs blocking streams). However
efa8265f 119this backwards compatibility will be removed in an upcoming release so you should either
0fb94688 120rewrite your custom filehandle objects to support getline or start using the
121middleware that adapts read for getline L<Plack::Middleware::AdaptFilehandleRead>.
122
efa8265f 123=head3 Response->headers become read-only after finalizing
8a3dcb98 124
125Once the response headers are finalized, trying to change them is not allowed
126(in the past you could change them and this would lead to unexpected results).
127
efa8265f 128=head3 Officially deprecate L<Catalyst::Engine::PSGI>
8e098614 129
130L<Catalyst::Engine::PSGI> is also officially no longer supported. We will
efa8265f 131no long run test cases against this and can remove backwards compatibility code for it
132as deemed necessary for the evolution of the platform. You should simply
133discontinue use of this engine, as L<Catalyst> has been PSGI at the core for
134several years.
aa20e9f5 135
efa8265f 136=head3 Officially deprecate finding the PSGI $env anyplace other than Request
0fb94688 137
138A few early releases of Cataplack had the PSGI $env in L<Catalyst::Engine>.
efa8265f 139Code has been maintained here for backwards compatibility reasons. This is no
140longer supported and will be removed in upcoming release, so you should update
0fb94688 141your code and / or upgrade to a newer version of L<Catalyst>
142
efa8265f 143=head3 Deprecate setting Response->body after using write/write_fh
8a3dcb98 144
145Setting $c->res->body to a filehandle after using $c->res->write or
146$c->res->write_fh is no longer considered allowed, since we can't send
147the filehandle to the underlying Plack handler. For now we will continue
3157d22a 148to support setting body to a simple value since this is possible, but at
149some future release a choice to use streaming indicates that you will do
150so for the rest of the request.
8a3dcb98 151
e27f6633 152
5bb2a5b3 153=head2 VERSION 5.90053
154
155We are now clarifying the behavior of log, plugins and configuration during
156the setup phase. Since Plugins might require a log during setup, setup_log
157must run BEFORE setup_plugins. This has the unfortunate side effect that
158anyone using the popular ConfigLoader plugin will not be able to supply
159configuration to custom logs since the configuration is not yet finalized
160when setup_log is run (when using ConfigLoader, which is a plugin and is
161not loaded until later.)
162
163As a workaround, you can supply custom log configuration directly into
164the configuration:
165
166 package MyApp;
167 use Catalyst;
168
169 __PACKAGE__->config(
170 my_custom_log_info => { %custom_args },
171 );
172
173 __PACKAGE__->setup;
174
175If you wish to configure the custom logger differently based on ENV, you can
176try:
177
178 package MyApp;
179
180 use Catalyst;
181 use Catalyst::Utils;
182
183 __PACKAGE__->config(
184 Catalyst::Utils::merge_hashes(
185 +{ my_custom_log_info => { %base_custom_args } },
186 +{ do __PACKAGE__->path_to( $ENV{WHICH_CONF}."_conf.pl") },
187 ),
188 );
189
190 __PACKAGE__->setup;
191
192Or create a standalone Configuration class that does the right thing.
193
194Basically if you want to configure a logger via Catalyst global configuration
195you can't use ConfigLoader because it will always be loaded too late to be of
196any use. Patches and workaround options welcomed!
197
9b3b1b9c 198=head2 VERSION 5.9XXXX 'cataplack'
c20710a1 199
200The Catalyst::Engine sub-classes have all been removed and deprecated,
201to be replaced with Plack handlers.
202
203Plack is an implementation of the L<PSGI> specification, which is
204a standard interface between web servers and application frameworks.
205
206This should be no different for developers, and you should not have to
207migrate your applications unless you are using a custom engine already.
208
209This change benefits Catalyst significantly by reducing the amount of
210code inside the framework, and means that the framework gets upstream
211bug fixes in L<Plack>, and automatically gains support for any web server
212which a L<PSGI> compliant handler is written for.
213
214It also allows you more flexibility with your application, and allows
215the use of cross web framework 'middleware'.
216
217Developers are recommended to read L<Catalyst::Upgrading> for notes about
218upgrading, especially if you are using an unusual deployment method.
219
220Documentation for how to take advantage of L<PSGI> can be found in
221L<Catalyst::PSGI>, and information about deploying your application
222has been moved to L<Catalyst::Manual::Deployment>.
223
224=head3 Updated modules:
225
226A number of modules have been updated to pass their tests or not
227produce deprecation warnings with the latest version of Catalyst.
228It is recommended that you upgrade any of these that you are using
229after installing this version of Catalyst.
230
231These extensions are:
232
233=over
234
235=item L<Catalyst::Engine::HTTP::Prefork>
236
237This is now deprecated, see L<Catalyst::Upgrading>.
238
239=item L<Test::WWW::Mechanize::Catalyst>
240
241Has been updated to not produce deprecation warnings, upgrade recommended.
242
243=item Catalyst::ActionRole::ACL
244
245Has been updated to fix failing tests (although older versions still
246function perfectly with this version of Catalyst).
247
248=item Catalyst::Plugin::Session::Store::DBIC
249
250Has been updated to fix failing tests (although older versions still
251function perfectly with this version of Catalyst).
252
14eb7697 253=item Catalyst::Plugin::Authentication
254
255Has been updated to fix failing tests (although older versions still
256function perfectly with this version of Catalyst).
257
c20710a1 258=back
1fae8c61 259
260=head1 PREVIOUS VERSIONS
261
9b3b1b9c 262=head2 VERSION 5.8XXXX 'catamoose'
1fae8c61 263
264=head3 Deprecations
b31499bc 265
e88235ff 266Please see L<Catalyst::Upgrading> for a full description of how changes in the
267framework may affect your application.
268
269Below is a brief list of features which have been deprecated in this release:
270
796a8358 271=over
b31499bc 272
796a8358 273=item ::[MVC]:: style naming scheme has been deprecated and will warn
b31499bc 274
e88235ff 275=item NEXT is deprecated for all applications and components, use MRO::Compat
b31499bc 276
e88235ff 277=item Dispatcher methods which are an implementation detail made private, public versions now warn.
b31499bc 278
e88235ff 279=item MyApp->plugin method is deprecated, use L<Catalyst::Model::Adaptor> instead.
796a8358 280
efa8265f 281=item __PACKAGE__->mk_accessors() is supported for backwards compatibility only, use Moose attributes instead in new code.
0a3b8de0 282
7df44a71 283=item Use of Catalyst::Base now warns
284
796a8358 285=back
286
1fae8c61 287=head3 New features
0a3b8de0 288
289=head3 Dispatcher
b31499bc 290
7df44a71 291=over
292
293=item Fix forwarding to Catalyst::Action objects.
294
295=item Add the dispatch_type method
296
297=back
b31499bc 298
0a3b8de0 299=head3 Restarter
b31499bc 300
6171ddd5 301The development server restarter has been improved to be compatible with
302immutable Moose classes, and also to optionally use
303L<B::Hooks::OP::Check::StashChange> to handle more complex application layouts
304correctly.
b31499bc 305
7df44a71 306=head3 $c->uri_for_action method.
b31499bc 307
7df44a71 308Give a private path to the Catalyst action you want to create a URI for.
6c18e892 309
0a3b8de0 310=head3 Logging
b31499bc 311
7df44a71 312Log levels have been made additive.
b31499bc 313
0a3b8de0 314=head3 L<Catalyst::Test>
315
316=over
317
318=item Change to use L<Sub::Exporter>.
319
0a3b8de0 320=item Support mocking multiple virtual hosts
321
322=item New methods like action_ok and action_redirect to write more compact tests
323
324=back
325
7df44a71 326=head3 Catalyst::Response
0a3b8de0 327
7df44a71 328=over
329
330=item *
331
332New print method which prints @data to the output stream, separated by $,.
333This lets you pass the response object to functions that want to write to an
334L<IO::Handle>.
335
336=item *
337
338Added code method as an alias for C<< $res->status >>
0a3b8de0 339
d5a6de01 340=back
341
1fae8c61 342=head3 Consequences of the Moose back end
b31499bc 343
796a8358 344=over
345
346=item *
347
7df44a71 348Components are fully compatible with Moose, and all Moose features, such as
349method modifiers, attributes, roles, BUILD and BUILDARGS methods are fully
350supported and may be used in components and applications.
351
352=item *
353
354Many reusable extensions which would previously have been plugins or base
355classes are better implemented as Moose roles.
356
357=item *
358
a0c37f08 359L<MooseX::MethodAttributes::Role::AttrContainer::Inheritable> is used to contain action
7df44a71 360attributes. This means that attributes are represented in the MOP, and
361decouples action creation from attributes.
796a8358 362
363=item *
364
0a3b8de0 365There is a reasonable API in Catalyst::Controller for working with
796a8358 366and registering actions, allowing a controller sub-class to replace
25f61108 367subroutine attributes for action declarations with an alternate
0a3b8de0 368syntax.
796a8358 369
370=item *
371
0a3b8de0 372Refactored capturing of $app from L<Catalyst::Controller> into
373L<Catalyst::Component::ApplicationAttribute> for easier reuse in other
7df44a71 374components.
375
376=item *
377
378Your application class is forced to become immutable at the end of compilation.
379
380=back
381
1fae8c61 382=head3 Bug fixes
7df44a71 383
384=over
385
386=item *
387
25f61108 388Don't ignore SIGCHLD while handling requests with the development server, so that
7df44a71 389system() and other ways of creating child processes work as expected.
390
391=item *
392
393Fixes for FastCGI when used with IIS 6.0
394
395=item *
396
397Fix a bug in uri_for which could cause it to generate paths with multiple
398slashes in them.
796a8358 399
400=item *
401
7df44a71 402Fix a bug in Catalyst::Stats, stopping garbage being inserted into
403the stats if a user calls begin => but no end
796a8358 404
405=back
406