Mercurial > pub > Impl
comparison lib/IMPL/DOM/Document.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::DOM::Document; | |
2 use strict; | |
3 use warnings; | |
4 | |
5 use IMPL::lang; | |
6 use IMPL::Const qw(:prop); | |
7 use IMPL::declare { | |
8 require => { | |
9 DOMNode => 'IMPL::DOM::Node' | |
10 }, | |
11 base => [ | |
12 DOMNode => '@_' | |
13 ], | |
14 props => [ | |
15 schemaDocument => PROP_RW | |
16 ] | |
17 }; | |
18 | |
19 sub document { | |
20 return $_[0]; | |
21 } | |
22 | |
23 sub Create { | |
24 my ($this,$nodeName,$class,$refProps) = @_; | |
25 | |
26 if ( ref $class eq 'HASH' ) { | |
27 $refProps = $class; | |
28 $class = undef; | |
29 } | |
30 | |
31 $class ||= DOMNode; | |
32 $refProps ||= {}; | |
33 | |
34 delete $refProps->{nodeName}; | |
35 | |
36 die new IMPL::Exception("class is not specified") unless $class; | |
37 return $class->new( | |
38 nodeName => $nodeName, | |
39 document => $this, | |
40 %$refProps | |
41 ); | |
42 } | |
43 | |
44 sub save { | |
45 my ($this,$writer) = @_; | |
46 | |
47 $writer->xmlDecl(undef,'yes'); | |
48 $this->SUPER::save($writer); | |
49 $writer->end(); | |
50 } | |
51 | |
52 { | |
53 my $empty; | |
54 sub Empty() { | |
55 return $empty ? $empty : ($empty = __PACKAGE__->new(nodeName => 'Empty')); | |
56 } | |
57 } | |
58 | |
59 1; | |
60 __END__ | |
61 | |
62 =pod | |
63 | |
64 =head1 NAME | |
65 | |
66 C<IMPL::DOM::Document> DOM документ. | |
67 | |
68 =head1 DESCRIPTION | |
69 | |
70 Документ, позволяет создавать узлы определенных типов, что позволяет абстрагироваться | |
71 от механизмов реального создания объектов. Т.о. например C<IMPL::DOM::Navigator::Builder> | |
72 может формировать произвольные документы. | |
73 | |
74 =head1 SYNOPSIS | |
75 | |
76 =begin code | |
77 | |
78 package MyDocument; | |
79 use parent qw(IMPL::DOM::Document); | |
80 | |
81 sub Create { | |
82 my $this = shift; | |
83 my ($name,$class,$hashProps) = @_; | |
84 | |
85 if ($class eq 'Info') { | |
86 return MyInfo->new($name,$hashProps->{date},$hashProps->{description}); | |
87 } else { | |
88 # leave as it is | |
89 return $this->SUPER::Create(@_); | |
90 } | |
91 } | |
92 | |
93 =end code | |
94 | |
95 =head1 METHODS | |
96 | |
97 =over | |
98 | |
99 =item C< Create($nodeName,$class,$hashProps) > | |
100 | |
101 Реализация по умолчанию. Создает узел определеннго типа с определенным именем и свойствами. | |
102 | |
103 =begin code | |
104 | |
105 sub Create { | |
106 my ($this,$nodeName,$class,$hashProps) = @_; | |
107 | |
108 return $class->new ( | |
109 nodeName => $nodeName, | |
110 document => $this, | |
111 %$hashProps | |
112 ); | |
113 } | |
114 | |
115 =end code | |
116 | |
117 =item C< save($writer) > | |
118 | |
119 Сохраняет документ в виде XML узла и вызывает C<< $writer->end() >>. | |
120 | |
121 =over | |
122 | |
123 =item C<$writer> | |
124 | |
125 Объект с интерфейсом C<XML::Writer> который будет использован для записи | |
126 содержимого документа | |
127 | |
128 =back | |
129 | |
130 =back | |
131 | |
132 =cut |