comparison Lib/IMPL/Web/Application/Resource.pm @ 359:833e663796c4

TTView: added view variable to pass rendering context between controls TTView: display function renamed to display_for WebResource: resources now marked with roles for searching a desired resource by a role in the resource chain
author sergey
date Mon, 25 Nov 2013 02:19:31 +0400
parents ec58c47edb52
children
comparison
equal deleted inserted replaced
358:248f95c1762a 359:833e663796c4
19 base => [ 19 base => [
20 'IMPL::Object' => undef, 20 'IMPL::Object' => undef,
21 'IMPL::Web::Application::ResourceInterface' => undef 21 'IMPL::Web::Application::ResourceInterface' => undef
22 ], 22 ],
23 props => [ 23 props => [
24 request => PROP_RO, 24 request => PROP_RO,
25 application => PROP_RO, 25 application => PROP_RO,
26 parent => PROP_RO, 26 parent => PROP_RO,
27 model => PROP_RO, 27 model => PROP_RO,
28 id => PROP_RO, 28 id => PROP_RO,
29 location => PROP_RO, 29 location => PROP_RO,
30 role => PROP_RO | PROP_LIST
30 ] 31 ]
31 }; 32 };
32 33
33 sub CTOR { 34 sub CTOR {
34 my ( $this, %args ) = @_; 35 my ( $this, %args ) = @_;
48 49
49 # если расположение явно не указано, то оно вычисляется автоматически, 50 # если расположение явно не указано, то оно вычисляется автоматически,
50 # либо остается не заданным 51 # либо остается не заданным
51 $this->location( $args{location} 52 $this->location( $args{location}
52 || eval { $this->parent->location->Child( $this->id ) } ); 53 || eval { $this->parent->location->Child( $this->id ) } );
54
55 if (my $role = $args{role}) {
56 if (ref($role) eq 'ARRAY') {
57 $this->role($role);
58 } elsif (not ref($role)) {
59 $this->role(split(/\s+/, $role));
60 } else {
61 die ArgumentException->new( role => 'A invalid value is provided, expected ARRAY or SCALAR');
62 }
63 }
53 } 64 }
54 65
55 sub InvokeHttpVerb { 66 sub InvokeHttpVerb {
56 my ( $this, $verb ) = @_; 67 my ( $this, $verb ) = @_;
57 68
100 111
101 sub AccessCheck { 112 sub AccessCheck {
102 113
103 } 114 }
104 115
105 sub PrepareEnvironment {
106 my ($this) = @_;
107
108 my @stack;
109 my $env = {};
110
111 for ( my $res = $this ; $res ; $res = $res->parent ) {
112 push @stack, $res if $res->can('SetupEnvironment');
113 }
114
115 map $_->SetupEnvironment($env), reverse @stack;
116
117 return $env;
118 }
119
120 # это реализация по умолчанию, базируется информации о ресурсах, содержащийся 116 # это реализация по умолчанию, базируется информации о ресурсах, содержащийся
121 # в контракте. 117 # в контракте.
122 sub FetchChildResource { 118 sub FetchChildResource {
123 my ( $this, $childId ) = @_; 119 my ( $this, $childId ) = @_;
124 120
173 169
174 return $delegate->(@_) if ref $delegate eq 'CODE'; 170 return $delegate->(@_) if ref $delegate eq 'CODE';
175 return $delegate->Invoke(@_) if eval { $delegate->can('Invoke') }; 171 return $delegate->Invoke(@_) if eval { $delegate->can('Invoke') };
176 } 172 }
177 173
174 sub Seek {
175 my ($this, $role) = @_;
176
177 my @roles;
178
179 if (ref($role) eq 'ARRAY') {
180 @roles = @{$role};
181 } elsif (not ref($role)) {
182 @roles = split(/\s+/, $role);
183 } else {
184 die ArgumentException->new( role => 'A invalid value is provided, expected ARRAY or SCALAR');
185 }
186
187
188 for(my $r = $this; $r; $r = $r->parent) {
189 return $r if $r->HasRole(@roles);
190 }
191 return;
192 }
193
194 sub HasRole {
195 my ($this, @roles) = @_;
196 my %cache = map { $_, 1 } @{$this->role};
197 return scalar(grep not($cache{$_}), @roles) ? 0 : 1;
198 }
199
178 1; 200 1;
179 201
180 __END__ 202 __END__
181 203
182 =pod 204 =pod
270 Объект типа C<IMPL::Web::AutoLocator> или аналогичный описывающий адрес текущего 292 Объект типа C<IMPL::Web::AutoLocator> или аналогичный описывающий адрес текущего
271 ресурса, может быть как явно передан при создании ресурса, так и вычислен 293 ресурса, может быть как явно передан при создании ресурса, так и вычислен
272 автоматически (только для ресурсов имеющих родителя). Следует заметить, что 294 автоматически (только для ресурсов имеющих родителя). Следует заметить, что
273 адрес ресурса не содержит параметров запроса, а только путь. 295 адрес ресурса не содержит параметров запроса, а только путь.
274 296
297 =head2 C<[get,list]role>
298
299 Список ролей ресурса. Роль это условный маркер, который позволяет определить
300 функции выполняемые ресурсом, например контейнер, профиль пользователя и т.п.
301
302 Используется при построении цепочек навигации, а также при поиске с использованием
303 метода C<seek>.
304
305 =head2 C<seek($role)>
306
307 Ищет ресурс в цепочке родителей (включая сам ресурс) с подходящими ролями.
308
309 Роли могут быть переданы в виде массива или строки, где роли разделены пробелами
310
275 =head2 C<[get]FetchChildResource($id)> 311 =head2 C<[get]FetchChildResource($id)>
276 312
277 Возвращает дочерний ресурс, по его идентификатору. 313 Возвращает дочерний ресурс, по его идентификатору.
278 314
279 Данная реализация использует контракт текущего ресурса для поиска информации о 315 Данная реализация использует контракт текущего ресурса для поиска информации о