use strict;
use warnings;
-use Test::More tests => 39;
-use Test::Exception;
+use Test::More;
+use Test::Fatal;
=pod
-This tests the more complex
-delegation cases and that they
+This tests the more complex
+delegation cases and that they
do not fail at compile time.
=cut
sub child_g_method_1 { "g1" }
+ package ChildH;
+ use Moose;
+
+ sub child_h_method_1 { "h1" }
+ sub parent_method_1 { "child_parent_1" }
+
+ package ChildI;
+ use Moose;
+
+ sub child_i_method_1 { "i1" }
+ sub parent_method_1 { "child_parent_1" }
+
package Parent;
use Moose;
- ::dies_ok {
+ sub parent_method_1 { "parent_1" }
+ ::can_ok('Parent', 'parent_method_1');
+
+ ::isnt( ::exception {
has child_a => (
is => "ro",
default => sub { ChildA->new },
handles => qr/.*/,
);
- } "all_methods requires explicit isa";
+ }, undef, "all_methods requires explicit isa" );
- ::lives_ok {
+ ::is( ::exception {
has child_a => (
isa => "ChildA",
is => "ro",
default => sub { ChildA->new },
handles => qr/.*/,
);
- } "allow all_methods with explicit isa";
+ }, undef, "allow all_methods with explicit isa" );
- ::lives_ok {
+ ::is( ::exception {
has child_b => (
is => 'ro',
default => sub { ChildB->new },
handles => [qw/child_b_method_1/],
);
- } "don't need to declare isa if method list is predefined";
+ }, undef, "don't need to declare isa if method list is predefined" );
- ::lives_ok {
+ ::is( ::exception {
has child_c => (
isa => "ChildC",
is => "ro",
default => sub { ChildC->new },
handles => qr/_la$/,
);
- } "can declare regex collector";
+ }, undef, "can declare regex collector" );
- ::dies_ok {
+ ::isnt( ::exception {
has child_d => (
is => "ro",
default => sub { ChildD->new },
my ( $class, $delegate_class ) = @_;
}
);
- } "can't create attr with generative handles parameter and no isa";
+ }, undef, "can't create attr with generative handles parameter and no isa" );
- ::lives_ok {
+ ::is( ::exception {
has child_d => (
isa => "ChildD",
is => "ro",
return;
}
);
- } "can't create attr with generative handles parameter and no isa";
+ }, undef, "can't create attr with generative handles parameter and no isa" );
- ::lives_ok {
+ ::is( ::exception {
has child_e => (
isa => "ChildE",
is => "ro",
default => sub { ChildE->new },
handles => ["child_e_method_2"],
);
- } "can delegate to non moose class using explicit method list";
+ }, undef, "can delegate to non moose class using explicit method list" );
my $delegate_class;
- ::lives_ok {
+ ::is( ::exception {
has child_f => (
isa => "ChildF",
is => "ro",
return;
},
);
- } "subrefs on non moose class give no meta";
+ }, undef, "subrefs on non moose class give no meta" );
::is( $delegate_class, "ChildF", "plain classes are handed down to subs" );
-
- ::lives_ok {
+
+ ::is( ::exception {
has child_g => (
isa => "ChildG",
default => sub { ChildG->new },
handles => ["child_g_method_1"],
);
- } "can delegate to object even without explicit reader";
+ }, undef, "can delegate to object even without explicit reader" );
+
+ ::can_ok('Parent', 'parent_method_1');
+ ::isnt( ::exception {
+ has child_h => (
+ isa => "ChildH",
+ is => "ro",
+ default => sub { ChildH->new },
+ handles => sub { map { $_, $_ } $_[1]->get_all_method_names },
+ );
+ }, undef, "Can't override exisiting class method in delegate" );
+ ::can_ok('Parent', 'parent_method_1');
+
+ ::is( ::exception {
+ has child_i => (
+ isa => "ChildI",
+ is => "ro",
+ default => sub { ChildI->new },
+ handles => sub {
+ map { $_, $_ } grep { !/^parent_method_1|meta$/ }
+ $_[1]->get_all_method_names;
+ },
+ );
+ }, undef, "Test handles code ref for skipping predefined methods" );
+
sub parent_method { "p" }
}
isa_ok( $p->child_d, "ChildD" );
isa_ok( $p->child_e, "ChildE" );
isa_ok( $p->child_f, "ChildF" );
+isa_ok( $p->child_i, "ChildI" );
ok(!$p->can('child_g'), '... no child_g accessor defined');
+ok(!$p->can('child_h'), '... no child_h accessor defined');
is( $p->parent_method, "p", "parent method" );
ok( !$p->can($_), "none of ChildD's methods ($_)" )
- for grep { /^child/ } map { $_->{name} } ChildD->meta->compute_all_applicable_methods();
+ for grep { /^child/ } map { $_->name } ChildD->meta->get_all_methods();
can_ok( $p, "child_c_method_3_la" );
can_ok( $p, "child_c_method_4_la" );
can_ok( $p, "child_g_method_1" );
is( $p->child_g_method_1, "g1", "delegate to moose class without reader (child_g_method_1)" );
+
+can_ok( $p, "child_i_method_1" );
+is( $p->parent_method_1, "parent_1", "delegate doesn't override existing method" );
+
+done_testing;