Mercurial > pub > Impl
changeset 339:97628101b765
refactoring: application now holds a security object factory rather than a security object
author | cin |
---|---|
date | Wed, 19 Jun 2013 03:25:44 +0400 |
parents | c78dfbe658bd |
children | c090d9102a38 |
files | Lib/IMPL/Object/Abstract.pm Lib/IMPL/Web/Application.pm Lib/IMPL/Web/Application/Action.pm Lib/IMPL/Web/Application/ResourceContract.pm Lib/IMPL/Web/Handler/SecureCookie.pm Lib/IMPL/Web/Handler/TTView.pm Lib/IMPL/Web/View/TTFactory.pm _test/dump.out |
diffstat | 8 files changed, 70 insertions(+), 492 deletions(-) [+] |
line wrap: on
line diff
--- a/Lib/IMPL/Object/Abstract.pm Sat Jun 15 02:32:11 2013 +0400 +++ b/Lib/IMPL/Object/Abstract.pm Wed Jun 19 03:25:44 2013 +0400 @@ -149,7 +149,7 @@ our $AUTOLOAD; sub AUTOLOAD { - goto &{caller(). substr $AUTOLOAD,6}; + goto &{caller(). substr $AUTOLOAD,4}; } package supercall; @@ -157,7 +157,7 @@ our $AUTOLOAD; sub AUTOLOAD { my $sub; - my $methodName = substr $AUTOLOAD,11; + my $methodName = substr $AUTOLOAD,9; no strict 'refs'; $sub = $_->can($methodName) and $sub->(@_) foreach @{caller().'::ISA'}; }
--- a/Lib/IMPL/Web/Application.pm Sat Jun 15 02:32:11 2013 +0400 +++ b/Lib/IMPL/Web/Application.pm Wed Jun 19 03:25:44 2013 +0400 @@ -62,8 +62,6 @@ application => $this, ); - $this->BeforeProcessRequest($action); - eval { my $result = $handler->($action); @@ -73,7 +71,8 @@ $result->PrintResponse( $this->output ); }; - $this->AfterProcessRequest($action); + $action->Dispose(); + if ($@) { my $e = $@; @@ -132,14 +131,6 @@ } } -sub BeforeProcessRequest { - -} - -sub AfterProcessRequest { - -} - 1; __END__
--- a/Lib/IMPL/Web/Application/Action.pm Sat Jun 15 02:32:11 2013 +0400 +++ b/Lib/IMPL/Web/Application/Action.pm Wed Jun 19 03:25:44 2013 +0400 @@ -2,16 +2,20 @@ use strict; use Carp qw(carp); - -use IMPL::Const qw(:prop); -use IMPL::Web::CGIWrapper(); use URI; use JSON; +use IMPL::lang; +use IMPL::Const qw(:prop); +use IMPL::Web::CGIWrapper(); use IMPL::declare { + require => { + Disposable => '-IMPL::Object::Disposable' + }, base => [ 'IMPL::Object' => undef, - 'IMPL::Object::Autofill' => '@_' + 'IMPL::Object::Autofill' => '@_', + 'IMPL::Object::Disposable' => undef ], props => [ application => PROP_RW, @@ -166,6 +170,14 @@ } } +sub Dispose { + my ($this) = @_; + + $_->Dispose() foreach grep is($_,Disposable), values %{$this->context}; + + $this->next::method(); +} + 1; __END__
--- a/Lib/IMPL/Web/Application/ResourceContract.pm Sat Jun 15 02:32:11 2013 +0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,329 +0,0 @@ -package IMPL::Web::Application::ResourceContract; -use strict; - -use IMPL::lang; -use IMPL::Const qw(:prop); -use IMPL::declare { - require => { - Exception => 'IMPL::Exception', - ArgumentException => '-IMPL::ArgumentException', - KeyNotFoundException => '-IMPL::KeyNotFoundException', - ResourceClass => 'IMPL::Web::Application::CustomResource', - CustomContract => 'IMPL::Web::Application::CustomResourceContract', - Factory => 'IMPL::Object::Factory' - }, - base => [ 'IMPL::Object' => undef ], - props => [ - resourceFactory => PROP_ALL, - verbs => PROP_ALL, - _namedResources => PROP_ALL, - _regexpResources => PROP_ALL | PROP_LIST, - ] -}; - -sub CTOR { - my $this = shift; - my %args = @_; - - my $factory = delete $args{resourceFactory} || ResourceClass; - my $resources = delete $args{resources} || []; - my $verbs = delete $args{verbs} || {}; - - die ArgumentException->new( - resources => 'resources parameter must be a reference to an array' ) - unless ref $resources eq 'ARRAY'; - - die ArgumentException->new( - opearations => 'operations parameter must be a reference to a hash' ) - unless ref $verbs eq 'HASH'; - - $this->verbs( - { map { lc($_), $verbs->{$_} } keys %$verbs } ); - - my %nameMap; - - foreach my $res (@$resources) { - if (ref $res->{contract} eq 'HASH') { - # custom contract will add OPTIONS verb if needed - $res->{contract} = CustomContract->new(%{$res->{contract}}); - } - - next unless $res->{contract}; - - if ( my $name = $res->{name} ) { - $nameMap{$name} = $res; - } - if ( $res->{match} ) { - $this->_regexpResources->Append($res); - } - } - - $this->_namedResources( \%nameMap ); - - $this->resourceFactory( %args ? Factory->new($factory,\%args) : $factory ); -} - -sub AddChildResourceContract { - my ($this,$res) = @_; - - die ArgumentException->new(res => "A valid child resource definition") - unless ref $res eq 'HASH'; - - $this->_namedResources->{$res->{name}} = $res if $res->{name}; - $this->_regexpResources->Append($res) if $res->{match}; - - return; -} - -sub CreateResource { - my $this = shift; - my %args = @_; - - return $this->resourceFactory->new( %args, contract => $this ); -} - -sub FindChildResourceInfo { - my ( $this, $name ) = @_; - - if ( my $info = $this->_namedResources->{$name} ) { - return $info, [$name]; - } - else { - foreach my $info ( $this->_regexpResources ) { - my $rx = $info->{match}; - if(my @childId = $name =~ m/$rx/) { - return $info, \@childId; - } - } - } - - return; -} - -1; - -__END__ - -=pod - -=head1 NAME - -C<IMPL::Web::Application::ResourceContract> - описание ресурса - -=head1 SYNIOSIS - -=begin code - -use IMPL::require { - ResourceContract => 'IMPL::Web::Application::ResourceContract', - OperationContract => 'IMPL::Web::Application::OperationContract' -}; - -my $contract = ResourceContract->new( - verbs => { - get => sub { - my ($resource,$action) = @_; - return "Hello!"; - }, - post => OperationContract->new( - binding => sub { - my ($resource,$action) = @_; - my $data = My::App::ModelBinder->new($resource->ds)->Bind($action); - return IMPL::Web::HttpResponse->Redirect( - location => $resource->location->Child($result->id) - ) - } - ), - }, - resources => [ - { - name => 'info', - binding => sub { - return $_[0]->model->info; - }, - contract => { - verbs => { - get => sub { - my ($resource,$action) = @_; - return $resource->model; - } - - } - } - } - ] -) - -my $obj = My::App::Data->fetch('something'); - -my $resource = $contract->CreateResource( - request => $currentRequest, - model => $obj, - parent => $prentResource, - id => 'item-something' -); - -my $child = $contract->FetchChildResource('info'); - -=end code - -=head1 DESCRIPTION - -Контракт описывает структуру Веб-ресурса и отображение операций над ним в методы -предметной области. Контракты используются инфраструктурой и пользователь -не использует их напрямую, до тех пор пока не требуется изменить стандартный -функционал. - - -Ресурс представляе собой набор контрактов операций, соответствующих методам -C<HTTP> которые доступны у данного ресурса. Кроме операций ресурс состоит из -дочерних ресурсов, которые могут соответствовать регулярным выражениям, либо -иметь фиксированные имена. - -Каждая операция над ресурсом C<IMPL::Web::Application::OperationContract> -описывается преобразованием параметров, привязкой к предметной области, -дополнительным обработчиком результата выполнения привязки, либо обработчиком -исключения, если привязку не удалось выполнить. - -Основное назначение контракта - создавать объекты ресурсов, над которыми -контроллер запросов C<HTTP> сможет выполнить операцию. Контракт может создавать -дочерние ресурсы, на основе указанного родительского ресурса и идетификатора -нового ресурса. При этом будет найден подходящий контракт для дочернего ресурса -и с его помощью создан дочерний ресурс. - -=head2 Динамический контракт - -Основная функция контракта - превращать данные модели предметной области в -данные ресурсной модели, тоесть в ресурсы, для чего каждый контракт обязан -реализовывать метод C<CreateResource(%args)>. - -Результатом выполнения этого метода должен быть Web-ресурс, см. -C<IMPL::Web::Application::Resource>. Другими словами не существует жесткого -требования к реализации самого контракта, как и того, что созданный ресурс -должен ссылаться именно на этот контракт (да и вообще ссылаться на контракт). - -Таким образом можно реализовать контракт, который выполняет роль посредника, -ниже приведен пример, который выбирает нужный контракт на основе типа модели -переданной для создания ресурса. - -=begin code - -package My::Web::Application::ContractMapper; -use strict; -use IMPL::Const qw(:prop); -use IMPL::declare { - require => { - ForbiddenException => 'IMPL::Web::ForbiddenException' - }, - base => [ - 'IMPL::Object' => undef, - 'IMPL::Object::Autofill' => '@_' - ], - props => [ - map => PROP_GET | PROP_OWNERSET - ] -} - -sub CreateResource { - my ($this,%args) = @_; - - my $type = ref $args{model} || '_default'; - - my $contract = $this->map->{$type}; - - die ForbiddenException->new() - unless $contract; - - return $contract->CreateResource(%args); -} - -=end code - -=head1 MEMBERS - -=head2 C<CTOR(%args)> - -=over - -=item * C<resourceFactory> - -Фабрика объектов C<IMPL::Object::Factory> которая будет использоваться при -создании новых ресурсов. По-умолчанию C<IMPL::Web::Application::Resource>. - -=item * C<operations> - -Хеш с доступными действиями над C<HTTP> ресурсом, ключом является имя ресурса, -значением C<IMPL::Web::Application::OperationContract>. - -=item * C<resources> - -Ссылка на массив хешей, каждый хеш описывает правила, как получить дочерний -ресурс и связать его с контрактом. Ниже преведено описание элементов хеша. - -=over - -=item * C<name> - -Имя дочернегно ресурса. - -=item * C<match> - -Регулярное выражение, которому должно удовлетворять имя дочернего ресурса. - -=item * C<bind> - -Делегат, получающий модель для дочернего ресурса. Первым параметром ему -передается родительский объект, далее передаются граппы из регулярного -выражения, если это ресурс с именем удовлетворяющим регулярному выражению из -элемента C<match>, либо имя ресурса, если это ресурс с именем, указанным в -элементе C<name>. - -=item * C<contract> - -Ссылка на C<IMPL::Web::Application::ResourceContract> для дочернего ресурса. -У данного контракта используется только метод C<CreateContract>. - -Для реализации отложенной загрузки контракта (чтобы снизить ресурсоемкость -запуска приложения) вместо ссылки на контракт может быть либо ссылка на -процедуру, либо объект имеющий метод C<Invoke>. - -=back - -По крайней мере C<name> или C<match> должны присутсвовать. - -=back - -=head2 C<CreateResource(%args)> - -Создает ресурс, параметры C<%args> будут переданы напрямую констркутору -ресурса, для создания ресурса используется фабрика C<resourceFactory>. -При создании, конгструктору ресурса, будет передана ссылка на текущй контракт. - -По-сути никакого дополнительного функционала данный метод не несет. - -=head2 C<FindChildResourceInfo($childId)> - -Используется для поиска информации о дочернем ресурсе, возвращает список из двух -элементов. C<($info,$childIdParts)> - -=over - -=item * C<$info> - -Информация о контракте дочернего ресурса, как правило это ссылка на хеш, похожий -по формату на - -=back - -=head2 C<[get]verbs> - -Хеш с доступными действиями над C<HTTP> ресурсом, все имена операций приведены -к нижнему регистру. - -=begin code - -my $result = $contract->verbs->{get}->Invoke($resource,$action); - -=end code - -=cut
--- a/Lib/IMPL/Web/Handler/SecureCookie.pm Sat Jun 15 02:32:11 2013 +0400 +++ b/Lib/IMPL/Web/Handler/SecureCookie.pm Wed Jun 19 03:25:44 2013 +0400 @@ -57,7 +57,7 @@ return unless $nextHandler; my $context; - $this->_manager($action->application->security); + $this->_manager($action->application->security->new()); my $sid = $action->cookie('sid',qr/(\w+)/); @@ -84,7 +84,12 @@ $context ||= SecurityContext->new(principal => User->nobody, authority => $this); - my $httpResponse = $context->Impersonate($nextHandler,$action); + my $httpResponse = eval { $context->Impersonate($nextHandler,$action); }; + my $e = $@; + + $this->_manager->Dispose(); + + die $e if $e; die OperationException->new("A HttpResponse instance is expected") unless ref $httpResponse && eval { $httpResponse->isa(HttpResponse) };
--- a/Lib/IMPL/Web/Handler/TTView.pm Sat Jun 15 02:32:11 2013 +0400 +++ b/Lib/IMPL/Web/Handler/TTView.pm Wed Jun 19 03:25:44 2013 +0400 @@ -51,7 +51,9 @@ my $vars = { view => $view, model => $model, + #TODO cleanup action => sub { carp "action variable is deprecated"; $action }, + request => sub { $action }, app => $action->application, context => $action->context, env => _cached($action->context->{environment}),
--- a/Lib/IMPL/Web/View/TTFactory.pm Sat Jun 15 02:32:11 2013 +0400 +++ b/Lib/IMPL/Web/View/TTFactory.pm Wed Jun 19 03:25:44 2013 +0400 @@ -134,7 +134,6 @@ $labels{default} = IMPL::Resources::Strings::ParseStringsMap("$flabels"); while(my($label,$text) = each %{$labels{default}}) { - warn "LABEL: $label"; $vars{$label} = sub { my ($params) = @_; my $locale = Resources->currentLocale;
--- a/_test/dump.out Sat Jun 15 02:32:11 2013 +0400 +++ b/_test/dump.out Wed Jun 19 03:25:44 2013 +0400 @@ -1,6 +1,5 @@ $VAR1 = [ bless( { - 'require' => sub { "DUMMY" }, 'global' => {}, 'inc' => sub { "DUMMY" }, 'date' => { @@ -37,14 +36,32 @@ }, 'Template::Stash::XS' ) }, 'Template::Stash::XS' ), bless( { + 'global' => $VAR1->[0]{'global'}, + 'date' => $VAR1->[0]{'date'}, + 'inc' => $VAR1->[0]{'inc'}, + 'dynamic' => $VAR1->[0]{'dynamic'}, + 'dec' => $VAR1->[0]{'dec'}, + 'strings' => sub { "DUMMY" }, + '_STRICT' => undef, + 'component' => '', + 'site' => $VAR1->[0]{'site'}, + 'dojo' => $VAR1->[0]{'dojo'}, + 'view' => $VAR1->[0]{'view'}, + 'user' => 'test_user', + '_DEBUG' => 0, + '_PARENT' => $VAR1->[0] + }, 'Template::Stash::XS' ), + bless( { 'PREFIX_MAP' => {}, 'BLOCKS' => { 'CTOR' => sub { "DUMMY" } }, 'TRIM' => 0, 'CONFIG' => { - 'PREFIX_MAP' => $VAR1->[1]{'PREFIX_MAP'}, - 'BLOCKS' => {}, + 'PREFIX_MAP' => $VAR1->[2]{'PREFIX_MAP'}, + 'BLOCKS' => { + 'CTOR' => $VAR1->[2]{'BLOCKS'}{'CTOR'} + }, 'TRIM' => 0, 'LOAD_PLUGINS' => [ bless( { @@ -91,7 +108,7 @@ '/home/sergey/workspace.web/Impl/_test/Resources/TTView/simple.tt', bless( { '_DEFBLOCKS' => { - 'CTOR' => $VAR1->[1]{'BLOCKS'}{'CTOR'} + 'CTOR' => $VAR1->[2]{'BLOCKS'}{'CTOR'} }, '_VARIABLES' => {}, 'modtime' => 1343890751, @@ -103,7 +120,7 @@ }, 'Template::Document' ), 1343890751, [ - $VAR1->[1]{'CONFIG'}{'LOAD_TEMPLATES'}[0]{'HEAD'}, + $VAR1->[2]{'CONFIG'}{'LOAD_TEMPLATES'}[0]{'HEAD'}, '/home/sergey/workspace.web/Impl/_test/Resources/TTView/global.tt', bless( { '_DEFBLOCKS' => {}, @@ -116,9 +133,9 @@ }, 'Template::Document' ), 1343890751, undef, - 1366549254 + 1371164279 ], - 1366549254 + 1371164279 ], 'DELIMITER' => ':', 'UNICODE' => 1, @@ -134,8 +151,8 @@ 'STAT_TTL' => 1, 'ABSOLUTE' => 0, 'LOOKUP' => { - '/home/sergey/workspace.web/Impl/_test/Resources/TTView/global.tt' => $VAR1->[1]{'CONFIG'}{'LOAD_TEMPLATES'}[0]{'HEAD'}[4], - '/home/sergey/workspace.web/Impl/_test/Resources/TTView/simple.tt' => $VAR1->[1]{'CONFIG'}{'LOAD_TEMPLATES'}[0]{'HEAD'} + '/home/sergey/workspace.web/Impl/_test/Resources/TTView/global.tt' => $VAR1->[2]{'CONFIG'}{'LOAD_TEMPLATES'}[0]{'HEAD'}[4], + '/home/sergey/workspace.web/Impl/_test/Resources/TTView/simple.tt' => $VAR1->[2]{'CONFIG'}{'LOAD_TEMPLATES'}[0]{'HEAD'} }, 'DEFAULT' => undef, 'PARSER' => bless( { @@ -5304,7 +5321,7 @@ 'DEBUG_DIRS' => 0, 'PRE_CHOMP' => 0, 'GRAMMAR' => bless( { - 'STATES' => $VAR1->[1]{'CONFIG'}{'LOAD_TEMPLATES'}[0]{'PARSER'}{'STATES'}, + 'STATES' => $VAR1->[2]{'CONFIG'}{'LOAD_TEMPLATES'}[0]{'PARSER'}{'STATES'}, 'RULES' => [ [ '$start', @@ -6207,12 +6224,12 @@ sub { "DUMMY" } ] ], - 'LEXTABLE' => $VAR1->[1]{'CONFIG'}{'LOAD_TEMPLATES'}[0]{'PARSER'}{'LEXTABLE'} + 'LEXTABLE' => $VAR1->[2]{'CONFIG'}{'LOAD_TEMPLATES'}[0]{'PARSER'}{'LEXTABLE'} }, 'Template::Grammar' ), - 'RULES' => $VAR1->[1]{'CONFIG'}{'LOAD_TEMPLATES'}[0]{'PARSER'}{'GRAMMAR'}{'RULES'}, + 'RULES' => $VAR1->[2]{'CONFIG'}{'LOAD_TEMPLATES'}[0]{'PARSER'}{'GRAMMAR'}{'RULES'}, 'FILE_INFO' => 1, 'TRACE_VARS' => undef, - 'DEFBLOCK' => $VAR1->[1]{'CONFIG'}{'LOAD_TEMPLATES'}[0]{'HEAD'}[4][2]{'_DEFBLOCKS'}, + 'DEFBLOCK' => $VAR1->[2]{'CONFIG'}{'LOAD_TEMPLATES'}[0]{'HEAD'}[4][2]{'_DEFBLOCKS'}, 'METADATA' => [ 'version', '1' @@ -6232,23 +6249,23 @@ 'START_TAG' => '\\[%' } ], - 'VARIABLES' => $VAR1->[1]{'CONFIG'}{'LOAD_TEMPLATES'}[0]{'HEAD'}[4][2]{'_VARIABLES'}, + 'VARIABLES' => $VAR1->[2]{'CONFIG'}{'LOAD_TEMPLATES'}[0]{'HEAD'}[4][2]{'_VARIABLES'}, 'START_TAG' => undef }, 'Template::Parser' ), - 'TAIL' => $VAR1->[1]{'CONFIG'}{'LOAD_TEMPLATES'}[0]{'HEAD'}[4], + 'TAIL' => $VAR1->[2]{'CONFIG'}{'LOAD_TEMPLATES'}[0]{'HEAD'}[4], 'ENCODING' => 'utf-8', 'SLOTS' => 2, 'PARAMS' => { 'ENCODING' => 'utf-8', 'INTERPOLATE' => 1, 'POST_CHOMP' => 1, - 'INCLUDE_PATH' => $VAR1->[1]{'CONFIG'}{'LOAD_TEMPLATES'}[0]{'INCLUDE_PATH'} + 'INCLUDE_PATH' => $VAR1->[2]{'CONFIG'}{'LOAD_TEMPLATES'}[0]{'INCLUDE_PATH'} }, 'COMPILE_EXT' => '' }, 'Template::Provider' ) ], 'BLKSTACK' => [], - 'STASH' => $VAR1->[0], + 'STASH' => $VAR1->[1], '_ERROR' => '', 'DEBUG_FORMAT' => undef, 'DEBUG' => 0, @@ -6256,7 +6273,7 @@ 'EXPOSE_BLOCKS' => 0, 'DEBUG_DIRS' => 0, 'RECURSION' => 0, - 'INIT_BLOCKS' => $VAR1->[1]{'CONFIG'}{'BLOCKS'}, + 'INIT_BLOCKS' => $VAR1->[2]{'CONFIG'}{'BLOCKS'}, 'LOAD_FILTERS' => [ bless( { 'DEBUG' => 0, @@ -6266,10 +6283,10 @@ }, 'Template::Filters' ) ] }, - 'LOAD_PLUGINS' => $VAR1->[1]{'CONFIG'}{'LOAD_PLUGINS'}, - 'LOAD_TEMPLATES' => $VAR1->[1]{'CONFIG'}{'LOAD_TEMPLATES'}, + 'LOAD_PLUGINS' => $VAR1->[2]{'CONFIG'}{'LOAD_PLUGINS'}, + 'LOAD_TEMPLATES' => $VAR1->[2]{'CONFIG'}{'LOAD_TEMPLATES'}, 'BLKSTACK' => [], - 'STASH' => $VAR1->[0], + 'STASH' => $VAR1->[1], 'DEBUG_FORMAT' => undef, '_ERROR' => '', 'DEBUG' => 0, @@ -6277,126 +6294,7 @@ 'EXPOSE_BLOCKS' => 0, 'DEBUG_DIRS' => 0, 'RECURSION' => 0, - 'INIT_BLOCKS' => $VAR1->[1]{'BLOCKS'}, - 'LOAD_FILTERS' => $VAR1->[1]{'CONFIG'}{'LOAD_FILTERS'} - }, 'Template::Context' ), - bless( { - 'IMPL_Web_View_TTRegistry_context' => $VAR1->[1], - 'IMPL_Web_View_TTRegistry_loader' => bless( { - 'IMPL_Web_View_TTLoader_context' => bless( { - 'PREFIX_MAP' => $VAR1->[1]{'PREFIX_MAP'}, - 'BLOCKS' => $VAR1->[1]{'CONFIG'}{'BLOCKS'}, - 'TRIM' => 0, - 'CONFIG' => { - 'ENCODING' => 'utf-8', - 'POST_CHOMP' => 1, - 'INTERPOLATE' => 1, - 'LOAD_TEMPLATES' => $VAR1->[1]{'CONFIG'}{'LOAD_TEMPLATES'}[0], - 'INCLUDE_PATH' => $VAR1->[1]{'CONFIG'}{'LOAD_TEMPLATES'}[0]{'INCLUDE_PATH'} - }, - 'LOAD_PLUGINS' => $VAR1->[1]{'CONFIG'}{'LOAD_PLUGINS'}, - 'LOAD_TEMPLATES' => $VAR1->[1]{'CONFIG'}{'LOAD_TEMPLATES'}, - 'BLKSTACK' => $VAR1->[1]{'CONFIG'}{'BLKSTACK'}, - 'STASH' => $VAR1->[0]{'_PARENT'}, - 'DEBUG_FORMAT' => undef, - '_ERROR' => '', - 'DEBUG' => 0, - 'EVAL_PERL' => 0, - 'EXPOSE_BLOCKS' => 0, - 'DEBUG_DIRS' => 0, - 'RECURSION' => 0, - 'INIT_BLOCKS' => $VAR1->[1]{'CONFIG'}{'BLOCKS'}, - 'LOAD_FILTERS' => $VAR1->[1]{'CONFIG'}{'LOAD_FILTERS'} - }, 'Template::Context' ), - 'IMPL_Web_View_TTLoader_layoutBase' => 'Layout', - 'IMPL_Web_View_TTLoader_initializer' => 'global.tt', - 'IMPL_Web_View_TTLoader_provider' => $VAR1->[1]{'CONFIG'}{'LOAD_TEMPLATES'}[0], - 'IMPL_Web_View_TTLoader_ext' => '.tt', - 'IMPL_Web_View_TTLoader__globals' => { - 'site' => $VAR1->[0]{'site'}, - 'view' => $VAR1->[0]{'view'}, - 'date' => $VAR1->[0]{'date'}, - 'dynamic' => $VAR1->[0]{'dynamic'} - }, - 'IMPL_Web_View_TTLoader_options' => $VAR1->[2]{'IMPL_Web_View_TTRegistry_loader'}{'IMPL_Web_View_TTLoader_context'}{'CONFIG'}, - 'IMPL_Web_View_TTLoader_isInitialized' => 1 - }, 'IMPL::Web::View::TTLoader' ), - 'IMPL_Web_View_TTRegistry__cache' => {} - }, 'IMPL::Web::View::TTRegistry' ), - bless( { - 'IMPL_Web_View_TTFactory_initialized' => 1, - 'IMPL_Web_View_TTFactory_registry' => $VAR1->[2], - 'IMPL_Web_View_TTFactory_instances' => 1, - 'IMPL_Object_Factory_factory' => 'IMPL::Web::View::TTDocument', - 'IMPL_Web_View_TTFactory_baseLocation' => '', - 'IMPL_Web_View_TTFactory_context' => $VAR1->[1], - 'IMPL_Web_View_TTFactory_blocks' => $VAR1->[1]{'CONFIG'}{'LOAD_TEMPLATES'}[0]{'HEAD'}[2]{'_DEFBLOCKS'}, - 'IMPL_Web_View_TTFactory_template' => $VAR1->[1]{'CONFIG'}{'LOAD_TEMPLATES'}[0]{'HEAD'}[2] - }, 'IMPL::Web::View::TTFactory' ), - bless( { - 'require' => $VAR1->[0]{'require'}, - 'global' => $VAR1->[0]{'global'}, - 'date' => $VAR1->[0]{'date'}, - 'inc' => $VAR1->[0]{'inc'}, - 'dynamic' => $VAR1->[0]{'dynamic'}, - 'dec' => $VAR1->[0]{'dec'}, - '_STRICT' => undef, - 'site' => $VAR1->[0]{'site'}, - 'component' => '', - 'dojo' => $VAR1->[0]{'dojo'}, - 'view' => $VAR1->[0]{'view'}, - 'user' => 'test_user', - '_DEBUG' => 0, - '_PARENT' => $VAR1->[0] - }, 'Template::Stash::XS' ), - bless( { - 'PREFIX_MAP' => $VAR1->[1]{'PREFIX_MAP'}, - 'BLOCKS' => { - 'CTOR' => $VAR1->[1]{'BLOCKS'}{'CTOR'} - }, - 'TRIM' => 0, - 'CONFIG' => { - 'PREFIX_MAP' => $VAR1->[1]{'PREFIX_MAP'}, - 'BLOCKS' => $VAR1->[1]{'BLOCKS'}, - 'TRIM' => 0, - 'LOAD_PLUGINS' => $VAR1->[1]{'CONFIG'}{'LOAD_PLUGINS'}, - 'LOAD_TEMPLATES' => $VAR1->[1]{'CONFIG'}{'LOAD_TEMPLATES'}, - 'BLKSTACK' => $VAR1->[1]{'BLKSTACK'}, - 'STASH' => $VAR1->[4], - '_ERROR' => '', - 'DEBUG_FORMAT' => undef, - 'DEBUG' => 0, - 'EVAL_PERL' => 0, - 'EXPOSE_BLOCKS' => 0, - 'DEBUG_DIRS' => 0, - 'RECURSION' => 0, - 'INIT_BLOCKS' => $VAR1->[1]{'BLOCKS'}, - 'LOAD_FILTERS' => $VAR1->[1]{'CONFIG'}{'LOAD_FILTERS'} - }, - 'LOAD_PLUGINS' => $VAR1->[1]{'CONFIG'}{'LOAD_PLUGINS'}, - 'LOAD_TEMPLATES' => $VAR1->[1]{'CONFIG'}{'LOAD_TEMPLATES'}, - 'BLKSTACK' => [], - 'STASH' => $VAR1->[4], - 'DEBUG_FORMAT' => undef, - '_ERROR' => '', - 'DEBUG' => 0, - 'EVAL_PERL' => 0, - 'EXPOSE_BLOCKS' => 0, - 'DEBUG_DIRS' => 0, - 'RECURSION' => 0, - 'INIT_BLOCKS' => $VAR1->[5]{'BLOCKS'}, - 'LOAD_FILTERS' => $VAR1->[1]{'CONFIG'}{'LOAD_FILTERS'} - }, 'Template::Context' ), - bless( { - 'IMPL_Web_View_TTControl_id' => '_16', - 'IMPL_Web_View_TTDocument_registry' => $VAR1->[2], - 'IMPL_Web_View_TTControl_template' => $VAR1->[1]{'CONFIG'}{'LOAD_TEMPLATES'}[0]{'HEAD'}[2], - 'IMPL_Web_View_TTControl_context' => $VAR1->[5], - 'IMPL_Web_View_TTDocument_layout' => undef, - 'IMPL_Web_View_TTControl_attributes' => { - 'factory' => $VAR1->[3], - 'title' => "\x{414}\x{43e}\x{43a}\x{443}\x{43c}\x{435}\x{43d}\x{442} 1" - }, - 'IMPL_Web_View_TTDocument_layoutBase' => 'Layout' - }, 'IMPL::Web::View::TTDocument' ) + 'INIT_BLOCKS' => $VAR1->[2]{'BLOCKS'}, + 'LOAD_FILTERS' => $VAR1->[2]{'CONFIG'}{'LOAD_FILTERS'} + }, 'Template::Context' ) ];