Mercurial > pub > Impl
changeset 294:8088779e539d
corrected IMPL::Config::Activator
author | cin |
---|---|
date | Thu, 28 Feb 2013 02:19:38 +0400 |
parents | 15d87ef41764 |
children | 9b25e1f50144 |
files | Lib/IMPL/Config/Activator.pm Lib/IMPL/Object/PublicSerializable.pm |
diffstat | 2 files changed, 29 insertions(+), 11 deletions(-) [+] |
line wrap: on
line diff
--- a/Lib/IMPL/Config/Activator.pm Wed Feb 27 17:37:28 2013 +0400 +++ b/Lib/IMPL/Config/Activator.pm Thu Feb 28 02:19:38 2013 +0400 @@ -5,10 +5,10 @@ use IMPL::lang; use IMPL::Const qw(:prop); use IMPL::declare { - require => [ + require => { Loader => 'IMPL::Code::Loader', Exception => 'IMPL::Exception' - ], + }, base => [ 'IMPL::Object' => undef, 'IMPL::Object::Autofill' => '@_', @@ -17,12 +17,13 @@ props => [ factory => PROP_RW, parameters => PROP_RW, - object => PROP_RO + singleCall => PROP_RW, + _object => PROP_RW ] }; use constant { - SELF_CLASS => __PACKAGE__ + SELF_CLASS => __PACKAGE__, }; sub CTOR { @@ -36,15 +37,15 @@ sub activate { my $this = shift; - unless ($this->object) { + unless ($this->_object) { my @args; my $params = $this->parameters; - if (reftype($params) eq 'HASH') { + if (ref $params eq 'HASH') { while ( my ($key,$value) = each %$params ) { push @args,$key, is($value,SELF_CLASS) ? $value->activate : $value; } - } elsif (reftype($params) eq 'ARRAY') { + } elsif (ref $params eq 'ARRAY') { push @args, map is($_,SELF_CLASS) ? $_->activate : $_, @$params; } else { push @args, is($params,SELF_CLASS) ? $params->activate : $params; @@ -53,11 +54,17 @@ push @args, map is($_,SELF_CLASS) ? $_->activate : $_, @_ if @_; my $factory = $this->factory; - Loader->Require($factory) unless ref $factory; + Loader->default->Require($factory) + unless ref($factory); + + my $instance = $factory->new(@args); - return $this->object($factory->new(@args)); + $this->_object($instance) + unless $this->singleCall; + + return $instance; } else { - return $this->object; + return $this->_object; } } @@ -69,6 +76,16 @@ =head1 NAME -C<> +C<IMPL::Config::Activator> - объект, используемый для получения других объектов. + +=head1 DESCRIPTION + +Служит дополнительным уровнем абстракции в тех случаях, когда нужный объект +заранее не известен или его создание должно происходить по требованию. +От обычной фабрики отличается также тем, что рассматривает формальные параметры +на наличие активаторов и выполняет их при активации. + +Кроме того можно указать, что процесс активации должен происходить при каждом +обращении. =cut