view Lib/IMPL/Web/Application.pm @ 63:76b878ad6596

Added serialization support for the IMPL::Object::List More intelligent Exception message Fixed encoding support in the actions Improoved tests Minor fixes
author wizard
date Mon, 15 Mar 2010 02:38:09 +0300
parents c64bd1bf727d
children 2840c4c85db8
line wrap: on
line source

package IMPL::Web::Application;
use strict;
use warnings;

use base qw(IMPL::Config IMPL::Object::Singleton);

require IMPL::Web::Application::Action;
require IMPL::Web::Application::Response;

use IMPL::Class::Property;
use CGI;

__PACKAGE__->PassThroughArgs;

BEGIN {
    public property handlerError => prop_all;
    public property factoryAction => prop_all;
    public property handlersQuery => prop_all | prop_list;
    public property options => prop_all;
}

# custom factory
sub new {
    my ($self,$file) = @_;
    
    return $self->LoadXMLFile($file);
}

sub CTOR {
	my ($this) = @_;
	
	$this->factoryAction('IMPL::Web::Application::Action') unless $this->factoryAction;
}

sub Run {
    my ($this) = @_;
    
    while (my $query = $this->FetchRequest()) {
        
        # todo: move a creation of the response to the ActionClass
        my $action = $this->factoryAction->new(
        	query => $query,
        	response => new IMPL::Web::Application::Response(query => $query),
        	application => $this, 
        ); 
        
        $action->ChainHandler($_) foreach $this->handlersQuery;
        
        $action->Invoke();
        
        $action->response->Complete;
    }
}

{
	my $hasFetched = 0;

	sub FetchRequest {
		return undef if $hasFetched;
		$hasFetched = 1;
		return CGI->new();
	}
}

1;

__END__

=pod

=head1 SYNOPSIS

require MyApp;
MyApp->spawn('app.config')->Run();

=head1 DESCRIPTION

Зкземпляр приложения содержит в себе глобальные настройки, реализует контроллер запросов,
в качестве источника запросов используется CGI или иной совместимый модуль.

Процесс обработки запроса состоит из следующих частей

1. Получение cgi запроса
2. Вызов модуля для инициализации объекта действия
3. Инициализация контекста выполнения 
4. Выполнение запроса
5. Преобразование полученных данных в тело ответа




=cut