b6fa18e7517b3f8d3b8f9518d3e9117de0be7e88
[gitmo/Moose.git] / lib / Moose / Util / TypeConstraints.pm
1
2 package Moose::Util::TypeConstraints;
3
4 use Carp ();
5 use List::MoreUtils qw( all any );
6 use Scalar::Util qw( blessed reftype );
7 use Moose::Exporter;
8
9 our $VERSION = '0.93';
10 $VERSION = eval $VERSION;
11 our $AUTHORITY = 'cpan:STEVAN';
12
13 ## --------------------------------------------------------
14 # Prototyped subs must be predeclared because we have a
15 # circular dependency with Moose::Meta::Attribute et. al.
16 # so in case of us being use'd first the predeclaration
17 # ensures the prototypes are in scope when consumers are
18 # compiled.
19
20 # dah sugah!
21 sub where (&);
22 sub via (&);
23 sub message (&);
24 sub optimize_as (&);
25
26 ## --------------------------------------------------------
27
28 use Moose::Meta::TypeConstraint;
29 use Moose::Meta::TypeConstraint::Union;
30 use Moose::Meta::TypeConstraint::Parameterized;
31 use Moose::Meta::TypeConstraint::Parameterizable;
32 use Moose::Meta::TypeConstraint::Class;
33 use Moose::Meta::TypeConstraint::Role;
34 use Moose::Meta::TypeConstraint::Enum;
35 use Moose::Meta::TypeConstraint::DuckType;
36 use Moose::Meta::TypeCoercion;
37 use Moose::Meta::TypeCoercion::Union;
38 use Moose::Meta::TypeConstraint::Registry;
39 use Moose::Util::TypeConstraints::OptimizedConstraints;
40
41 Moose::Exporter->setup_import_methods(
42     as_is => [
43         qw(
44             type subtype class_type role_type maybe_type duck_type
45             as where message optimize_as
46             coerce from via
47             enum
48             find_type_constraint
49             register_type_constraint
50             match_on_type )
51     ],
52 );
53
54 ## --------------------------------------------------------
55 ## type registry and some useful functions for it
56 ## --------------------------------------------------------
57
58 my $REGISTRY = Moose::Meta::TypeConstraint::Registry->new;
59
60 sub get_type_constraint_registry {$REGISTRY}
61 sub list_all_type_constraints    { keys %{ $REGISTRY->type_constraints } }
62
63 sub export_type_constraints_as_functions {
64     my $pkg = caller();
65     no strict 'refs';
66     foreach my $constraint ( keys %{ $REGISTRY->type_constraints } ) {
67         my $tc = $REGISTRY->get_type_constraint($constraint)
68             ->_compiled_type_constraint;
69         *{"${pkg}::${constraint}"}
70             = sub { $tc->( $_[0] ) ? 1 : undef };    # the undef is for compat
71     }
72 }
73
74 sub create_type_constraint_union {
75     my @type_constraint_names;
76
77     if ( scalar @_ == 1 && _detect_type_constraint_union( $_[0] ) ) {
78         @type_constraint_names = _parse_type_constraint_union( $_[0] );
79     }
80     else {
81         @type_constraint_names = @_;
82     }
83
84     ( scalar @type_constraint_names >= 2 )
85         || __PACKAGE__->_throw_error(
86         "You must pass in at least 2 type names to make a union");
87
88     my @type_constraints = map {
89         find_or_parse_type_constraint($_)
90             || __PACKAGE__->_throw_error(
91             "Could not locate type constraint ($_) for the union");
92     } @type_constraint_names;
93
94     return Moose::Meta::TypeConstraint::Union->new(
95         type_constraints => \@type_constraints );
96 }
97
98 sub create_parameterized_type_constraint {
99     my $type_constraint_name = shift;
100     my ( $base_type, $type_parameter )
101         = _parse_parameterized_type_constraint($type_constraint_name);
102
103     ( defined $base_type && defined $type_parameter )
104         || __PACKAGE__->_throw_error(
105         "Could not parse type name ($type_constraint_name) correctly");
106
107     if ( $REGISTRY->has_type_constraint($base_type) ) {
108         my $base_type_tc = $REGISTRY->get_type_constraint($base_type);
109         return _create_parameterized_type_constraint(
110             $base_type_tc,
111             $type_parameter
112         );
113     }
114     else {
115         __PACKAGE__->_throw_error(
116             "Could not locate the base type ($base_type)");
117     }
118 }
119
120 sub _create_parameterized_type_constraint {
121     my ( $base_type_tc, $type_parameter ) = @_;
122     if ( $base_type_tc->can('parameterize') ) {
123         return $base_type_tc->parameterize($type_parameter);
124     }
125     else {
126         return Moose::Meta::TypeConstraint::Parameterized->new(
127             name   => $base_type_tc->name . '[' . $type_parameter . ']',
128             parent => $base_type_tc,
129             type_parameter =>
130                 find_or_create_isa_type_constraint($type_parameter),
131         );
132     }
133 }
134
135 #should we also support optimized checks?
136 sub create_class_type_constraint {
137     my ( $class, $options ) = @_;
138
139 # too early for this check
140 #find_type_constraint("ClassName")->check($class)
141 #    || __PACKAGE__->_throw_error("Can't create a class type constraint because '$class' is not a class name");
142
143     my %options = (
144         class => $class,
145         name  => $class,
146         %{ $options || {} },
147     );
148
149     $options{name} ||= "__ANON__";
150
151     Moose::Meta::TypeConstraint::Class->new(%options);
152 }
153
154 sub create_role_type_constraint {
155     my ( $role, $options ) = @_;
156
157 # too early for this check
158 #find_type_constraint("ClassName")->check($class)
159 #    || __PACKAGE__->_throw_error("Can't create a class type constraint because '$class' is not a class name");
160
161     my %options = (
162         role => $role,
163         name => $role,
164         %{ $options || {} },
165     );
166
167     $options{name} ||= "__ANON__";
168
169     Moose::Meta::TypeConstraint::Role->new(%options);
170 }
171
172 sub find_or_create_type_constraint {
173     my ( $type_constraint_name, $options_for_anon_type ) = @_;
174
175     if ( my $constraint
176         = find_or_parse_type_constraint($type_constraint_name) ) {
177         return $constraint;
178     }
179     elsif ( defined $options_for_anon_type ) {
180
181         # NOTE:
182         # if there is no $options_for_anon_type
183         # specified, then we assume they don't
184         # want to create one, and return nothing.
185
186         # otherwise assume that we should create
187         # an ANON type with the $options_for_anon_type
188         # options which can be passed in. It should
189         # be noted that these don't get registered
190         # so we need to return it.
191         # - SL
192         return Moose::Meta::TypeConstraint->new(
193             name => '__ANON__',
194             %{$options_for_anon_type}
195         );
196     }
197
198     return;
199 }
200
201 sub find_or_create_isa_type_constraint {
202     my $type_constraint_name = shift;
203     find_or_parse_type_constraint($type_constraint_name)
204         || create_class_type_constraint($type_constraint_name);
205 }
206
207 sub find_or_create_does_type_constraint {
208     my $type_constraint_name = shift;
209     find_or_parse_type_constraint($type_constraint_name)
210         || create_role_type_constraint($type_constraint_name);
211 }
212
213 sub find_or_parse_type_constraint {
214     my $type_constraint_name = normalize_type_constraint_name(shift);
215     my $constraint;
216
217     if ( $constraint = find_type_constraint($type_constraint_name) ) {
218         return $constraint;
219     }
220     elsif ( _detect_type_constraint_union($type_constraint_name) ) {
221         $constraint = create_type_constraint_union($type_constraint_name);
222     }
223     elsif ( _detect_parameterized_type_constraint($type_constraint_name) ) {
224         $constraint
225             = create_parameterized_type_constraint($type_constraint_name);
226     }
227     else {
228         return;
229     }
230
231     $REGISTRY->add_type_constraint($constraint);
232     return $constraint;
233 }
234
235 sub normalize_type_constraint_name {
236     my $type_constraint_name = shift;
237     $type_constraint_name =~ s/\s//g;
238     return $type_constraint_name;
239 }
240
241 sub _confess {
242     my $error = shift;
243
244     local $Carp::CarpLevel = $Carp::CarpLevel + 1;
245     Carp::confess($error);
246 }
247
248 ## --------------------------------------------------------
249 ## exported functions ...
250 ## --------------------------------------------------------
251
252 sub find_type_constraint {
253     my $type = shift;
254
255     if ( blessed $type and $type->isa("Moose::Meta::TypeConstraint") ) {
256         return $type;
257     }
258     else {
259         return unless $REGISTRY->has_type_constraint($type);
260         return $REGISTRY->get_type_constraint($type);
261     }
262 }
263
264 sub register_type_constraint {
265     my $constraint = shift;
266     __PACKAGE__->_throw_error("can't register an unnamed type constraint")
267         unless defined $constraint->name;
268     $REGISTRY->add_type_constraint($constraint);
269     return $constraint;
270 }
271
272 # type constructors
273
274 sub type {
275
276     # back-compat version, called without sugar
277     if ( !any { ( reftype($_) || '' ) eq 'HASH' } @_ ) {
278         return _create_type_constraint( $_[0], undef, $_[1] );
279     }
280
281     my $name = shift;
282
283     my %p = map { %{$_} } @_;
284
285     return _create_type_constraint(
286         $name, undef, $p{where}, $p{message},
287         $p{optimize_as}
288     );
289 }
290
291 sub subtype {
292
293     # crazy back-compat code for being called without sugar ...
294     #
295     # subtype 'Parent', sub { where };
296     if ( scalar @_ == 2 && ( reftype( $_[1] ) || '' ) eq 'CODE' ) {
297         return _create_type_constraint( undef, @_ );
298     }
299
300     # subtype 'Parent', sub { where }, sub { message };
301     # subtype 'Parent', sub { where }, sub { message }, sub { optimized };
302     if ( scalar @_ >= 3 && all { ( reftype($_) || '' ) eq 'CODE' }
303         @_[ 1 .. $#_ ] ) {
304         return _create_type_constraint( undef, @_ );
305     }
306
307     # subtype 'Name', 'Parent', ...
308     if ( scalar @_ >= 2 && all { !ref } @_[ 0, 1 ] ) {
309         return _create_type_constraint(@_);
310     }
311
312     if ( @_ == 1 && !ref $_[0] ) {
313         __PACKAGE__->_throw_error(
314             'A subtype cannot consist solely of a name, it must have a parent'
315         );
316     }
317
318     # The blessed check is mostly to accommodate MooseX::Types, which
319     # uses an object which overloads stringification as a type name.
320     my $name = ref $_[0] && !blessed $_[0] ? undef : shift;
321
322     my %p = map { %{$_} } @_;
323
324     # subtype Str => where { ... };
325     if ( !exists $p{as} ) {
326         $p{as} = $name;
327         $name = undef;
328     }
329
330     return _create_type_constraint(
331         $name, $p{as}, $p{where}, $p{message},
332         $p{optimize_as}
333     );
334 }
335
336 sub class_type {
337     register_type_constraint(
338         create_class_type_constraint(
339             $_[0],
340             ( defined( $_[1] ) ? $_[1] : () ),
341         )
342     );
343 }
344
345 sub role_type ($;$) {
346     register_type_constraint(
347         create_role_type_constraint(
348             $_[0],
349             ( defined( $_[1] ) ? $_[1] : () ),
350         )
351     );
352 }
353
354 sub maybe_type {
355     my ($type_parameter) = @_;
356
357     register_type_constraint(
358         $REGISTRY->get_type_constraint('Maybe')->parameterize($type_parameter)
359     );
360 }
361
362 sub duck_type {
363     my ( $type_name, @methods ) = @_;
364     if ( ref $type_name eq 'ARRAY' && !@methods ) {
365         @methods   = @$type_name;
366         $type_name = undef;
367     }
368     if ( @methods == 1 && ref $methods[0] eq 'ARRAY' ) {
369         @methods = @{ $methods[0] };
370     }
371
372     register_type_constraint(
373         create_duck_type_constraint(
374             $type_name,
375             \@methods,
376         )
377     );
378 }
379
380 sub coerce {
381     my ( $type_name, @coercion_map ) = @_;
382     _install_type_coercions( $type_name, \@coercion_map );
383 }
384
385 # The trick of returning @_ lets us avoid having to specify a
386 # prototype. Perl will parse this:
387 #
388 # subtype 'Foo'
389 #     => as 'Str'
390 #     => where { ... }
391 #
392 # as this:
393 #
394 # subtype( 'Foo', as( 'Str', where { ... } ) );
395 #
396 # If as() returns all it's extra arguments, this just works, and
397 # preserves backwards compatibility.
398 sub as { { as => shift }, @_ }
399 sub where (&)       { { where       => $_[0] } }
400 sub message (&)     { { message     => $_[0] } }
401 sub optimize_as (&) { { optimize_as => $_[0] } }
402
403 sub from    {@_}
404 sub via (&) { $_[0] }
405
406 sub enum {
407     my ( $type_name, @values ) = @_;
408
409     # NOTE:
410     # if only an array-ref is passed then
411     # you get an anon-enum
412     # - SL
413     if ( ref $type_name eq 'ARRAY' && !@values ) {
414         @values    = @$type_name;
415         $type_name = undef;
416     }
417     if ( @values == 1 && ref $values[0] eq 'ARRAY' ) {
418         @values = @{ $values[0] };
419     }
420     ( scalar @values >= 2 )
421         || __PACKAGE__->_throw_error(
422         "You must have at least two values to enumerate through");
423     my %valid = map { $_ => 1 } @values;
424
425     register_type_constraint(
426         create_enum_type_constraint(
427             $type_name,
428             \@values,
429         )
430     );
431 }
432
433 sub create_enum_type_constraint {
434     my ( $type_name, $values ) = @_;
435
436     Moose::Meta::TypeConstraint::Enum->new(
437         name => $type_name || '__ANON__',
438         values => $values,
439     );
440 }
441
442 sub create_duck_type_constraint {
443     my ( $type_name, $methods ) = @_;
444
445     Moose::Meta::TypeConstraint::DuckType->new(
446         name => $type_name || '__ANON__',
447         methods => $methods,
448     );
449 }
450
451 sub match_on_type {
452     my ($to_match, @cases) = @_;
453     my $default;
454     if (@cases % 2 != 0) {
455         $default = pop @cases;
456         (ref $default eq 'CODE')
457             || __PACKAGE__->_throw_error("Default case must be a CODE ref, not $default");
458     }
459     while (@cases) {
460         my ($type, $action) = splice @cases, 0, 2;
461
462         unless (blessed $type && $type->isa('Moose::Meta::TypeConstraint')) {
463             $type = find_or_parse_type_constraint($type)
464                  || __PACKAGE__->_throw_error("Cannot find or parse the type '$type'")
465         }
466
467         (ref $action eq 'CODE')
468             || __PACKAGE__->_throw_error("Match action must be a CODE ref, not $action");
469
470         if ($type->check($to_match)) {
471             local $_ = $to_match;
472             return $action->($to_match);
473         }
474     }
475     (defined $default)
476         || __PACKAGE__->_throw_error("No cases matched for $to_match");
477     {
478         local $_ = $to_match;
479         return $default->($to_match);
480     }
481 }
482
483
484 ## --------------------------------------------------------
485 ## desugaring functions ...
486 ## --------------------------------------------------------
487
488 sub _create_type_constraint ($$$;$$) {
489     my $name      = shift;
490     my $parent    = shift;
491     my $check     = shift;
492     my $message   = shift;
493     my $optimized = shift;
494
495     my $pkg_defined_in = scalar( caller(1) );
496
497     if ( defined $name ) {
498         my $type = $REGISTRY->get_type_constraint($name);
499
500         ( $type->_package_defined_in eq $pkg_defined_in )
501             || _confess(
502                   "The type constraint '$name' has already been created in "
503                 . $type->_package_defined_in
504                 . " and cannot be created again in "
505                 . $pkg_defined_in )
506             if defined $type;
507
508         $name =~ /^[\w:\.]+$/
509             or die qq{$name contains invalid characters for a type name.}
510             . qq{ Names can contain alphanumeric character, ":", and "."\n};
511     }
512
513     my %opts = (
514         name               => $name,
515         package_defined_in => $pkg_defined_in,
516
517         ( $check     ? ( constraint => $check )     : () ),
518         ( $message   ? ( message    => $message )   : () ),
519         ( $optimized ? ( optimized  => $optimized ) : () ),
520     );
521
522     my $constraint;
523     if (
524         defined $parent
525         and $parent
526         = blessed $parent
527         ? $parent
528         : find_or_create_isa_type_constraint($parent)
529         ) {
530         $constraint = $parent->create_child_type(%opts);
531     }
532     else {
533         $constraint = Moose::Meta::TypeConstraint->new(%opts);
534     }
535
536     $REGISTRY->add_type_constraint($constraint)
537         if defined $name;
538
539     return $constraint;
540 }
541
542 sub _install_type_coercions ($$) {
543     my ( $type_name, $coercion_map ) = @_;
544     my $type = find_type_constraint($type_name);
545     ( defined $type )
546         || __PACKAGE__->_throw_error(
547         "Cannot find type '$type_name', perhaps you forgot to load it");
548     if ( $type->has_coercion ) {
549         $type->coercion->add_type_coercions(@$coercion_map);
550     }
551     else {
552         my $type_coercion = Moose::Meta::TypeCoercion->new(
553             type_coercion_map => $coercion_map,
554             type_constraint   => $type
555         );
556         $type->coercion($type_coercion);
557     }
558 }
559
560 ## --------------------------------------------------------
561 ## type notation parsing ...
562 ## --------------------------------------------------------
563
564 {
565
566     # All I have to say is mugwump++ cause I know
567     # do not even have enough regexp-fu to be able
568     # to have written this (I can only barely
569     # understand it as it is)
570     # - SL
571
572     use re "eval";
573
574     my $valid_chars = qr{[\w:\.]};
575     my $type_atom   = qr{ $valid_chars+ };
576
577     my $any;
578
579     my $type = qr{  $valid_chars+  (?: \[ \s* (??{$any})   \s* \] )? }x;
580     my $type_capture_parts
581         = qr{ ($valid_chars+) (?: \[ \s* ((??{$any})) \s* \] )? }x;
582     my $type_with_parameter
583         = qr{  $valid_chars+      \[ \s* (??{$any})   \s* \]    }x;
584
585     my $op_union = qr{ \s* \| \s* }x;
586     my $union    = qr{ $type (?: $op_union $type )+ }x;
587
588     $any = qr{ $type | $union }x;
589
590     sub _parse_parameterized_type_constraint {
591         { no warnings 'void'; $any; }  # force capture of interpolated lexical
592         $_[0] =~ m{ $type_capture_parts }x;
593         return ( $1, $2 );
594     }
595
596     sub _detect_parameterized_type_constraint {
597         { no warnings 'void'; $any; }  # force capture of interpolated lexical
598         $_[0] =~ m{ ^ $type_with_parameter $ }x;
599     }
600
601     sub _parse_type_constraint_union {
602         { no warnings 'void'; $any; }  # force capture of interpolated lexical
603         my $given = shift;
604         my @rv;
605         while ( $given =~ m{ \G (?: $op_union )? ($type) }gcx ) {
606             push @rv => $1;
607         }
608         ( pos($given) eq length($given) )
609             || __PACKAGE__->_throw_error( "'$given' didn't parse (parse-pos="
610                 . pos($given)
611                 . " and str-length="
612                 . length($given)
613                 . ")" );
614         @rv;
615     }
616
617     sub _detect_type_constraint_union {
618         { no warnings 'void'; $any; }  # force capture of interpolated lexical
619         $_[0] =~ m{^ $type $op_union $type ( $op_union .* )? $}x;
620     }
621 }
622
623 ## --------------------------------------------------------
624 # define some basic built-in types
625 ## --------------------------------------------------------
626
627 # By making these classes immutable before creating all the types we
628 # below, we avoid repeatedly calling the slow MOP-based accessors.
629 $_->make_immutable(
630     inline_constructor => 1,
631     constructor_name   => "_new",
632
633     # these are Class::MOP accessors, so they need inlining
634     inline_accessors => 1
635     ) for grep { $_->is_mutable }
636     map { Class::MOP::class_of($_) }
637     qw(
638     Moose::Meta::TypeConstraint
639     Moose::Meta::TypeConstraint::Union
640     Moose::Meta::TypeConstraint::Parameterized
641     Moose::Meta::TypeConstraint::Parameterizable
642     Moose::Meta::TypeConstraint::Class
643     Moose::Meta::TypeConstraint::Role
644     Moose::Meta::TypeConstraint::Enum
645     Moose::Meta::TypeConstraint::DuckType
646     Moose::Meta::TypeConstraint::Registry
647 );
648
649 type 'Any'  => where {1};    # meta-type including all
650 subtype 'Item' => as 'Any';  # base-type
651
652 subtype 'Undef'   => as 'Item' => where { !defined($_) };
653 subtype 'Defined' => as 'Item' => where { defined($_) };
654
655 subtype 'Bool' => as 'Item' =>
656     where { !defined($_) || $_ eq "" || "$_" eq '1' || "$_" eq '0' };
657
658 subtype 'Value' => as 'Defined' => where { !ref($_) } =>
659     optimize_as \&Moose::Util::TypeConstraints::OptimizedConstraints::Value;
660
661 subtype 'Ref' => as 'Defined' => where { ref($_) } =>
662     optimize_as \&Moose::Util::TypeConstraints::OptimizedConstraints::Ref;
663
664 subtype 'Str' => as 'Value' => where { ref(\$_) eq 'SCALAR' } =>
665     optimize_as \&Moose::Util::TypeConstraints::OptimizedConstraints::Str;
666
667 subtype 'Num' => as 'Str' =>
668     where { Scalar::Util::looks_like_number($_) } =>
669     optimize_as \&Moose::Util::TypeConstraints::OptimizedConstraints::Num;
670
671 subtype 'Int' => as 'Num' => where { "$_" =~ /^-?[0-9]+$/ } =>
672     optimize_as \&Moose::Util::TypeConstraints::OptimizedConstraints::Int;
673
674 subtype 'ScalarRef' => as 'Ref' => where { ref($_) eq 'SCALAR' } =>
675     optimize_as
676     \&Moose::Util::TypeConstraints::OptimizedConstraints::ScalarRef;
677 subtype 'CodeRef' => as 'Ref' => where { ref($_) eq 'CODE' } =>
678     optimize_as \&Moose::Util::TypeConstraints::OptimizedConstraints::CodeRef;
679 subtype 'RegexpRef' => as 'Ref' => where { ref($_) eq 'Regexp' } =>
680     optimize_as
681     \&Moose::Util::TypeConstraints::OptimizedConstraints::RegexpRef;
682 subtype 'GlobRef' => as 'Ref' => where { ref($_) eq 'GLOB' } =>
683     optimize_as \&Moose::Util::TypeConstraints::OptimizedConstraints::GlobRef;
684
685 # NOTE:
686 # scalar filehandles are GLOB refs,
687 # but a GLOB ref is not always a filehandle
688 subtype 'FileHandle' => as 'GlobRef' => where {
689     Scalar::Util::openhandle($_) || ( blessed($_) && $_->isa("IO::Handle") );
690 } => optimize_as
691     \&Moose::Util::TypeConstraints::OptimizedConstraints::FileHandle;
692
693 # NOTE:
694 # blessed(qr/.../) returns true,.. how odd
695 subtype 'Object' => as 'Ref' =>
696     where { blessed($_) && blessed($_) ne 'Regexp' } =>
697     optimize_as \&Moose::Util::TypeConstraints::OptimizedConstraints::Object;
698
699 # This type is deprecated.
700 subtype 'Role' => as 'Object' => where { $_->can('does') } =>
701     optimize_as \&Moose::Util::TypeConstraints::OptimizedConstraints::Role;
702
703 my $_class_name_checker = sub { };
704
705 subtype 'ClassName' => as 'Str' =>
706     where { Class::MOP::is_class_loaded($_) } => optimize_as
707     \&Moose::Util::TypeConstraints::OptimizedConstraints::ClassName;
708
709 subtype 'RoleName' => as 'ClassName' => where {
710     (Class::MOP::class_of($_) || return)->isa('Moose::Meta::Role');
711 } => optimize_as
712     \&Moose::Util::TypeConstraints::OptimizedConstraints::RoleName;
713
714 ## --------------------------------------------------------
715 # parameterizable types ...
716
717 $REGISTRY->add_type_constraint(
718     Moose::Meta::TypeConstraint::Parameterizable->new(
719         name               => 'ArrayRef',
720         package_defined_in => __PACKAGE__,
721         parent             => find_type_constraint('Ref'),
722         constraint         => sub { ref($_) eq 'ARRAY' },
723         optimized =>
724             \&Moose::Util::TypeConstraints::OptimizedConstraints::ArrayRef,
725         constraint_generator => sub {
726             my $type_parameter = shift;
727             my $check          = $type_parameter->_compiled_type_constraint;
728             return sub {
729                 foreach my $x (@$_) {
730                     ( $check->($x) ) || return;
731                 }
732                 1;
733                 }
734         }
735     )
736 );
737
738 $REGISTRY->add_type_constraint(
739     Moose::Meta::TypeConstraint::Parameterizable->new(
740         name               => 'HashRef',
741         package_defined_in => __PACKAGE__,
742         parent             => find_type_constraint('Ref'),
743         constraint         => sub { ref($_) eq 'HASH' },
744         optimized =>
745             \&Moose::Util::TypeConstraints::OptimizedConstraints::HashRef,
746         constraint_generator => sub {
747             my $type_parameter = shift;
748             my $check          = $type_parameter->_compiled_type_constraint;
749             return sub {
750                 foreach my $x ( values %$_ ) {
751                     ( $check->($x) ) || return;
752                 }
753                 1;
754                 }
755         }
756     )
757 );
758
759 $REGISTRY->add_type_constraint(
760     Moose::Meta::TypeConstraint::Parameterizable->new(
761         name                 => 'Maybe',
762         package_defined_in   => __PACKAGE__,
763         parent               => find_type_constraint('Item'),
764         constraint           => sub {1},
765         constraint_generator => sub {
766             my $type_parameter = shift;
767             my $check          = $type_parameter->_compiled_type_constraint;
768             return sub {
769                 return 1 if not( defined($_) ) || $check->($_);
770                 return;
771                 }
772         }
773     )
774 );
775
776 my @PARAMETERIZABLE_TYPES
777     = map { $REGISTRY->get_type_constraint($_) } qw[ArrayRef HashRef Maybe];
778
779 sub get_all_parameterizable_types {@PARAMETERIZABLE_TYPES}
780
781 sub add_parameterizable_type {
782     my $type = shift;
783     ( blessed $type
784             && $type->isa('Moose::Meta::TypeConstraint::Parameterizable') )
785         || __PACKAGE__->_throw_error(
786         "Type must be a Moose::Meta::TypeConstraint::Parameterizable not $type"
787         );
788     push @PARAMETERIZABLE_TYPES => $type;
789 }
790
791 ## --------------------------------------------------------
792 # end of built-in types ...
793 ## --------------------------------------------------------
794
795 {
796     my @BUILTINS = list_all_type_constraints();
797     sub list_all_builtin_type_constraints {@BUILTINS}
798 }
799
800 sub _throw_error {
801     shift;
802     require Moose;
803     unshift @_, 'Moose';
804     goto &Moose::throw_error;
805 }
806
807 1;
808
809 __END__
810
811 =pod
812
813 =head1 NAME
814
815 Moose::Util::TypeConstraints - Type constraint system for Moose
816
817 =head1 SYNOPSIS
818
819   use Moose::Util::TypeConstraints;
820
821   subtype 'Natural'
822       => as 'Int'
823       => where { $_ > 0 };
824
825   subtype 'NaturalLessThanTen'
826       => as 'Natural'
827       => where { $_ < 10 }
828       => message { "This number ($_) is not less than ten!" };
829
830   coerce 'Num'
831       => from 'Str'
832         => via { 0+$_ };
833
834   enum 'RGBColors' => qw(red green blue);
835
836   no Moose::Util::TypeConstraints;
837
838 =head1 DESCRIPTION
839
840 This module provides Moose with the ability to create custom type
841 constraints to be used in attribute definition.
842
843 =head2 Important Caveat
844
845 This is B<NOT> a type system for Perl 5. These are type constraints,
846 and they are not used by Moose unless you tell it to. No type
847 inference is performed, expressions are not typed, etc. etc. etc.
848
849 A type constraint is at heart a small "check if a value is valid"
850 function. A constraint can be associated with an attribute. This
851 simplifies parameter validation, and makes your code clearer to read,
852 because you can refer to constraints by name.
853
854 =head2 Slightly Less Important Caveat
855
856 It is B<always> a good idea to quote your type names.
857
858 This prevents Perl from trying to execute the call as an indirect
859 object call. This can be an issue when you have a subtype with the
860 same name as a valid class.
861
862 For instance:
863
864   subtype DateTime => as Object => where { $_->isa('DateTime') };
865
866 will I<just work>, while this:
867
868   use DateTime;
869   subtype DateTime => as Object => where { $_->isa('DateTime') };
870
871 will fail silently and cause many headaches. The simple way to solve
872 this, as well as future proof your subtypes from classes which have
873 yet to have been created, is to quote the type name:
874
875   use DateTime;
876   subtype 'DateTime' => as 'Object' => where { $_->isa('DateTime') };
877
878 =head2 Default Type Constraints
879
880 This module also provides a simple hierarchy for Perl 5 types, here is
881 that hierarchy represented visually.
882
883   Any
884   Item
885       Bool
886       Maybe[`a]
887       Undef
888       Defined
889           Value
890               Str
891                   Num
892                       Int
893                   ClassName
894                   RoleName
895           Ref
896               ScalarRef
897               ArrayRef[`a]
898               HashRef[`a]
899               CodeRef
900               RegexpRef
901               GlobRef
902                   FileHandle
903               Object
904
905 B<NOTE:> Any type followed by a type parameter C<[`a]> can be
906 parameterized, this means you can say:
907
908   ArrayRef[Int]    # an array of integers
909   HashRef[CodeRef] # a hash of str to CODE ref mappings
910   Maybe[Str]       # value may be a string, may be undefined
911
912 If Moose finds a name in brackets that it does not recognize as an
913 existing type, it assumes that this is a class name, for example
914 C<ArrayRef[DateTime]>.
915
916 B<NOTE:> Unless you parameterize a type, then it is invalid to include
917 the square brackets. I.e. C<ArrayRef[]> will be treated as a new type
918 name, I<not> as a parameterization of C<ArrayRef>.
919
920 B<NOTE:> The C<Undef> type constraint for the most part works
921 correctly now, but edge cases may still exist, please use it
922 sparingly.
923
924 B<NOTE:> The C<ClassName> type constraint does a complex package
925 existence check. This means that your class B<must> be loaded for this
926 type constraint to pass.
927
928 B<NOTE:> The C<RoleName> constraint checks a string is a I<package
929 name> which is a role, like C<'MyApp::Role::Comparable'>.
930
931 =head2 Type Constraint Naming
932
933 Type name declared via this module can only contain alphanumeric
934 characters, colons (:), and periods (.).
935
936 Since the types created by this module are global, it is suggested
937 that you namespace your types just as you would namespace your
938 modules. So instead of creating a I<Color> type for your
939 B<My::Graphics> module, you would call the type
940 I<My::Graphics::Types::Color> instead.
941
942 =head2 Use with Other Constraint Modules
943
944 This module can play nicely with other constraint modules with some
945 slight tweaking. The C<where> clause in types is expected to be a
946 C<CODE> reference which checks it's first argument and returns a
947 boolean. Since most constraint modules work in a similar way, it
948 should be simple to adapt them to work with Moose.
949
950 For instance, this is how you could use it with
951 L<Declare::Constraints::Simple> to declare a completely new type.
952
953   type 'HashOfArrayOfObjects',
954       {
955       where => IsHashRef(
956           -keys   => HasLength,
957           -values => IsArrayRef(IsObject)
958       )
959   };
960
961 For more examples see the F<t/200_examples/004_example_w_DCS.t> test
962 file.
963
964 Here is an example of using L<Test::Deep> and it's non-test
965 related C<eq_deeply> function.
966
967   type 'ArrayOfHashOfBarsAndRandomNumbers'
968       => where {
969           eq_deeply($_,
970               array_each(subhashof({
971                   bar           => isa('Bar'),
972                   random_number => ignore()
973               })))
974         };
975
976 For a complete example see the
977 F<t/200_examples/005_example_w_TestDeep.t> test file.
978
979 =head1 FUNCTIONS
980
981 =head2 Type Constraint Constructors
982
983 The following functions are used to create type constraints.  They
984 will also register the type constraints your create in a global
985 registry that is used to look types up by name.
986
987 See the L<SYNOPSIS> for an example of how to use these.
988
989 =over 4
990
991 =item B<< subtype 'Name' => as 'Parent' => where { } ... >>
992
993 This creates a named subtype.
994
995 If you provide a parent that Moose does not recognize, it will
996 automatically create a new class type constraint for this name.
997
998 When creating a named type, the C<subtype> function should either be
999 called with the sugar helpers (C<where>, C<message>, etc), or with a
1000 name and a hashref of parameters:
1001
1002  subtype( 'Foo', { where => ..., message => ... } );
1003
1004 The valid hashref keys are C<as> (the parent), C<where>, C<message>,
1005 and C<optimize_as>.
1006
1007 =item B<< subtype as 'Parent' => where { } ... >>
1008
1009 This creates an unnamed subtype and will return the type
1010 constraint meta-object, which will be an instance of
1011 L<Moose::Meta::TypeConstraint>.
1012
1013 When creating an anonymous type, the C<subtype> function should either
1014 be called with the sugar helpers (C<where>, C<message>, etc), or with
1015 just a hashref of parameters:
1016
1017  subtype( { where => ..., message => ... } );
1018
1019 =item B<class_type ($class, ?$options)>
1020
1021 Creates a new subtype of C<Object> with the name C<$class> and the
1022 metaclass L<Moose::Meta::TypeConstraint::Class>.
1023
1024 =item B<role_type ($role, ?$options)>
1025
1026 Creates a C<Role> type constraint with the name C<$role> and the
1027 metaclass L<Moose::Meta::TypeConstraint::Role>.
1028
1029 =item B<maybe_type ($type)>
1030
1031 Creates a type constraint for either C<undef> or something of the
1032 given type.
1033
1034 =item B<duck_type ($name, \@methods)>
1035
1036 This will create a subtype of Object and test to make sure the value
1037 C<can()> do the methods in C<\@methods>.
1038
1039 This is intended as an easy way to accept non-Moose objects that
1040 provide a certain interface. If you're using Moose classes, we
1041 recommend that you use a C<requires>-only Role instead.
1042
1043 =item B<duck_type (\@methods)>
1044
1045 If passed an ARRAY reference as the only parameter instead of the
1046 C<$name>, C<\@methods> pair, this will create an unnamed duck type.
1047 This can be used in an attribute definition like so:
1048
1049   has 'cache' => (
1050       is  => 'ro',
1051       isa => duck_type( [qw( get_set )] ),
1052   );
1053
1054 =item B<enum ($name, \@values)>
1055
1056 This will create a basic subtype for a given set of strings.
1057 The resulting constraint will be a subtype of C<Str> and
1058 will match any of the items in C<\@values>. It is case sensitive.
1059 See the L<SYNOPSIS> for a simple example.
1060
1061 B<NOTE:> This is not a true proper enum type, it is simply
1062 a convenient constraint builder.
1063
1064 =item B<enum (\@values)>
1065
1066 If passed an ARRAY reference as the only parameter instead of the
1067 C<$name>, C<\@values> pair, this will create an unnamed enum. This
1068 can then be used in an attribute definition like so:
1069
1070   has 'sort_order' => (
1071       is  => 'ro',
1072       isa => enum([qw[ ascending descending ]]),
1073   );
1074
1075 =item B<as 'Parent'>
1076
1077 This is just sugar for the type constraint construction syntax.
1078
1079 It takes a single argument, which is the name of a parent type.
1080
1081 =item B<where { ... }>
1082
1083 This is just sugar for the type constraint construction syntax.
1084
1085 It takes a subroutine reference as an argument. When the type
1086 constraint is tested, the reference is run with the value to be tested
1087 in C<$_>. This reference should return true or false to indicate
1088 whether or not the constraint check passed.
1089
1090 =item B<message { ... }>
1091
1092 This is just sugar for the type constraint construction syntax.
1093
1094 It takes a subroutine reference as an argument. When the type
1095 constraint fails, then the code block is run with the value provided
1096 in C<$_>. This reference should return a string, which will be used in
1097 the text of the exception thrown.
1098
1099 =item B<optimize_as { ... }>
1100
1101 This can be used to define a "hand optimized" version of your
1102 type constraint which can be used to avoid traversing a subtype
1103 constraint hierarchy.
1104
1105 B<NOTE:> You should only use this if you know what you are doing,
1106 all the built in types use this, so your subtypes (assuming they
1107 are shallow) will not likely need to use this.
1108
1109 =item B<< type 'Name' => where { } ... >>
1110
1111 This creates a base type, which has no parent.
1112
1113 The C<type> function should either be called with the sugar helpers
1114 (C<where>, C<message>, etc), or with a name and a hashref of
1115 parameters:
1116
1117   type( 'Foo', { where => ..., message => ... } );
1118
1119 The valid hashref keys are C<where>, C<message>, and C<optimize_as>.
1120
1121 =back
1122
1123 =head2 Type Constraint Utilities
1124
1125 =over 4
1126
1127 =item B<< match_on_type $value => ( $type => \&action, ... ?\&default ) >>
1128
1129 This is a utility function for doing simple type based dispatching similar to
1130 match/case in O'Caml and case/of in Haskell. It is not as featureful as those
1131 languages, nor does not it support any kind of automatic destructuring
1132 bind. Here is a simple Perl pretty printer dispatching over the core Moose
1133 types.
1134
1135   sub ppprint {
1136       my $x = shift;
1137       match_on_type $x => (
1138           HashRef => sub {
1139               my $hash = shift;
1140               '{ '
1141                   . (
1142                   join ", " => map { $_ . ' => ' . ppprint( $hash->{$_} ) }
1143                       sort keys %$hash
1144                   ) . ' }';
1145           },
1146           ArrayRef => sub {
1147               my $array = shift;
1148               '[ ' . ( join ", " => map { ppprint($_) } @$array ) . ' ]';
1149           },
1150           CodeRef   => sub {'sub { ... }'},
1151           RegexpRef => sub { 'qr/' . $_ . '/' },
1152           GlobRef   => sub { '*' . B::svref_2object($_)->NAME },
1153           Object    => sub { $_->can('to_string') ? $_->to_string : $_ },
1154           ScalarRef => sub { '\\' . ppprint( ${$_} ) },
1155           Num       => sub {$_},
1156           Str       => sub { '"' . $_ . '"' },
1157           Undef     => sub {'undef'},
1158           => sub { die "I don't know what $_ is" }
1159       );
1160   }
1161
1162 Or a simple JSON serializer:
1163
1164   sub to_json {
1165       my $x = shift;
1166       match_on_type $x => (
1167           HashRef => sub {
1168               my $hash = shift;
1169               '{ '
1170                   . (
1171                   join ", " =>
1172                       map { '"' . $_ . '" : ' . to_json( $hash->{$_} ) }
1173                       sort keys %$hash
1174                   ) . ' }';
1175           },
1176           ArrayRef => sub {
1177               my $array = shift;
1178               '[ ' . ( join ", " => map { to_json($_) } @$array ) . ' ]';
1179           },
1180           Num   => sub {$_},
1181           Str   => sub { '"' . $_ . '"' },
1182           Undef => sub {'null'},
1183           => sub { die "$_ is not acceptable json type" }
1184       );
1185   }
1186
1187 The matcher is done by mapping a C<$type> to an C<\&action>. The C<$type> can
1188 be either a string type or a L<Moose::Meta::TypeConstraint> object, and
1189 C<\&action> is a subroutine reference. This function will dispatch on the
1190 first match for C<$value>. It is possible to have a catch-all by providing an
1191 additional subroutine reference as the final argument to C<match_on_type>.
1192
1193 =back
1194
1195 =head2 Type Coercion Constructors
1196
1197 You can define coercions for type constraints, which allow you to
1198 automatically transform values to something valid for the type
1199 constraint. If you ask your accessor to coerce, then Moose will run
1200 the type-coercion code first, followed by the type constraint
1201 check. This feature should be used carefully as it is very powerful
1202 and could easily take off a limb if you are not careful.
1203
1204 See the L<SYNOPSIS> for an example of how to use these.
1205
1206 =over 4
1207
1208 =item B<< coerce 'Name' => from 'OtherName' => via { ... } >>
1209
1210 This defines a coercion from one type to another. The C<Name> argument
1211 is the type you are coercing I<to>.
1212
1213 =item B<from 'OtherName'>
1214
1215 This is just sugar for the type coercion construction syntax.
1216
1217 It takes a single type name (or type object), which is the type being
1218 coerced I<from>.
1219
1220 =item B<via { ... }>
1221
1222 This is just sugar for the type coercion construction syntax.
1223
1224 It takes a subroutine reference. This reference will be called with
1225 the value to be coerced in C<$_>. It is expected to return a new value
1226 of the proper type for the coercion.
1227
1228 =back
1229
1230 =head2 Creating and Finding Type Constraints
1231
1232 These are additional functions for creating and finding type
1233 constraints. Most of these functions are not available for
1234 importing. The ones that are importable as specified.
1235
1236 =over 4
1237
1238 =item B<find_type_constraint($type_name)>
1239
1240 This function can be used to locate the L<Moose::Meta::TypeConstraint>
1241 object for a named type.
1242
1243 This function is importable.
1244
1245 =item B<register_type_constraint($type_object)>
1246
1247 This function will register a L<Moose::Meta::TypeConstraint> with the
1248 global type registry.
1249
1250 This function is importable.
1251
1252 =item B<normalize_type_constraint_name($type_constraint_name)>
1253
1254 This method takes a type constraint name and returns the normalized
1255 form. This removes any whitespace in the string.
1256
1257 =item B<create_type_constraint_union($pipe_separated_types | @type_constraint_names)>
1258
1259 This can take a union type specification like C<'Int|ArrayRef[Int]'>,
1260 or a list of names. It returns a new
1261 L<Moose::Meta::TypeConstraint::Union> object.
1262
1263 =item B<create_parameterized_type_constraint($type_name)>
1264
1265 Given a C<$type_name> in the form of C<'BaseType[ContainerType]'>,
1266 this will create a new L<Moose::Meta::TypeConstraint::Parameterized>
1267 object. The C<BaseType> must exist already exist as a parameterizable
1268 type.
1269
1270 =item B<create_class_type_constraint($class, $options)>
1271
1272 Given a class name this function will create a new
1273 L<Moose::Meta::TypeConstraint::Class> object for that class name.
1274
1275 The C<$options> is a hash reference that will be passed to the
1276 L<Moose::Meta::TypeConstraint::Class> constructor (as a hash).
1277
1278 =item B<create_role_type_constraint($role, $options)>
1279
1280 Given a role name this function will create a new
1281 L<Moose::Meta::TypeConstraint::Role> object for that role name.
1282
1283 The C<$options> is a hash reference that will be passed to the
1284 L<Moose::Meta::TypeConstraint::Role> constructor (as a hash).
1285
1286 =item B<create_enum_type_constraint($name, $values)>
1287
1288 Given a enum name this function will create a new
1289 L<Moose::Meta::TypeConstraint::Enum> object for that enum name.
1290
1291 =item B<create_duck_type_constraint($name, $methods)>
1292
1293 Given a duck type name this function will create a new
1294 L<Moose::Meta::TypeConstraint::DuckType> object for that enum name.
1295
1296 =item B<find_or_parse_type_constraint($type_name)>
1297
1298 Given a type name, this first attempts to find a matching constraint
1299 in the global registry.
1300
1301 If the type name is a union or parameterized type, it will create a
1302 new object of the appropriate, but if given a "regular" type that does
1303 not yet exist, it simply returns false.
1304
1305 When given a union or parameterized type, the member or base type must
1306 already exist.
1307
1308 If it creates a new union or parameterized type, it will add it to the
1309 global registry.
1310
1311 =item B<find_or_create_isa_type_constraint($type_name)>
1312
1313 =item B<find_or_create_does_type_constraint($type_name)>
1314
1315 These functions will first call C<find_or_parse_type_constraint>. If
1316 that function does not return a type, a new anonymous type object will
1317 be created.
1318
1319 The C<isa> variant will use C<create_class_type_constraint> and the
1320 C<does> variant will use C<create_role_type_constraint>.
1321
1322 =item B<get_type_constraint_registry>
1323
1324 Returns the L<Moose::Meta::TypeConstraint::Registry> object which
1325 keeps track of all type constraints.
1326
1327 =item B<list_all_type_constraints>
1328
1329 This will return a list of type constraint names in the global
1330 registry. You can then fetch the actual type object using
1331 C<find_type_constraint($type_name)>.
1332
1333 =item B<list_all_builtin_type_constraints>
1334
1335 This will return a list of builtin type constraints, meaning those
1336 which are defined in this module. See the L<Default Type Constraints>
1337 section for a complete list.
1338
1339 =item B<export_type_constraints_as_functions>
1340
1341 This will export all the current type constraints as functions into
1342 the caller's namespace (C<Int()>, C<Str()>, etc). Right now, this is
1343 mostly used for testing, but it might prove useful to others.
1344
1345 =item B<get_all_parameterizable_types>
1346
1347 This returns all the parameterizable types that have been registered,
1348 as a list of type objects.
1349
1350 =item B<add_parameterizable_type($type)>
1351
1352 Adds C<$type> to the list of parameterizable types
1353
1354 =back
1355
1356 =head1 BUGS
1357
1358 All complex software has bugs lurking in it, and this module is no
1359 exception. If you find a bug please either email me, or add the bug
1360 to cpan-RT.
1361
1362 =head1 AUTHOR
1363
1364 Stevan Little E<lt>stevan@iinteractive.comE<gt>
1365
1366 =head1 COPYRIGHT AND LICENSE
1367
1368 Copyright 2006-2009 by Infinity Interactive, Inc.
1369
1370 L<http://www.iinteractive.com>
1371
1372 This library is free software; you can redistribute it and/or modify
1373 it under the same terms as Perl itself.
1374
1375 =cut