diff lib/IMPL/Config/Resolve.pm @ 407:c6e90e02dd17 ref20150831

renamed Lib->lib
author cin
date Fri, 04 Sep 2015 19:40:23 +0300
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/IMPL/Config/Resolve.pm	Fri Sep 04 19:40:23 2015 +0300
@@ -0,0 +1,77 @@
+package IMPL::Config::Resolve;
+use strict;
+use parent qw(IMPL::Object IMPL::Object::Serializable);
+
+use IMPL::Class::Property;
+use IMPL::Exception;
+use Carp qw(carp);
+
+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;