
BEGIN {
  unless ($ENV{AUTHOR_TESTING}) {
    require Test::More;
    Test::More::plan(skip_all => 'these tests are for testing by the author');
  }
}

use Test::More;
use Test::Moose;

{ package MyClass;
  use Moose;
  use MooseX::Method::Signatures;
  use aliased 'MooseX::Meta::Method::Transactional';
  use aliased 'MooseX::Meta::Method::Authorized';

  has user => (is => 'ro');
  has schema => (is => 'ro');

  # this was supposed to die, but the trait is not really applied.
  method m01 does Transactional does Authorized(requires => ['foo']) { 'm01' }
  method m02 does Transactional { 'm02' }
  method m03 does Authorized(requires => ['gah']) { 'm03' }
  method m04 does Transactional does Authorized(requires => ['gah']) { 'm01' }

};
{ package MySchema;
  use Moose;
  sub txn_do {
      my $self = shift;
      my $code = shift;
      return 'txn_do '.$code->(@_);
  }
};
{ package MyUser;
  use Moose;
  sub roles { qw<foo bar baz> }
};

my $meth = MyClass->meta->get_method('m01');
my $obj = MyClass->new({user => MyUser->new, schema => MySchema->new });

is($obj->m01, 'txn_do m01', 'applying both roles work.');
is($obj->m02, 'txn_do m02', 'Applyign just Transactional');
eval {
    $obj->m03;
};
like($@.'', qr(Access Denied)i, $@);

eval {
    $obj->m04;
};
like($@.'', qr(Access Denied)i, $@);

done_testing();
1;
