diff Lib/IMPL/Web/Application/Action.pm @ 56:117b6956d5a5

Web application in progress
author wizard
date Thu, 04 Mar 2010 15:46:17 +0300
parents 609b59c9f03c
children bf59ee1cd506
line wrap: on
line diff
--- a/Lib/IMPL/Web/Application/Action.pm	Wed Mar 03 17:40:18 2010 +0300
+++ b/Lib/IMPL/Web/Application/Action.pm	Thu Mar 04 15:46:17 2010 +0300
@@ -26,18 +26,22 @@
 sub ChainHandler {
 	my ($this,$handler) = @_;
 	
-	my $delegate;
-
 	my $delegateNext = $this->_entryPoint();
 	
 	if (ref $handler eq 'CODE') {
-		$delegate = sub {
+		$this->_entryPoint( sub {
 			$handler->($this,$delegateNext);			
-		};
+		} );
 	} elsif (UNIVERSAL::isa($handler,'IMPL::Web::Application::QueryHandler')) {
-		$delegate = sub {
+		$this->_entryPoint( sub {
 			$handler->Invoke($this,$delegateNext);
-		}
+		} );
+	} elsif ($handler and not ref $handler) {
+		my $method = $this->can($handler) or die new IMPL::InvalidArgumentException("An invalid handler supplied");
+		
+		$this->_entryPoint( sub {
+			$method->($this,$delegateNext);			
+		} );
 	} else {
 		die new IMPL::InvalidArgumentException("An invalid handler supplied");
 	}
@@ -95,4 +99,25 @@
 в простые структуры и передается JSON преобразователю. Таким образом модулю логики
 не требуется знать о выходном формате, всю работу проделают дополнительные фильтры.
 
+=head1 HANDLERS
+
+=head2 subroutines
+
+=over
+
+=item CODE ref
+
+Ссылка на процедуру может являться обработчиком, при этом функция будет вызвана с
+двумя параметрами: ссылкой на action объект, и точкой входа следующего обработчика.
+
+=item Method Name
+
+Имя метода, передается в виде строки. У текущего объекта action ищется метод с
+указанным именем, после чего используется ссылка на этот метод для вызова с двумя
+параметрами: ссылкой на action объект, и точкой входа следующего обработчика.
+
+Получается вызов идентичный следующему C<< $action->MethodName($nextHandler) >>; 
+
+=back 
+
 =cut
\ No newline at end of file