comparison lib/IMPL/Config/Reference.pm @ 407:c6e90e02dd17 ref20150831

renamed Lib->lib
author cin
date Fri, 04 Sep 2015 19:40:23 +0300
parents
children
comparison
equal deleted inserted replaced
406:f23fcb19d3c1 407:c6e90e02dd17
1 package IMPL::Config::Reference;
2 use strict;
3
4 use IMPL::Exception;
5
6 sub restore {
7 my ($self,$data,$surrogate) = @_;
8
9 my @path;
10
11 my ($tagTarget,$target) = splice @$data, 0, 2;
12
13 die new IMPL::Exception('A traget tag must be the first tag in the reference specification') unless $tagTarget eq 'target';
14 while(my ($method,$args) = splice @$data, 0, 2 ) {
15 $target = $self->_InvokeMember($target,{ method => $method, args => $args});
16 }
17 return $target;
18 }
19
20 sub _InvokeMember {
21 my ($self,$object,$member) = @_;
22
23 my $method = $member->{method};
24 return
25 ref $object eq 'HASH' ?
26 $object->{$method}
27 :
28 $object->$method(
29 exists $member->{args} ?
30 _as_list($member->{args})
31 :
32 ()
33 )
34 ;
35 }
36
37 sub _as_list {
38 ref $_[0] ?
39 (ref $_[0] eq 'HASH' ?
40 %{$_[0]}
41 :
42 (ref $_[0] eq 'ARRAY'?
43 @{$_[0]}
44 :
45 $_[0]
46 )
47 )
48 :
49 ($_[0]);
50 }
51
52 1;
53
54 __END__
55
56 =pod
57
58 =head1 NAME
59
60 C<IMPL::Config::Reference> - ссылка на внешний объект, вычисляемый на этапе десериализации данных.
61
62 =head1 SYNOPSIS
63
64 =begin code xml
65
66 <Application>
67 <processingStack type="IMPL::Config::Reference">
68 <target>IMPL::Config</target>
69 <LoadXMLFile>stdprocessing.xml</LoadXMLFile>
70 </processingStack>
71 </Application>
72
73 =end code xml
74
75 =head1 DESCRIPTION
76
77 Позволяет на указвать ссылки на вычисляемые объекты, например, загружаемые из файлов. Ссылки такого рода
78 будут вычислены на этапе десериализации еще до того, как будет создан объект верхнего уровня, поэтому
79 следует избегать таких ссылок на сам (его свойства и методы) десериализуемый объект.
80
81 =head1 MEMBERS
82
83 =head2 C<restore($class,$data,$surrogate)>
84
85 Использует данные переданные в параметре дата C<$data> для вычисления свойства. Данный метод - стандартный
86 метод для десериализации объекта, а параметр C<$data> содержит пары значений C<(имя_узла,значение_узла)>,
87 первая пара обязательно является узлом C<target>, а его значение - целевой объект, который будет
88 использован для вычисления конечного значения.
89
90 =back
91
92 =cut