package Venus::Role::Dumpable;

use 5.018;

use strict;
use warnings;

use Venus::Role 'with';

# METHODS

sub dump {
  my ($self, $method, @args) = @_;

  require Data::Dumper;

  no warnings 'once';

  local $Data::Dumper::Indent = 0;
  local $Data::Dumper::Purity = 0;
  local $Data::Dumper::Quotekeys = 0;
  local $Data::Dumper::Deepcopy = 1;
  local $Data::Dumper::Deparse = 1;
  local $Data::Dumper::Sortkeys = 1;
  local $Data::Dumper::Terse = 1;
  local $Data::Dumper::Useqq = 1;

  local $_ = $self;

  my $data = Data::Dumper->Dump([
    $method ? scalar($self->$method(@args)) : $self
  ]);

  $data =~ s/^"|"$//g;

  return $data;
}

sub dump_pretty {
  my ($self, $method, @args) = @_;

  require Data::Dumper;

  no warnings 'once';

  local $Data::Dumper::Indent = 2;
  local $Data::Dumper::Trailingcomma = 0;
  local $Data::Dumper::Purity = 0;
  local $Data::Dumper::Pad = '';
  local $Data::Dumper::Varname = 'VAR';
  local $Data::Dumper::Useqq = 0;
  local $Data::Dumper::Terse = 1;
  local $Data::Dumper::Freezer = '';
  local $Data::Dumper::Toaster = '';
  local $Data::Dumper::Deepcopy = 1;
  local $Data::Dumper::Quotekeys = 0;
  local $Data::Dumper::Bless = 'bless';
  local $Data::Dumper::Pair = ' => ';
  local $Data::Dumper::Maxdepth = 0;
  local $Data::Dumper::Maxrecurse = 1000;
  local $Data::Dumper::Useperl = 0;
  local $Data::Dumper::Sortkeys = 1;
  local $Data::Dumper::Deparse = 1;
  local $Data::Dumper::Sparseseen = 0;

  local $_ = $self;

  my $data = Data::Dumper->Dump([
    $method ? scalar($self->$method(@args)) : $self
  ]);

  $data =~ s/^'|'$//g;

  chomp $data;

  return $data;
}

# EXPORTS

sub EXPORT {
  ['dump', 'dump_pretty']
}

1;



=head1 NAME

Venus::Role::Dumpable - Dumpable Role

=cut

=head1 ABSTRACT

Dumpable Role for Perl 5

=cut

=head1 SYNOPSIS

  package Example;

  use Venus::Class;

  attr 'test';

  with 'Venus::Role::Dumpable';

  package main;

  my $example = Example->new(test => 123);

  # $example->dump;

=cut

=head1 DESCRIPTION

This package modifies the consuming package and provides methods for dumping
the object or the return value of a dispatched method call.

=cut

=head1 METHODS

This package provides the following methods:

=cut

=head2 dump

  dump(Str | CodeRef $method, Any @args) (Str)

The dump method returns a string representation of the underlying data. This
method supports dispatching, i.e. providing a method name and arguments whose
return value will be acted on by this method.

I<Since C<0.01>>

=over 4

=item dump example 1

  package main;

  my $example = Example->new(test => 123);

  my $dump = $example->dump;

  # "bless( {test => 123}, 'Example' )"

=back

=cut

=head2 dump_pretty

  dump_pretty(Str | CodeRef $method, Any @args) (Str)

The dump_pretty method returns a string representation of the underlying data
that is human-readable and useful for debugging. This method supports
dispatching, i.e. providing a method name and arguments whose return value will
be acted on by this method.

I<Since C<0.01>>

=over 4

=item dump_pretty example 1

  package main;

  my $example = Example->new(test => 123);

  my $dump_pretty = $example->dump_pretty;

  # bless( {
  #          test => 123
  #        }, 'Example' )

=back

=cut