1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
|
#!/usr/bin/perl
use strict;
use warnings;
use Scalar::Util 'isweak';
use Test::More tests => 26;
use Test::Exception;
BEGIN {
use_ok('Moose');
}
{
package Foo;
use Moose;
has 'bar' => (is => 'rw',
isa => 'Maybe[Bar]',
trigger => sub {
my ($self, $bar) = @_;
$bar->foo($self) if defined $bar;
});
has 'baz' => (writer => 'set_baz',
reader => 'get_baz',
isa => 'Baz',
trigger => sub {
my ($self, $baz) = @_;
$baz->foo($self);
});
package Bar;
use Moose;
has 'foo' => (is => 'rw', isa => 'Foo', weak_ref => 1);
package Baz;
use Moose;
has 'foo' => (is => 'rw', isa => 'Foo', weak_ref => 1);
}
{
my $foo = Foo->new;
isa_ok($foo, 'Foo');
my $bar = Bar->new;
isa_ok($bar, 'Bar');
my $baz = Baz->new;
isa_ok($baz, 'Baz');
lives_ok {
$foo->bar($bar);
} '... did not die setting bar';
is($foo->bar, $bar, '... set the value foo.bar correctly');
is($bar->foo, $foo, '... which in turn set the value bar.foo correctly');
ok(isweak($bar->{foo}), '... bar.foo is a weak reference');
lives_ok {
$foo->bar(undef);
} '... did not die un-setting bar';
is($foo->bar, undef, '... set the value foo.bar correctly');
is($bar->foo, $foo, '... which in turn set the value bar.foo correctly');
# test the writer
lives_ok {
$foo->set_baz($baz);
} '... did not die setting baz';
is($foo->get_baz, $baz, '... set the value foo.baz correctly');
is($baz->foo, $foo, '... which in turn set the value baz.foo correctly');
ok(isweak($baz->{foo}), '... baz.foo is a weak reference');
}
{
my $bar = Bar->new;
isa_ok($bar, 'Bar');
my $baz = Baz->new;
isa_ok($baz, 'Baz');
my $foo = Foo->new(bar => $bar, baz => $baz);
isa_ok($foo, 'Foo');
is($foo->bar, $bar, '... set the value foo.bar correctly');
is($bar->foo, $foo, '... which in turn set the value bar.foo correctly');
ok(isweak($bar->{foo}), '... bar.foo is a weak reference');
is($foo->get_baz, $baz, '... set the value foo.baz correctly');
is($baz->foo, $foo, '... which in turn set the value baz.foo correctly');
ok(isweak($baz->{foo}), '... baz.foo is a weak reference');
}
# some errors
{
package Bling;
use Moose;
::dies_ok {
has('bling' => (is => 'rw', trigger => 'Fail'));
} '... a trigger must be a CODE ref';
::dies_ok {
has('bling' => (is => 'rw', trigger => []));
} '... a trigger must be a CODE ref';
}
|