diff lib/IMPL/Config/Reference.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/Reference.pm	Fri Sep 04 19:40:23 2015 +0300
@@ -0,0 +1,92 @@
+package IMPL::Config::Reference;
+use strict;
+
+use IMPL::Exception;
+
+sub restore {
+	my ($self,$data,$surrogate) = @_;
+	
+	my @path;
+	
+	my ($tagTarget,$target) = splice @$data, 0, 2;
+	
+	die new IMPL::Exception('A traget tag must be the first tag in the reference specification') unless $tagTarget eq 'target';
+	while(my ($method,$args) = splice @$data, 0, 2 ) {
+		$target = $self->_InvokeMember($target,{ method => $method, args => $args});
+	}
+	return $target;
+}
+
+sub _InvokeMember {
+    my ($self,$object,$member) = @_;
+    
+    my $method = $member->{method};
+    return 
+        ref $object eq 'HASH' ?
+            $object->{$method}
+            :
+            $object->$method(
+                exists $member->{args} ?
+                    _as_list($member->{args})
+                    :
+                    ()
+            )
+    ;
+}
+
+sub _as_list {
+    ref $_[0] ?
+        (ref $_[0] eq 'HASH' ?
+            %{$_[0]}
+            :
+            (ref $_[0] eq 'ARRAY'?
+                @{$_[0]}
+                :
+                $_[0]
+            )
+        )
+        :
+        ($_[0]);
+}
+
+1;
+
+__END__
+
+=pod
+
+=head1 NAME
+
+C<IMPL::Config::Reference> - ссылка на внешний объект, вычисляемый на этапе десериализации данных.
+
+=head1 SYNOPSIS
+
+=begin code xml
+
+<Application>
+	<processingStack type="IMPL::Config::Reference">
+	   <target>IMPL::Config</target>
+	   <LoadXMLFile>stdprocessing.xml</LoadXMLFile>
+	</processingStack>
+</Application>
+
+=end code xml
+
+=head1 DESCRIPTION
+
+Позволяет на указвать ссылки на вычисляемые объекты, например, загружаемые из файлов. Ссылки такого рода
+будут вычислены на этапе десериализации еще до того, как будет создан объект верхнего уровня, поэтому
+следует избегать таких ссылок на сам (его свойства и методы) десериализуемый объект.  
+
+=head1 MEMBERS
+
+=head2 C<restore($class,$data,$surrogate)>
+
+Использует данные переданные в параметре дата C<$data> для вычисления свойства. Данный метод - стандартный
+метод для десериализации объекта, а параметр C<$data> содержит пары значений C<(имя_узла,значение_узла)>,
+первая пара обязательно является узлом C<target>, а его значение - целевой объект, который будет
+использован для вычисления конечного значения.
+
+=back
+
+=cut
\ No newline at end of file