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)>
 
 Возвращает дочерний ресурс, по его идентификатору.