File Coverage

blib/lib/YAML/Old/Node.pm
Criterion Covered Total %
statement 100 117 85.4
branch 28 36 77.7
condition 2 2 100.0
subroutine 23 29 79.3
pod 0 6 0.0
total 153 190 80.5


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