Version 1.00.
[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 = '1.00';
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+) }x;
576     my $ws   = qr{ (?>\s*) }x;
577
578     my $any;
579
580     my $type = qr{  $type_atom  (?: \[ $ws (??{$any})   $ws \] )? }x;
581     my $type_capture_parts
582         = qr{ ($type_atom) (?: \[ $ws ((??{$any})) $ws \] )? }x;
583     my $type_with_parameter
584         = qr{  $type_atom      \[ $ws (??{$any})   $ws \]    }x;
585
586     my $op_union = qr{ $ws \| $ws }x;
587     my $union    = qr{ $type (?> (?: $op_union $type )+ ) }x;
588
589     $any = qr{ $type | $union }x;
590
591     sub _parse_parameterized_type_constraint {
592         { no warnings 'void'; $any; }  # force capture of interpolated lexical
593         $_[0] =~ m{ $type_capture_parts }x;
594         return ( $1, $2 );
595     }
596
597     sub _detect_parameterized_type_constraint {
598         { no warnings 'void'; $any; }  # force capture of interpolated lexical
599         $_[0] =~ m{ ^ $type_with_parameter $ }x;
600     }
601
602     sub _parse_type_constraint_union {
603         { no warnings 'void'; $any; }  # force capture of interpolated lexical
604         my $given = shift;
605         my @rv;
606         while ( $given =~ m{ \G (?: $op_union )? ($type) }gcx ) {
607             push @rv => $1;
608         }
609         ( pos($given) eq length($given) )
610             || __PACKAGE__->_throw_error( "'$given' didn't parse (parse-pos="
611                 . pos($given)
612                 . " and str-length="
613                 . length($given)
614                 . ")" );
615         @rv;
616     }
617
618     sub _detect_type_constraint_union {
619         { no warnings 'void'; $any; }  # force capture of interpolated lexical
620         $_[0] =~ m{^ $type $op_union $type ( $op_union .* )? $}x;
621     }
622 }
623
624 ## --------------------------------------------------------
625 # define some basic built-in types
626 ## --------------------------------------------------------
627
628 # By making these classes immutable before creating all the types we
629 # below, we avoid repeatedly calling the slow MOP-based accessors.
630 $_->make_immutable(
631     inline_constructor => 1,
632     constructor_name   => "_new",
633
634     # these are Class::MOP accessors, so they need inlining
635     inline_accessors => 1
636     ) for grep { $_->is_mutable }
637     map { Class::MOP::class_of($_) }
638     qw(
639     Moose::Meta::TypeConstraint
640     Moose::Meta::TypeConstraint::Union
641     Moose::Meta::TypeConstraint::Parameterized
642     Moose::Meta::TypeConstraint::Parameterizable
643     Moose::Meta::TypeConstraint::Class
644     Moose::Meta::TypeConstraint::Role
645     Moose::Meta::TypeConstraint::Enum
646     Moose::Meta::TypeConstraint::DuckType
647     Moose::Meta::TypeConstraint::Registry
648 );
649
650 type 'Any'  => where {1};    # meta-type including all
651 subtype 'Item' => as 'Any';  # base-type
652
653 subtype 'Undef'   => as 'Item' => where { !defined($_) };
654 subtype 'Defined' => as 'Item' => where { defined($_) };
655
656 subtype 'Bool' => as 'Item' =>
657     where { !defined($_) || $_ eq "" || "$_" eq '1' || "$_" eq '0' };
658
659 subtype 'Value' => as 'Defined' => where { !ref($_) } =>
660     optimize_as \&Moose::Util::TypeConstraints::OptimizedConstraints::Value;
661
662 subtype 'Ref' => as 'Defined' => where { ref($_) } =>
663     optimize_as \&Moose::Util::TypeConstraints::OptimizedConstraints::Ref;
664
665 subtype 'Str' => as 'Value' => where { ref(\$_) eq 'SCALAR' } =>
666     optimize_as \&Moose::Util::TypeConstraints::OptimizedConstraints::Str;
667
668 subtype 'Num' => as 'Str' =>
669     where { Scalar::Util::looks_like_number($_) } =>
670     optimize_as \&Moose::Util::TypeConstraints::OptimizedConstraints::Num;
671
672 subtype 'Int' => as 'Num' => where { "$_" =~ /^-?[0-9]+$/ } =>
673     optimize_as \&Moose::Util::TypeConstraints::OptimizedConstraints::Int;
674
675 subtype 'CodeRef' => as 'Ref' => where { ref($_) eq 'CODE' } =>
676     optimize_as \&Moose::Util::TypeConstraints::OptimizedConstraints::CodeRef;
677 subtype 'RegexpRef' => as 'Ref' => where { ref($_) eq 'Regexp' } =>
678     optimize_as
679     \&Moose::Util::TypeConstraints::OptimizedConstraints::RegexpRef;
680 subtype 'GlobRef' => as 'Ref' => where { ref($_) eq 'GLOB' } =>
681     optimize_as \&Moose::Util::TypeConstraints::OptimizedConstraints::GlobRef;
682
683 # NOTE:
684 # scalar filehandles are GLOB refs,
685 # but a GLOB ref is not always a filehandle
686 subtype 'FileHandle' => as 'GlobRef' => where {
687     Scalar::Util::openhandle($_) || ( blessed($_) && $_->isa("IO::Handle") );
688 } => optimize_as
689     \&Moose::Util::TypeConstraints::OptimizedConstraints::FileHandle;
690
691 # NOTE:
692 # blessed(qr/.../) returns true,.. how odd
693 subtype 'Object' => as 'Ref' =>
694     where { blessed($_) && blessed($_) ne 'Regexp' } =>
695     optimize_as \&Moose::Util::TypeConstraints::OptimizedConstraints::Object;
696
697 # This type is deprecated.
698 subtype 'Role' => as 'Object' => where { $_->can('does') } =>
699     optimize_as \&Moose::Util::TypeConstraints::OptimizedConstraints::Role;
700
701 my $_class_name_checker = sub { };
702
703 subtype 'ClassName' => as 'Str' =>
704     where { Class::MOP::is_class_loaded($_) } => optimize_as
705     \&Moose::Util::TypeConstraints::OptimizedConstraints::ClassName;
706
707 subtype 'RoleName' => as 'ClassName' => where {
708     (Class::MOP::class_of($_) || return)->isa('Moose::Meta::Role');
709 } => optimize_as
710     \&Moose::Util::TypeConstraints::OptimizedConstraints::RoleName;
711
712 ## --------------------------------------------------------
713 # parameterizable types ...
714
715 $REGISTRY->add_type_constraint(
716     Moose::Meta::TypeConstraint::Parameterizable->new(
717         name               => 'ScalarRef',
718         package_defined_in => __PACKAGE__,
719         parent             => find_type_constraint('Ref'),
720         constraint         => sub { ref($_) eq 'SCALAR' || ref($_) eq 'REF' },
721         optimized =>
722             \&Moose::Util::TypeConstraints::OptimizedConstraints::ScalarRef,
723         constraint_generator => sub {
724             my $type_parameter = shift;
725             my $check          = $type_parameter->_compiled_type_constraint;
726             return sub {
727                 return $check->(${ $_ });
728             };
729         }
730     )
731 );
732
733 $REGISTRY->add_type_constraint(
734     Moose::Meta::TypeConstraint::Parameterizable->new(
735         name               => 'ArrayRef',
736         package_defined_in => __PACKAGE__,
737         parent             => find_type_constraint('Ref'),
738         constraint         => sub { ref($_) eq 'ARRAY' },
739         optimized =>
740             \&Moose::Util::TypeConstraints::OptimizedConstraints::ArrayRef,
741         constraint_generator => sub {
742             my $type_parameter = shift;
743             my $check          = $type_parameter->_compiled_type_constraint;
744             return sub {
745                 foreach my $x (@$_) {
746                     ( $check->($x) ) || return;
747                 }
748                 1;
749                 }
750         }
751     )
752 );
753
754 $REGISTRY->add_type_constraint(
755     Moose::Meta::TypeConstraint::Parameterizable->new(
756         name               => 'HashRef',
757         package_defined_in => __PACKAGE__,
758         parent             => find_type_constraint('Ref'),
759         constraint         => sub { ref($_) eq 'HASH' },
760         optimized =>
761             \&Moose::Util::TypeConstraints::OptimizedConstraints::HashRef,
762         constraint_generator => sub {
763             my $type_parameter = shift;
764             my $check          = $type_parameter->_compiled_type_constraint;
765             return sub {
766                 foreach my $x ( values %$_ ) {
767                     ( $check->($x) ) || return;
768                 }
769                 1;
770                 }
771         }
772     )
773 );
774
775 $REGISTRY->add_type_constraint(
776     Moose::Meta::TypeConstraint::Parameterizable->new(
777         name                 => 'Maybe',
778         package_defined_in   => __PACKAGE__,
779         parent               => find_type_constraint('Item'),
780         constraint           => sub {1},
781         constraint_generator => sub {
782             my $type_parameter = shift;
783             my $check          = $type_parameter->_compiled_type_constraint;
784             return sub {
785                 return 1 if not( defined($_) ) || $check->($_);
786                 return;
787                 }
788         }
789     )
790 );
791
792 my @PARAMETERIZABLE_TYPES
793     = map { $REGISTRY->get_type_constraint($_) } qw[ScalarRef ArrayRef HashRef Maybe];
794
795 sub get_all_parameterizable_types {@PARAMETERIZABLE_TYPES}
796
797 sub add_parameterizable_type {
798     my $type = shift;
799     ( blessed $type
800             && $type->isa('Moose::Meta::TypeConstraint::Parameterizable') )
801         || __PACKAGE__->_throw_error(
802         "Type must be a Moose::Meta::TypeConstraint::Parameterizable not $type"
803         );
804     push @PARAMETERIZABLE_TYPES => $type;
805 }
806
807 ## --------------------------------------------------------
808 # end of built-in types ...
809 ## --------------------------------------------------------
810
811 {
812     my @BUILTINS = list_all_type_constraints();
813     sub list_all_builtin_type_constraints {@BUILTINS}
814 }
815
816 sub _throw_error {
817     shift;
818     require Moose;
819     unshift @_, 'Moose';
820     goto &Moose::throw_error;
821 }
822
823 1;
824
825 __END__
826
827 =pod
828
829 =head1 NAME
830
831 Moose::Util::TypeConstraints - Type constraint system for Moose
832
833 =head1 SYNOPSIS
834
835   use Moose::Util::TypeConstraints;
836
837   subtype 'Natural'
838       => as 'Int'
839       => where { $_ > 0 };
840
841   subtype 'NaturalLessThanTen'
842       => as 'Natural'
843       => where { $_ < 10 }
844       => message { "This number ($_) is not less than ten!" };
845
846   coerce 'Num'
847       => from 'Str'
848         => via { 0+$_ };
849
850   enum 'RGBColors' => qw(red green blue);
851
852   no Moose::Util::TypeConstraints;
853
854 =head1 DESCRIPTION
855
856 This module provides Moose with the ability to create custom type
857 constraints to be used in attribute definition.
858
859 =head2 Important Caveat
860
861 This is B<NOT> a type system for Perl 5. These are type constraints,
862 and they are not used by Moose unless you tell it to. No type
863 inference is performed, expressions are not typed, etc. etc. etc.
864
865 A type constraint is at heart a small "check if a value is valid"
866 function. A constraint can be associated with an attribute. This
867 simplifies parameter validation, and makes your code clearer to read,
868 because you can refer to constraints by name.
869
870 =head2 Slightly Less Important Caveat
871
872 It is B<always> a good idea to quote your type names.
873
874 This prevents Perl from trying to execute the call as an indirect
875 object call. This can be an issue when you have a subtype with the
876 same name as a valid class.
877
878 For instance:
879
880   subtype DateTime => as Object => where { $_->isa('DateTime') };
881
882 will I<just work>, while this:
883
884   use DateTime;
885   subtype DateTime => as Object => where { $_->isa('DateTime') };
886
887 will fail silently and cause many headaches. The simple way to solve
888 this, as well as future proof your subtypes from classes which have
889 yet to have been created, is to quote the type name:
890
891   use DateTime;
892   subtype 'DateTime' => as 'Object' => where { $_->isa('DateTime') };
893
894 =head2 Default Type Constraints
895
896 This module also provides a simple hierarchy for Perl 5 types, here is
897 that hierarchy represented visually.
898
899   Any
900   Item
901       Bool
902       Maybe[`a]
903       Undef
904       Defined
905           Value
906               Str
907                   Num
908                       Int
909                   ClassName
910                   RoleName
911           Ref
912               ScalarRef[`a]
913               ArrayRef[`a]
914               HashRef[`a]
915               CodeRef
916               RegexpRef
917               GlobRef
918                   FileHandle
919               Object
920
921 B<NOTE:> Any type followed by a type parameter C<[`a]> can be
922 parameterized, this means you can say:
923
924   ArrayRef[Int]    # an array of integers
925   HashRef[CodeRef] # a hash of str to CODE ref mappings
926   ScalarRef[Int]   # a reference to an integer
927   Maybe[Str]       # value may be a string, may be undefined
928
929 If Moose finds a name in brackets that it does not recognize as an
930 existing type, it assumes that this is a class name, for example
931 C<ArrayRef[DateTime]>.
932
933 B<NOTE:> Unless you parameterize a type, then it is invalid to include
934 the square brackets. I.e. C<ArrayRef[]> will be treated as a new type
935 name, I<not> as a parameterization of C<ArrayRef>.
936
937 B<NOTE:> The C<Undef> type constraint for the most part works
938 correctly now, but edge cases may still exist, please use it
939 sparingly.
940
941 B<NOTE:> The C<ClassName> type constraint does a complex package
942 existence check. This means that your class B<must> be loaded for this
943 type constraint to pass.
944
945 B<NOTE:> The C<RoleName> constraint checks a string is a I<package
946 name> which is a role, like C<'MyApp::Role::Comparable'>.
947
948 =head2 Type Constraint Naming
949
950 Type name declared via this module can only contain alphanumeric
951 characters, colons (:), and periods (.).
952
953 Since the types created by this module are global, it is suggested
954 that you namespace your types just as you would namespace your
955 modules. So instead of creating a I<Color> type for your
956 B<My::Graphics> module, you would call the type
957 I<My::Graphics::Types::Color> instead.
958
959 =head2 Use with Other Constraint Modules
960
961 This module can play nicely with other constraint modules with some
962 slight tweaking. The C<where> clause in types is expected to be a
963 C<CODE> reference which checks it's first argument and returns a
964 boolean. Since most constraint modules work in a similar way, it
965 should be simple to adapt them to work with Moose.
966
967 For instance, this is how you could use it with
968 L<Declare::Constraints::Simple> to declare a completely new type.
969
970   type 'HashOfArrayOfObjects',
971       {
972       where => IsHashRef(
973           -keys   => HasLength,
974           -values => IsArrayRef(IsObject)
975       )
976   };
977
978 For more examples see the F<t/200_examples/004_example_w_DCS.t> test
979 file.
980
981 Here is an example of using L<Test::Deep> and it's non-test
982 related C<eq_deeply> function.
983
984   type 'ArrayOfHashOfBarsAndRandomNumbers'
985       => where {
986           eq_deeply($_,
987               array_each(subhashof({
988                   bar           => isa('Bar'),
989                   random_number => ignore()
990               })))
991         };
992
993 For a complete example see the
994 F<t/200_examples/005_example_w_TestDeep.t> test file.
995
996 =head1 FUNCTIONS
997
998 =head2 Type Constraint Constructors
999
1000 The following functions are used to create type constraints.  They
1001 will also register the type constraints your create in a global
1002 registry that is used to look types up by name.
1003
1004 See the L</SYNOPSIS> for an example of how to use these.
1005
1006 =over 4
1007
1008 =item B<< subtype 'Name' => as 'Parent' => where { } ... >>
1009
1010 This creates a named subtype.
1011
1012 If you provide a parent that Moose does not recognize, it will
1013 automatically create a new class type constraint for this name.
1014
1015 When creating a named type, the C<subtype> function should either be
1016 called with the sugar helpers (C<where>, C<message>, etc), or with a
1017 name and a hashref of parameters:
1018
1019  subtype( 'Foo', { where => ..., message => ... } );
1020
1021 The valid hashref keys are C<as> (the parent), C<where>, C<message>,
1022 and C<optimize_as>.
1023
1024 =item B<< subtype as 'Parent' => where { } ... >>
1025
1026 This creates an unnamed subtype and will return the type
1027 constraint meta-object, which will be an instance of
1028 L<Moose::Meta::TypeConstraint>.
1029
1030 When creating an anonymous type, the C<subtype> function should either
1031 be called with the sugar helpers (C<where>, C<message>, etc), or with
1032 just a hashref of parameters:
1033
1034  subtype( { where => ..., message => ... } );
1035
1036 =item B<class_type ($class, ?$options)>
1037
1038 Creates a new subtype of C<Object> with the name C<$class> and the
1039 metaclass L<Moose::Meta::TypeConstraint::Class>.
1040
1041 =item B<role_type ($role, ?$options)>
1042
1043 Creates a C<Role> type constraint with the name C<$role> and the
1044 metaclass L<Moose::Meta::TypeConstraint::Role>.
1045
1046 =item B<maybe_type ($type)>
1047
1048 Creates a type constraint for either C<undef> or something of the
1049 given type.
1050
1051 =item B<duck_type ($name, \@methods)>
1052
1053 This will create a subtype of Object and test to make sure the value
1054 C<can()> do the methods in C<\@methods>.
1055
1056 This is intended as an easy way to accept non-Moose objects that
1057 provide a certain interface. If you're using Moose classes, we
1058 recommend that you use a C<requires>-only Role instead.
1059
1060 =item B<duck_type (\@methods)>
1061
1062 If passed an ARRAY reference as the only parameter instead of the
1063 C<$name>, C<\@methods> pair, this will create an unnamed duck type.
1064 This can be used in an attribute definition like so:
1065
1066   has 'cache' => (
1067       is  => 'ro',
1068       isa => duck_type( [qw( get_set )] ),
1069   );
1070
1071 =item B<enum ($name, \@values)>
1072
1073 This will create a basic subtype for a given set of strings.
1074 The resulting constraint will be a subtype of C<Str> and
1075 will match any of the items in C<\@values>. It is case sensitive.
1076 See the L</SYNOPSIS> for a simple example.
1077
1078 B<NOTE:> This is not a true proper enum type, it is simply
1079 a convenient constraint builder.
1080
1081 =item B<enum (\@values)>
1082
1083 If passed an ARRAY reference as the only parameter instead of the
1084 C<$name>, C<\@values> pair, this will create an unnamed enum. This
1085 can then be used in an attribute definition like so:
1086
1087   has 'sort_order' => (
1088       is  => 'ro',
1089       isa => enum([qw[ ascending descending ]]),
1090   );
1091
1092 =item B<as 'Parent'>
1093
1094 This is just sugar for the type constraint construction syntax.
1095
1096 It takes a single argument, which is the name of a parent type.
1097
1098 =item B<where { ... }>
1099
1100 This is just sugar for the type constraint construction syntax.
1101
1102 It takes a subroutine reference as an argument. When the type
1103 constraint is tested, the reference is run with the value to be tested
1104 in C<$_>. This reference should return true or false to indicate
1105 whether or not the constraint check passed.
1106
1107 =item B<message { ... }>
1108
1109 This is just sugar for the type constraint construction syntax.
1110
1111 It takes a subroutine reference as an argument. When the type
1112 constraint fails, then the code block is run with the value provided
1113 in C<$_>. This reference should return a string, which will be used in
1114 the text of the exception thrown.
1115
1116 =item B<optimize_as { ... }>
1117
1118 This can be used to define a "hand optimized" version of your
1119 type constraint which can be used to avoid traversing a subtype
1120 constraint hierarchy.
1121
1122 B<NOTE:> You should only use this if you know what you are doing,
1123 all the built in types use this, so your subtypes (assuming they
1124 are shallow) will not likely need to use this.
1125
1126 =item B<< type 'Name' => where { } ... >>
1127
1128 This creates a base type, which has no parent.
1129
1130 The C<type> function should either be called with the sugar helpers
1131 (C<where>, C<message>, etc), or with a name and a hashref of
1132 parameters:
1133
1134   type( 'Foo', { where => ..., message => ... } );
1135
1136 The valid hashref keys are C<where>, C<message>, and C<optimize_as>.
1137
1138 =back
1139
1140 =head2 Type Constraint Utilities
1141
1142 =over 4
1143
1144 =item B<< match_on_type $value => ( $type => \&action, ... ?\&default ) >>
1145
1146 This is a utility function for doing simple type based dispatching similar to
1147 match/case in OCaml and case/of in Haskell. It is not as featureful as those
1148 languages, nor does not it support any kind of automatic destructuring
1149 bind. Here is a simple Perl pretty printer dispatching over the core Moose
1150 types.
1151
1152   sub ppprint {
1153       my $x = shift;
1154       match_on_type $x => (
1155           HashRef => sub {
1156               my $hash = shift;
1157               '{ '
1158                   . (
1159                   join ", " => map { $_ . ' => ' . ppprint( $hash->{$_} ) }
1160                       sort keys %$hash
1161                   ) . ' }';
1162           },
1163           ArrayRef => sub {
1164               my $array = shift;
1165               '[ ' . ( join ", " => map { ppprint($_) } @$array ) . ' ]';
1166           },
1167           CodeRef   => sub {'sub { ... }'},
1168           RegexpRef => sub { 'qr/' . $_ . '/' },
1169           GlobRef   => sub { '*' . B::svref_2object($_)->NAME },
1170           Object    => sub { $_->can('to_string') ? $_->to_string : $_ },
1171           ScalarRef => sub { '\\' . ppprint( ${$_} ) },
1172           Num       => sub {$_},
1173           Str       => sub { '"' . $_ . '"' },
1174           Undef     => sub {'undef'},
1175           => sub { die "I don't know what $_ is" }
1176       );
1177   }
1178
1179 Or a simple JSON serializer:
1180
1181   sub to_json {
1182       my $x = shift;
1183       match_on_type $x => (
1184           HashRef => sub {
1185               my $hash = shift;
1186               '{ '
1187                   . (
1188                   join ", " =>
1189                       map { '"' . $_ . '" : ' . to_json( $hash->{$_} ) }
1190                       sort keys %$hash
1191                   ) . ' }';
1192           },
1193           ArrayRef => sub {
1194               my $array = shift;
1195               '[ ' . ( join ", " => map { to_json($_) } @$array ) . ' ]';
1196           },
1197           Num   => sub {$_},
1198           Str   => sub { '"' . $_ . '"' },
1199           Undef => sub {'null'},
1200           => sub { die "$_ is not acceptable json type" }
1201       );
1202   }
1203
1204 The matcher is done by mapping a C<$type> to an C<\&action>. The C<$type> can
1205 be either a string type or a L<Moose::Meta::TypeConstraint> object, and
1206 C<\&action> is a subroutine reference. This function will dispatch on the
1207 first match for C<$value>. It is possible to have a catch-all by providing an
1208 additional subroutine reference as the final argument to C<match_on_type>.
1209
1210 =back
1211
1212 =head2 Type Coercion Constructors
1213
1214 You can define coercions for type constraints, which allow you to
1215 automatically transform values to something valid for the type
1216 constraint. If you ask your accessor to coerce, then Moose will run
1217 the type-coercion code first, followed by the type constraint
1218 check. This feature should be used carefully as it is very powerful
1219 and could easily take off a limb if you are not careful.
1220
1221 See the L</SYNOPSIS> for an example of how to use these.
1222
1223 =over 4
1224
1225 =item B<< coerce 'Name' => from 'OtherName' => via { ... } >>
1226
1227 This defines a coercion from one type to another. The C<Name> argument
1228 is the type you are coercing I<to>.
1229
1230 =item B<from 'OtherName'>
1231
1232 This is just sugar for the type coercion construction syntax.
1233
1234 It takes a single type name (or type object), which is the type being
1235 coerced I<from>.
1236
1237 =item B<via { ... }>
1238
1239 This is just sugar for the type coercion construction syntax.
1240
1241 It takes a subroutine reference. This reference will be called with
1242 the value to be coerced in C<$_>. It is expected to return a new value
1243 of the proper type for the coercion.
1244
1245 =back
1246
1247 =head2 Creating and Finding Type Constraints
1248
1249 These are additional functions for creating and finding type
1250 constraints. Most of these functions are not available for
1251 importing. The ones that are importable as specified.
1252
1253 =over 4
1254
1255 =item B<find_type_constraint($type_name)>
1256
1257 This function can be used to locate the L<Moose::Meta::TypeConstraint>
1258 object for a named type.
1259
1260 This function is importable.
1261
1262 =item B<register_type_constraint($type_object)>
1263
1264 This function will register a L<Moose::Meta::TypeConstraint> with the
1265 global type registry.
1266
1267 This function is importable.
1268
1269 =item B<normalize_type_constraint_name($type_constraint_name)>
1270
1271 This method takes a type constraint name and returns the normalized
1272 form. This removes any whitespace in the string.
1273
1274 =item B<create_type_constraint_union($pipe_separated_types | @type_constraint_names)>
1275
1276 This can take a union type specification like C<'Int|ArrayRef[Int]'>,
1277 or a list of names. It returns a new
1278 L<Moose::Meta::TypeConstraint::Union> object.
1279
1280 =item B<create_parameterized_type_constraint($type_name)>
1281
1282 Given a C<$type_name> in the form of C<'BaseType[ContainerType]'>,
1283 this will create a new L<Moose::Meta::TypeConstraint::Parameterized>
1284 object. The C<BaseType> must exist already exist as a parameterizable
1285 type.
1286
1287 =item B<create_class_type_constraint($class, $options)>
1288
1289 Given a class name this function will create a new
1290 L<Moose::Meta::TypeConstraint::Class> object for that class name.
1291
1292 The C<$options> is a hash reference that will be passed to the
1293 L<Moose::Meta::TypeConstraint::Class> constructor (as a hash).
1294
1295 =item B<create_role_type_constraint($role, $options)>
1296
1297 Given a role name this function will create a new
1298 L<Moose::Meta::TypeConstraint::Role> object for that role name.
1299
1300 The C<$options> is a hash reference that will be passed to the
1301 L<Moose::Meta::TypeConstraint::Role> constructor (as a hash).
1302
1303 =item B<create_enum_type_constraint($name, $values)>
1304
1305 Given a enum name this function will create a new
1306 L<Moose::Meta::TypeConstraint::Enum> object for that enum name.
1307
1308 =item B<create_duck_type_constraint($name, $methods)>
1309
1310 Given a duck type name this function will create a new
1311 L<Moose::Meta::TypeConstraint::DuckType> object for that enum name.
1312
1313 =item B<find_or_parse_type_constraint($type_name)>
1314
1315 Given a type name, this first attempts to find a matching constraint
1316 in the global registry.
1317
1318 If the type name is a union or parameterized type, it will create a
1319 new object of the appropriate, but if given a "regular" type that does
1320 not yet exist, it simply returns false.
1321
1322 When given a union or parameterized type, the member or base type must
1323 already exist.
1324
1325 If it creates a new union or parameterized type, it will add it to the
1326 global registry.
1327
1328 =item B<find_or_create_isa_type_constraint($type_name)>
1329
1330 =item B<find_or_create_does_type_constraint($type_name)>
1331
1332 These functions will first call C<find_or_parse_type_constraint>. If
1333 that function does not return a type, a new anonymous type object will
1334 be created.
1335
1336 The C<isa> variant will use C<create_class_type_constraint> and the
1337 C<does> variant will use C<create_role_type_constraint>.
1338
1339 =item B<get_type_constraint_registry>
1340
1341 Returns the L<Moose::Meta::TypeConstraint::Registry> object which
1342 keeps track of all type constraints.
1343
1344 =item B<list_all_type_constraints>
1345
1346 This will return a list of type constraint names in the global
1347 registry. You can then fetch the actual type object using
1348 C<find_type_constraint($type_name)>.
1349
1350 =item B<list_all_builtin_type_constraints>
1351
1352 This will return a list of builtin type constraints, meaning those
1353 which are defined in this module. See the L<Default Type Constraints>
1354 section for a complete list.
1355
1356 =item B<export_type_constraints_as_functions>
1357
1358 This will export all the current type constraints as functions into
1359 the caller's namespace (C<Int()>, C<Str()>, etc). Right now, this is
1360 mostly used for testing, but it might prove useful to others.
1361
1362 =item B<get_all_parameterizable_types>
1363
1364 This returns all the parameterizable types that have been registered,
1365 as a list of type objects.
1366
1367 =item B<add_parameterizable_type($type)>
1368
1369 Adds C<$type> to the list of parameterizable types
1370
1371 =back
1372
1373 =head1 BUGS
1374
1375 See L<Moose/BUGS> for details on reporting bugs.
1376
1377 =head1 AUTHOR
1378
1379 Stevan Little E<lt>stevan@iinteractive.comE<gt>
1380
1381 =head1 COPYRIGHT AND LICENSE
1382
1383 Copyright 2006-2010 by Infinity Interactive, Inc.
1384
1385 L<http://www.iinteractive.com>
1386
1387 This library is free software; you can redistribute it and/or modify
1388 it under the same terms as Perl itself.
1389
1390 =cut