The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;

use Test::More;

{
  package Some::Carrier;
  use Moose;

  with 'Role::HasPayload::Merged';

  has size => (
    is   => 'ro',
    isa  => 'Int',
    lazy => 1,
    traits  => [ 'Role::HasPayload::Meta::Attribute::Payload' ],
    default => 36,
  );

  has private_thing => (
    is      => 'ro',
    isa     => 'Int',
    default => 13,
  );
}

{
  my $obj = Some::Carrier->new({
    payload => { blort => 10 },
  });

  isa_ok($obj, 'Some::Carrier', 'we got our object');

  is_deeply(
    $obj->payload,
    {
      blort => 10,
      size  => 36,
    },
    "...and the payload is correct",
  );
}

{
  my @warnings;
  local $SIG{__WARN__} = sub { push @warnings, @_ };

  my $obj = Some::Carrier->new({
    payload => { blort => 10, size => 20 },
  });

  isa_ok($obj, 'Some::Carrier', 'we got our object');

  is_deeply(
    $obj->payload,
    {
      blort => 10,
      size  => 36,
    },
    "...and the payload is correct",
  );

  is(@warnings, 1, "we got a warning when trying to override auto payload");
  like(
    $warnings[0],
    qr{declining to override automatic payload entry size at t.merged\.t},
    "...and it's the right warning",
  );
}

done_testing;