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 |
