The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use Test::More;
use strict; use warnings FATAL => 'all';

{ package My::Baz;
  use Test::More;
  use strict; use warnings FATAL => 'all';

  use List::Objects::WithUtils;

  ok( My::Baz->can('array'), 'array() imported' );
  ok( My::Baz->can('hash'),  'hash() imported'  );
  ok( My::Baz->can('immarray'), 'immarray() imported' );
}

{ package My::Quux;
  use Test::More;
  use strict; use warnings FATAL => 'all';

  use List::Objects::WithUtils 'array', 'hash';

  ok( My::Quux->can('array'), 'selectively imported array()' );
  ok( My::Quux->can('hash'),  'selectively imported hash()'  );
}


{ package My::Foo;
  use Test::More;
  use strict; use warnings FATAL => 'all';

  use List::Objects::WithUtils ':all';

  ok( My::Foo->can('array'), 'all imported array()');
  ok( My::Foo->can('hash'),  'all imported hash()');
  ok( My::Foo->can('immarray'), 'all imported immarray()');
  cmp_ok( []->count, '==', 0, 'all imported autobox');
}

{ package My::Bar;
  use Test::More;
  use strict; use warnings FATAL => 'all';

  use Lowu;

  ok( My::Bar->can('array'), 'Lowu imported array()');
  ok( My::Bar->can('hash'),  'Lowu imported hash()');
  ok( My::Bar->can('immarray'), 'Lowu imported immarray()');
  cmp_ok( []->count, '==', 0, 'Lowu imported autobox');
}

{ package My::Defaults;
  use strict; use warnings FATAL => 'all';

  use parent 'List::Objects::WithUtils';
  sub import {
    my ($class) = @_;
    $class->SUPER::import({
      import => [ 'autobox', 'immarray' ],
      to     => 'My::Target',
    })
  }
}
{
  package My::Target;
  use strict; use warnings FATAL => 'all';
  use Test::More;

  BEGIN { My::Defaults->import }
  ok( My::Target->can('immarray'), 'import immarray to target looks ok' );
  ok( !My::Target->can('array'), 'import omitted array ok' );
  cmp_ok( []->count, '==', 0, 'import autobox to target looks ok' );
}


{ package My::Array::Obj;
  use strict; use warnings FATAL => 'all';
  use parent 'List::Objects::WithUtils::Array';

  sub foo { 1 }
}
{ package My::Hash::Obj;
  use strict; use warnings FATAL => 'all';
  use parent 'List::Objects::WithUtils::Hash';

  sub bar { 1 }
}
{
  package My::Uses::List;
  use strict; use warnings FATAL => 'all';
  use List::Objects::WithUtils::Autobox
    HASH  => 'My::Hash::Obj',
    ARRAY => 'My::Array::Obj'
  ;

  use Test::More;

  ok( []->foo, 'imported autobox array with specified pkg ok' );
  ok( +{}->bar, 'imported autobox hash with specified pkg ok' );
  my $foo;
  ok( $foo = [1]->copy, 'imported autobox with specified pkg subclass ok' );
  my $bar;
  ok( $bar = +{foo => 'bar'}->copy, 'imported autobox hash with specified pkg subclass ok' );
}

done_testing;