view Lib/IMPL/Web/Application/Action.pm @ 55:609b59c9f03c

Web application rewrote prop_list implementation to support IMPL::Object::List
author wizard
date Wed, 03 Mar 2010 17:40:18 +0300
parents 15d720913562
children 117b6956d5a5
line wrap: on
line source

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

use base qw(IMPL::Object);

use IMPL::Class::Property;

BEGIN {
	public property application => prop_get | owner_set;
	public property request => prop_get | owner_set;
	public property response => prop_get | owner_set;
	
	private property _entryPoint => prop_all;
}

sub Invoke {
	my ($this) = @_;
	
	if ($this->_entryPoint) {
		$this->_entryPoint->();
	} else {
		die new IMPL::InvalidOperationException("At least one handler is required");
	}
}

sub ChainHandler {
	my ($this,$handler) = @_;
	
	my $delegate;

	my $delegateNext = $this->_entryPoint();
	
	if (ref $handler eq 'CODE') {
		$delegate = sub {
			$handler->($this,$delegateNext);			
		};
	} elsif (UNIVERSAL::isa($handler,'IMPL::Web::Application::QueryHandler')) {
		$delegate = sub {
			$handler->Invoke($this,$delegateNext);
		}
	} else {
		die new IMPL::InvalidArgumentException("An invalid handler supplied");
	}
	
}

1;

__END__

=pod

=head1 DESCRIPTION

Определяет порядок выполнения запроса, форматирует результат, инициализирует контекст.

Объект создается обработчиком запросов, таким как C<IMPL::Web::Application::UriController>.
При этом формируется цепочка обработчиков запроса, эта цапочка будет выполняться с последнего добавленного,
причем каждый добавленный обработчик в качестве одного из параметров получает не только текущий запрос,
но и предыдущий обработчик.

Типичная цепочка может быть такой, в порядке добавления

$objSecCallToMethod($target,$method)
$AuthenticateMethod
$TDocumentOut($file)

что приведет к следующей последовательности

Action->Invoke() {
	TDocumentOut->Invoke($Action,$nextHandler) {
		my $result = $nextHandler() {
			$AuthenticateMethod($Action,$nextHandler) {
				my $context = $Action->application->security->Authenticate($Action->request,$Action->response);
				return $context->Impersonate($nextHandler) {
					$objSecCallToMethod->Invoke($Action,undef) {
						IMPL::Security->AccessCheck($target,$method);
						return $target->$method();
					}
				}
			}
		}
		$this->format($result,$Action->response->streamBody);
	}		
}

или как альтернатива может быть еще

$objSecCallToMethod($target,$method)
$AuthenticateMethod
$TransfromToSimpleData
$JSONOut

В данной цепочке также происходит вызов метода, но его результат потом преобразуется
в простые структуры и передается JSON преобразователю. Таким образом модулю логики
не требуется знать о выходном формате, всю работу проделают дополнительные фильтры.

=cut