Mercurial > pub > Impl
diff 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 |
line wrap: on
line diff
--- a/lib/IMPL/Config/Bag.pm Mon Sep 21 19:54:10 2015 +0300 +++ b/lib/IMPL/Config/Bag.pm Thu Sep 24 12:19:30 2015 +0300 @@ -2,15 +2,103 @@ use strict; use IMPL::declare { - + base => [ + 'IMPL::Object' => undef + ], + props => [ + parent => '*r', + _cache => '*rw', + _entries => '*rw' + ] }; +sub CTOR { + my ($this, $p) = @_; + + $this->{$parent} = $p; + $this->{$_cache} = {}; + $this->{$_entries} = []; +} + sub Resolve { + my ($this,$role) = @_; + + my $d = $this->GetDescriptor(); +} + +sub GetDescriptor { + my ($this, $role) = @_; + + my $d = $this->{$_cache}{$role}; + return $d if $d and $d->{valid}; + + my @entries = @{$this->{$_entries}}; + + if(my $t = $this->{$parent} && $this->{$parent}->GetDescriptor($role)) { + push @entries, $t; + } + + my $level; + foreach my $entry (@entries) { + my $t = $entry->{isa}{$role}; + next unless defined $t; + if (defined($level) && $level > $t) { + $d = $entry; + $level = $t; + } + } + + if ($d and $d->{valid}) { + $this->{$_cache}{$role} = $d; + return $d; + } else { + return; + } +} + +sub ResolveAll { + my ($this, $role) = @_; + + my $result = $this->{$parent} ? $this->{$parent}->ResolveAll() : []; + + push @$result, map $_->{value}, grep $_->{isa}{$role}, @{$this->{$_entries}}; + + return $result; +} + +sub Register { + my ($this, $role, $isa, $value) = @_; +} + +sub _UpdateDescriptor { } -sub Register { - +package IMPL::Config::Bag::Entry; +use IMPL::Exception(); +use IMPL::declare { + base => [ + 'IMPL::Object::Fields' => undef + ] +}; + +my @fields = qw(owner type isa valid value index); +use fields @fields; + +sub CTOR { + my SELF $this = shift; + my $args = shift; + + $this->{valid} = 1; + $this->{owner} = $args->{owner} or die IMPL::InvalidArgumentException->new("owner"); + $this->{value} = $args->{value} if exists $args->{value}; + $this->{isa} = $args->{isa} if $args->{isa}; +} + +sub Invalidate { + my SELF $this = shift; + + $this->{owner}->_UpdateDescriptor($this); } 1; \ No newline at end of file