NAME Catalyst::Plugin::Continuation - Catalyst Continuation Plugin SYNOPSIS # Make sure to load session plugins too! package MyApp; use Catalyst qw/Session Session::Store::File Session::State::Cookie Continuation/; # Create a controller package MyApp::Controller::Test; use base 'Catalyst::Controller'; # Add a action with attached action class sub counter : Global { my ( $self, $c ) = @_; my $up = $c->continue('up'); my $down = $c->continue('down'); my $counter = $c->stash->{counter} || 0; $c->res->body(<<"EOF"); Counter: $counter
++ -- EOF } # Add private actions for continuations sub up : Private { $_[1]->stash->{counter}++ } sub down : Private { $_[1]->stash->{counter}-- } DESCRIPTION Catalyst Continuation Plugin. OVERLOADED METHODS prepare_action dispatch These methods are overridden to allow the special continuation dispatch. METHODS continuation Contains the continuation object that was restored. set_continuation $id, $structure get_continuation $id delete_continuation $id active_continuations clear_continuations generate_continuation_id These are internal methods which you can override. They default to storing inside "$c->session", and using "generate_session_id" in Catalyst::Plugin::Session. If you want your continuations to be garbage collected in some way you need to override this to store the data in some other backend. Note that "active_continuations" returns a hash reference which you can edit. Be careful. $c->continuation_expired( $id ) This handler is called when the continuation with the ID $id tried to get invoked but did not exist $c->resume_continuation( $cont_or_id ); Resume a continuation based on an ID or an object. This is a convenience method intended on saving you the need to load and execute the continuation yourself. $c->continue($method) $c->cont($method) Returns the Catalyst::Continuation object for given method. Takes the same arguments as "forward" in Catalyst and it's relatives. $c->caller_continuation A pseudo-cc - a continuation to your caller. Note that this does NOT honor the call stack in any way - it is ONLY to reinvoke the immediate caller. See the NeedsLogin test controller in the test suite for an example of how to use this effectively. $c->cont_class Returns the string "Catalyst::Continuation" by default. You may override this to replace the continuation class. CAVEATS Continuations take up space, and are by default stored in the session. When invoked a session will delete itself by default, but anything else will leak, until the session expires. If this is a concern for you, override the "get_continuation" family of functions to have a better scheme for storage. Some approaches you could implement, depending on how you use continuations: size limiting Store up to $x continuations, and toss out old ones once this starts to overflow. This is essentially an LRU policy. continuation grouping Group all the continuations saved in a single request together. When one of them is deleted, all the rest go with it. use the fine grained session expiry feature Catalyst::Plugin::Session allows you to expire some session keys before the entire session expired. You can associate each session with it's own unique key, and avoid extending the continuation's time-to-live. If you override all these functions then you don't need the Catalyst::Plugin::Session dependency. SEE ALSO Catalyst, Seaside (http://www.seaside.st/), Jifty, Coro::Cont, psychiatrist(1). AUTHOR Sebastian Riedel, "sri@oook.de" Yuval Kogman, "nothingmuch@woobling.org" LICENSE This library is free software, you can redistribute it and/or modify it under the same terms as Perl itself.