# $Id: MortalForward.pm 1111 2006-02-22 00:39:49Z ykerherve $
package Catalyst::Plugin::MortalForward;
use warnings;
use strict;

our $VERSION = '0.01';

use NEXT;
sub execute {
    my $c = shift;
    my ($class, $action) = @_;
    local $NEXT::NEXT{ $c, 'execute' };
    my $error_count = scalar @{$c->error};
    # Don't die for internal actions
    return $c->state if $c->depth < 3 || $action->name =~ m/^_/; 

    my @errors = @{ $c->error };
    if ($error_count < scalar @errors) {
        my $error = pop @errors;
        die $error;
    return $c->state;

"Il ne doit en rester qu'un";


=head1 NAME 

Catalyst::Plugin::MortalForward - Make forward() to throw exception


    use Catalyst qw( MortalForward );

    sub someaction : Local {
        $c->forward('check_input'); # may die

        # never executed if forward dies
        do_something_important(); # assume that the input has been checked


I<Catalyst::Plugin::MortalForward> is a small plugin that changes the behaviour
of C<< $c->forward >> which usually never dies (because the forwarded code
is internally wrapped into an eval block.

This plugin changes this behaviour B<globally>. The forward method will throw
exceptions (that you should be carefull to handle at somepoint or the default
Catalyst error page will be displayed)

=head1 SEE ALSO

Discussion on the Catalyst mailing list: 
(followed-up in February)

=head1 BUGS & TODOS

Please report any problem.
If you let the exception reach Catalyst internal, then the error (which is logged
might be a bit messy) because it holds the information of all successive layers
that the exception went thru. For instance : 

Caught exception in TestApp->class_fwd "Caught exception in TestApp::C::Elsewhere->test "I die too, sorry at /Users/yann/Catalyst/Catalyst-Plugin-MortalForward/t/lib/TestApp/C/Elsewhere.pm line 8." at lib/Catalyst/Plugin/MortalForward.pm line 24."

=head1 AUTHOR

Six Apart, cpan@sixapart.com

=head1 LICENSE

I<Catalyst::Plugin::MortalForward> is free software; you may redistribute it
and/or modify it under the same terms as Perl itself.


Except where otherwise noted, I<Catalyst::Plugin::MortalForward> is
Copyright 2006 Six Apart, cpan@sixapart.com. All rights reserved.