use strict;
$^W++;
use Class::Prototyped qw(:EZACCESS :SUPER);
use Data::Dumper;
use Test;
BEGIN {
$|++;
plan tests => 14;
}
$Data::Dumper::Sortkeys = 1;
$Data::Dumper::Sortkeys = 1;
package A;
sub a {
my $self = shift;
(ref($self) ? $self->name : $self) . 'A.a'
}
package main;
my $p1 = Class::Prototyped->new(
name => 'p1',
m1 => sub { $_[0]->name . ".m1" },
);
my $p2 = Class::Prototyped->new(
name => 'p2',
m2 => sub { $_[0]->name . ".m2" },
m2a => sub { $_[0]->name . ".m2a" },
);
my $p3 = Class::Prototyped->new(
name => 'p3',
'parent*' => $p1,
p2 => $p2,
s1 => sub {},
);
ok( $p1->m1, 'p1.m1' );
ok( $p2->m2, 'p2.m2' );
ok( $p2->m2a, 'p2.m2a' );
ok( $p3->m1, 'p3.m1' ); # inheritance
$p3->reflect->delegate(
m1 => 'parent*',
m2 => $p2,
m2a => 'p2',
m3 => [ $p1, 'm1' ],
m3a => [ 'parent*', 'm1' ],
m4 => [ $p2, 'm2' ],
m4a => [ 'p2', 'm2a' ],
);
ok( $p3->m1, 'p1.m1' ); # delegation
ok( $p3->m2, 'p2.m2' );
ok( $p3->m3, 'p1.m1' );
ok( $p3->m3a, 'p1.m1' );
ok( $p3->m4, 'p2.m2' );
ok( $p3->m4a, 'p2.m2a' );
# detect exceptions
eval { $p3->reflect->delegate( m9 => 's1' ) };
ok( $@ =~ /delegate to a subroutine/ );
eval { $p3->reflect->delegate( m1 => 'p1' ) };
ok( $@ =~ /conflict with existing/ );
my $p4 = Class::Prototyped->new(
name => 'p4',
'parent*' => 'A',
);
ok( $p4->a, 'p4A.a' );
$p4->reflect->delegate( 'b' => [ 'parent*', 'a' ] );
ok( $p4->b, 'AA.a' );
# vim: ft=perl