Move is_valid_class_name into XS
[gitmo/Mouse.git] / t / 001_mouse / 062-duck_type.t
CommitLineData
5d3ab42b 1#!perl
2use strict;
3use warnings;
4
5use Test::More tests => 15;
6
7use Mouse::Util::TypeConstraints qw(duck_type);
8
9{
10 package Foo;
11 use Mouse;
12
13 sub a {}
14
15 package Bar;
16 use Mouse;
17
18 extends qw(Foo);
19
20 sub b {}
21
22 package Baz;
23 use Mouse;
24
25 sub can {
26 my($class, $method) = @_;
27 return $method eq 'b';
28 }
29}
30
31my $CanA = duck_type CanA => qw(a);
32my $CanB = duck_type CanB => [qw(b)];
33my $CanAB = duck_type [qw(a b)];
34
35is $CanA->name, 'CanA';
36is $CanB->name, 'CanB';
37is $CanAB->name, '__ANON__';
38
39ok $CanA->check(Foo->new);
40ok $CanA->check(Bar->new);
41ok!$CanA->check(Baz->new);
42
43ok!$CanB->check(Foo->new);
44ok $CanB->check(Bar->new);
45ok $CanB->check(Baz->new);
46
47ok!$CanAB->check(Foo->new);
48ok $CanAB->check(Bar->new);
49ok!$CanAB->check(Baz->new);
50
51ok!$CanA->check(undef);
52ok!$CanA->check(1);
53ok!$CanA->check({});