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