Improve enum to accept "enum($name, $arrayref)" construction
gfx [Wed, 9 Dec 2009 05:34:33 +0000 (14:34 +0900)]
lib/Mouse/Util/TypeConstraints.pm
t/001_mouse/041-enum.t

index 6672030..2b2d558 100644 (file)
@@ -184,16 +184,12 @@ sub typecast_constraints { # DEPRECATED
 sub enum {
     my($name, %valid);
 
-    # enum ['small', 'medium', 'large']
-    if (ref($_[0]) eq 'ARRAY') {
-        %valid = map{ $_ => undef } @{ $_[0] };
-        $name  = sprintf '(%s)', join '|', sort @{$_[0]};
-    }
-    # enum size => 'small', 'medium', 'large'
-    else{
-        $name  = shift;
-        %valid = map{ $_ => undef } @_;
+    if(!(@_ == 1 && ref($_[0]) eq 'ARRAY')){
+        $name = shift;
     }
+
+    %valid = map{ $_ => undef } (@_ == 1 && ref($_[0]) eq 'ARRAY' ? @{$_[0]} : @_);
+
     return _create_type 'type', $name => (
         optimized_as  => sub{ defined($_[0]) && !ref($_[0]) && exists $valid{$_[0]} },
 
index 5546f4f..8dfe9b9 100644 (file)
@@ -1,7 +1,7 @@
 #!/usr/bin/env perl
 use strict;
 use warnings;
-use Test::More tests => 16;
+use Test::More tests => 19;
 use Test::Exception;
 
 do {
@@ -38,3 +38,11 @@ for my $class ('Shirt', 'Shirt::Anon') {
     throws_ok { $class->new(size => ' small') } qr/^Attribute \(size\) does not pass the type constraint because: Validation failed for '\S+' failed with value  small/;
 }
 
+use Mouse::Util::TypeConstraints qw(enum);
+
+my $t = enum 'Foo', [qw(foo bar)];
+
+ok $t->check('foo'), 'enum $name, $array_ref';
+ok $t->check('bar');
+ok!$t->check('baz');
+