validate filesystem paths in a very ad-hoc and
not-quite-correct way. (Dave Rolsky)
+ * added maybe_type to exports of Moose::Util::TypeConstraints (rjbs)
+
0.64 Wed, December 31, 2008
* Moose::Meta::Method::Accessor
- Always inline predicate and clearer methods (Sartak)
Moose::Exporter->setup_import_methods(
as_is => [
qw(
- type subtype class_type role_type as where message optimize_as
+ type subtype class_type role_type maybe_type
+ as where message optimize_as
coerce from via
enum
find_type_constraint
);
}
+sub maybe_type {
+ my ($type_parameter) = @_;
+
+ Moose::Meta::TypeConstraint->new(
+ parent => find_type_constraint('Item'),
+ constraint => sub {
+ my $check = $type_parameter->_compiled_type_constraint;
+ return 1 if not(defined($_)) || $check->($_);
+ return;
+ }
+ )
+}
+
sub coerce {
my ($type_name, @coercion_map) = @_;
_install_type_coercions($type_name, \@coercion_map);
Creates a type constraint with the name C<$role> and the metaclass
L<Moose::Meta::TypeConstraint::Role>.
+=item B<maybe_type ($type)>
+
+Creates a type constraint for either C<undef> or something of the
+given type.
+
=item B<enum ($name, @values)>
This will create a basic subtype for a given set of strings.
use strict;
use warnings;
-use Test::More tests => 31;
+use Test::More tests => 36;
use Test::Exception;
use Moose::Util::TypeConstraints;
ok(!$type->check([]), '... checked type correctly (fail)');
{
+ package Bar;
+ use Moose;
+
package Foo;
use Moose;
+ use Moose::Util::TypeConstraints;
- has 'bar' => (is => 'rw', isa => 'Maybe[ArrayRef]', required => 1);
+ has 'arr' => (is => 'rw', isa => 'Maybe[ArrayRef]', required => 1);
+ has 'bar' => (is => 'rw', isa => class_type('Bar'));
+ has 'maybe_bar' => (is => 'rw', isa => maybe_type(class_type('Bar')));
}
lives_ok {
- Foo->new(bar => []);
+ Foo->new(arr => [], bar => Bar->new);
+} '... Bar->new isa Bar';
+
+dies_ok {
+ Foo->new(arr => [], bar => undef);
+} '... undef isnta Bar';
+
+lives_ok {
+ Foo->new(arr => [], maybe_bar => Bar->new);
+} '... Bar->new isa maybe(Bar)';
+
+lives_ok {
+ Foo->new(arr => [], maybe_bar => undef);
+} '... undef isa maybe(Bar)';
+
+dies_ok {
+ Foo->new(arr => [], maybe_bar => 1);
+} '... 1 isnta maybe(Bar)';
+
+lives_ok {
+ Foo->new(arr => []);
} '... it worked!';
lives_ok {
- Foo->new(bar => undef);
+ Foo->new(arr => undef);
} '... it worked!';
dies_ok {
- Foo->new(bar => 100);
+ Foo->new(arr => 100);
} '... failed the type check';
dies_ok {
- Foo->new(bar => 'hello world');
+ Foo->new(arr => 'hello world');
} '... failed the type check';
throws_ok sub { $obj->Maybe_Int("a") },
qr/Attribute \(Maybe_Int\) does not pass the type constraint/
- => 'failed assigned ("a")';
\ No newline at end of file
+ => 'failed assigned ("a")';