407
|
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 |