The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use Test::More tests => 5;

# load module
BEGIN { use_ok('Data::Traverse', 'traverse'), };

# basic traverse
my $struct = [ 2, 3, { foo => 4 }, [ 5, [ 6, { bar => 7, baz => 8, quux => [ { foo => 1 }, { foo => 2 } ] } ] ] ];

my @types;

traverse { push @types, $_ } $struct;

is_deeply( \@types, [ 'ARRAY', 'ARRAY', 'HASH', 'ARRAY', 'ARRAY', 'HASH', 'HASH', 'HASH', 'HASH' ] );

# fail on regex ref
my $struct2 = [ 1, 2, 3, qr/foobar/, 5 ];

eval { 
    traverse { $_ } $struct2;
};

like( $@, qr/unsupported type/ );

# try some objects
my $objs = [ (bless [ 42 ], 'A::Class'),
             { foo => 'bar' },
             (bless { narf => 'blatz' }, 'A::Class') ];

my @obj_types;
traverse { push @obj_types, $_ } $objs;
is_deeply( \@obj_types, [ 'ARRAY', 'HASH', 'HASH' ] );

# try ignoring regex refs
Data::Traverse->ignore_unsupported_refs( 1 );

my @foo;
traverse { push @foo, $_ } $struct2;

ok( @foo == 4 );