Mercurial > pub > Impl
annotate Lib/IMPL/Config/Activator.pm @ 293:15d87ef41764
*IMPL::Config::Activator: refactoring
author | sergey |
---|---|
date | Wed, 27 Feb 2013 17:37:28 +0400 |
parents | c8fe3f84feba |
children | 8088779e539d |
rev | line source |
---|---|
59
0f3e369553bd
Rewritten property implementation (probably become slower but more flexible)
wizard
parents:
diff
changeset
|
1 package IMPL::Config::Activator; |
0f3e369553bd
Rewritten property implementation (probably become slower but more flexible)
wizard
parents:
diff
changeset
|
2 use strict; |
0f3e369553bd
Rewritten property implementation (probably become slower but more flexible)
wizard
parents:
diff
changeset
|
3 |
293 | 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 object => PROP_RO | |
21 ] | |
22 }; | |
59
0f3e369553bd
Rewritten property implementation (probably become slower but more flexible)
wizard
parents:
diff
changeset
|
23 |
293 | 24 use constant { |
25 SELF_CLASS => __PACKAGE__ | |
26 }; | |
59
0f3e369553bd
Rewritten property implementation (probably become slower but more flexible)
wizard
parents:
diff
changeset
|
27 |
0f3e369553bd
Rewritten property implementation (probably become slower but more flexible)
wizard
parents:
diff
changeset
|
28 sub CTOR { |
0f3e369553bd
Rewritten property implementation (probably become slower but more flexible)
wizard
parents:
diff
changeset
|
29 my $this = shift; |
60
b0c068da93ac
Lazy activation for the configuration objects (final concept)
wizard
parents:
59
diff
changeset
|
30 |
293 | 31 die Exception->new("A factory parameter is required") unless $this->factory; |
59
0f3e369553bd
Rewritten property implementation (probably become slower but more flexible)
wizard
parents:
diff
changeset
|
32 |
0f3e369553bd
Rewritten property implementation (probably become slower but more flexible)
wizard
parents:
diff
changeset
|
33 } |
0f3e369553bd
Rewritten property implementation (probably become slower but more flexible)
wizard
parents:
diff
changeset
|
34 |
0f3e369553bd
Rewritten property implementation (probably become slower but more flexible)
wizard
parents:
diff
changeset
|
35 |
60
b0c068da93ac
Lazy activation for the configuration objects (final concept)
wizard
parents:
59
diff
changeset
|
36 sub activate { |
59
0f3e369553bd
Rewritten property implementation (probably become slower but more flexible)
wizard
parents:
diff
changeset
|
37 my $this = shift; |
0f3e369553bd
Rewritten property implementation (probably become slower but more flexible)
wizard
parents:
diff
changeset
|
38 |
60
b0c068da93ac
Lazy activation for the configuration objects (final concept)
wizard
parents:
59
diff
changeset
|
39 unless ($this->object) { |
b0c068da93ac
Lazy activation for the configuration objects (final concept)
wizard
parents:
59
diff
changeset
|
40 my @args; |
b0c068da93ac
Lazy activation for the configuration objects (final concept)
wizard
parents:
59
diff
changeset
|
41 |
b0c068da93ac
Lazy activation for the configuration objects (final concept)
wizard
parents:
59
diff
changeset
|
42 my $params = $this->parameters; |
293 | 43 if (reftype($params) eq 'HASH') { |
194 | 44 while ( my ($key,$value) = each %$params ) { |
293 | 45 push @args,$key, is($value,SELF_CLASS) ? $value->activate : $value; |
194 | 46 } |
293 | 47 } elsif (reftype($params) eq 'ARRAY') { |
48 push @args, map is($_,SELF_CLASS) ? $_->activate : $_, @$params; | |
60
b0c068da93ac
Lazy activation for the configuration objects (final concept)
wizard
parents:
59
diff
changeset
|
49 } else { |
293 | 50 push @args, is($params,SELF_CLASS) ? $params->activate : $params; |
60
b0c068da93ac
Lazy activation for the configuration objects (final concept)
wizard
parents:
59
diff
changeset
|
51 } |
b0c068da93ac
Lazy activation for the configuration objects (final concept)
wizard
parents:
59
diff
changeset
|
52 |
293 | 53 push @args, map is($_,SELF_CLASS) ? $_->activate : $_, @_ if @_; |
60
b0c068da93ac
Lazy activation for the configuration objects (final concept)
wizard
parents:
59
diff
changeset
|
54 |
b0c068da93ac
Lazy activation for the configuration objects (final concept)
wizard
parents:
59
diff
changeset
|
55 my $factory = $this->factory; |
293 | 56 Loader->Require($factory) unless ref $factory; |
60
b0c068da93ac
Lazy activation for the configuration objects (final concept)
wizard
parents:
59
diff
changeset
|
57 |
b0c068da93ac
Lazy activation for the configuration objects (final concept)
wizard
parents:
59
diff
changeset
|
58 return $this->object($factory->new(@args)); |
59
0f3e369553bd
Rewritten property implementation (probably become slower but more flexible)
wizard
parents:
diff
changeset
|
59 } else { |
194 | 60 return $this->object; |
59
0f3e369553bd
Rewritten property implementation (probably become slower but more flexible)
wizard
parents:
diff
changeset
|
61 } |
0f3e369553bd
Rewritten property implementation (probably become slower but more flexible)
wizard
parents:
diff
changeset
|
62 } |
0f3e369553bd
Rewritten property implementation (probably become slower but more flexible)
wizard
parents:
diff
changeset
|
63 |
180 | 64 1; |
293 | 65 |
66 __END__ | |
67 | |
68 =pod | |
69 | |
70 =head1 NAME | |
71 | |
72 C<> | |
73 | |
74 =cut |