Mercurial > pub > Impl
comparison Lib/IMPL/Config/Resolve.pm @ 93:0667064553ef
fixed _is_class in activator
rewritten IMPL::Config::Resolve
new features in the Abstract class
author | wizard |
---|---|
date | Wed, 28 Apr 2010 17:50:55 +0400 |
parents | 5f676b61fb8b |
children | 76515373dac0 |
comparison
equal
deleted
inserted
replaced
92:5f676b61fb8b | 93:0667064553ef |
---|---|
1 package IMPL::Config::Resolve; | 1 package IMPL::Config::Resolve; |
2 use base qw(IMPL::Object IMPL::Object::Autofill IMPL::Object::Serializable); | 2 use strict; |
3 use base qw(IMPL::Object IMPL::Object::Serializable); | |
3 | 4 |
4 use IMPL::Class::Property; | 5 use IMPL::Class::Property; |
5 use IMPL::Exception; | 6 use IMPL::Exception; |
6 | 7 |
7 BEGIN { | 8 BEGIN { |
8 public property target => prop_all; | 9 public property path => prop_all|prop_list; |
9 public property path => prop_all; | |
10 public property default => prop_all | |
11 } | 10 } |
12 | 11 |
13 __PACKAGE__->PassThroughArgs; | 12 __PACKAGE__->PassThroughArgs; |
14 | 13 |
15 sub CTOR { | 14 sub CTOR { |
16 my ($this) = @_; | 15 my $this = shift; |
17 | 16 |
18 die new IMPL::InvalidArgumentException("The argument is mandatory","target") unless $this->target; | 17 my $list = $this->path; |
19 die new IMPL::InvalidArgumentException("The argument is mandatory","path") unless $this->path; | 18 |
19 while(my $name = shift ) { | |
20 my $args = shift; | |
21 $list->Append({ method => $name, (defined $args ? (args => $args) : ()) }); | |
22 } | |
23 | |
24 die new IMPL::InvalidArgumentException("The argument is mandatory","path") unless $this->path->Count; | |
20 } | 25 } |
21 | 26 |
22 sub Invoke { | 27 sub Invoke { |
23 my ($this) = @_; | 28 my ($this,$target,$default) = @_; |
24 | 29 |
25 my $path = $this->path; | 30 my $result = $target; |
31 $result = $this->_InvokeMember($result,$_) || return $default foreach $this->path; | |
26 | 32 |
27 if (ref $path eq 'ARRAY') { | 33 return $result; |
28 my $result = $this->target; | |
29 $result = $this->_InvokeMember($result,$_) || return $this->default foreach @$path; | |
30 return $result; | |
31 } elsif (not ref $path) { | |
32 my $result = $this->target; | |
33 $result = $this->_InvokeMember($result,$_) || return $this->default foreach map { name => $_},split /\./,$this->path; | |
34 return $result; | |
35 } else { | |
36 die new IMPL::InvalidOperationException("Unsopported path type",ref $path); | |
37 } | |
38 } | 34 } |
39 | 35 |
40 sub _InvokeMember { | 36 sub _InvokeMember { |
41 my ($self,$object,$member) = @_; | 37 my ($self,$object,$member) = @_; |
42 | 38 |
39 my $method = $member->{method}; | |
40 | |
43 local $@; | 41 local $@; |
44 return eval { $object->($member->{method})(exists $member->{parameters} ? _as_list($member->{parameters}) : ()) }; | 42 return eval { |
43 ref $object eq 'HASH' ? | |
44 $object->{$method} | |
45 : | |
46 $object->$method( | |
47 exists $member->{args} ? | |
48 _as_list($member->{args}) | |
49 : | |
50 () | |
51 ) | |
52 }; | |
53 } | |
54 | |
55 sub save { | |
56 my ($this,$ctx) = @_; | |
57 | |
58 $ctx->AddVar($_->{method},$_->{args}) foreach $this->path; | |
45 } | 59 } |
46 | 60 |
47 sub _as_list { | 61 sub _as_list { |
48 ref $_[0] ? | 62 ref $_[0] ? |
49 (ref $_[0] eq 'HASH' ? | 63 (ref $_[0] eq 'HASH' ? |