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
--- 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} ++
             },