Mercurial > pub > Impl
comparison lib/IMPL/Config/ServiceDescriptor.pm @ 421:7798345304bc ref20150831
working on IMPL::Config, removed old stuff
author | cin |
---|---|
date | Sun, 16 Jul 2017 22:59:39 +0300 |
parents | df591e3afd10 |
children | b0481c071bea |
comparison
equal
deleted
inserted
replaced
420:df591e3afd10 | 421:7798345304bc |
---|---|
2 use strict; | 2 use strict; |
3 | 3 |
4 use IMPL::lang qw(:base); | 4 use IMPL::lang qw(:base); |
5 use IMPL::Exception(); | 5 use IMPL::Exception(); |
6 use IMPL::declare { | 6 use IMPL::declare { |
7 require => { | 7 require => { |
8 Bag => 'IMPL::Config::Bag', | 8 Bag => 'IMPL::Config::Bag', |
9 ActivationException => 'IMPL::Config::ActivationException' | 9 ActivationException => 'IMPL::Config::ActivationException' |
10 }, | 10 }, |
11 base => [ | 11 base => [ |
12 'IMPL::Object' => undef, | 12 'IMPL::Object' => undef, |
13 'IMPL::Config::Descriptor' => undef | 13 'IMPL::Config::Descriptor' => undef |
14 ], | 14 ], |
15 props => [ | 15 props => [ |
16 type => 'r', | 16 type => 'r', |
17 activation => 'r', | 17 activation => 'r', |
18 args => 'r', | 18 args => 'r', |
19 services => 'r', | 19 services => 'r', |
20 norequire => 'r', | 20 norequire => 'r', |
21 owner => 'r', | 21 owner => 'r', |
22 _name => 'rw', | 22 _name => 'rw', |
23 _loaded => 'rw' | 23 _loaded => 'rw' |
24 ] | 24 ] |
25 }; | 25 }; |
26 | 26 |
27 sub CTOR { | 27 sub CTOR { |
28 my ( $this, %opts ) = @_; | 28 my ( $this, %opts ) = @_; |
29 | 29 |
30 $this->type( $opts{type} ) | 30 $this->type( $opts{type} ) |
31 or die IMPL::InvalidArgumentException->new('type'); | 31 or die IMPL::InvalidArgumentException->new('type'); |
32 $this->owner( $opts{owner} ) | 32 $this->owner( $opts{owner} ) |
33 or die IMPL::InvalidArgumentException->new('owner'); | 33 or die IMPL::InvalidArgumentException->new('owner'); |
34 | 34 |
35 $this->activation( SELF->ParseActivation( $opts{activation} ) ); | 35 $this->activation( SELF->ParseActivation( $opts{activation} ) ); |
36 $this->args( $opts{args} ) if exists $opts{args}; | 36 $this->args( $opts{args} ) if exists $opts{args}; |
37 $this->services( $opts{services} ) if exists $opts{services}; | 37 $this->services( $opts{services} ) if exists $opts{services}; |
38 $this->norequire( $opts{norequire} ) if exists $opts{norequire}; | 38 $this->norequire( $opts{norequire} ) if exists $opts{norequire}; |
39 | 39 |
40 $this->_name( 'new {' | 40 $this->_name( 'new {' |
41 . SELF->ActivationToString( $this->activation ) | 41 . SELF->ActivationToString( $this->activation ) . '} ' |
42 . '} ' | 42 . $this->type ); |
43 . $this->type ); | |
44 } | 43 } |
45 | 44 |
46 sub Activate { | 45 sub Activate { |
47 my ( $this, $context ) = @_; | 46 my ( $this, $context ) = @_; |
48 | 47 |
49 my $instance; | 48 my $instance; |
50 $context->EnterScope( $this->_name, $this->services ); | 49 $context->EnterScope( $this->_name, $this->services ); |
51 | 50 |
52 my $activation = $this->activation; | 51 my $activation = $this->activation; |
53 my $cache; | 52 my $cache; |
54 | 53 |
55 if ( $activation == SELF->ACTIVATE_SINGLETON ) { | 54 if ( $activation == SELF->ACTIVATE_SINGLETON ) { |
56 $cache = $context->container->root->instances; | 55 $cache = $context->container->root->instances; |
57 } | 56 } |
58 elsif ( $activation == SELF->ACTIVATE_CONTAINER ) { | 57 elsif ( $activation == SELF->ACTIVATE_CONTAINER ) { |
59 $cache = $this->owner->instances; | 58 $cache = $this->owner->instances; |
60 } | 59 } |
61 elsif ( $activation == SELF->ACTIVATE_HIERARCHY ) { | 60 elsif ( $activation == SELF->ACTIVATE_HIERARCHY ) { |
62 $cache = $context->container->instances; | 61 $cache = $context->container->instances; |
63 } | 62 } |
64 elsif ( $activation == SELF->ACTIVATE_CONTEXT ) { | 63 elsif ( $activation == SELF->ACTIVATE_CONTEXT ) { |
65 $cache = $context->instances; | 64 $cache = $context->instances; |
66 } | 65 } |
67 | 66 |
68 $instance = $cache->{ ref($this) } if $cache; | 67 $instance = $cache->{ ref($this) } if $cache; |
69 unless ($instance) { | 68 unless ($instance) { |
70 $instance = $this->CreateInstance($context); | 69 $instance = $this->CreateInstance($context); |
71 } | 70 $cache->{ ref($this) } = $instance if $cache; |
71 } | |
72 | 72 |
73 $cache->{ ref($this) } = $instance if $cache; | 73 $context->LeaveScope(); |
74 | 74 |
75 $context->LeaveScope(); | 75 return $instance; |
76 | |
77 return $instance; | |
78 } | 76 } |
79 | 77 |
80 sub CreateInstance { | 78 sub CreateInstance { |
81 my ( $this, $context ) = @_; | 79 my ( $this, $context ) = @_; |
82 | 80 |
83 my $class = | 81 my $class = |
84 $this->norequire | 82 $this->norequire |
85 ? $this->type | 83 ? $this->type |
86 : $context->container->Require( $this->type ); | 84 : $context->container->Require( $this->type ); |
87 | 85 |
88 my $args = $this->args ? $this->args->Activate($context) : undef; | 86 my $args = $this->args ? $this->args->Activate($context) : undef; |
89 | 87 |
90 if ( defined $args ) { | 88 if ( defined $args ) { |
91 if ( isarray($args) ) { | 89 if ( isarray($args) ) { |
92 return $class->new(@$args); | 90 return $class->new(@$args); |
93 } | 91 } |
94 elsif ( ishash($args) ) { | 92 elsif ( ishash($args) ) { |
95 return $class->new(%$args); | 93 return $class->new(%$args); |
96 } | 94 } |
97 else { | 95 else { |
98 return $class->new($args); | 96 return $class->new($args); |
99 } | 97 } |
100 } | 98 } |
101 else { | 99 else { |
102 return $class->new(); | 100 return $class->new(); |
103 } | 101 } |
104 } | 102 } |
105 | 103 |
106 1; | 104 1; |