Mercurial > pub > Impl
changeset 405:cd6c6e61d442 ref20150831
Working on DI container
author | cin |
---|---|
date | Mon, 31 Aug 2015 10:23:42 +0300 |
parents | 9ef75f2029be |
children | f23fcb19d3c1 |
files | Lib/IMPL/Config/ActivationContext.pm Lib/IMPL/Config/ServicesBag.pm Lib/IMPL/Object/List.pm |
diffstat | 3 files changed, 132 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/Lib/IMPL/Config/ActivationContext.pm Fri Aug 28 19:54:53 2015 +0300 +++ b/Lib/IMPL/Config/ActivationContext.pm Mon Aug 31 10:23:42 2015 +0300 @@ -1,5 +1,51 @@ package IMPL::Config::ActivationContext; +use IMPL::Const qw(:prop); +use IMPL::Exception(); +use IMPL::declare { + require => { + PropertyBag => 'IMPL::Config::ServicesBag' + }, + base => { + 'IMPL::Object' => '@_' + }, + props => { + _services => PROP_RW, + _cache => PROP_RW, + _stack => PROP_RW + } +}; + +sub GetService { + my ($this,$serviceId) = @_; + + $this->_services-> +} + +sub EnterScope { + my ($this, $name, $localize) = @_; + + my $info = { name => $name }; + + if ($localize) { + $info->{services} = $this->_services; + + $this->_services(PropertyBag->new($this->_services)); + } + + $this->_stack->Push($info); +} + +sub LeaveScope { + my ($this) = @_; + + my $info = $this->_stack->Pop() + or die IMPL::InvalidOperationException(); + + if ($info->{services}) + $this->_services($info->{services}); +} + 1; __END__
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Lib/IMPL/Config/ServicesBag.pm Mon Aug 31 10:23:42 2015 +0300 @@ -0,0 +1,79 @@ +package IMPL::Config::ServicesBag; + +use IMPL::Const qw(:prop); +use IMPL::declare { + base => { + 'IMPL::Object' => undef + }, + props => { + _prototype => PROP_RW, + _nameMap => PROP_RW, + _typeMap => PROP_RW, + _props => PROP_RW, + } +}; + +sub GetDescriptorByName { + my ($this, $name) = @_; + + my $d = $this->_namedMap->{$name}; + if ($d && $d->{valid}) + return $d; + + my $parent = $this->_prototype; + if ($parent && $d = $parent->GetDescriptorByName($name)) + return $this->_namedMap->{$name} = $d; + + return undef; +} + +sub GetDescriptorByType { + my ($this, $type) = @_; + + my $d = $this->_typeMap->{$name}; + if ($d && $d->{valid}) + return $d; + + my $parent = $this->_prototype; + if ($parent && $d = $parent->GetDescriptorByType($name)) + return $this->_typeMap->{$name} = $d; + + return undef; +} + +sub Register + +1; + +__END__ + +=pod + +=head1 NAME + +=head1 SYNOPSIS + +=head1 DESCRIPTION + +Коллекция сервисов построена на прототиптровании экземпляров, т.е. при создании +новой коллекции может указваться базовая коллекция в которой будет происходить +поиск сервисов в случае их отсутсвия в основной. Для оптимизации данного процесса +сервисы кешируются, чтобы избежать можестрвенных операций поиска по иерархии +коллекций, для этого каждый сервис описывается дескриптором: + +=over + +=item * name название под которым сервис зарегистрирован + +=item * type тип сервиса + +=item * service фабрика сервиса + +=item * valid признак того, что дескриптор действителен + +=back + +Если запрашиваемый десриптор не найден это является ошибкой, поэтому негативные +ответы не кешируются + +=cut \ No newline at end of file
--- a/Lib/IMPL/Object/List.pm Fri Aug 28 19:54:53 2015 +0300 +++ b/Lib/IMPL/Object/List.pm Mon Aug 31 10:23:42 2015 +0300 @@ -2,6 +2,7 @@ use strict; use warnings; +use Carp qw(confess); use parent qw(IMPL::Object::ArrayObject); require IMPL::Exception; @@ -19,10 +20,16 @@ } sub Append { + confess "Appen method is obsolete use Push instead"; push @{$_[0]}, @_[1 .. $#_]; } +sub Push { + push @{$_[0]}, @_[1 .. $#_]; +} + sub AddLast { + confess "Appen method is obsolete use Push instead"; push @{$_[0]}, @_[1 .. $#_]; }