Mercurial > pub > Impl
comparison Lib/IMPL/Web/Application/Action.pm @ 229:47f77e6409f7
heavily reworked the resource model of the web application:
*some ResourcesContraact functionality moved to Resource
+Added CustomResource
*Corrected action handlers
author | sergey |
---|---|
date | Sat, 29 Sep 2012 02:34:47 +0400 |
parents | c8fe3f84feba |
children | 6d8092d8ce1b |
comparison
equal
deleted
inserted
replaced
228:431db7034a88 | 229:47f77e6409f7 |
---|---|
9 use Carp qw(carp); | 9 use Carp qw(carp); |
10 | 10 |
11 BEGIN { | 11 BEGIN { |
12 public property application => prop_get | owner_set; | 12 public property application => prop_get | owner_set; |
13 public property query => prop_get | owner_set; | 13 public property query => prop_get | owner_set; |
14 public property response => prop_get | owner_set; | |
15 public property responseFactory => prop_get | owner_set; | |
16 public property context => prop_get | owner_set; | |
17 private property _entryPoint => prop_all; | 14 private property _entryPoint => prop_all; |
18 } | 15 } |
19 | 16 |
20 sub CTOR { | 17 sub CTOR { |
21 my ($this) = @_; | 18 my ($this) = @_; |
22 | 19 |
23 $this->responseFactory('IMPL::Web::Application::Response') unless $this->responseFactory; | |
24 $this->response( $this->responseFactory->new(query => $this->query) ); | |
25 $this->context({}); | 20 $this->context({}); |
26 } | 21 } |
27 | 22 |
28 sub Invoke { | 23 sub Invoke { |
29 my ($this) = @_; | 24 my ($this) = @_; |
31 if ($this->_entryPoint) { | 26 if ($this->_entryPoint) { |
32 $this->_entryPoint->(); | 27 $this->_entryPoint->(); |
33 } else { | 28 } else { |
34 die new IMPL::InvalidOperationException("At least one handler is required"); | 29 die new IMPL::InvalidOperationException("At least one handler is required"); |
35 } | 30 } |
36 } | |
37 | |
38 sub ReinitResponse { | |
39 my ($this) = @_; | |
40 | |
41 die new IMPL::InvalidOperationException("Response already sent") if $this->response->isHeaderPrinted; | |
42 | |
43 $this->response->Discard; | |
44 $this->response($this->responseFactory->new(query => $this->query)); | |
45 } | |
46 | |
47 sub ChainHandler { | |
48 my ($this,$handler) = @_; | |
49 | |
50 carp "deprecated, use Application->handlers instead"; | |
51 | |
52 my $delegateNext = $this->_entryPoint(); | |
53 | |
54 if (ref $handler eq 'CODE') { | |
55 $this->_entryPoint( sub { | |
56 $handler->($this,$delegateNext); | |
57 } ); | |
58 } elsif (ref $handler and UNIVERSAL::isa($handler,'IMPL::Web::QueryHandler')) { | |
59 $this->_entryPoint( sub { | |
60 $handler->Invoke($this,$delegateNext); | |
61 } ); | |
62 } elsif ($handler and not ref $handler) { | |
63 | |
64 if (my $method = $this->can($handler) ) { | |
65 $this->_entryPoint( sub { | |
66 $method->($this,$delegateNext); | |
67 } ); | |
68 } else { | |
69 { | |
70 no strict 'refs'; | |
71 eval "require $handler; 1;" or die new IMPL::InvalidArgumentException("An invalid handler supplied",$handler,"Failed to load module") unless keys %{"${handler}::"}; | |
72 } | |
73 | |
74 if (UNIVERSAL::isa($handler,'IMPL::Web::QueryHandler')) { | |
75 $this->_entryPoint( sub { | |
76 $handler->Invoke($this,$delegateNext); | |
77 } ); | |
78 } else { | |
79 die new IMPL::InvalidArgumentException("An invalid handler supplied",$handler); | |
80 } | |
81 } | |
82 } else { | |
83 die new IMPL::InvalidArgumentException("An invalid handler supplied",$handler); | |
84 } | |
85 | |
86 } | 31 } |
87 | 32 |
88 sub cookie { | 33 sub cookie { |
89 my ($this,$name,$rx) = @_; | 34 my ($this,$name,$rx) = @_; |
90 | 35 |
95 my ($this,$name,$rx) = @_; | 40 my ($this,$name,$rx) = @_; |
96 | 41 |
97 $this->_launder(scalar( $this->query->param($name) ), $rx ); | 42 $this->_launder(scalar( $this->query->param($name) ), $rx ); |
98 } | 43 } |
99 | 44 |
45 sub requestMethod { | |
46 my ($this) = @_; | |
47 return $this->query->request_method; | |
48 } | |
49 | |
50 sub pathInfo { | |
51 my ($this) = @_; | |
52 return $this->query->path_info; | |
53 } | |
54 | |
100 sub _launder { | 55 sub _launder { |
101 my ($this,$value,$rx) = @_; | 56 my ($this,$value,$rx) = @_; |
102 | 57 |
103 if ( $value ) { | 58 if ( $value ) { |
104 if ($rx) { | 59 if ($rx) { |
105 if ( my @result = ($value =~ m/$rx/) ) { | 60 if ( my @result = ($value =~ m/$rx/) ) { |
106 return @result > 1 ? \@result : $result[0]; | 61 return @result > 1 ? \@result : $result[0]; |
107 } else { | 62 } else { |
108 return undef; | 63 return; |
109 } | 64 } |
110 } else { | 65 } else { |
111 return $value; | 66 return $value; |
112 } | 67 } |
113 } else { | 68 } else { |
114 return undef; | 69 return; |
115 } | 70 } |
116 } | 71 } |
117 | 72 |
118 1; | 73 1; |
119 | 74 |
130 C<[Infrastructure]> | 85 C<[Infrastructure]> |
131 Свзяывет CGI запрос, приложение, орабатывающее его и ответ, который будет отправлен клиенту. | 86 Свзяывет CGI запрос, приложение, орабатывающее его и ответ, который будет отправлен клиенту. |
132 | 87 |
133 =head1 MEMBERS | 88 =head1 MEMBERS |
134 | 89 |
135 =head2 PROPERTIES | 90 =head2 C<CTOR(%args)> |
136 | 91 |
137 =over | 92 Инициализирует новый экземпляр. Именованными параметрами передаются значения |
93 свойств. | |
138 | 94 |
139 =item C< [get] application> | 95 =head2 C< [get]application> |
140 | 96 |
141 Экземпляр приложения создавшего текущий объект | 97 Экземпляр приложения создавшего текущий объект |
142 | 98 |
143 =item C< [get] query > | 99 =item C< [get] query > |
144 | 100 |
145 Экземпляр C<CGI> запроса | 101 Экземпляр C<CGI> запроса |
146 | 102 |
147 =item C< [get] response > | |
148 | |
149 Ответ на C<CGI> заспрос C<IMPL::Web::Application::Response> | |
150 | |
151 =item C< [get] responseFactory > | |
152 | |
153 Фабрика ответов на запрос, используется для создания нового ответа | |
154 либо при конструировании текущего объекта C<IMPL::Web::Application::Action>, | |
155 либо при вызове метода C<ReinitResponse> у текущего объекта. | |
156 | |
157 По умолчанию имеет значение C<IMPL::Web::Application::Response> | |
158 | |
159 =back | 103 =back |
160 | 104 |
161 =head2 METHODS | |
162 | |
163 =over | |
164 | |
165 =item C< ReinitResponse() > | |
166 | |
167 Отмена старого ответа C<response> и создание вместо него нового. | |
168 | |
169 Данная операция обычно проводится при обработке ошибок, когда | |
170 уже сформированный ответ требуется отменить. Следует заметить, | |
171 что эта операция не возможна, если ответ частично или полностью | |
172 отправлен клиенту. Тогда возникает исключение C<IMPL::InvalidOperationException>. | |
173 | 105 |
174 =cut | 106 =cut |