File Coverage

lib/XML/DOM/Lite/Node.pm
Criterion Covered Total %
statement 105 140 75.0
branch 38 64 59.3
condition 2 2 100.0
subroutine 24 28 85.7
pod 0 23 0.0
total 169 257 65.7


line stmt bran cond sub pod time code
1             package XML::DOM::Lite::Node;
2 8     8   55 use warnings;
  8         14  
  8         223  
3 8     8   65 use strict;
  8         14  
  8         194  
4              
5 8     8   33 use Scalar::Util qw(weaken);
  8         12  
  8         571  
6 8     8   42 use XML::DOM::Lite::NodeList;
  8         11  
  8         159  
7 8     8   36 use XML::DOM::Lite::Constants qw(:all);
  8         10  
  8         10064  
8              
9             sub new {
10 121     121 0 222 my ($class, $proto) = @_;
11 121 50       432 unless (UNIVERSAL::isa($proto->{childNodes}, 'XML::DOM::Lite::NodeList')) {
12             $proto->{childNodes} = XML::DOM::Lite::NodeList->new(
13 121   100     556 $proto->{childNodes} || [ ]
14             );
15             }
16             $proto->{attributes} = XML::DOM::Lite::NodeList->new([ ])
17 121 100       390 unless defined $proto->{attributes};
18              
19 121 50       254 weaken($proto->{parentNode}) if defined $proto->{parentNode};
20 121 100       318 weaken($proto->{ownerDocument}) if defined $proto->{ownerDocument};
21              
22 121         169 my $self = bless $proto, $class;
23 121         282 return $self;
24             }
25              
26             sub childNodes {
27 134 50   134 0 167 my $self = shift; $self->{childNodes} = shift if @_;
  134         252  
28 134         358 return $self->{childNodes};
29             }
30              
31             sub parentNode {
32 122     122 0 458 my $self = shift;
33 122 100       215 if (@_) {
34 78         268 weaken($self->{parentNode} = shift());
35             } else {
36 44         121 return $self->{parentNode};
37             }
38             }
39              
40             sub documentElement {
41 0 0   0 0 0 $_[0]->{documentElement} = $_[1] if $_[1];
42 0         0 $_[0]->{documentElement};
43             }
44              
45             sub nodeType {
46 153 50   153 0 508 my $self = shift; $self->{nodeType} = shift if @_;
  153         291  
47 153         441 $self->{nodeType};
48             }
49              
50             sub nodeName {
51 26 50   26 0 39 my $self = shift; $self->{nodeName} = shift if @_;
  26         51  
52 26         93 $self->{nodeName};
53             }
54              
55             sub tagName {
56 24 50   24 0 32 my $self = shift; $self->{tagName} = shift if @_;
  24         37  
57 24         61 $self->{tagName};
58             }
59              
60             sub appendChild {
61 78     78 0 132 my ($self, $node) = @_;
62 78 100       179 if ($node->{parentNode}) {
63 3         9 $node->{parentNode}->removeChild($node);
64             }
65 78 100       140 unless ($node->nodeType == DOCUMENT_FRAGMENT_NODE) {
66 77         173 $node->parentNode($self);
67 77         184 $self->{childNodes}->insertNode($node);
68             } else {
69 1         3 while ($node->childNodes->length) {
70 3         7 $self->appendChild($node->firstChild);
71             }
72             }
73              
74 78         116 return $node;
75             }
76              
77             sub previousSibling {
78 3     3 0 6 my $self = shift;
79 3 50       5 if ($self->parentNode) {
80 3         6 my $index = $self->parentNode->childNodes->nodeIndex($self);
81 3 100       13 return undef if $index == 0;
82 2         5 return $self->parentNode->childNodes->[$index - 1];
83             }
84             }
85              
86             sub nextSibling {
87 7     7 0 12 my $self = shift;
88 7 50       15 if ($self->parentNode) {
89 7         15 my $index = $self->parentNode->childNodes->nodeIndex($self);
90 7 100       17 return undef if $index == $self->parentNode->childNodes->length - 1;
91 4         9 return $self->parentNode->childNodes->[$index + 1];
92             }
93             }
94              
95             sub removeChild {
96 4     4 0 323 my ($self, $node) = @_;
97 4 50       10 if ($node->parentNode == $self) {
98 4         7 undef($node->{parentNode});
99 4         11 return $self->childNodes->removeNode($node);
100             } else {
101 0         0 die "$node is not a child of $self";
102             }
103             }
104              
105             sub insertBefore {
106 1     1 0 3 my ($self, $node, $refNode) = @_;
107 1 50       4 die "usage error" unless (scalar(@_) == 3);
108 1 50       5 if ($node->parentNode) {
109 0         0 $node->parentNode->removeChild($node);
110             }
111 1 50       3 if ($node->nodeType == DOCUMENT_FRAGMENT_NODE) {
112 0         0 foreach my $c (@{$node->childNodes}) {
  0         0  
113 0         0 $self->insertBefore($c, $refNode);
114             }
115 0         0 return;
116             }
117 1         4 $node->parentNode($self);
118 1         2 my $index = $self->childNodes->nodeIndex($refNode);
119 1 50       3 if (defined $index) {
120 1 50       3 if ($index <= 0) {
121 0         0 $self->childNodes->insertNode($node, 0);
122             } else {
123 1         2 $self->childNodes->insertNode($node, $index);
124             }
125             } else {
126 0         0 die "$refNode is not a child of $self";
127             }
128             }
129              
130             sub replaceChild {
131 0     0 0 0 my ($self, $node, $refNode) = @_;
132 0 0       0 die "usage error" unless (scalar(@_) == 3);
133 0         0 $self->insertBefore($refNode, $node);
134 0         0 $self->removeChild($refNode);
135             }
136              
137             sub nodeValue {
138 18 50   18 0 28 my $self = shift; $self->{nodeValue} = shift if @_;
  18         44  
139 18         64 $self->{nodeValue};
140             }
141              
142             sub attributes {
143 23 50   23 0 804 my $self = shift; $self->{attributes} = shift if @_;
  23         72  
144 23         74 return $self->{attributes};
145             }
146              
147             sub getAttribute {
148 66     66 0 452 my ($self, $attname) = @_;
149 66         178 for (my $x = 0; $x < $self->{attributes}->length; $x++) {
150             return $self->{attributes}->[$x]->{nodeValue}
151 63 100       229 if ($self->{attributes}->[$x]->{nodeName} eq $attname);
152             }
153 39         122 return undef;
154             }
155              
156             sub setAttribute {
157 1     1 0 2 my ($self, $attname, $value) = @_;
158 1         4 for (my $x = 0; $x < $self->{attributes}->length; $x++) {
159 0 0       0 if ($self->{attributes}->[$x]->{nodeName} eq $attname) {
160 0         0 $self->{attributes}->[$x]->{nodeValue} = $value;
161 0         0 return $value;
162             }
163             }
164 1         1 push @{$self->{attributes}}, XML::DOM::Lite::Node->new({
  1         6  
165             nodeType => ATTRIBUTE_NODE,
166             nodeName => $attname,
167             nodeValue => $value
168             });
169 1         3 return $value;
170              
171             }
172              
173             sub firstChild {
174 19     19 0 367 my ($self) = @_;
175 19         44 return $self->childNodes->item(0);
176             }
177              
178             sub lastChild {
179 7     7 0 15 my ($self) = @_;
180 7         16 return $self->childNodes->[$#{$self->childNodes}];
  7         13  
181             }
182              
183             sub ownerDocument {
184 84 100   84 0 112 my $self = shift; weaken($self->{ownerDocument} = shift) if @_;
  84         274  
185 84         161 $self->{ownerDocument};
186             }
187              
188             sub getElementsByTagName {
189 1     1 0 4 my ($self, $tag_name) = @_;
190 1         4 my $nlist = XML::DOM::Lite::NodeList->new([ ]);
191 1         3 my @stack = @{ $self->childNodes };
  1         5  
192 1         4 while (my $n = shift(@stack)) {
193 17 100       28 if ($n->nodeType == ELEMENT_NODE) {
194 8 100       12 if ($n->tagName eq $tag_name) {
195 2         4 $nlist->insertNode($n);
196             }
197 8         9 push @stack, @{ $n->childNodes };
  8         16  
198             }
199             }
200 1         2 return $nlist;
201             }
202              
203             sub cloneNode {
204 0     0 0   my ($self, $deep) = @_;
205              
206 0           my $copy = { %$self };
207 0           $copy->{childNodes} = XML::DOM::Lite::NodeList->new([ ]);
208 0           $copy->{attributes} = XML::DOM::Lite::NodeList->new([@{$self->attributes}]);
  0            
209 0           weaken($copy->{ownerDocument});
210 0           weaken($copy->{parentNode});
211              
212 0           bless $copy, ref($self);
213              
214 0 0         if ($deep) {
215             $copy->{documentElement} = $copy->{documentElement}->cloneNode($deep)
216 0 0         if defined $copy->{documentElement};
217 0           foreach (@{$self->childNodes}) {
  0            
218 0           $copy->childNodes->insertNode($_->cloneNode($deep));
219             }
220             }
221 0           return $copy;
222             }
223              
224             sub xml {
225 0     0 0   my $self = shift;
226 0           require XML::DOM::Lite::Serializer;
227 0           my $serializer = XML::DOM::Lite::Serializer->new();
228 0           return $serializer->serializeToString( $self );
229             }
230              
231              
232             1;
233