NAME

RappidApp::Util::Hash::Merge - Merges arbitrarily deep hashes into a single hash

SYNOPSIS

    use RappidApp::Util:Hash::Merge qw( merge );
    my %a = ( 
		'foo'    => 1,
	    'bar'    => [ qw( a b e ) ],
	    'querty' => { 'bob' => 'alice' },
	);
    my %b = ( 
		'foo'     => 2, 
		'bar'    => [ qw(c d) ],
		'querty' => { 'ted' => 'margeret' }, 
	);

    my %c = %{ merge( \%a, \%b ) };

    RappidApp::Util:Hash::Merge::set_behavior( 'RIGHT_PRECEDENT' );

    # This is the same as above

	RappidApp::Util:Hash::Merge::specify_behavior(
	    {
			'SCALAR' => {
				'SCALAR' => sub { $_[1] },
				'ARRAY'  => sub { [ $_[0], @{$_[1]} ] },
				'HASH'   => sub { $_[1] },
			},
			'ARRAY => {
				'SCALAR' => sub { $_[1] },
				'ARRAY'  => sub { [ @{$_[0]}, @{$_[1]} ] },
				'HASH'   => sub { $_[1] }, 
			},
			'HASH' => {
				'SCALAR' => sub { $_[1] },
				'ARRAY'  => sub { [ values %{$_[0]}, @{$_[1]} ] },
				'HASH'   => sub { RappidApp::Util:Hash::Merge::_merge_hashes( $_[0], $_[1] ) }, 
			},
		}, 
		'My Behavior', 
	);
	
	# Also there is OO interface.
	
	my $merge = RappidApp::Util:Hash::Merge->new( 'LEFT_PRECEDENT' );
	my %c = %{ $merge->merge( \%a, \%b ) };
	
	# All behavioral changes (e.g. $merge->set_behavior(...)), called on an object remain specific to that object
	# The legacy "Global Setting" behavior is respected only when new called as a non-OO function.

DESCRIPTION

This is a copy of Hash::Merge at version 2.00.

See https://metacpan.org/pod/release/REHSACK/Hash-Merge-0.200/lib/Hash/Merge.pm

Please don't use this as it may be removed at any time.

AUTHOR

Original author Michael K. Neylon <mneylon-pm@masemware.com>

Trivial modifications by Henry Van Styn for RapidApp

See https://github.com/vanstyn/RapidApp/issues/177 for why this copy was created.

COPYRIGHT

Copyright (c) 2001,2002 Michael K. Neylon. All rights reserved.

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