1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
|
package Catmandu::Fix::retain;
use Catmandu::Sane;
our $VERSION = '1.2024';
use Moo;
use Catmandu::Util::Path qw(as_path);
use namespace::clean;
use Catmandu::Fix::Has;
with 'Catmandu::Fix::Builder';
has paths => (fix_arg => 'collect', default => sub {[]},);
sub _build_fixer {
my ($self) = @_;
my $paths = [map {as_path($_)} @{$self->paths}];
my $getters = [map {$_->getter} @$paths];
my $creators = [map {$_->creator} @$paths];
sub {
my $data = $_[0];
my $temp = {};
for (my $i = 0; $i < @$getters; $i++) {
my $getter = $getters->[$i];
my $creator = $creators->[$i];
my $values = $getter->($data);
while (@$values) {
$creator->($temp, shift @$values);
}
}
undef %$data;
for my $key (keys %$temp) {
$data->{$key} = $temp->{$key};
}
$data;
};
}
1;
__END__
=pod
=head1 NAME
Catmandu::Fix::retain - delete everything except the paths given
=head1 SYNOPSIS
# Keep the field _id , name , title
retain(_id , name, title)
# Delete everything except foo.bar
# {bar => { x => 1} , foo => {bar => 1, y => 2}}
# to
# {foo => {bar => 1}}
retain(foo.bar)
=head1 SEE ALSO
L<Catmandu::Fix>
=cut
|