File Coverage

blib/lib/Catmandu/Fix/move_field.pm
Criterion Covered Total %
statement 33 33 100.0
branch n/a
condition n/a
subroutine 8 8 100.0
pod n/a
total 41 41 100.0


line stmt bran cond sub pod time code
1              
2             use Catmandu::Sane;
3 4     4   89409  
  4         8  
  4         24  
4             our $VERSION = '1.2018';
5              
6             use Moo;
7 4     4   27 use Catmandu::Util::Path qw(as_path);
  4         5  
  4         19  
8 4     4   2207 use Clone qw(clone);
  4         8  
  4         229  
9 4     4   31 use namespace::clean;
  4         7  
  4         158  
10 4     4   19 use Catmandu::Fix::Has;
  4         10  
  4         16  
11 4     4   2040  
  4         12  
  4         23  
12             with 'Catmandu::Fix::Builder';
13              
14             has old_path => (fix_arg => 1);
15             has new_path => (fix_arg => 1);
16              
17             my ($self) = @_;
18             my $old_path = as_path($self->old_path);
19 7     7   74 my $new_path = as_path($self->new_path);
20 7         54 my $getter = $old_path->getter;
21 7         1471 my $deleter = $old_path->deleter;
22 7         125 my $creator = $new_path->creator;
23 7         38  
24 7         148 sub {
25             my $data = $_[0];
26             my $values = [map {clone($_)} @{$getter->($data)}];
27 7     7   16 $deleter->($data);
28 7         14 while (@$values) {
  7         70  
  7         103  
29 7         120 $data = $creator->($data, shift @$values);
30 7         22 }
31 7         113 $data;
32             };
33 7         106 }
34 7         87  
35             1;
36              
37              
38             =pod
39              
40             =head1 NAME
41              
42             Catmandu::Fix::move_field - move a field to another place in the data structure
43              
44             =head1 SYNOPSIS
45              
46             # Move single fields
47              
48             # Move 'foo.bar' to 'bar.foo'
49             move_field(foo.bar, bar.foo)
50              
51             # Move multipe fields
52             # Data:
53             # a:
54             # b: test1
55             # c: test2
56             move_field(a,z) # -> Move all the 'a' to 'z'
57             # z:
58             # b: test1
59             # c: test2
60             # Data:
61             # a:
62             # b: test1
63             # c: test2
64             move_field(a,.) # -> Move the fields 'b' and 'c' to the root
65             # b: test1
66             # c: test2
67              
68             =head1 SEE ALSO
69              
70             L<Catmandu::Fix>
71              
72             =cut