comparison lib/IMPL/Config/ReferenceDescriptor.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::ReferenceDescriptor;
2 use strict;
3
4 use IMPL::Exception();
5 use IMPL::declare {
6 base => [
7 'IMPL::Object' => undef,
8 'IMPL::Config::Descriptor' => undef
9 ],
10 props => [
11 reference => 'ro',
12 services => 'ro',
13 lazy => 'ro',
14 optional => 'ro',
15 default => 'ro',
16 _name => 'rw'
17 ]
18 };
19
20 sub CTOR {
21 my ( $this, $ref, %opts ) = @_;
22
23 $this->reference($ref)
24 or die IMPL::InvalidArgumentException->new('ref');
25
26 $this->_name( 'ref ' . $ref );
27 }
28
29 sub Activate {
30 my ( $this, $context ) = @_;
31
32 $this->EnterScope( $this->_name, $this->services );
33
34 my $ref = $this->reference;
35 my %opts;
36 $opts{default} = $this->default
37 if $this->optional;
38
39 if ( $this->lazy ) {
40 my $clone = $context->Clone();
41 return sub {
42 $clone->Resolve( $ref, %opts );
43 };
44 }
45 else {
46 return $context->Resolve( $ref, %opts );
47 }
48
49 $this->LeaveScope();
50 }
51
52 1;