NAME

Tie::Hash::MultiValueOrdered - hash with multiple values per key, and ordered keys

SYNOPSIS

use Test::More;
use Tie::Hash::MultiValueOrdered;

my $tied = tie my %hash, "Tie::Hash::MultiValueOrdered";

$hash{a} = 1;
$hash{b} = 2;
$hash{a} = 3;
$hash{b} = 4;

# Order of keys is predictable
is_deeply(
   [ keys %hash ],
   [ qw( a b ) ],
);

# Order of values is predictable
# Note that the last values of 'a' and 'b' are returned.
is_deeply(
   [ values %hash ],
   [ qw( 3 4 ) ],
);

# Can retrieve list of all key-value pairs
is_deeply(
   [ $tied->pairs ],
   [ qw( a 1 b 2 a 3 b 4 ) ],
);

# Switch the retrieval mode for the hash.
$tied->fetch_first;

# Now the first values of 'a' and 'b' are returned.
is_deeply(
   [ values %hash ],
   [ qw( 1 2 ) ],
);

# Switch the retrieval mode for the hash.
$tied->fetch_list;

# Now arrayrefs are returned.
is_deeply(
   [ values %hash ],
   [ [1,3], [2,4] ],
);

# Restore the default retrieval mode for the hash.
$tied->fetch_last;

done_testing;

DESCRIPTION

A hash tied to this class acts more or less like a standard hash, except that when you assign a new value to an existing key, the old value is retained underneath. An explicit delete deletes all values associated with a key.

By default, the old values are inaccessible through the hash interface, but can be retrieved via the tied object:

my @values = tied(%hash)->get($key);

However, the fetch_* methods provide a means to alter the behaviour of the hash.

Tied Object Methods

pairs

Returns all the hash's key-value pairs (including duplicates) as a flattened list.

pair_refs

Returns all the hash's key-value pairs (including duplicates) as a list of two item arrayrefs.

get($key)

Returns the list of all values associated with a key.

keys

The list of all hash keys in their original order. Where a key is duplicated, only the first occurance is returned.

rr_keys

The list of all hash keys in their original order. Where a key is duplicated, only the last occurance is returned.

all_keys

The list of all hash keys in their original order, including duplicates.

values

The values correponding to keys.

rr_values

The values correponding to rr_keys.

all_values

The values correponding to all_keys.

Fetch Styles

fetch_last

This is the default style of fetching.

tie my %hash, "Tie::Hash::MultiValueOrdered";

$hash{a} = 1;
$hash{b} = 2;
$hash{b} = 3;

tied(%hash)->fetch_last;

is($hash{a}, 1);
is($hash{b}, 3);
fetch_first
tie my %hash, "Tie::Hash::MultiValueOrdered";

$hash{a} = 1;
$hash{b} = 2;
$hash{b} = 3;

tied(%hash)->fetch_first;

is($hash{a}, 1);
is($hash{b}, 2);
fetch_list
tie my %hash, "Tie::Hash::MultiValueOrdered";

$hash{a} = 1;
$hash{b} = 2;
$hash{b} = 3;

tied(%hash)->fetch_first;

is_deeply($hash{a}, [1]);
is_deeply($hash{b}, [2, 3]);
fetch_iterator

This fetch style is experimental and subject to change.

tie my %hash, "Tie::Hash::MultiValueOrdered";

$hash{a} = 1;
$hash{b} = 2;
$hash{b} = 3;

tied(%hash)->fetch_iterator;

my $A = $hash{a};
my $B = $hash{b};

is($A->(), 1);
is($B->(), 2);
is($B->(), 3);

BUGS

Please report any bugs to http://rt.cpan.org/Dist/Display.html?Queue=JSON-MultiValueOrdered.

SEE ALSO

JSON::Tiny::Subclassable, JSON::Tiny, Mojo::JSON.

AUTHOR

Toby Inkster <tobyink@cpan.org>.

COPYRIGHT AND LICENCE

This software is copyright (c) 2012-2013 by Toby Inkster.

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

DISCLAIMER OF WARRANTIES

THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.