diff Lib/IMPL/Web/Application/Resource.pm @ 230:6d8092d8ce1b

*reworked IMPL::Security *reworked IMPL::Web::Security *refactoring
author sergey
date Mon, 08 Oct 2012 03:37:37 +0400
parents 47f77e6409f7
children a02b110da931
line wrap: on
line diff
--- a/Lib/IMPL/Web/Application/Resource.pm	Sat Sep 29 02:34:47 2012 +0400
+++ b/Lib/IMPL/Web/Application/Resource.pm	Mon Oct 08 03:37:37 2012 +0400
@@ -1,7 +1,7 @@
 package IMPL::Web::Application::Resource;
 use strict;
 
-use IMPL::lang qw(:constants);
+use IMPL::Const qw(:prop);
 use IMPL::declare {
     require => {
         Exception           => 'IMPL::Exception',
@@ -36,24 +36,22 @@
     $this->id( $args{id} );
     $this->contract( $args{contract} );
 
-    # если расположение явно не указано, что обычно делается для корневого
-    # ресурса, то оно вычисляется автоматически, либо остается не заданным
-    $this->location( $args{location}
-          || eval { $this->parent->location->Child( $this->id ) } );
-    )
-
+    # если расположение явно не указано, то оно вычисляется автоматически,
+    # либо остается не заданным
+    $this->location( $args{location} || eval { $this->parent->location->Child( $this->id ) } );
 }
 
 sub InvokeHttpVerb {
       my ( $this, $verb, $action ) = @_;
 
-      my $verb = $this->contract->verbs->{ lc($verb) };
-
+      my $operation = $this->contract->verbs->{ lc($verb) };
+      
       die NotAllowedException->new(
-          allow => join( ',' map( uc, keys %{ $this->contract->verbs } ) ) )
-        unless $verb;
+          allow => join( ',', map( uc, keys %{ $this->contract->verbs } ) )
+      )
+        unless $operation;
 
-      return $verb->Invoke( $this, $action );
+      return $operation->Invoke( $this, $action );
 }
 
 # это реализация по умолчанию, базируется информации о ресурсах, содержащийся
@@ -61,12 +59,12 @@
 sub FetchChildResource {
       my ( $this, $childId ) = @_;
       
-      my $info = $this->contract->FindChildResourceInfo($childId);
+      my ($info,$childIdParts) = $this->contract->FindChildResourceInfo($childId);
       
-      die NotFoundException->new() unless $info;
+      die NotFoundException->new($this->location->url,$childId) unless $info;
       
-      my $binding = $this->{binding};
-      my $contract = $this->{contract}
+      my $binding = $info->{binding};
+      my $contract = $info->{contract}
         or die OperationException->new("Can't fetch a contract for the resource", $childId);
         
       my %args = (
@@ -74,7 +72,7 @@
             id     => $childId
       );
       
-      $args{model} = _InvokeDelegate($binding,$this);
+      $args{model} = _InvokeDelegate($binding,$this,@$childIdParts);
 
       return $contract->CreateResource(%args);
 }
@@ -82,7 +80,7 @@
 sub _InvokeDelegate {
     my $delegate = shift;
     
-    return $delegete->(@_) if ref $delegate eq 'CODE';
+    return $delegate->(@_) if ref $delegate eq 'CODE';
     return $delegate->Invoke(@_) if eval { $delegate->can('Invoke')};
 }
 
@@ -145,4 +143,33 @@
 собственный класс ресурса, например унаследованный от 
 C<IMPL::Web::Application::CustomResource>.
 
+=head1 MEMBERS
+
+=head2 C<[get]contract>
+
+Обязательное свойство для ресурса, ссылается, на контракт, соотсетствующий
+данному ресурсу, используется для выполнения C<HTTP> методов и получения
+дочерних ресурсов.
+
+=head2 C<[get]id>
+
+Обязательное свойство ресурса, идентифицирует его в родительском контейнере,
+для корневого ресурса может иметь произвольное значение.
+
+=head2 C<[get]parent>
+
+Ссылка на родительский ресурс, для корневого ресурса не определена.
+
+=head2 C<[get]model>
+
+Ссылка на объект предметной области, представляемый данным ресурсом. Данное 
+свойство не является обязательным и может быть не задано.
+
+=head2 C<[get]location>
+
+Объект типа C<IMPL::Web::AutoLocator> или аналогичный описывающий адрес текущего
+ресурса, может быть как явно передан при создании ресурса, так и вычислен
+автоматически (только для ресурсов имеющих родителя). Следует заметить, что
+адрес ресурса не содержит параметров запроса, а только путь.
+
 =cut