Ambrosia

 view release on metacpan or  search on metacpan

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

package Ambrosia::Context;
use strict;
use warnings;

use Ambrosia::Assert;
use Ambrosia::error::Exceptions;
use Ambrosia::DataProvider;
use Ambrosia::QL;
use Ambrosia::Utils::Container;
use Ambrosia::Utils::Queue;

use Ambrosia::Event qw/on_start on_abort on_finish/;

use Ambrosia::Meta;

class sealed {
    extends => [qw/Exporter/],
    public  => [qw/repository mqueue response_type resource_type resource_id method proxy/],
    private => [qw/__error __cgi/],
};

our $VERSION = 0.010;

our @EXPORT = qw/Context/;

sub new : Private
{
}

{
    my $_CONTEXT;

    sub instance
    {
        unless ( $_CONTEXT )
        {
            my $package = shift;
            my %params = @_ == 1 ? %{$_[0]} : @_;
            assert {$params{engine_name}} 'Context must instance before first call "Context" or you not set "engine_name" in params.';
            #throw Ambrosia::error::Exception::BadUsage('Context must instance before first call "Context"') unless $params{engine_name};

            my ($engine_name,$engine_params) = @params{qw/engine_name engine_params/};
            delete @params{qw/engine_name engine_params/};
            my $cgi = Ambrosia::core::ClassFactory::create_object(
                    'Ambrosia::CommonGatewayInterface::' . $engine_name, $engine_params);

            $_CONTEXT = $package->SUPER::new(__cgi => $cgi, %params);
        }
        return $_CONTEXT;
    }

    sub destroy
    {
        undef $_CONTEXT;
    }

    sub Context
    {
        no warnings;
        return __PACKAGE__->instance();
    }
}

sub start_session
{
    my $self = shift;
    $self->repository = new Ambrosia::Utils::Container;
    $self->mqueue = new Ambrosia::Utils::Queue;
    $self->init_request_params;
    $self->publicEvent('on_start');
}

sub abort_session
{
    my $self = shift;
    $self->repository = undef;
    $self->mqueue = undef;
    $self->__cgi->abort();
    $self->publicEvent( on_abort => $self->error() );
}

sub finish_session
{
    my $self = shift;
    $self->repository = undef;
    $self->mqueue = undef;
    $self->__cgi->close();
    $self->publicEvent( 'on_finish' );
}

sub print_response_header
{
    print shift()->__cgi->output_data(@_);
}

sub redirect
{
    my $self = shift;
    $self->__cgi->SET_REDIRECT();
    $self->__cgi->output_data(@_);
}

#TODO!!
sub handler
{
    $_[0]->__cgi->handler();
}



( run in 1.932 second using v1.01-cache-2.11-cpan-364913b4093 )