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

working on IMPL::Config::Container
author cin
date Tue, 20 Oct 2015 07:32:55 +0300
parents ec6f2d389d1e
children
comparison
equal deleted inserted replaced
414:ec6f2d389d1e 415:3d24b10dd0d5
6 use IMPL::clone; 6 use IMPL::clone;
7 use IMPL::declare { 7 use IMPL::declare {
8 base => { 8 base => {
9 'IMPL::Object' => undef 9 'IMPL::Object' => undef
10 }, 10 },
11 props => { 11 props => [
12 roles => '*rw', 12 roles => '*rw',
13 _cache => '*rw' 13 _cache => '*rw'
14 } 14 ]
15 }; 15 };
16 16
17 sub CTOR { 17 sub CTOR {
18 my ( $this, $roles ) = @_; 18 my ( $this, $roles ) = @_;
19 19
20 if ( is( $roles, SELF ) ) { 20 if ( is( $roles, SELF ) ) {
21 $this->roles( clone( $roles->roles ) ); 21 $this->roles( clone( $roles->roles ) );
22 } 22 }
23 elsif ( ishash($roles) ) { 23 elsif ( ishash($roles) ) {
24 $this->roles($roles); 24 $this->roles({});
25 while(my ($n, $p) = each %$roles) {
26 $this->AddRole($n,$p);
27 }
25 } 28 }
26 elsif ( isarray($roles) ) { 29 elsif ( isarray($roles) ) {
27 $this->roles( { map { $_, 1 } @$roles } ); 30 $this->roles( { map { $_, undef } @$roles } );
28 } 31 }
29 else { 32 else {
30 $this->roles( {} ); 33 $this->roles( {} );
31 } 34 }
32 } 35 }
50 my $cache = $this->{$_cache}{$role}; 53 my $cache = $this->{$_cache}{$role};
51 54
52 unless ($cache) { 55 unless ($cache) {
53 $cache = { $role, 1 }; 56 $cache = { $role, 1 };
54 57
55 my @roles = [$role, 1]; 58 my @roles = ([$role, 1]);
56 59
57 while (my $r = shift @roles ) { 60 while (my $r = shift @roles ) {
58 my ($name, $level) = @$r; 61 my ($name, $level) = @$r;
59 62
60 $cache->{$name} = $level; 63 $cache->{$name} = $level;
61 if(my $parents = $this->{$roles}{$name}) { 64 if(my $parents = $this->{$roles}{$name}) {
62 foreach my $p (@$parents) { 65 foreach my $p (@$parents) {
63 next if $cache{$p}; 66 next if $cache->{$p};
64 push @roles, [$p, $cache{$p} = $level + 1]; 67 push @roles, [$p, $cache->{$p} = $level + 1];
65 } 68 }
66 } 69 }
67 } 70 }
68 $this->{$_cache}{$role} = $cache; 71 $this->{$_cache}{$role} = $cache;
69 } 72 }