diff lib/IMPL/Config/Activator.pm @ 407:c6e90e02dd17 ref20150831

renamed Lib->lib
author cin
date Fri, 04 Sep 2015 19:40:23 +0300
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/IMPL/Config/Activator.pm	Fri Sep 04 19:40:23 2015 +0300
@@ -0,0 +1,91 @@
+package IMPL::Config::Activator;
+use strict;
+
+use Scalar::Util qw(reftype);
+use IMPL::lang;
+use IMPL::Const qw(:prop);
+use IMPL::declare {
+	require => {
+	   Loader => 'IMPL::Code::Loader',
+	   Exception => 'IMPL::Exception'
+	},
+	base => [
+	   'IMPL::Object' => undef,
+	   'IMPL::Object::Autofill' => '@_',
+	   'IMPL::Object::PublicSerializable' => undef
+	],
+	props => [
+	   factory => PROP_RW,
+	   parameters => PROP_RW,
+	   singleCall => PROP_RW,
+	   _object => PROP_RW
+	]
+};
+
+use constant {
+	SELF_CLASS => __PACKAGE__,
+};
+
+sub CTOR {
+    my $this = shift;
+
+    die Exception->new("A factory parameter is required") unless $this->factory;
+    
+}
+
+
+sub activate {
+    my $this = shift;
+    
+    unless ($this->_object) {
+        my @args;
+        
+        my $params = $this->parameters;
+        if (ref $params eq 'HASH') {
+            while ( my ($key,$value) = each %$params ) {
+                push @args,$key, is($value,SELF_CLASS) ? $value->activate : $value;
+            }
+        } elsif (ref $params eq 'ARRAY') {
+            push @args, map is($_,SELF_CLASS) ? $_->activate : $_, @$params;
+        } else {
+            push @args, is($params,SELF_CLASS) ? $params->activate : $params;
+        }
+        
+        push @args,  map is($_,SELF_CLASS) ? $_->activate : $_, @_ if @_;
+        
+        my $factory = $this->factory;
+        Loader->default->Require($factory)
+            unless ref($factory);
+        
+        my $instance = $factory->new(@args);
+        
+        $this->_object($instance)
+            unless $this->singleCall;
+        
+        return $instance;
+    } else {
+        return $this->_object;
+    }
+}
+
+1;
+
+__END__
+
+=pod
+
+=head1 NAME
+
+C<IMPL::Config::Activator> - объект, используемый для получения других объектов.
+
+=head1 DESCRIPTION
+
+Служит дополнительным уровнем абстракции в тех случаях, когда нужный объект
+заранее не известен или его создание должно происходить по требованию.
+От обычной фабрики отличается также тем, что рассматривает формальные параметры
+на наличие активаторов и выполняет их при активации.
+
+Кроме того можно указать, что процесс активации должен происходить при каждом
+обращении. 
+
+=cut