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