X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMoose%2FMeta%2FTypeConstraint%2FEnum.pm;h=b19c59b8092c9d38d7f747b419ed1ac96a755075;hb=477a812e8edd6ee5ebee1a3b7b90cfeac3b2b9f7;hp=e27eb4657b4bfc96db0bb705d103c37ac06933f8;hpb=ad46f5244f59757c45306c4a41e195b7aa4b0943;p=gitmo%2FMoose.git diff --git a/lib/Moose/Meta/TypeConstraint/Enum.pm b/lib/Moose/Meta/TypeConstraint/Enum.pm index e27eb46..b19c59b 100644 --- a/lib/Moose/Meta/TypeConstraint/Enum.pm +++ b/lib/Moose/Meta/TypeConstraint/Enum.pm @@ -4,20 +4,38 @@ use strict; use warnings; use metaclass; +use B; use Moose::Util::TypeConstraints (); -our $AUTHORITY = 'cpan:STEVAN'; - use base 'Moose::Meta::TypeConstraint'; __PACKAGE__->meta->add_attribute('values' => ( accessor => 'values', )); +our %ENUMS; + +my $inliner = sub { + my $self = shift; + my $val = shift; + + my $name = $self->name(); + $ENUMS{$name} ||= { map { $_ => 1 } @{ $self->values() } }; + + return + "defined $val" + . "&& ! ref $val" . '&& $' + . __PACKAGE__ + . '::ENUMS{' + . B::perlstring($name) + . "}{ $val }"; +}; + sub new { my ( $class, %args ) = @_; $args{parent} = Moose::Util::TypeConstraints::find_type_constraint('Str'); + $args{inlined} = $inliner; if ( scalar @{ $args{values} } < 2 ) { require Moose; @@ -35,6 +53,9 @@ sub new { } } + my %values = map { $_ => 1 } @{ $args{values} }; + $args{constraint} = sub { $values{ $_[0] } }; + my $self = $class->_new(\%args); $self->compile_type_constraint() @@ -73,14 +94,6 @@ sub constraint { return sub { exists $values{$_[0]} }; } -sub _compile_hand_optimized_type_constraint { - my $self = shift; - - my %values = map { $_ => undef } @{ $self->values }; - - sub { defined($_[0]) && !ref($_[0]) && exists $values{$_[0]} }; -} - sub create_child_type { my ($self, @args) = @_; return Moose::Meta::TypeConstraint->new(@args, parent => $self);