407
|
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
|