Mercurial > pub > Impl
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 } |