run_for 'Baz';
+my $lt3;
+
{
package LazyFoo;
+ use Sub::Quote;
use Moo;
has less_than_three => (
is => 'lazy',
- isa => sub { die "$_[0] is not less than three" unless $_[0] < 3 }
+ isa => quote_sub(q{ die "$_[0] is not less than three" unless $_[0] < 3 })
);
- sub _build_less_than_three { 4 }
+ sub _build_less_than_three { $lt3 }
}
+$lt3 = 4;
+
+my $lazyfoo = LazyFoo->new;
like(
- exception { LazyFoo->new->less_than_three },
+ exception { $lazyfoo->less_than_three },
qr/isa check for "less_than_three" failed: 4 is not less than three/,
"exception thrown on bad builder return value (LazyFoo)"
);
+$lt3 = 2;
+
+is(
+ exception { $lazyfoo->less_than_three },
+ undef,
+ 'Corrected builder value on existing object returned ok'
+);
+
+is(LazyFoo->new->less_than_three, 2, 'Correct builder value returned ok');
+
+{
+ package Fizz;
+
+ use Moo;
+
+ has attr1 => (
+ is => 'ro',
+ isa => sub {
+ no warnings 'once';
+ my $attr = $Method::Generate::Accessor::CurrentAttribute;
+ die bless [@$attr{'name', 'init_arg', 'step'}], 'MyException';
+ },
+ init_arg => 'attr_1',
+ );
+}
+
+my $e = exception { Fizz->new(attr_1 => 5) };
+is(
+ ref($e),
+ 'MyException',
+ 'Exception objects passed though correctly',
+);
+
+is($e->[0], 'attr1', 'attribute name available in isa check');
+is($e->[1], 'attr_1', 'attribute init_arg available in isa check');
+is($e->[2], 'isa check', 'step available in isa check');
+
+{
+ my $called;
+ local $SIG{__DIE__} = sub { $called++; die $_[0] };
+ my $e = exception { Fizz->new(attr_1 => 5) };
+ is($called, 1, '__DIE__ handler called if set')
+}
+
done_testing;