Add another test file
[gitmo/MooseX-Role-Parameterized.git] / t / 003-apply.t
1 #!/usr/bin/env perl
2 use strict;
3 use warnings;
4 use Test::More tests => 1;
5 use Test::Exception;
6
7 do {
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
58 throws_ok {
59     package MyClass::Error;
60     use Moose;
61     with 'MyRole::Storage';
62 } qr/^Attribute \(format\) is required/;
63
64 do {
65     package MyClass::Dumper;
66     use Moose;
67     with 'MyRole::Storage' => {
68         format => 'Dumper',
69     };
70 };
71