For now, forbid "alias" and "excludes" as keywords
[gitmo/MooseX-Role-Parameterized.git] / t / 003-apply.t
CommitLineData
0d2825cd 1#!/usr/bin/env perl
2use strict;
3use warnings;
a4ea464f 4use Test::More tests => 15;
0d2825cd 5use Test::Exception;
6
7do {
8 package MyRole::Storage;
9 use MooseX::Role::Parameterized;
10 use Moose::Util::TypeConstraints;
11
12 parameter format => (
13 is => 'ro',
14 isa => (enum ['Dumper', 'Storable']),
15 required => 1,
16 );
17
18 parameter freeze_method => (
19 is => 'ro',
20 isa => 'Str',
21 lazy => 1,
22 default => sub { "freeze_" . shift->format },
23 );
24
25 parameter thaw_method => (
26 is => 'ro',
27 isa => 'Str',
28 lazy => 1,
29 default => sub { "thaw_" . shift->format },
30 );
31
32 role {
33 my $p = shift;
34 my $format = $p->format;
35
36 my ($freezer, $thawer);
37
38 if ($format eq 'Dumper') {
39 require Data::Dumper;
40 $freezer = \&Data::Dumper::Dumper;
41 $thawer = sub { eval "@_" };
42
43 }
44 elsif ($format eq 'Storable') {
45 require Storable;
46 $freezer = \&Storable::nfreeze;
47 $thawer = \&Storable::thaw;
48 }
49 else {
50 die "Unknown format ($format)";
51 }
52
53 method $p->freeze_method => $freezer;
54 method $p->thaw_method => $thawer;
55 };
56};
57
0d2825cd 58do {
59 package MyClass::Dumper;
60 use Moose;
61 with 'MyRole::Storage' => {
62 format => 'Dumper',
63 };
64};
65
09156b03 66can_ok('MyClass::Dumper' => qw(freeze_Dumper thaw_Dumper));
eda20a62 67cant_ok('MyClass::Dumper' => qw(freeze_Storable thaw_Storable));
09156b03 68
69do {
70 package MyClass::Storable;
71 use Moose;
72 with 'MyRole::Storage' => {
73 format => 'Storable',
74 };
75};
76
77can_ok('MyClass::Storable' => qw(freeze_Storable thaw_Storable));
78cant_ok('MyClass::Storable' => qw(freeze_Dumper thaw_Dumper));
79
80do {
81 package MyClass::DumperRenamed;
82 use Moose;
83 with 'MyRole::Storage' => {
84 format => 'Dumper',
85 freeze_method => 'save',
86 thaw_method => 'load',
87 };
88};
89
90can_ok('MyClass::DumperRenamed' => qw(save load));
91cant_ok('MyClass::DumperRenamed' => qw(freeze_Dumper freeze_Storable thaw_Dumper thaw_Storable));
92
93do {
94 package MyClass::Both;
95 use Moose;
96 with 'MyRole::Storage' => { format => 'Dumper' };
97 with 'MyRole::Storage' => { format => 'Storable' };
98};
99
100can_ok('MyClass::Both' => qw(freeze_Dumper freeze_Storable thaw_Dumper thaw_Storable));
101
102do {
103 package MyClass::Three;
104 use Moose;
105 with 'MyRole::Storage' => { format => 'Dumper' };
106 with 'MyRole::Storage' => { format => 'Storable' };
107 with 'MyRole::Storage' => {
108 format => 'Storable',
109 freeze_method => 'store',
110 thaw_method => 'dump',
111 };
112};
113
114can_ok('MyClass::Three' => qw(freeze_Dumper freeze_Storable thaw_Dumper thaw_Storable store dump));
115
a4ea464f 116throws_ok {
117 package MyClass::Error::Required;
118 use Moose;
119 with 'MyRole::Storage';
120} qr/^Attribute \(format\) is required/;
121
122throws_ok {
123 package MyClass::Error::Invalid;
124 use Moose;
125 with 'MyRole::Storage' => {
126 format => 'YAML',
127 };
128} qr/^Attribute \(format\) does not pass the type constraint/;
129
09156b03 130sub cant_ok {
131 local $Test::Builder::Level = $Test::Builder::Level + 1;
132 my $instance = shift;
133 for my $method (@_) {
134 ok(!$instance->can($method), "$instance cannot $method");
135 }
136}
137