Ambrosia

 view release on metacpan or  search on metacpan

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

package Ambrosia::BaseManager;
use strict;
use warnings;
use Carp;

use Ambrosia::error::Exceptions;
use Ambrosia::core::ClassFactory;
use Ambrosia::core::Nil;
use Ambrosia::Context;
use Ambrosia::Meta;

class
{
    extends => [qw/Exporter/],
    private => [qw/__managers __last_manager/],
};

our $VERSION = 0.010;

sub RELEGATE() { 0 }
sub INTERNALREDIRECT() { 1 }
sub FORWARD() { 2 }

our @EXPORT = qw/controller/;

{
    my $__CONTROLLER__;

    sub instance
    {
        $__CONTROLLER__ = shift->SUPER::new(@_) unless $__CONTROLLER__;
        return $__CONTROLLER__;
    }

    sub controller
    {
        no warnings;
        return __PACKAGE__->instance(@_);
    }
}

sub managers
{
    controller->__managers;
}

sub last_manager
{
    controller->__last_manager;
}

sub current_manager
{
    if ( my $f = Context->mqueue->first() )
    {
        return $f->[0];
    }
    return new Ambrosia::core::Nil;
}

sub prepare : Protected
{
    return $_[0];
}

sub process
{
    $_[0]->prepare();
    return $_[0];
}

sub next_manager
{
    my ($manager_params, $state) = @{Context->mqueue->first() || []};
    if ( $manager_params )
    {
        if ( $state == &RELEGATE )
        {
            Context->mqueue->next();
            return create_object($manager_params);
        }
    }
    return new Ambrosia::core::Nil;
}

#
# relegate the handling to other manager
#
sub __relegate #(anotherManager)
{
    my $self = shift;



( run in 1.192 second using v1.01-cache-2.11-cpan-f0ff5d10edf )