NAME
Data::Abridge
VERSION
version 0.03.01
Simplify data structures for naive serialization.
SYNOPSIS
use Data::Abridge qw( abridge_recursive );
use JSON;
my $foo = bless { handle => \*STDIN }, 'SomeObj';
print encode_json abridge_recursive( $foo );
local $DATA::Abridge::HONOR_STRINGIFY = undef;
print encode_json abridge_recursive( $foo );
DESCRIPTION
Webster's 1913 edition defines abridge as follows:
A*bridge" (#), v. t.
1. To make shorter; to shorten in duration; to lessen; to diminish; to
curtail; as, to abridge labor; to abridge power or rights. The bridegroom
This module exists to simplify the process of serializing data to formats, such as JSON, which do not support the full richness of perl datatypes.
An abridged data structure will feature only scalars, hashes and arrays.
This module does NOT guarantee round-trip capability. Abridgement is a lossy process and some information may be lost.
EXPORTED SYMBOLS
Nothing is exported by default.
The three subroutines in the public API are available for export by request.
SUBROUTINES
abridge_item
Abridges the top level of an item. Deep structures are not modified below the top structure. For complete conversion, use abridge_recursive
.
Scalars that aren't references, array references and hash references are unchanged:
Input Output
------------------------------------------
'A string' 'A string'
57 57
{a=>1, b=>2} {a=>1, b=>2}
[1,2,3] [1,2,3]
Code references are converted to a hash ref that indicates the fully qualified name of the subroutine pointed to. Anonymous subroutines are marked as __ANON__
.
Input Output
------------------------------------------
\&foo {CODE => '\&main::foo'}
sub {0} {CODE => '\&main::__ANON__'}
Typeglob references are converted to a hash ref that contains the name of the glob.
Input Output
------------------------------------------
\*main::foo {GLOB => '\*main::foo'}
Scalar references are converted to a hash ref that contains the scalar.
Input Output
------------------------------------------
\$foo {SCALAR => $foo}
Objects are converted to a hash ref that contains the name of the class and an unblessed copy of the object's underlying data type.
Input Output
------------------------------------------
bless {a=>'b'}, 'Foo' { Foo => {a=>'b'} }
bless [1,2,3], 'Foo' { Foo => [1,2,3] }
Objects that override stringification will be treated as strings, by default.
Given:
package Foo;
use overload '""' => sub { join ' ', keys %$_[0] };
Input Output Condition
----------------------------------------------------
bless {a=>'b'}, 'Foo' 'a' Default
bless {a=>'b'}, 'Foo' { Foo => {a=>'b'} } $HONOR_STRINGIFY = undef
bless {a=>'b'}, 'Foo' 'a' $HONOR_STRINGIFY = 1
abridge_items
Operates as abridge item, but applied to a list.
Takes a list of arguments, applies abridge_item
to each, and then returns an array ref containing the results.
abridge_recursive
Operates on a single data structure as per abridge_item
, but in a top-down recursive mode.
The data structure returned will consist of only abridged data.
Recursive processing adds one more transformation type to the set described above:
Input Output
------------------------------------------
Any repeated item {SEEN => [ 0, 'Path' ]}
This means that any item that appears more than once in a data structure will be replaced with a pointer to the other location. A hash ref with a single key "SEEN" and a value consisting of an array reference to indicate the path of keys and indexes that must be traversed to find the fully dumped instance.
A reference to the top level data structure will yeild an empty []
path.
A reference to an element in an object or other special item will include the Data::Abridge generated keys in the path [ 2, 'SCALAR', 'SomeClass', 'that_attrib', 5 ]
.
abridge_items_recursive
Operates as abridge_recursive
, but applied to a list.
Takes a list of arguments, applies abridge_recursive
to each, and then returns an array ref of the results.
The top level item, in this case, is taken to be the array of items.
SUPPORT
Please file any bugs through the standard CPAN ticketing system. At the time of writing this is http://rt.cpan.org.
LICENSE
This module is licensed under the same terms as Perl.
To be specific, you may choose to use it under any of the licensing terms available for Perl 5.6.0 or newer.
AUTHOR
Mark Swayne
Copyright 2012
ACKNOWLEDGEMENTS
Thank you to Marchex http://marchex.com for supporting the development and release of this module.
Special thanks to Tye McQueen for the original idea and his readiness to kibbitz during the development process.