File Coverage

inc/YAML/Node.pm
Criterion Covered Total %
statement 21 118 17.8
branch 4 34 11.7
condition 0 2 0.0
subroutine 6 30 20.0
pod 0 6 0.0
total 31 190 16.3


line stmt bran cond sub pod time code
1             #line 1
2 1     1   4 package YAML::Node;
  1     1   1  
  1         30  
  1         5  
  1         2  
  1         19  
3 1     1   4 use strict; use warnings;
  1     1   3  
  1         44  
  1         5  
  1         2  
  1         4  
4 1     1   535 use YAML::Base; use base 'YAML::Base';
  1         3  
  1         1418  
5             use YAML::Tag;
6              
7             our @EXPORT = qw(ynode);
8              
9 4     4 0 6 sub ynode {
10 4 50       17 my $self;
    100          
11 0         0 if (ref($_[0]) eq 'HASH') {
  0         0  
12             $self = tied(%{$_[0]});
13             }
14 1         2 elsif (ref($_[0]) eq 'ARRAY') {
  1         4  
15             $self = tied(@{$_[0]});
16             }
17 3         6 else {
18             $self = tied($_[0]);
19 4 50       22 }
20             return (ref($self) =~ /^yaml_/) ? $self : undef;
21             }
22              
23 0     0 0   sub new {
24 0           my ($class, $node, $tag) = @_;
25 0           my $self;
26 0           $self->{NODE} = $node;
27 0 0         my (undef, $type) = $class->node_info($node);
    0          
    0          
28             $self->{KIND} = (not defined $type) ? 'scalar' :
29             ($type eq 'ARRAY') ? 'sequence' :
30             ($type eq 'HASH') ? 'mapping' :
31 0   0       $class->die("Can't create YAML::Node from '$type'");
32 0 0         tag($self, ($tag || ''));
33 0           if ($self->{KIND} eq 'scalar') {
34 0           yaml_scalar->new($self, $_[1]);
35             return \ $_[1];
36 0           }
37 0           my $package = "yaml_" . $self->{KIND};
38             $package->new($self)
39             }
40 0     0 0    
41 0     0 0   sub node { $_->{NODE} }
42             sub kind { $_->{KIND} }
43 0     0 0   sub tag {
44 0 0         my ($self, $value) = @_;
45 0           if (defined $value) {
46 0           $self->{TAG} = YAML::Tag->new($value);
47             return $self;
48             }
49 0           else {
50             return $self->{TAG};
51             }
52             }
53 0     0 0   sub keys {
54 0 0         my ($self, $value) = @_;
55 0           if (defined $value) {
56 0           $self->{KEYS} = $value;
57             return $self;
58             }
59 0           else {
60             return $self->{KEYS};
61             }
62             }
63              
64             #==============================================================================
65             package yaml_scalar;
66             @yaml_scalar::ISA = qw(YAML::Node);
67              
68 0     0     sub new {
69 0           my ($class, $self) = @_;
70             tie $_[2], $class, $self;
71             }
72              
73 0     0     sub TIESCALAR {
74 0           my ($class, $self) = @_;
75 0           bless $self, $class;
76             $self
77             }
78              
79 0     0     sub FETCH {
80 0           my ($self) = @_;
81             $self->{NODE}
82             }
83              
84 0     0     sub STORE {
85 0           my ($self, $value) = @_;
86             $self->{NODE} = $value
87             }
88              
89             #==============================================================================
90             package yaml_sequence;
91             @yaml_sequence::ISA = qw(YAML::Node);
92              
93 0     0     sub new {
94 0           my ($class, $self) = @_;
95 0           my $new;
96 0           tie @$new, $class, $self;
97             $new
98             }
99              
100 0     0     sub TIEARRAY {
101 0           my ($class, $self) = @_;
102             bless $self, $class
103             }
104              
105 0     0     sub FETCHSIZE {
106 0           my ($self) = @_;
  0            
107             scalar @{$self->{NODE}};
108             }
109              
110 0     0     sub FETCH {
111 0           my ($self, $index) = @_;
112             $self->{NODE}[$index]
113             }
114              
115 0     0     sub STORE {
116 0           my ($self, $index, $value) = @_;
117             $self->{NODE}[$index] = $value
118             }
119              
120 0     0     sub undone {
121             die "Not implemented yet"; # XXX
122             }
123              
124             *STORESIZE = *POP = *PUSH = *SHIFT = *UNSHIFT = *SPLICE = *DELETE = *EXISTS =
125             *STORESIZE = *POP = *PUSH = *SHIFT = *UNSHIFT = *SPLICE = *DELETE = *EXISTS =
126             *undone; # XXX Must implement before release
127              
128             #==============================================================================
129             package yaml_mapping;
130             @yaml_mapping::ISA = qw(YAML::Node);
131              
132 0     0     sub new {
133 0           my ($class, $self) = @_;
  0            
  0            
134 0           @{$self->{KEYS}} = sort keys %{$self->{NODE}};
135 0           my $new;
136 0           tie %$new, $class, $self;
137             $new
138             }
139              
140 0     0     sub TIEHASH {
141 0           my ($class, $self) = @_;
142             bless $self, $class
143             }
144              
145 0     0     sub FETCH {
146 0 0         my ($self, $key) = @_;
147 0 0         if (exists $self->{NODE}{$key}) {
  0            
  0            
148             return (grep {$_ eq $key} @{$self->{KEYS}})
149             ? $self->{NODE}{$key} : undef;
150 0           }
151             return $self->{HASH}{$key};
152             }
153              
154 0     0     sub STORE {
155 0 0         my ($self, $key, $value) = @_;
    0          
156 0           if (exists $self->{NODE}{$key}) {
157             $self->{NODE}{$key} = $value;
158             }
159 0           elsif (exists $self->{HASH}{$key}) {
160             $self->{HASH}{$key} = $value;
161             }
162 0 0         else {
  0            
  0            
163 0           if (not grep {$_ eq $key} @{$self->{KEYS}}) {
  0            
164             push(@{$self->{KEYS}}, $key);
165 0           }
166             $self->{HASH}{$key} = $value;
167 0           }
168             $value
169             }
170              
171 0     0     sub DELETE {
172 0           my ($self, $key) = @_;
173 0 0         my $return;
    0          
174 0           if (exists $self->{NODE}{$key}) {
175             $return = $self->{NODE}{$key};
176             }
177 0           elsif (exists $self->{HASH}{$key}) {
178             $return = delete $self->{NODE}{$key};
179 0           }
  0            
180 0 0         for (my $i = 0; $i < @{$self->{KEYS}}; $i++) {
181 0           if ($self->{KEYS}[$i] eq $key) {
  0            
182             splice(@{$self->{KEYS}}, $i, 1);
183             }
184 0           }
185             return $return;
186             }
187              
188 0     0     sub CLEAR {
189 0           my ($self) = @_;
  0            
190 0           @{$self->{KEYS}} = ();
  0            
191             %{$self->{HASH}} = ();
192             }
193              
194 0     0     sub FIRSTKEY {
195 0           my ($self) = @_;
196 0           $self->{ITER} = 0;
197             $self->{KEYS}[0]
198             }
199              
200 0     0     sub NEXTKEY {
201 0           my ($self) = @_;
202             $self->{KEYS}[++$self->{ITER}]
203             }
204              
205 0     0     sub EXISTS {
206 0           my ($self, $key) = @_;
207             exists $self->{NODE}{$key}
208             }
209              
210             1;
211              
212             __END__