Mercurial > pub > Impl
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 |