updated depraction notes
[catagits/Catalyst-Runtime.git] / lib / Catalyst / Delta.pod
1 =head1 NAME
2
3 Catalyst::Delta - Overview of changes between versions of Catalyst
4
5 =head1 DESCRIPTION
6
7 This is an overview of the user-visible changes to Catalyst between major
8 Catalyst releases.
9
10 =head2 VERSION 5.90060+
11
12 =head3 Deprecation of Catalyst::Utils::ensure_class_loaded
13
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
19 using it now.
20
21 =head3 Support passing Body filehandles directly to your Plack server.
22
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 supportubg 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).
36
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.
46
47 Please see note below about changes to filehandle support and existing
48 Plack middleware to aid in back compatibility.
49
50 =head3 Distinguish between body null versus undef.
51
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.
58
59 =head3 More Catalyst Middleware
60
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.
70
71 =head3 Deprecation of Filehandle like objects that do read but not getline
72
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 backcompat 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>.
85
86 =head3 Response->headers become readonly after finalizing
87
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).
90
91 =head3 Offically deprecation of L<Catalyst::Engine::PSGI>
92
93 L<Catalyst::Engine::PSGI> is also officially no longer supported.  We will
94 no long run test cases against this and can remove backcompat code for it
95 as deemed necessary for the evolution of the platform.  You should simple
96 discontinue use of this engine, as L<Catalyst> has been PSGI at the core
97 for several years.
98
99 =head2 Officially deprecate finding the PSGI $env anyplace other than Request
100
101 A few early releases of Cataplack had the PSGI $env in L<Catalyst::Engine>.
102 Code has been maintained here for backcompat reasons.  This is no longer
103 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>
105
106 =head2 Deprecate setting Response->body after using write/write_fh
107
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.
114
115
116 =head2 VERSION 5.90053
117
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.)
125
126 As a workaround, you can supply custom log configuration directly into
127 the configuration:
128
129     package MyApp;
130     use Catalyst;
131
132     __PACKAGE__->config(
133       my_custom_log_info => { %custom_args },
134     );
135
136     __PACKAGE__->setup;
137
138 If you wish to configure the custom logger differently based on ENV, you can
139 try:
140
141     package MyApp;
142
143     use Catalyst;
144     use Catalyst::Utils;
145
146     __PACKAGE__->config(
147       Catalyst::Utils::merge_hashes(
148         +{ my_custom_log_info => { %base_custom_args } },
149         +{ do __PACKAGE__->path_to( $ENV{WHICH_CONF}."_conf.pl") },
150       ),
151     );
152
153     __PACKAGE__->setup;
154
155 Or create a standalone Configuration class that does the right thing.
156
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!
160
161 =head2 VERSION 5.9XXXX 'cataplack'
162
163 The Catalyst::Engine sub-classes have all been removed and deprecated,
164 to be replaced with Plack handlers.
165
166 Plack is an implementation of the L<PSGI> specification, which is
167 a standard interface between web servers and application frameworks.
168
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.
171
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.
176
177 It also allows you more flexibility with your application, and allows
178 the use of cross web framework 'middleware'.
179
180 Developers are recommended to read L<Catalyst::Upgrading> for notes about
181 upgrading, especially if you are using an unusual deployment method.
182
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>.
186
187 =head3 Updated modules:
188
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.
193
194 These extensions are:
195
196 =over
197
198 =item L<Catalyst::Engine::HTTP::Prefork>
199
200 This is now deprecated, see L<Catalyst::Upgrading>.
201
202 =item L<Test::WWW::Mechanize::Catalyst>
203
204 Has been updated to not produce deprecation warnings, upgrade recommended.
205
206 =item Catalyst::ActionRole::ACL
207
208 Has been updated to fix failing tests (although older versions still
209 function perfectly with this version of Catalyst).
210
211 =item Catalyst::Plugin::Session::Store::DBIC
212
213 Has been updated to fix failing tests (although older versions still
214 function perfectly with this version of Catalyst).
215
216 =item Catalyst::Plugin::Authentication
217
218 Has been updated to fix failing tests (although older versions still
219 function perfectly with this version of Catalyst).
220
221 =back
222
223 =head1 PREVIOUS VERSIONS
224
225 =head2 VERSION 5.8XXXX 'catamoose'
226
227 =head3 Deprecations
228
229 Please see L<Catalyst::Upgrading> for a full description of how changes in the
230 framework may affect your application.
231
232 Below is a brief list of features which have been deprecated in this release:
233
234 =over
235
236 =item ::[MVC]:: style naming scheme has been deprecated and will warn
237
238 =item NEXT is deprecated for all applications and components, use MRO::Compat
239
240 =item Dispatcher methods which are an implementation detail made private, public versions now warn.
241
242 =item MyApp->plugin method is deprecated, use L<Catalyst::Model::Adaptor> instead.
243
244 =item __PACKAGE__->mk_accessors() is supported for backward compatibility only, use Moose attributes instead in new code.
245
246 =item Use of Catalyst::Base now warns
247
248 =back
249
250 =head3 New features
251
252 =head3 Dispatcher
253
254 =over
255
256 =item Fix forwarding to Catalyst::Action objects.
257
258 =item Add the dispatch_type method
259
260 =back
261
262 =head3 Restarter
263
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
267 correctly.
268
269 =head3 $c->uri_for_action method.
270
271 Give a private path to the Catalyst action you want to create a URI for.
272
273 =head3 Logging
274
275 Log levels have been made additive.
276
277 =head3 L<Catalyst::Test>
278
279 =over
280
281 =item Change to use L<Sub::Exporter>.
282
283 =item Support mocking multiple virtual hosts
284
285 =item New methods like action_ok and action_redirect to write more compact tests
286
287 =back
288
289 =head3 Catalyst::Response
290
291 =over
292
293 =item *
294
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 
297 L<IO::Handle>.
298
299 =item *
300
301 Added code method as an alias for C<< $res->status >>
302
303 =back
304
305 =head3 Consequences of the Moose back end
306
307 =over
308
309 =item *
310
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.
314
315 =item *
316
317 Many reusable extensions which would previously have been plugins or base 
318 classes are better implemented as Moose roles.
319
320 =item *
321
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.
325
326 =item *
327
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
331 syntax.
332
333 =item *
334
335 Refactored capturing of $app from L<Catalyst::Controller> into
336 L<Catalyst::Component::ApplicationAttribute> for easier reuse in other
337 components.
338
339 =item *
340
341 Your application class is forced to become immutable at the end of compilation.
342
343 =back
344
345 =head3 Bug fixes
346
347 =over
348
349 =item *
350
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.
353
354 =item *
355
356 Fixes for FastCGI when used with IIS 6.0
357
358 =item *
359
360 Fix a bug in uri_for which could cause it to generate paths with multiple 
361 slashes in them.
362
363 =item *
364
365 Fix a bug in Catalyst::Stats, stopping garbage being inserted into
366 the stats if a user calls begin => but no end
367
368 =back
369