NAME

Hash::Convert - Rule based Hash converter.

SYNOPSIS

#!/usr/bin/env perl
use strict;
use warnings;
use Hash::Convert;

my $rules = {
    visit   => { from => 'created_at' },
    count   => { from => 'count', via => sub { $_[0] + 1 }, default => 1 },
    visitor => {
        contain => {
            name => { from => 'name' },
            mail => { from => 'mail' },
        },
        default => {
            name => 'anonymous',
            mail => 'anonymous',
        }
    },
    price => {
        from => [qw/item.cost item.discount/],
        via => sub {
            my $cost     = $_[0];
            my $discount = $_[1];
            return $cost * ( (100 - $discount) * 0.01 );
        },
    },
};
my $opts = { pass => 'locate' };

my $converter = Hash::Convert->new($rules, $opts);

my $before = {
    created_at => time,
    count      => 1,
    name       => 'hixi',
    mail       => 'hixi@cpan.org',
    locate     => 'JP',
    item => {
        name     => 'chocolate',
        cost     => 100,
        discount => 10,
    },
};
my $after = $converter->convert($before);
print Dumper $after;
#{
#    'visitor' => {
#        'mail' => 'hixi@cpan.org',
#        'name' => 'hixi'
#    },
#    'count' => 2,
#    'visit' => '1377019766',
#    'price' => 90,
#    'locate' => 'JP'
#}

DESCRIPTION

Hash::Convert is can define hash converter based on the rules.

Function

convert

Convert hash structure from before value.

my $rules = {
    mail => { from => 'email' }
};
my $converter = Hash::Convert->new($rules);
my $before = { email => 'hixi@cpan.org' };
my $after  = $converter->convert($before);
#{
#  mail => 'hixi@cpan.org',
#}

Rules

Command

from
my $rules = { visit => { from => 'created_at' } };
#(
#(exists $before->{created_at})?
#    (visit => $before->{created_at}): (),
#)
from + via

`via` add after method toward `from`. `via` can receive multiple args from `from`.

Single args

my $rules = { version => { from => 'version', via => sub { $_[0] + 1 } } };
#(
#(exists $before->{version})?
#    (version => sub {
#        $_[0] + 1;
#    }->($before->{version})): (),
#)

Multi args

my $rules = { price => {
    from => [qw/cost discount/],
    via => sub {
        my $cost     = $_[0];
        my $discount = $_[1];
        return $cost * (100 - $discount);
}};
#(
#(exists $before->{item}->{cost} && exists $before->{item}->{discount})?
#    (price => sub {
#        my $cost = $_[0];
#        my $discount = $_[1];
#        return $cost * (100 - $discount);
#    }->($before->{item}->{cost}, $before->{item}->{discount})): (),
#)
contain
my $rules = { visitor => {
    contain => {
        name => { from => 'name' },
        mail => { from => 'mail' },
    }
}};
#(
#(exists $before->{name} && exists $before->{mail})?
#    (visitor => {
#    (exists $before->{mail})?
#        (mail => $before->{mail}): (),
#    (exists $before->{name})?
#        (name => $before->{name}): (),
#    }): (),
#)

Others expression

default

default can add all command (`from`, `from`+`via`, `contain`) .

my $rules = { visitor => {
    contain => {
        name => { from => 'name' },
        mail => { from => 'mail' },
    },
    default => {
        name => 'anonymous',
        mail => 'anonymous',
    }
}};
#(
#(visitor => {
#(exists $before->{mail})?
#    (mail => $before->{mail}): (),
#(exists $before->{name})?
#    (name => $before->{name}): (),
#}):
#(visitor => {
#  'name' => 'anonymous',
#  'mail' => 'anonymous'
#}),
#)
dot notation

`dot notation` make available nested hash structure.

my $rules = { price => {
    from => [qw/item.cost item.discount/],
    via => sub {
        my $cost     = $_[0];
        my $discount = $_[1];
        return $cost * ( (100 - $discount) * 0.01 );
    },
}};
#(
#(exists $before->{item}->{cost} && exists $before->{item}->{discount})?
#    (price => sub {
#        my $cost = $_[0];
#        my $discount = $_[1];
#        return $cost * ( (100 - $discount) * 0.01 );
#    }->($before->{item}->{cost}, $before->{item}->{discount})): (),
#)

LICENSE

Copyright (C) Hiroyoshi Houchi.

This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.

AUTHOR

Hiroyoshi Houchi <hixi@cpan.org>