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