Mercurial > pub > Impl
diff 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 |
line wrap: on
line diff
--- a/Lib/IMPL/Web/Application/Resource.pm Mon Nov 18 01:25:35 2013 +0400 +++ b/Lib/IMPL/Web/Application/Resource.pm Mon Nov 25 02:19:31 2013 +0400 @@ -21,12 +21,13 @@ 'IMPL::Web::Application::ResourceInterface' => undef ], props => [ - request => PROP_RO, + request => PROP_RO, application => PROP_RO, parent => PROP_RO, model => PROP_RO, id => PROP_RO, location => PROP_RO, + role => PROP_RO | PROP_LIST ] }; @@ -50,6 +51,16 @@ # либо остается не заданным $this->location( $args{location} || eval { $this->parent->location->Child( $this->id ) } ); + + if (my $role = $args{role}) { + if (ref($role) eq 'ARRAY') { + $this->role($role); + } elsif (not ref($role)) { + $this->role(split(/\s+/, $role)); + } else { + die ArgumentException->new( role => 'A invalid value is provided, expected ARRAY or SCALAR'); + } + } } sub InvokeHttpVerb { @@ -102,21 +113,6 @@ } -sub PrepareEnvironment { - my ($this) = @_; - - my @stack; - my $env = {}; - - for ( my $res = $this ; $res ; $res = $res->parent ) { - push @stack, $res if $res->can('SetupEnvironment'); - } - - map $_->SetupEnvironment($env), reverse @stack; - - return $env; -} - # это реализация по умолчанию, базируется информации о ресурсах, содержащийся # в контракте. sub FetchChildResource { @@ -175,6 +171,32 @@ return $delegate->Invoke(@_) if eval { $delegate->can('Invoke') }; } +sub Seek { + my ($this, $role) = @_; + + my @roles; + + if (ref($role) eq 'ARRAY') { + @roles = @{$role}; + } elsif (not ref($role)) { + @roles = split(/\s+/, $role); + } else { + die ArgumentException->new( role => 'A invalid value is provided, expected ARRAY or SCALAR'); + } + + + for(my $r = $this; $r; $r = $r->parent) { + return $r if $r->HasRole(@roles); + } + return; +} + +sub HasRole { + my ($this, @roles) = @_; + my %cache = map { $_, 1 } @{$this->role}; + return scalar(grep not($cache{$_}), @roles) ? 0 : 1; +} + 1; __END__ @@ -272,6 +294,20 @@ автоматически (только для ресурсов имеющих родителя). Следует заметить, что адрес ресурса не содержит параметров запроса, а только путь. +=head2 C<[get,list]role> + +Список ролей ресурса. Роль это условный маркер, который позволяет определить +функции выполняемые ресурсом, например контейнер, профиль пользователя и т.п. + +Используется при построении цепочек навигации, а также при поиске с использованием +метода C<seek>. + +=head2 C<seek($role)> + +Ищет ресурс в цепочке родителей (включая сам ресурс) с подходящими ролями. + +Роли могут быть переданы в виде массива или строки, где роли разделены пробелами + =head2 C<[get]FetchChildResource($id)> Возвращает дочерний ресурс, по его идентификатору.