Acme-Data-Dumper-Extensions

 view release on metacpan or  search on metacpan

lib/Acme/Data/Dumper/Extensions.pm  view on Meta::CPAN

use 5.006;    # our
use strict;
use warnings;

package Acme::Data::Dumper::Extensions;

our $VERSION = '0.001000';

# ABSTRACT: Experimental Enhancements to core Data::Dumper

# AUTHORITY

use Data::Dumper ();
use Exporter     ();

my $DD_Defaults;

BEGIN {
    no warnings 'once';
    $DD_Defaults = {
        Bless     => q[bless],
        Deepcopy  => 0,
        Deparse   => 0,
        Freezer   => q[],
        Indent    => 2,
        Maxdepth  => 0,
        Pad       => q[],
        Pair      => q[ => ],
        Purity    => 0,
        Quotekeys => 1,
        Sortkeys  => 0,
        Terse     => 0,
        Toaster   => q[],
        Useperl   => !( grep $_ eq 'Data::Dumper', @DynaLoader::dl_modules ),
        Useqq     => 0,
        Varname   => q[VAR],
    };

    $DD_Defaults->{Sparseseen} = 0    if eval { Data::Dumper->VERSION(2.136) };
    $DD_Defaults->{Maxrecurse} = 1000 if eval { Data::Dumper->VERSION(2.153) };
    $DD_Defaults->{Trailingcomma} = 0 if eval { Data::Dumper->VERSION(2.160) };
}

sub DD_Defaults {
    { %$DD_Defaults }
}

our $_new_with_defaults = sub {
    my ( $self, $user_defaults ) = @_;

    my $instance = $self->new( [] );

    # Initialise with system defaults
    my $instance_defaults = { %{$DD_Defaults} };

    # Validate and overwrite user defaults
    for my $key ( sort keys %{ $user_defaults || {} } ) {
        if ( not exists $DD_Defaults->{$key} ) {
            my $guesskey = ucfirst( lc($key) );
            my $dym =
              exists $DD_Defaults->{$guesskey}
              ? sprintf q[ (did you mean '%s'?)], $guesskey
              : q[];
            die sprintf "Unknown feature '%s'%s", $key, $dym;
        }
        $instance_defaults->{$key} = $user_defaults->{$key};
    }

    # Set all values
    for my $key ( sort keys %{$instance_defaults} ) {

        # Properties that aren't methods are bad?
        my $sub = $instance->can($key);
        die "No setter for feature '$key'" unless $sub;
        $instance->$sub( $instance_defaults->{$key} );
    }
    return $instance;
};

our $_DumpValues = sub {
    my ( $self, $values, $names ) = @_;

    die "Expected array of values to dump" if not defined $values;
    die "Dump values is not an array" unless q[ARRAY] eq ref $values;

    $names = [] unless defined $names;

    my (@out) = $self->Reset()->Names($names)->Values($values)->Dump;
    $self->Reset()->Names( [] )->Values( [] );

    return wantarray ? @out : join q[], @out;
};

our @EXPORT_OK = qw( $_new_with_defaults $_DumpValues );

BEGIN { *import = \&Exporter::import; }

1;

=head1 NAME

Acme::Data::Dumper::Extensions - Experimental Enhancements to core Data::Dumper

=head1 SYNOPSIS

  use Data::Dumper;
  use Acme::Data::Dumper::Extensions qw/$_new_with_defaults/;

  local $Data::Dumper::Indent = 5;

  my $instance = Data::Dumper->$_new_with_defaults({ }); # Indent is still 2!

  $instance =  Data::Dumper->$_new_with_defaults({
    Indent => 4,         # Easier initalizer
  });

=head1 DESCRIPTION

This is just a testing ground for things that I'm suggesting for Data::Dumper.

It will likely be terrible because bolting on features after-the-fact its also
pretty ugly.



( run in 0.862 second using v1.01-cache-2.11-cpan-0bb4e1dffa6 )