comparison lib/IMPL/Config/ServiceDescriptor.pm @ 415:3d24b10dd0d5 ref20150831

working on IMPL::Config::Container
author cin
date Tue, 20 Oct 2015 07:32:55 +0300
parents c6e90e02dd17
children cc2cf8c0edc2
comparison
equal deleted inserted replaced
414:ec6f2d389d1e 415:3d24b10dd0d5
1 package IMPL::Config::ServiceDescriptor;
2 use strict;
3
4 use IMPL::lang qw(:base);
5 use IMPL::Exception();
6 use IMPL::declare {
7 require => {
8 Bag => 'IMPL::Config::Bag'
9 },
10 base => [
11 'IMPL::Object' => undef,
12 'IMPL::Config::Descriptor' => undef
13 ],
14 props => [
15 type => 'ro',
16 activation => 'ro',
17 args => 'ro',
18 services => 'ro',
19 _name => 'rw',
20 _loaded => 'rw'
21 ]
22 };
23
24 sub CTOR {
25 my ( $this, %opts ) = @_;
26
27 $this->type( $opts{type} )
28 or die IMPL::InvalidArgumentException->new('type');
29
30 $this->activation(
31 IMPL::Config::Descriptor::ParseActivation( $opts{activation} ) );
32 $this->args( $opts{args} ) if exists $opts{args};
33 $this->services( $opts{services} ) if exists $opts{services};
34
35 $this->_name( 'new {'
36 . IMPL::Config::Descriptor::ActivationToString( $this->activation )
37 . '} '
38 . $this->type );
39 }
40
41 sub Activate {
42 my ( $this, $context ) = @_;
43
44 $context->EnterScope( $this->_name, $this->services );
45
46 my $activation = $this->activation;
47 my $cache;
48
49 if ( $activation == IMPL::Config::Descriptor::ACTIVATE_SINGLETON ) {
50 $cache = $context->container->root->instances;
51 }
52 elsif ( $activation == IMPL::Config::Descriptor::ACTIVATE_CONTAINER ) {
53 $cache = $context->container->instances;
54 }
55 elsif ( $activation == IMPL::Config::Descriptor::ACTIVATE_CONTEXT ) {
56 $cache = $context->instances;
57 }
58
59 my $instance = $cache->{ ref($this) } if $cache;
60
61 unless ($instance) {
62 $instance = $this->CreateInstance($context);
63 }
64
65 $cache->{ ref($this) } = $instance if $cache;
66
67 $context->LeaveScope();
68
69 return $instance;
70 }
71
72 sub CreateInstance {
73 my ( $this, $context ) = @_;
74
75 my $class = $context > container->Require( $this->type );
76
77 my $args = $this->args ? $this->args->Activate($context) : undef;
78
79 if ( defined $args ) {
80 if ( isarray($args) ) {
81 return $class->new(@$args);
82 }
83 elsif ( ishash($args) ) {
84 return $class->new(%$args);
85 }
86 else {
87 return $class->new($args);
88 }
89 }
90 else {
91 return $class->new();
92 }
93 }
94
95 1;