diff Lib/IMPL/Web/Application/Action.pm @ 67:9f5795a10939

Documentation, minor fixes
author wizard
date Fri, 19 Mar 2010 20:06:12 +0300
parents 2840c4c85db8
children b56ebc31bf18
line wrap: on
line diff
--- a/Lib/IMPL/Web/Application/Action.pm	Thu Mar 18 17:58:33 2010 +0300
+++ b/Lib/IMPL/Web/Application/Action.pm	Fri Mar 19 20:06:12 2010 +0300
@@ -87,49 +87,159 @@
 
 =pod
 
+=head1 NAME
+
+C<IMPL::Web::Application::Action> - Обертка вокруг C<CGI> запроса.
+
 =head1 DESCRIPTION
 
-Определяет порядок выполнения запроса.
+C<[Infrastructure]>
 
-Запрос выполняется последовательным вызовом цепочки обработчиков, при этом обработчики
-сами вызывают следующие.
+Определяет порядок выполнения запроса. Запрос выполняется последовательным вызовом
+цепочки обработчиков, при этом обработчики сами вызывают следующие.
+Обработчики выполняются в порядке, обратном их добавлению.
 
 Типичная цепочка может быть такой, в порядке добавления
 
-SecCallToMethod($target,$method)
-AuthenticateMethod
-TDocumentOut($file)
+=begin code
+
+IMPL::Web::QueryHandler::SecCallToMethod
+IMPL::Web::QueryHandler::AuthenticateCookie
+IMPL::Web::QueryHandler::PageFormat
+
+=end code
 
 что приведет к следующей последовательности
 
-Action->Invoke() {
-	TDocumentOut->Invoke($Action,$nextHandler) {
-		my $result = $nextHandler() {
-			$AuthenticateMethod($Action,$nextHandler) {
-				my $context = $Action->application->security->Authenticate($Action->query,$Action->response);
-				return $context->Impersonate($nextHandler) {
-					$objSecCallToMethod->Invoke($Action,undef) {
+=begin code
+
+# the application creates a new Action object 
+
+my $action = $application->actionFactory->new(
+	action => $application, # the application passes self
+	query => $query # current CGI query
+);
+
+# forms query handlers stack
+
+$action->ChainHandler($_) foreach qw (
+	IMPL::Web::QueryHandler::SecCallToMethod
+	IMPL::Web::QueryHandler::AuthenticateCookie
+	IMPL::Web::QueryHandler::PageFormat
+);
+
+# and finally invokes the action
+
+$action->Invoke() {
+	
+	# some internals
+	
+	IMPL::Web::QueryHandler::PageFormat->Invoke($action,$nextHandlerIsAuthHandler) {
+		
+		#some internals
+		
+		my $result = $nextHandlerIsAuthHandler() {
+			
+			# some internals
+
+			IMPL::Web::QueryHandler::AuthenticateCookie->Invoke($action,$nextHandlerIsSecCall) {
+				
+				# some internals
+				# do auth and generate security $context 
+				
+				# impersonate $context and call the next handler				
+				return $context->Impersonate($nextHandlerIsSecCall) {
+					
+					# some internals 
+					
+					IMPL::Web::QueryHandler::SecCallToMethod->Invoke($action,undef) {
+						
+						# next handler isn't present as it is the last hanler
+						
+						# some internals
+						# calculate the $method and the $target from CGI request
+												
 						IMPL::Security->AccessCheck($target,$method);
 						return $target->$method();
+						
 					}
+					
 				}
+				
 			}
 		}
-		$this->format($result,$Action->response->streamBody);
+		
+		# some intenals
+		# formatted output to $action->response->streamBody		
 	}		
 }
 
+=end code
+
 или как альтернатива может быть еще
 
-$objSecCallToMethod($target,$method)
-$AuthenticateMethod
-$TransfromToSimpleData
-$JSONOut
+=begin code
+
+IMPL::Web::QueryHandler::SecCallToMethod
+IMPL::Web::QueryHandler::AuthenticateCookie
+IMPL::Web::QueryHandler::Filter->new( target => IMPL::Transform::ObjectToJSON->new() , method => 'Transform')
+IMLP::Web::QueryHandler::JSONFormat
+
+
+=end code
 
 В данной цепочке также происходит вызов метода, но его результат потом преобразуется
 в простые структуры и передается JSON преобразователю. Таким образом модулю логики
 не требуется знать о выходном формате, всю работу проделают дополнительные фильтры.
 
+=head1 MEMBERS
+
+=head2 PROPERTIES
+
+=over
+
+=item C< [get] application>
+
+Экземпляр приложения создавшего текущий объект
+
+=item C< [get] query >
+
+Экземпляр C<CGI> запроса
+
+=item C< [get] response >
+
+Ответ на C<CGI> заспрос C<IMPL::Web::Application::Response>
+
+=item C< [get] responseFactory >
+
+Фабрика ответов на запрос, используется для создания нового ответа
+либо при конструировании текущего объекта C<IMPL::Web::Application::Action>,
+либо при вызове метода C<ReinitResponse> у текущего объекта.
+
+По умолчанию имеет значение C<IMPL::Web::Application::Response>
+
+=back
+
+=head2 METHODS
+
+=over
+
+=item C< ReinitResponse() >
+
+Отмена старого ответа C<response> и создание вместо него нового.
+
+Данная операция обычно проводится при обработке ошибок, когда
+уже сформированный ответ требуется отменить. Следует заметить,
+что эта операция не возможна, если ответ частично или полностью
+отправлен клиенту. Тогда возникает исключение C<IMPL::InvalidOperationException>.
+
+=item C< ChainHandler($handler) >
+
+Добавляет новый обработчик в цепочку. Выполнение цепочки начинается с конца,
+тоесть последний добавленный будет выполнен первым. 
+
+=back
+
 =head1 HANDLERS
 
 =head2 subroutines
@@ -151,9 +261,9 @@
 
 =back 
 
-=head2 C< IMPL::Web::Application::QueryHandler >
+=head2 C< IMPL::Web::QueryHandler >
 
-Любой объект наследованный от C< IMPL::Web::Application::QueryHandler > может быть
+Любой объект наследованный от C< IMPL::Web::QueryHandler > может быть
 использован в качестве обработчика запроса
 
 =cut
\ No newline at end of file