# HG changeset patch # User cin # Date 1362003578 -14400 # Node ID 8088779e539d1b48c5799c230fc4acbb80649428 # Parent 15d87ef41764cf919fabc601c85e08f5c59bcb31 corrected IMPL::Config::Activator diff -r 15d87ef41764 -r 8088779e539d Lib/IMPL/Config/Activator.pm --- 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 - объект, используемый для получения других объектов. + +=head1 DESCRIPTION + +Служит дополнительным уровнем абстракции в тех случаях, когда нужный объект +заранее не известен или его создание должно происходить по требованию. +От обычной фабрики отличается также тем, что рассматривает формальные параметры +на наличие активаторов и выполняет их при активации. + +Кроме того можно указать, что процесс активации должен происходить при каждом +обращении. =cut diff -r 15d87ef41764 -r 8088779e539d Lib/IMPL/Object/PublicSerializable.pm --- a/Lib/IMPL/Object/PublicSerializable.pm Wed Feb 27 17:37:28 2013 +0400 +++ b/Lib/IMPL/Object/PublicSerializable.pm Thu Feb 28 02:19:38 2013 +0400 @@ -27,6 +27,7 @@ sub { $_->access == ACCESS_PUBLIC and $_->getter and + $_->setter and not $_->ownerSet and not $seen{$_->name} ++ },