use strictures 1;
use Test::More;
use Test::Exception;

use Moo::HandleMoose;

{
   package FrewWithIsa;
   use Moo::Role;
   use Sub::Quote;

   has frooh => (
      is => 'rw',
      isa => sub { die 'not int' unless $_[0] =~ /^\d$/ },
   );

   has frew => (
      is => 'rw',
      isa => quote_sub(q{ die 'not int' unless $_[0] =~ /^\d$/ }),
   );

   package Bar;
   use Moose;
   with 'FrewWithIsa';

   package OffByOne;
   use Moo::Role;

   has off_by_one => (is => 'rw', coerce => sub { $_[0] + 1 });

   package Baz;
   use Moo;

   with 'OffByOne';

   package Quux;
   use Moose;

   with 'OffByOne';

   __PACKAGE__->meta->make_immutable;
}

lives_ok {
   Bar->new(frooh => 1, frew => 1);
} 'creation of valid Bar';

dies_ok {
   Bar->new(frooh => 'silly', frew => 1);
} 'creation of invalid Bar validated by coderef';

dies_ok {
   Bar->new(frooh => 1, frew => 'goose');
} 'creation of invalid Bar validated by quoted sub';

sub test_off_by_one {
  my ($class, $type) = @_;

  my $obo = $class->new(off_by_one => 1);

  is($obo->off_by_one, 2, "Off by one (new) ($type)");

  $obo->off_by_one(41);

  is($obo->off_by_one, 42, "Off by one (set) ($type)");
}

test_off_by_one('Baz', 'Moo');
test_off_by_one('Quux', 'Moose');

done_testing;
