Mercurial > pub > Impl
comparison lib/IMPL/Config/Bag.pm @ 413:af8d359ee4cc ref20150831
working on di container
author | cin |
---|---|
date | Thu, 24 Sep 2015 12:19:30 +0300 |
parents | 30e8c6a74937 |
children | ec6f2d389d1e |
comparison
equal
deleted
inserted
replaced
412:30e8c6a74937 | 413:af8d359ee4cc |
---|---|
1 package IMPL::Config::Bag; | 1 package IMPL::Config::Bag; |
2 use strict; | 2 use strict; |
3 | 3 |
4 use IMPL::declare { | 4 use IMPL::declare { |
5 | 5 base => [ |
6 'IMPL::Object' => undef | |
7 ], | |
8 props => [ | |
9 parent => '*r', | |
10 _cache => '*rw', | |
11 _entries => '*rw' | |
12 ] | |
6 }; | 13 }; |
7 | 14 |
15 sub CTOR { | |
16 my ($this, $p) = @_; | |
17 | |
18 $this->{$parent} = $p; | |
19 $this->{$_cache} = {}; | |
20 $this->{$_entries} = []; | |
21 } | |
22 | |
8 sub Resolve { | 23 sub Resolve { |
24 my ($this,$role) = @_; | |
25 | |
26 my $d = $this->GetDescriptor(); | |
27 } | |
28 | |
29 sub GetDescriptor { | |
30 my ($this, $role) = @_; | |
31 | |
32 my $d = $this->{$_cache}{$role}; | |
33 return $d if $d and $d->{valid}; | |
34 | |
35 my @entries = @{$this->{$_entries}}; | |
36 | |
37 if(my $t = $this->{$parent} && $this->{$parent}->GetDescriptor($role)) { | |
38 push @entries, $t; | |
39 } | |
40 | |
41 my $level; | |
42 foreach my $entry (@entries) { | |
43 my $t = $entry->{isa}{$role}; | |
44 next unless defined $t; | |
45 if (defined($level) && $level > $t) { | |
46 $d = $entry; | |
47 $level = $t; | |
48 } | |
49 } | |
50 | |
51 if ($d and $d->{valid}) { | |
52 $this->{$_cache}{$role} = $d; | |
53 return $d; | |
54 } else { | |
55 return; | |
56 } | |
57 } | |
58 | |
59 sub ResolveAll { | |
60 my ($this, $role) = @_; | |
61 | |
62 my $result = $this->{$parent} ? $this->{$parent}->ResolveAll() : []; | |
63 | |
64 push @$result, map $_->{value}, grep $_->{isa}{$role}, @{$this->{$_entries}}; | |
65 | |
66 return $result; | |
67 } | |
68 | |
69 sub Register { | |
70 my ($this, $role, $isa, $value) = @_; | |
71 } | |
72 | |
73 sub _UpdateDescriptor { | |
9 | 74 |
10 } | 75 } |
11 | 76 |
12 sub Register { | 77 package IMPL::Config::Bag::Entry; |
13 | 78 use IMPL::Exception(); |
79 use IMPL::declare { | |
80 base => [ | |
81 'IMPL::Object::Fields' => undef | |
82 ] | |
83 }; | |
84 | |
85 my @fields = qw(owner type isa valid value index); | |
86 use fields @fields; | |
87 | |
88 sub CTOR { | |
89 my SELF $this = shift; | |
90 my $args = shift; | |
91 | |
92 $this->{valid} = 1; | |
93 $this->{owner} = $args->{owner} or die IMPL::InvalidArgumentException->new("owner"); | |
94 $this->{value} = $args->{value} if exists $args->{value}; | |
95 $this->{isa} = $args->{isa} if $args->{isa}; | |
96 } | |
97 | |
98 sub Invalidate { | |
99 my SELF $this = shift; | |
100 | |
101 $this->{owner}->_UpdateDescriptor($this); | |
14 } | 102 } |
15 | 103 |
16 1; | 104 1; |