Search code examples
perl

How do you dump an object instance with Perl's new class feature?


The goal is to see the encapsulated data, like I've been doing for the last 26 years.

use 5.040;
use strictures;
use experimental 'class';

class Foo {
    field @member = qw(e r t);
}

my $foo = Foo->new;

# use Data::Dumper qw(Dumper);
# say Dumper $foo;
# cannot handle ref type 16

# use DDS; DumpLex $foo;
# _dump_rv() can't handle 'OBJECT' objects yet

# use Data::Dx; Dx $foo;
# Can't handle OBJECT data

# use DDP; p $foo;
# Foo  {
#     public methods (1): new
#     private methods (0)
#     internals: (opaque object)
# }
#                ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

Solution

  • The Tuple::Munge package on CPAN might help you.

    use v5.38;
    
    sub tuple_to_aref ( $t ) {
        use Tuple::Munge ();
        use experimental 'builtin';
        use builtin 'blessed';
        my $len = Tuple::Munge::tuple_length($t);
        my $aref = [ map Tuple::Munge::tuple_slot($t, $_-1), 1 .. $len ];
        if ( my $class = blessed $t  ) {
            return bless( $aref, "TUPLE_TO_ARRAY::$class" );
        }
        return $aref;
    }
    
    use experimental 'class';
    use Data::Dumper;
    
    class My::Class {
        field $x;
        ADJUST {
            $x = 'Foobar';
        }
    }
    
    my $object = My::Class->new;
    print Dumper( tuple_to_aref( $object ) );
    

    Sample output:

    $VAR1 = bless( [
                     \'Foobar'
                   ], 'TUPLE_TO_ARRAY::My::Class' );