X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMooseX%2FTypes%2FTypeDecorator.pm;h=808e7d6596e54ae1520efd6c2a68e1c9d4d84c18;hb=f5559e1ce7a42af91a0e64915a8cb1e08958ae63;hp=99dc92692e11aee9cbec2c9032daccc1a2dccdd2;hpb=5a9b6d38459e9fde284735a9ddc28cec3b30d366;p=gitmo%2FMooseX-Types.git diff --git a/lib/MooseX/Types/TypeDecorator.pm b/lib/MooseX/Types/TypeDecorator.pm index 99dc926..808e7d6 100644 --- a/lib/MooseX/Types/TypeDecorator.pm +++ b/lib/MooseX/Types/TypeDecorator.pm @@ -1,4 +1,5 @@ package MooseX::Types::TypeDecorator; +our $VERSION = "0.25"; use strict; use warnings; @@ -10,6 +11,11 @@ use Moose::Meta::TypeConstraint::Union; use Scalar::Util qw(blessed); use overload( + '0+' => sub { + my $self = shift @_; + my $tc = $self->{__type_constraint}; + return 0+$tc; + }, '""' => sub { my $self = shift @_; if(blessed $self) { @@ -18,13 +24,27 @@ use overload( return "$self"; } }, + bool => sub { 1 }, '|' => sub { ## It's kind of ugly that we need to know about Union Types, but this ## is needed for syntax compatibility. Maybe someday we'll all just do ## Or[Str,Str,Int] - - my @tc = grep {blessed $_} @_; + + my @args = @_[0,1]; ## arg 3 is special, see the overload docs. + my @tc = grep {blessed $_} map { + blessed $_ ? $_ : + Moose::Util::TypeConstraints::find_or_parse_type_constraint($_) + || __PACKAGE__->_throw_error( "$_ is not a type constraint") + } @args; + + ( scalar @tc == scalar @args) + || __PACKAGE__->_throw_error( + "one of your type constraints is bad. Passed: ". join(', ', @args) ." Got: ". join(', ', @tc)); + + ( scalar @tc >= 2 ) + || __PACKAGE__->_throw_error("You must pass in at least 2 type names to make a union"); + my $union = Moose::Meta::TypeConstraint::Union->new(type_constraints=>\@tc); return Moose::Util::TypeConstraints::register_type_constraint($union); }, @@ -63,12 +83,12 @@ sub new { ## stub in case we'll need to handle these types differently return bless {'__type_constraint'=>$arg}, $class; } elsif(blessed $arg) { - croak "Argument must be ->isa('Moose::Meta::TypeConstraint') or ->isa('MooseX::Types::UndefinedType'), not ". blessed $arg; + __PACKAGE__->_throw_error("Argument must be ->isa('Moose::Meta::TypeConstraint') or ->isa('MooseX::Types::UndefinedType'), not ". blessed $arg); } else { - croak "Argument cannot be '$arg'"; + __PACKAGE__->_throw_error("Argument cannot be '$arg'"); } } else { - croak "This method [new] requires a single argument."; + __PACKAGE__->_throw_error("This method [new] requires a single argument."); } } @@ -86,7 +106,7 @@ sub __type_constraint { } return $self->{__type_constraint}; } else { - croak 'cannot call __type_constraint as a class method'; + __PACKAGE__->_throw_error('cannot call __type_constraint as a class method'); } } @@ -109,6 +129,7 @@ sub isa { } } + =head2 can handle $self->can since AUTOLOAD can't. @@ -141,6 +162,18 @@ sub meta { } } +=head2 _throw_error + +properly delegate error messages + +=cut + +sub _throw_error { + shift; + require Moose; + unshift @_, 'Moose'; + goto &Moose::throw_error; +} =head2 DESTROY @@ -172,15 +205,15 @@ sub AUTOLOAD { eval { $return = $self->__type_constraint->$method(@args); }; if($@) { - croak $@; + __PACKAGE__->_throw_error($@); } else { return $return; } } -=head1 AUTHOR AND COPYRIGHT +=head1 AUTHOR -John Napiorkowski (jnapiorkowski) +See L. =head1 LICENSE