Mercurial > pub > Impl
comparison 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 |
comparison
equal
deleted
inserted
replaced
| 55:609b59c9f03c | 56:117b6956d5a5 |
|---|---|
| 24 } | 24 } |
| 25 | 25 |
| 26 sub ChainHandler { | 26 sub ChainHandler { |
| 27 my ($this,$handler) = @_; | 27 my ($this,$handler) = @_; |
| 28 | 28 |
| 29 my $delegate; | |
| 30 | |
| 31 my $delegateNext = $this->_entryPoint(); | 29 my $delegateNext = $this->_entryPoint(); |
| 32 | 30 |
| 33 if (ref $handler eq 'CODE') { | 31 if (ref $handler eq 'CODE') { |
| 34 $delegate = sub { | 32 $this->_entryPoint( sub { |
| 35 $handler->($this,$delegateNext); | 33 $handler->($this,$delegateNext); |
| 36 }; | 34 } ); |
| 37 } elsif (UNIVERSAL::isa($handler,'IMPL::Web::Application::QueryHandler')) { | 35 } elsif (UNIVERSAL::isa($handler,'IMPL::Web::Application::QueryHandler')) { |
| 38 $delegate = sub { | 36 $this->_entryPoint( sub { |
| 39 $handler->Invoke($this,$delegateNext); | 37 $handler->Invoke($this,$delegateNext); |
| 40 } | 38 } ); |
| 39 } elsif ($handler and not ref $handler) { | |
| 40 my $method = $this->can($handler) or die new IMPL::InvalidArgumentException("An invalid handler supplied"); | |
| 41 | |
| 42 $this->_entryPoint( sub { | |
| 43 $method->($this,$delegateNext); | |
| 44 } ); | |
| 41 } else { | 45 } else { |
| 42 die new IMPL::InvalidArgumentException("An invalid handler supplied"); | 46 die new IMPL::InvalidArgumentException("An invalid handler supplied"); |
| 43 } | 47 } |
| 44 | 48 |
| 45 } | 49 } |
| 93 | 97 |
| 94 В данной цепочке также происходит вызов метода, но его результат потом преобразуется | 98 В данной цепочке также происходит вызов метода, но его результат потом преобразуется |
| 95 в простые структуры и передается JSON преобразователю. Таким образом модулю логики | 99 в простые структуры и передается JSON преобразователю. Таким образом модулю логики |
| 96 не требуется знать о выходном формате, всю работу проделают дополнительные фильтры. | 100 не требуется знать о выходном формате, всю работу проделают дополнительные фильтры. |
| 97 | 101 |
| 102 =head1 HANDLERS | |
| 103 | |
| 104 =head2 subroutines | |
| 105 | |
| 106 =over | |
| 107 | |
| 108 =item CODE ref | |
| 109 | |
| 110 Ссылка на процедуру может являться обработчиком, при этом функция будет вызвана с | |
| 111 двумя параметрами: ссылкой на action объект, и точкой входа следующего обработчика. | |
| 112 | |
| 113 =item Method Name | |
| 114 | |
| 115 Имя метода, передается в виде строки. У текущего объекта action ищется метод с | |
| 116 указанным именем, после чего используется ссылка на этот метод для вызова с двумя | |
| 117 параметрами: ссылкой на action объект, и точкой входа следующего обработчика. | |
| 118 | |
| 119 Получается вызов идентичный следующему C<< $action->MethodName($nextHandler) >>; | |
| 120 | |
| 121 =back | |
| 122 | |
| 98 =cut | 123 =cut |
