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