Mercurial > pub > Impl
view Lib/IMPL/Config/Resolve.pm @ 104:196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
Minor and major fixes almost for everything.
A 'Source' property of the ValidationErrors generated from a NodeSet or a NodeList is subject to change in the future.
author | wizard |
---|---|
date | Tue, 11 May 2010 02:42:59 +0400 |
parents | 0667064553ef |
children | 76515373dac0 |
line wrap: on
line source
package IMPL::Config::Resolve; use strict; use base qw(IMPL::Object IMPL::Object::Serializable); use IMPL::Class::Property; use IMPL::Exception; BEGIN { public property path => prop_all|prop_list; } __PACKAGE__->PassThroughArgs; sub CTOR { my $this = shift; my $list = $this->path; while(my $name = shift ) { my $args = shift; $list->Append({ method => $name, (defined $args ? (args => $args) : ()) }); } die new IMPL::InvalidArgumentException("The argument is mandatory","path") unless $this->path->Count; } sub Invoke { my ($this,$target,$default) = @_; my $result = $target; $result = $this->_InvokeMember($result,$_) || return $default foreach $this->path; return $result; } sub _InvokeMember { my ($self,$object,$member) = @_; my $method = $member->{method}; local $@; return eval { ref $object eq 'HASH' ? $object->{$method} : $object->$method( exists $member->{args} ? _as_list($member->{args}) : () ) }; } sub save { my ($this,$ctx) = @_; $ctx->AddVar($_->{method},$_->{args}) foreach $this->path; } sub _as_list { ref $_[0] ? (ref $_[0] eq 'HASH' ? %{$_[0]} : (ref $_[0] eq 'ARRAY'? @{$_[0]} : $_[0] ) ) : ($_[0]); } 1;