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