Mercurial > pub > Impl
view Lib/IMPL/Config/ServicesBag.pm @ 405:cd6c6e61d442 ref20150831
Working on DI container
author | cin |
---|---|
date | Mon, 31 Aug 2015 10:23:42 +0300 |
parents | |
children | f23fcb19d3c1 |
line wrap: on
line source
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