Mercurial > pub > Impl
comparison lib/IMPL/Config/Container.pm @ 415:3d24b10dd0d5 ref20150831
working on IMPL::Config::Container
| author | cin | 
|---|---|
| date | Tue, 20 Oct 2015 07:32:55 +0300 | 
| parents | ec6f2d389d1e | 
| children | 3ed0c58e9da3 | 
   comparison
  equal
  deleted
  inserted
  replaced
| 414:ec6f2d389d1e | 415:3d24b10dd0d5 | 
|---|---|
| 7 require => { | 7 require => { | 
| 8 Descriptor => 'IMPL::Config::Descriptor', | 8 Descriptor => 'IMPL::Config::Descriptor', | 
| 9 ValueDescriptor => 'IMPL::Config::ValueDescriptor', | 9 ValueDescriptor => 'IMPL::Config::ValueDescriptor', | 
| 10 ActivationContext => 'IMPL::Config::ActivationContext', | 10 ActivationContext => 'IMPL::Config::ActivationContext', | 
| 11 Hierarchy => 'IMPL::Config::Hierarchy', | 11 Hierarchy => 'IMPL::Config::Hierarchy', | 
| 12 Bag => 'IMPL::Config::Bag' | 12 Bag => 'IMPL::Config::Bag', | 
| 13 Loader => 'IMPL::Code::Loader' | |
| 13 }, | 14 }, | 
| 14 base => [ | 15 base => [ | 
| 15 'IMPL::Object' => undef | 16 'IMPL::Object' => undef | 
| 16 ], | 17 ], | 
| 17 props => [ | 18 props => [ | 
| 18 roles => 'r', | 19 roles => 'r', | 
| 19 services => 'r', | 20 services => 'r', | 
| 20 instances => 'r', | 21 instances => 'r', | 
| 21 parent => 'r' | 22 parent => 'r', | 
| 23 root => 'r', | |
| 24 loader => 'r' | |
| 22 ] | 25 ] | 
| 23 }; | 26 }; | 
| 24 | 27 | 
| 25 my $nextRoleId = 1; | 28 my $nextRoleId = 1; | 
| 26 | 29 | 
| 27 sub CTOR { | 30 sub CTOR { | 
| 28 my ( $this, $parent ) = @_; | 31 my ( $this, $parent, %opts ) = @_; | 
| 29 | 32 | 
| 30 $this->instances( {} ); | 33 $this->instances( {} ); | 
| 34 | |
| 35 $this->loader( $opts{loader} || Loader->safe ); | |
| 31 | 36 | 
| 32 if ($parent) { | 37 if ($parent) { | 
| 33 $this->roles( Hierarchy->new( $parent->roles ) ); | 38 $this->roles( Hierarchy->new( $parent->roles ) ); | 
| 34 $this->services( Bag->new( $parent->services ) ); | 39 $this->services( Bag->new( $parent->services ) ); | 
| 35 $this->parent($parent); | 40 $this->parent($parent); | 
| 41 $this->root( $parent->root ); | |
| 36 } | 42 } | 
| 37 else { | 43 else { | 
| 38 $this->roles( Hierarchy->new() ); | 44 $this->roles( Hierarchy->new() ); | 
| 39 $this->services( Bag->new() ); | 45 $this->services( Bag->new() ); | 
| 46 $this->root($this); | |
| 40 } | 47 } | 
| 41 } | 48 } | 
| 42 | 49 | 
| 43 sub Register { | 50 sub Register { | 
| 44 my ( $this, $role, $service ) = @_; | 51 my ( $this, $role, $service ) = @_; | 
| 45 | 52 | 
| 53 die IMPL::InvalidArgumentException->new('service') | |
| 54 unless is( $service, Descriptor ); | |
| 55 $this->services->Register( $this->GetLinearRoleHash($role), $service ); | |
| 56 } | |
| 57 | |
| 58 sub GetLinearRoleHash { | |
| 59 my ( $this, $role ) = @_; | |
| 60 | |
| 46 die IMPL::InvalidArgumentException->new( | 61 die IMPL::InvalidArgumentException->new( | 
| 47 role => 'The argument is required' ) | 62 role => 'The argument is required' ) | 
| 48 unless $role; | 63 unless $role; | 
| 49 die IMPL::InvalidArgumentException->new('service') | |
| 50 unless is( $service, Descriptor ); | |
| 51 | 64 | 
| 52 if ( isarray($role) ) { | 65 if ( isarray($role) ) { | 
| 53 my $tempRole = "unnamed-" . $nextRoleId++; | 66 my $tempRole = "unnamed-" . $nextRoleId++; | 
| 54 $this->role->AddRole( $tempRole, $role ); | 67 $this->role->AddRole( $tempRole, $role ); | 
| 55 $role = $tempRole; | 68 $role = $tempRole; | 
| 56 } | 69 } | 
| 57 | 70 | 
| 58 $service = ValueDescriptor->new( value => $service ) | 71 $this->roles->GetLinearRoleHash($role); | 
| 59 unless is( $service, Descriptor ); | |
| 60 | |
| 61 $this->services->Register( $this->roles->GetLinearRoleHash($role), $service ); | |
| 62 } | 72 } | 
| 63 | 73 | 
| 64 sub Resolve { | 74 sub Resolve { | 
| 65 my ( $this, $role, %opts ) = @_; | 75 my ( $this, $role, %opts ) = @_; | 
| 66 | 76 | 
| 103 | 113 | 
| 104 =head1 SYNOPSIS | 114 =head1 SYNOPSIS | 
| 105 | 115 | 
| 106 =head2 METHODS | 116 =head2 METHODS | 
| 107 | 117 | 
| 108 =head3 GetService($serviceId) | 118 =head3 Resolve($role) | 
| 109 | 119 | 
| 110 =over | 120 =head3 ResolveAll($role, shared => $useSharedContext) | 
| 111 | 121 | 
| 112 =item * $serviceId | 122 =head3 Register($role, $service) | 
| 113 | |
| 114 A string indetifier of the service, it can be in two forms: class name or service name, | |
| 115 for the class name it should be prefixed with C<@>, for example: C<@Foo::Bar>. | |
| 116 | |
| 117 =back | |
| 118 | |
| 119 The activation container maintains two maps, one for classes and the other for names. | |
| 120 The first one is useful when we searching for an implementation the second one when | |
| 121 we need a particular service. | |
| 122 | |
| 123 =head3 RegisterService($descriptor) | |
| 124 | 123 | 
| 125 =cut | 124 =cut | 
