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