#!perl ## no critic (TidyCode)
use strict;
use warnings;

require Hash::Map;
require Data::Dumper;

our $VERSION = '0.001';

# example form data
my $form = { qw(
    country      Germany
    country_code D
    city         Examplecity
    zip          01234
    street       Examplestreet
    first_name   Steffen
    family_name  Winkler
) };

# example account object
my $account = {
    account => ( bless { account  => 'STEFFENW' }, __PACKAGE__ ),
};
sub get_account { my $self = shift; return $self->{account} }

# example mail data
my $mail = {
    name    => 'Steffen Winkler',
    address => 'steffenw@example.com',
    subject => 'Example',
};

my $hash_map = Hash::Map->combine(
    Hash::Map ## no critic (LongChainsOfMethodCalls)
        ->source_ref($form)
        ->copy_keys(
            qw(street city)
        )
        ->copy_modify(
            country_code => sub {
                return $_ eq 'D' ? 'DE' : $_;
            },
        )
        ->map_keys(
            zip => 'zip_code',
        )
        ->merge_hash(
            name => "$form->{first_name} $form->{family_name}",
        ),
    Hash::Map
        ->source_ref($account)
        ->copy_modify(
            account => sub {
                return $_->get_account;
            },
        ),
    Hash::Map
        ->source_ref($mail)
        ->copy_keys(
            qw(name address),
            sub {
                return "mail_$_";
            },
        ),
)->target_ref;

() = print Data::Dumper->new([$hash_map], ['hash_map'])->Indent(1)->Dump;

# $Id$
