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

renamed Lib->lib
author cin
date Fri, 04 Sep 2015 19:40:23 +0300
parents
children
comparison
equal deleted inserted replaced
406:f23fcb19d3c1 407:c6e90e02dd17
1 package IMPL::Config::Activator;
2 use strict;
3
4 use Scalar::Util qw(reftype);
5 use IMPL::lang;
6 use IMPL::Const qw(:prop);
7 use IMPL::declare {
8 require => {
9 Loader => 'IMPL::Code::Loader',
10 Exception => 'IMPL::Exception'
11 },
12 base => [
13 'IMPL::Object' => undef,
14 'IMPL::Object::Autofill' => '@_',
15 'IMPL::Object::PublicSerializable' => undef
16 ],
17 props => [
18 factory => PROP_RW,
19 parameters => PROP_RW,
20 singleCall => PROP_RW,
21 _object => PROP_RW
22 ]
23 };
24
25 use constant {
26 SELF_CLASS => __PACKAGE__,
27 };
28
29 sub CTOR {
30 my $this = shift;
31
32 die Exception->new("A factory parameter is required") unless $this->factory;
33
34 }
35
36
37 sub activate {
38 my $this = shift;
39
40 unless ($this->_object) {
41 my @args;
42
43 my $params = $this->parameters;
44 if (ref $params eq 'HASH') {
45 while ( my ($key,$value) = each %$params ) {
46 push @args,$key, is($value,SELF_CLASS) ? $value->activate : $value;
47 }
48 } elsif (ref $params eq 'ARRAY') {
49 push @args, map is($_,SELF_CLASS) ? $_->activate : $_, @$params;
50 } else {
51 push @args, is($params,SELF_CLASS) ? $params->activate : $params;
52 }
53
54 push @args, map is($_,SELF_CLASS) ? $_->activate : $_, @_ if @_;
55
56 my $factory = $this->factory;
57 Loader->default->Require($factory)
58 unless ref($factory);
59
60 my $instance = $factory->new(@args);
61
62 $this->_object($instance)
63 unless $this->singleCall;
64
65 return $instance;
66 } else {
67 return $this->_object;
68 }
69 }
70
71 1;
72
73 __END__
74
75 =pod
76
77 =head1 NAME
78
79 C<IMPL::Config::Activator> - объект, используемый для получения других объектов.
80
81 =head1 DESCRIPTION
82
83 Служит дополнительным уровнем абстракции в тех случаях, когда нужный объект
84 заранее не известен или его создание должно происходить по требованию.
85 От обычной фабрики отличается также тем, что рассматривает формальные параметры
86 на наличие активаторов и выполняет их при активации.
87
88 Кроме того можно указать, что процесс активации должен происходить при каждом
89 обращении.
90
91 =cut