NAME
Hash::Compact - A hash-based object implementation with key alias and default value support
SYNOPSIS
package My::Memcached;
use strict;
use warnings;
use parent qw(Cache::Memcached::Fast);
use JSON;
use Hash::Compact;
my $OPTIONS = {
foo => {
alias_for => 'f',
},
bar => {
alias_for => 'b',
default => 'bar',
},
};
sub get {
my ($self, $key) = @_;
my $value = $self->SUPER::get($key);
Hash::Compact->new(decode_json $value, $OPTIONS);
}
sub set {
my ($self, $key, $value, $expire) = @_;
my $hash = Hash::Compact->new($value, $OPTIONS);
$self->SUPER::set($key, encode_json $hash->to_hash, $expire);
}
package main;
use strict;
use warnings;
use Test::More;
my $key = 'key';
my $value = { foo => 'foo' };
my $memd = My::Memcached->new({servers => [qw(localhost:11211)]});
$memd->set($key, $value);
my $cached_value = $memd->get($key);
is_deeply $cached_value->param('foo'), 'foo';
is_deeply $cached_value->param('bar'), 'bar';
is_deeply $cached_value->to_hash, +{ f => 'foo' };
$cached_value->param(bar => 'baz');
$memd->set($key, $cached_value->to_hash);
$cached_value = $memd->get($key);
is_deeply $cached_value->param('foo'), 'foo';
is_deeply $cached_value->param('bar'), 'baz';
is_deeply $cached_value->to_hash, +{ f => 'foo', b => 'baz' };
done_testing;
DESCRIPTION
When we store some structured value into a column of a relational database or some key/value storage, redundancy of long key names can be a problem for storage space.
This module is yet another hash-based object implementation which aims to be aware of both space efficiency and easiness to use for us.
METHODS
new (\%hash [, \%options])
my $hash = Hash::Compact->new({
foo => 'foo',
}, {
foo => {
alias_for => 'f',
},
bar => {
alias_for => 'b',
default => 'bar',
},
},
);
Creates and returns a new Hash::Compact object. If \%options
not passed, Hash::Compact object $hash
will be just a plain hash-based object.
\%options
is a hash-ref which key/value pairs are associated with ones of \%hash
. It may contain the fields below:
alias_for
Alias to an actual key. If it's passed,
\%hash
will be compacted into another hash which has aliased key. The original key of\%hash
will be just an alias to an actual key.default
If this exists and the value associated with the key of
\%hash
is undefined, Hash::Compact object$hash
returns just the value. It's for space efficiency;$hash
doesn't need to have key/value pair when the value isn't defined or it's same as default value.
param ($key [, $value])
$hash->param('foo'); #=> 'foo'
$hash->param('bar'); #=> 'bar' (returns the default value)
$hash->param(bar => 'baz');
$hash->param('bar'); #=> 'baz'
Setter/getter method.
to_hash ()
my $compact_hash_ref = $hash->to_hash;
#=> { f => 'foo', b => 'baz' } (returns a compacted hash)
Returns a compacted hash according to \%options
passed into the constructor above;
AUTHOR
Kentaro Kuribayashi <kentarok@gmail.com>
SEE ALSO
LICENSE
Copyright (C) Kentaro Kuribayashi
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.