More tasks
[gitmo/MooseX-Role-Parameterized.git] / t / 003-apply.t
CommitLineData
0d2825cd 1#!/usr/bin/env perl
2use strict;
3use warnings;
09156b03 4use Test::More tests => 14;
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
58throws_ok {
59 package MyClass::Error;
60 use Moose;
61 with 'MyRole::Storage';
62} qr/^Attribute \(format\) is required/;
63
64do {
65 package MyClass::Dumper;
66 use Moose;
67 with 'MyRole::Storage' => {
68 format => 'Dumper',
69 };
70};
71
09156b03 72can_ok('MyClass::Dumper' => qw(freeze_Dumper thaw_Dumper));
73cant_ok('MyClass::Storable' => qw(freeze_Storable thaw_Storable));
74
75do {
76 package MyClass::Storable;
77 use Moose;
78 with 'MyRole::Storage' => {
79 format => 'Storable',
80 };
81};
82
83can_ok('MyClass::Storable' => qw(freeze_Storable thaw_Storable));
84cant_ok('MyClass::Storable' => qw(freeze_Dumper thaw_Dumper));
85
86do {
87 package MyClass::DumperRenamed;
88 use Moose;
89 with 'MyRole::Storage' => {
90 format => 'Dumper',
91 freeze_method => 'save',
92 thaw_method => 'load',
93 };
94};
95
96can_ok('MyClass::DumperRenamed' => qw(save load));
97cant_ok('MyClass::DumperRenamed' => qw(freeze_Dumper freeze_Storable thaw_Dumper thaw_Storable));
98
99do {
100 package MyClass::Both;
101 use Moose;
102 with 'MyRole::Storage' => { format => 'Dumper' };
103 with 'MyRole::Storage' => { format => 'Storable' };
104};
105
106can_ok('MyClass::Both' => qw(freeze_Dumper freeze_Storable thaw_Dumper thaw_Storable));
107
108do {
109 package MyClass::Three;
110 use Moose;
111 with 'MyRole::Storage' => { format => 'Dumper' };
112 with 'MyRole::Storage' => { format => 'Storable' };
113 with 'MyRole::Storage' => {
114 format => 'Storable',
115 freeze_method => 'store',
116 thaw_method => 'dump',
117 };
118};
119
120can_ok('MyClass::Three' => qw(freeze_Dumper freeze_Storable thaw_Dumper thaw_Storable store dump));
121
122sub cant_ok {
123 local $Test::Builder::Level = $Test::Builder::Level + 1;
124 my $instance = shift;
125 for my $method (@_) {
126 ok(!$instance->can($method), "$instance cannot $method");
127 }
128}
129