diff Lib/IMPL/Web/Application/Resource.pm @ 285:546957c50a36

*IMPL::Web::Handler::TTView Reworked template selection mechanism *IMPL::Web::Application: refactoring -Removed obsolete IMPL::Text modules
author cin
date Mon, 18 Feb 2013 02:55:59 +0400
parents 4abda21186cd
children fe725fad2d90
line wrap: on
line diff
--- a/Lib/IMPL/Web/Application/Resource.pm	Thu Feb 14 19:14:02 2013 +0400
+++ b/Lib/IMPL/Web/Application/Resource.pm	Mon Feb 18 02:55:59 2013 +0400
@@ -58,10 +58,33 @@
 # в случае, когда один ресурс вызывает HTTP метод другого ресурса, нужно
 # сохранить оригинальный resourceLocation
     $action->context->{resourceLocation} ||= $this->location;
+    
+    # это свойство специфично только для REST приложений.
+    # сохранение текущего ресурса не повлечет за собой существенных расходов,
+    # т.к. они просто освободятся несколько позже.
+    if(not $action->context->{resource}) { 
+        $action->context->{resource} = $this;
+        $action->context->{environment} = sub { $this->PrepareEnvironment() };
+    }
 
     return _InvokeDelegate($operation, $this, $action );
 }
 
+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 {