comparison Lib/IMPL/Config/Reference.pm @ 196:a705e848dcc7

added IMPL::Config::Reference
author cin
date Mon, 16 Apr 2012 17:42:54 +0400
parents
children 2ffe6f661605
comparison
equal deleted inserted replaced
195:7a920771fd8e 196:a705e848dcc7
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