Data-Transfigure

 view release on metacpan or  search on metacpan

lib/Data/Transfigure.pm  view on Meta::CPAN

package Data::Transfigure 1.03;
use v5.26;
use warnings;

# ABSTRACT: performs rule-based data transfigurations of arbitrary structures

=encoding UTF-8
 
=head1 NAME
 
Data::Transfigure - performs rule-based data transfigurations of arbitrary structures
 
=head1 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)",
                          #   },
                          # ]

=head1 DESCRIPTION

C<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:

=over

=item * L<Data::Transfigure::Node>
the root role which all transfigurators must implement

=item * L<Data::Transfigure::Default>
a low priority transfigurator that only applies when no other transfigurators do

=item * L<Data::Transfigure::Default::ToString>
a transfigurator that stringifies any value that is not otherwise transfigured

=item * L<Data::Transfigure::Type>
a transfigurator that matches against one or more data types

=item * L<Data::Transfigure::Type::DateTime>
transfigures DateTime objects to L<ISO8601|https://en.wikipedia.org/wiki/ISO_8601> 
format.

=item * L<Data::Transfigure::Type::DateTime::Duration>
transfigures L<DateTime::Duration> objects to 
L<ISO8601|https://en.wikipedia.org/wiki/ISO_8601#Durations> (duration!) format

=item * L<Data::Transfigure::Type::DBIx>
transfigures L<DBIx::Class::Row> instances into hashrefs of colname->value 
pairs. Does not recurse across relationships

=item * L<Data::Transfigure::Type::DBIx::Recursive>
transfigures L<DBIx::Class::Row> instances into hashrefs of colname->value pairs,
recursing down to_one-type relationships

=item * L<Data::Transfigure::Value>
a transfigurator that matches against data values (exactly, by regex, or by coderef 
callback)

=item * L<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

=item * L<Data::Transfigure::Tree>
a transfigurator that is applied to the entire data structure after all 
node transfigurations have been completed

=item * L<Data::Transfigure::HashKeys::CamelCase>
a transfigurator that converts all hash keys in the data structure to 
lowerCamelCase

=item * L<Data::Transfigure::HashKeys::SnakeCase>
a transfigurator that converts all hash keys in the data structure to 
snake_case

=item * L<Data::Transfigure::HashKeys::CapitalizedIDSuffix>
a transfigurator that converts "Id" at the end of hash keys (as results from 



( run in 1.826 second using v1.01-cache-2.11-cpan-39bf76dae61 )