Mercurial > pub > Impl
comparison lib/IMPL/Config/Bag.pm @ 417:3ed0c58e9da3 ref20150831
working on di container, tests
| author | cin |
|---|---|
| date | Mon, 02 Nov 2015 01:56:53 +0300 |
| parents | 3d24b10dd0d5 |
| children | b0481c071bea |
comparison
equal
deleted
inserted
replaced
| 416:cc2cf8c0edc2 | 417:3ed0c58e9da3 |
|---|---|
| 39 | 39 |
| 40 $this->{$_parents} && $this->{$_parents}[ @{ $this->{$_parents} } - 1 ]; | 40 $this->{$_parents} && $this->{$_parents}[ @{ $this->{$_parents} } - 1 ]; |
| 41 } | 41 } |
| 42 | 42 |
| 43 sub _Seal { | 43 sub _Seal { |
| 44 unless ($_[0]->{$_sealed}) { | 44 unless ( $_[0]->{$_sealed} ) { |
| 45 $_[0]->{$_sealed} = 1; | 45 $_[0]->{$_sealed} = 1; |
| 46 $_[0]->{$_timestamp} = 0; # from now the timestamp is important | 46 $_[0]->{$_timestamp} = 0; # from now the timestamp is important |
| 47 } | 47 } |
| 48 } | 48 } |
| 49 | 49 |
| 50 sub _Validate { | 50 sub _Validate { |
| 51 my ($this) = @_; | 51 my ($this) = @_; |
| 52 | 52 |
| 53 my $chain = $this->{$_parents} | 53 my $chain = $this->{$_parents} |
| 54 or return 1; | 54 or return 1; |
| 55 | 55 |
| 56 my $rev = 0; # rev 0 means that parent was never modified | 56 my $rev = 0; # rev 0 means that parent was never modified |
| 57 # this allows to made more efficient checks | 57 # this allows to made more efficient checks |
| 58 my $flush; | 58 my $flush; |
| 59 | 59 |
| 60 foreach my $bag (@$chain, $this) { | 60 foreach my $bag ( @$chain, $this ) { |
| 61 | |
| 61 # we need to updated all bags after the first change was detected; | 62 # we need to updated all bags after the first change was detected; |
| 62 if ($flush ||= $rev and $bag->{$_parentRev} != $rev) { | 63 if ( $flush ||= $rev and $bag->{$_parentRev} != $rev ) { |
| 63 $bag->{$_cache} = {}; | 64 $bag->{$_cache} = {}; |
| 64 $bag->{$_parentRev} = $rev; | 65 $bag->{$_parentRev} = $rev; |
| 65 } | 66 } |
| 66 $rev = $bag->{$_timestamp}; | 67 $rev = $bag->{$_timestamp}; |
| 67 } | 68 } |
| 68 | 69 |
| 69 return $flush ? 0 : 1; | 70 return $flush ? 0 : 1; |
| 70 } | 71 } |
| 71 | 72 |
| 72 sub Resolve { | 73 sub Resolve { |
| 73 my ( $this, $role ) = @_; | 74 my ( $this, $role ) = @_; |
| 103 # $d is not a valid descriptor | 104 # $d is not a valid descriptor |
| 104 | 105 |
| 105 $d = undef; | 106 $d = undef; |
| 106 my $prev; | 107 my $prev; |
| 107 | 108 |
| 108 if ( my $parents = $this->{$_parents} ) { | 109 my $parents = $this->{$_parents}; |
| 109 foreach my $bag ( @$parents, $this ) { | 110 my @bags = $parents ? ( @$parents, $this ) : ($this); |
| 110 | 111 |
| 111 # check the cache; | 112 foreach my $bag (@bags) { |
| 112 unless ( my $t = $bag->{$_cache}{$role} ) { | 113 |
| 114 # check the cache; | |
| 115 unless ( my $t = $bag->{$_cache}{$role} ) { | |
| 113 | 116 |
| 114 # no cached entry this may be due cache flush | 117 # no cached entry this may be due cache flush |
| 115 # go through own entries and find better entry than inherited from parents | 118 # go through own entries and find better entry than inherited from parents |
| 116 foreach my $entry ( @{ $bag->{$_entries} } ) { | 119 foreach my $entry ( @{ $bag->{$_entries} } ) { |
| 117 my $level = $entry->{isa}{$role}; | 120 my $level = $entry->{isa}{$role}; |
| 118 if ( $level and ( not($prev) or $level <= $prev ) ) { | 121 if ( $level and ( not($prev) or $level <= $prev ) ) { |
| 119 $d = $entry; | 122 $d = $entry; |
| 120 $prev = $level; | 123 $prev = $level; |
| 121 } | |
| 122 } | 124 } |
| 125 } | |
| 123 | 126 |
| 124 #cache it | 127 #cache it |
| 125 $bag->{$_cache}{$role} = $d if $d; | 128 $bag->{$_cache}{$role} = $d if $d; |
| 126 } | 129 } |
| 127 else { | 130 else { |
| 128 $d = $t; | 131 $d = $t; |
| 129 $prev = $d->{isa}{$role}; | 132 $prev = $d->{isa}{$role}; |
| 130 } | |
| 131 } | 133 } |
| 132 } | 134 } |
| 133 | 135 |
| 134 return $d; | 136 return $d; |
| 135 } | 137 } |
| 138 my ( $this, $role ) = @_; | 140 my ( $this, $role ) = @_; |
| 139 | 141 |
| 140 return [ | 142 return [ |
| 141 map $_->{value}, | 143 map $_->{value}, |
| 142 grep $_->{isa}{$role}, | 144 grep $_->{isa}{$role}, |
| 143 map @{$_->{$_entries}}, | 145 map @{ $_->{$_entries} }, |
| 144 @{ $this->{$_parents} || [] }, | 146 @{ $this->{$_parents} || [] }, |
| 145 $this | 147 $this |
| 146 ]; | 148 ]; |
| 147 | 149 |
| 148 } | 150 } |
