Ambrosia

 view release on metacpan or  search on metacpan

lib/Ambrosia/Dispatcher.pm  view on Meta::CPAN

package Ambrosia::Dispatcher;
use strict;

use Ambrosia::error::Exceptions;
use Ambrosia::Context;
use Ambrosia::BaseManager;
use Ambrosia::Event qw/on_run on_complete on_error on_success/;

use Ambrosia::Meta;
class sealed {
    private => [qw/__check_access/],
};

our $VERSION = 0.010;

sub _init
{
    my $self = shift;
    $self->SUPER::_init(@_);
    $self->__check_access = sub {1};
    $self->on_error(sub {warn "Error: @_\n";1;});
}

sub on_check_access
{
    my $self = shift;
    my $proc = shift;
    if ( $proc && ref $proc eq 'CODE' )
    {
        my $old_f = $self->__check_access;
        $self->__check_access = sub { $old_f->(@_); $proc->(@_) };
    }
    return $self;
}

sub run
{
    my $self = shift;
    my $manager = shift;
    my $success;
    my $access = 0;

    eval
    {
        controller->relegate($manager);
        do
        {
            $self->publicEvent( 'on_run' );
            $success = 0;
            if ( $access = $self->__check_access->(controller->current_manager) )
            {
                for(; controller->next_manager->process; ){};
                $self->publicEvent( on_success => controller->last_manager );
                $success = 1;
            }
        } until ( !controller->internal_redirect );
    };

    if ( $@ )
    {
        $self->publicEvent( on_error => "$@" );
    }
    elsif($access)
    {
        $self->publicEvent( on_complete => $success ? controller->last_manager : undef );
    }
    return $self;
}

1;

__END__

=head1 NAME

Ambrosia::Dispatcher - a dispatcher that execute the specified managers.

=head1 VERSION



( run in 3.624 seconds using v1.01-cache-2.11-cpan-5e09290becf )