4 use Test::More tests => 15;
8 package MyRole::Storage;
9 use MooseX::Role::Parameterized;
10 use Moose::Util::TypeConstraints;
13 isa => (enum ['Dumper', 'Storable']),
17 parameter freeze_method => (
20 default => sub { "freeze_" . shift->format },
23 parameter thaw_method => (
26 default => sub { "thaw_" . shift->format },
31 my $format = $p->format;
33 my ($freezer, $thawer);
35 if ($format eq 'Dumper') {
37 $freezer = \&Data::Dumper::Dumper;
38 $thawer = sub { eval "@_" };
41 elsif ($format eq 'Storable') {
43 $freezer = \&Storable::nfreeze;
44 $thawer = \&Storable::thaw;
47 die "Unknown format ($format)";
50 method $p->freeze_method => $freezer;
51 method $p->thaw_method => $thawer;
56 package MyClass::Dumper;
58 with 'MyRole::Storage' => {
63 can_ok('MyClass::Dumper' => qw(freeze_Dumper thaw_Dumper));
64 cant_ok('MyClass::Dumper' => qw(freeze_Storable thaw_Storable));
67 package MyClass::Storable;
69 with 'MyRole::Storage' => {
74 can_ok('MyClass::Storable' => qw(freeze_Storable thaw_Storable));
75 cant_ok('MyClass::Storable' => qw(freeze_Dumper thaw_Dumper));
78 package MyClass::DumperRenamed;
80 with 'MyRole::Storage' => {
82 freeze_method => 'save',
83 thaw_method => 'load',
87 can_ok('MyClass::DumperRenamed' => qw(save load));
88 cant_ok('MyClass::DumperRenamed' => qw(freeze_Dumper freeze_Storable thaw_Dumper thaw_Storable));
91 package MyClass::Both;
93 with 'MyRole::Storage' => { format => 'Dumper' };
94 with 'MyRole::Storage' => { format => 'Storable' };
97 can_ok('MyClass::Both' => qw(freeze_Dumper freeze_Storable thaw_Dumper thaw_Storable));
100 package MyClass::Three;
102 with 'MyRole::Storage' => { format => 'Dumper' };
103 with 'MyRole::Storage' => { format => 'Storable' };
104 with 'MyRole::Storage' => {
105 format => 'Storable',
106 freeze_method => 'store',
107 thaw_method => 'dump',
111 can_ok('MyClass::Three' => qw(freeze_Dumper freeze_Storable thaw_Dumper thaw_Storable store dump));
114 package MyClass::Error::Required;
116 with 'MyRole::Storage';
117 } qr/^Attribute \(format\) is required/;
120 package MyClass::Error::Invalid;
122 with 'MyRole::Storage' => {
125 } qr/^Attribute \(format\) does not pass the type constraint/;
128 local $Test::Builder::Level = $Test::Builder::Level + 1;
129 my $instance = shift;
130 for my $method (@_) {
131 ok(!$instance->can($method), "$instance cannot $method");