Mercurial > pub > Impl
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 |