Data-Transfigure
view release on metacpan or search on metacpan
NAME
Data::Transfigure - performs rule-based data transfigurations of
arbitrary structures
SYNOPSIS
use Data::Transfigure;
my $d = Data::Transfigure->std();
$d->add_transfigurators(qw(
Data::Transfigure::Type::DateTime::Duration
Data::Transfigure::HashKeys::CamelCase
), Data::Transfigure::Type->new(
type => 'Activity::Run'.
handler => sub ($data) {
{
start => $data->start_time, # DateTime
time => $data->time, # DateTime::Duration
distance => $data->distance, # number
pace => $data->pace, # DateTime::Duration
}
}
));
my $list = [
{ user_id => 3, run => Activity::Run->new(...) },
{ user_id => 4, ride => Activity::Ride->new(...) },
];
$d->transfigure($list); # [
# {
# userID => 3
# run => {
# start => "2023-05-15T074:11:14",
# time => "PT30M5S",
# distance => "5",
# pace => "PT9M30S",
# }
# },
# {
# userID => 4,
# ride => "Activity::Ride=HASH(0x2bbd7d16f640)",
# },
# ]
DESCRIPTION
"Data::Transfigure" allows you to write reusable rules
('transfigurators') to modify parts (or all) of a data structure. There
are many possible applications of this, but it was primarily written to
handle converting object graphs of ORM objects into a structure that
could be converted to JSON and delivered as an API endpoint response.
One of the challenges of such a system is being able to reuse code
because many different controllers could need to convert the an object
type to the same structure, but then other controllers might need to
convert that same type to a different structure.
A number of transfigurator roles and classes are included with this
distribution:
* Data::Transfigure::Node the root role which all transfigurators must
implement
* Data::Transfigure::Default a low priority transfigurator that only
applies when no other transfigurators do
* Data::Transfigure::Default::ToString a transfigurator that
stringifies any value that is not otherwise transfigured
* Data::Transfigure::Type a transfigurator that matches against one or
more data types
* Data::Transfigure::Type::DateTime transfigures DateTime objects to
ISO8601 <https://en.wikipedia.org/wiki/ISO_8601> format.
* Data::Transfigure::Type::DateTime::Duration transfigures
DateTime::Duration objects to ISO8601
<https://en.wikipedia.org/wiki/ISO_8601#Durations> (duration!)
format
* Data::Transfigure::Type::DBIx transfigures DBIx::Class::Row
instances into hashrefs of colname->value pairs. Does not recurse
across relationships
* Data::Transfigure::Type::DBIx::Recursive transfigures
DBIx::Class::Row instances into hashrefs of colname->value pairs,
recursing down to_one-type relationships
* Data::Transfigure::Value a transfigurator that matches against data
values (exactly, by regex, or by coderef callback)
* Data::Transfigure::Position a compound transfigurator that specifies
one or more locations within the data structure to apply to, in
addition to whatever other criteria its transfigurator specifies
* Data::Transfigure::Tree a transfigurator that is applied to the
entire data structure after all node transfigurations have been
completed
* Data::Transfigure::HashKeys::CamelCase a transfigurator that
converts all hash keys in the data structure to lowerCamelCase
* Data::Transfigure::HashKeys::SnakeCase a transfigurator that
converts all hash keys in the data structure to snake_case
* Data::Transfigure::HashKeys::CapitalizedIDSuffix a transfigurator
that converts "Id" at the end of hash keys (as results from
lowerCamelCase conversion) to "ID"
* Data::Transfigure::HashFilter::Undef a transfigurator that removes
key/value pairs where the value is undefined and the key matches a
certain pattern
( run in 2.185 seconds using v1.01-cache-2.11-cpan-5837b0d9d2c )