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 )