bump version and update Changes
[gitmo/Moose.git] / lib / Moose / Util / TypeConstraints.pm
1
2 package Moose::Util::TypeConstraints;
3
4 use strict;
5 use warnings;
6
7 use Carp ();
8 use List::MoreUtils qw( all );
9 use Scalar::Util 'blessed';
10 use Moose::Exporter;
11
12 our $VERSION   = '0.62_02';
13 $VERSION = eval $VERSION;
14 our $AUTHORITY = 'cpan:STEVAN';
15
16 ## --------------------------------------------------------
17 # Prototyped subs must be predeclared because we have a
18 # circular dependency with Moose::Meta::Attribute et. al.
19 # so in case of us being use'd first the predeclaration
20 # ensures the prototypes are in scope when consumers are
21 # compiled.
22
23 # dah sugah!
24 sub where       (&);
25 sub via         (&);
26 sub message     (&);
27 sub optimize_as (&);
28
29 ## private stuff ...
30 sub _create_type_constraint ($$$;$$);
31 sub _install_type_coercions ($$);
32
33 ## --------------------------------------------------------
34
35 use Moose::Meta::TypeConstraint;
36 use Moose::Meta::TypeConstraint::Union;
37 use Moose::Meta::TypeConstraint::Parameterized;
38 use Moose::Meta::TypeConstraint::Parameterizable;
39 use Moose::Meta::TypeConstraint::Class;
40 use Moose::Meta::TypeConstraint::Role;
41 use Moose::Meta::TypeConstraint::Enum;
42 use Moose::Meta::TypeCoercion;
43 use Moose::Meta::TypeCoercion::Union;
44 use Moose::Meta::TypeConstraint::Registry;
45 use Moose::Util::TypeConstraints::OptimizedConstraints;
46
47 Moose::Exporter->setup_import_methods(
48     as_is => [
49         qw(
50             type subtype class_type role_type as where message optimize_as
51             coerce from via
52             enum
53             find_type_constraint
54             register_type_constraint )
55     ],
56     _export_to_main => 1,
57 );
58
59 ## --------------------------------------------------------
60 ## type registry and some useful functions for it
61 ## --------------------------------------------------------
62
63 my $REGISTRY = Moose::Meta::TypeConstraint::Registry->new;
64
65 sub get_type_constraint_registry         { $REGISTRY }
66 sub list_all_type_constraints            { keys %{$REGISTRY->type_constraints} }
67 sub export_type_constraints_as_functions {
68     my $pkg = caller();
69     no strict 'refs';
70     foreach my $constraint (keys %{$REGISTRY->type_constraints}) {
71         my $tc = $REGISTRY->get_type_constraint($constraint)->_compiled_type_constraint;
72         *{"${pkg}::${constraint}"} = sub { $tc->($_[0]) ? 1 : undef }; # the undef is for compat
73     }
74 }
75
76 sub create_type_constraint_union {
77     my @type_constraint_names;
78
79     if (scalar @_ == 1 && _detect_type_constraint_union($_[0])) {
80         @type_constraint_names = _parse_type_constraint_union($_[0]);
81     }
82     else {
83         @type_constraint_names = @_;
84     }
85     
86     (scalar @type_constraint_names >= 2)
87         || Moose->throw_error("You must pass in at least 2 type names to make a union");
88
89     my @type_constraints = map {
90         find_or_parse_type_constraint($_) ||
91          Moose->throw_error("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
99 sub create_parameterized_type_constraint {
100     my $type_constraint_name = shift;
101     my ($base_type, $type_parameter) = _parse_parameterized_type_constraint($type_constraint_name);
102
103     (defined $base_type && defined $type_parameter)
104         || Moose->throw_error("Could not parse type name ($type_constraint_name) correctly");
105
106     if ($REGISTRY->has_type_constraint($base_type)) {
107         my $base_type_tc = $REGISTRY->get_type_constraint($base_type);
108         return _create_parameterized_type_constraint(
109             $base_type_tc,
110             $type_parameter
111         );
112     } else {
113         Moose->throw_error("Could not locate the base type ($base_type)");
114     }
115 }
116
117 sub _create_parameterized_type_constraint {
118     my ( $base_type_tc, $type_parameter ) = @_;
119     if ( $base_type_tc->can('parameterize') ) {
120         return $base_type_tc->parameterize($type_parameter);
121     } else {
122         return Moose::Meta::TypeConstraint::Parameterized->new(
123             name => $base_type_tc->name . '[' . $type_parameter . ']',
124             parent => $base_type_tc,
125             type_parameter => find_or_create_isa_type_constraint($type_parameter),
126         );
127     }
128 }                                       
129
130 #should we also support optimized checks?
131 sub create_class_type_constraint {
132     my ( $class, $options ) = @_;
133
134     # too early for this check
135     #find_type_constraint("ClassName")->check($class)
136     #    || Moose->throw_error("Can't create a class type constraint because '$class' is not a class name");
137
138     my %options = (
139         class => $class,
140         name  => $class,
141         %{ $options || {} },
142     );
143
144     $options{name} ||= "__ANON__";
145
146     Moose::Meta::TypeConstraint::Class->new( %options );
147 }
148
149 sub create_role_type_constraint {
150     my ( $role, $options ) = @_;
151
152     # too early for this check
153     #find_type_constraint("ClassName")->check($class)
154     #    || Moose->throw_error("Can't create a class type constraint because '$class' is not a class name");
155
156     my %options = (
157         role => $role,
158         name => $role,
159         %{ $options || {} },
160     );
161
162     $options{name} ||= "__ANON__";
163
164     Moose::Meta::TypeConstraint::Role->new( %options );
165 }
166
167
168 sub find_or_create_type_constraint {
169     my ( $type_constraint_name, $options_for_anon_type ) = @_;
170
171     if ( my $constraint = find_or_parse_type_constraint($type_constraint_name) ) {
172         return $constraint;
173     }
174     elsif ( defined $options_for_anon_type ) {
175         # NOTE:
176         # if there is no $options_for_anon_type
177         # specified, then we assume they don't
178         # want to create one, and return nothing.
179
180         # otherwise assume that we should create
181         # an ANON type with the $options_for_anon_type
182         # options which can be passed in. It should
183         # be noted that these don't get registered
184         # so we need to return it.
185         # - SL
186         return Moose::Meta::TypeConstraint->new(
187             name => '__ANON__',
188             %{$options_for_anon_type}
189         );
190     }
191
192     return;
193 }
194
195 sub find_or_create_isa_type_constraint {
196     my $type_constraint_name = shift;
197     find_or_parse_type_constraint($type_constraint_name) || create_class_type_constraint($type_constraint_name)
198 }
199
200 sub find_or_create_does_type_constraint {
201     my $type_constraint_name = shift;
202     find_or_parse_type_constraint($type_constraint_name) || create_role_type_constraint($type_constraint_name)
203 }
204
205 sub find_or_parse_type_constraint {
206     my $type_constraint_name = normalize_type_constraint_name(shift);
207     my $constraint;
208     
209     if ($constraint = find_type_constraint($type_constraint_name)) {
210         return $constraint;
211     } elsif (_detect_type_constraint_union($type_constraint_name)) {
212         $constraint = create_type_constraint_union($type_constraint_name);
213     } elsif (_detect_parameterized_type_constraint($type_constraint_name)) {
214         $constraint = create_parameterized_type_constraint($type_constraint_name);
215     } else {
216         return;
217     }
218
219     $REGISTRY->add_type_constraint($constraint);
220     return $constraint;
221 }
222
223 sub normalize_type_constraint_name {
224     my $type_constraint_name = shift;
225     $type_constraint_name =~ s/\s//g;
226     return $type_constraint_name;
227 }
228
229 sub _confess {
230     my $error = shift;
231
232     local $Carp::CarpLevel = $Carp::CarpLevel + 1;
233     Carp::confess($error);
234 }
235
236 ## --------------------------------------------------------
237 ## exported functions ...
238 ## --------------------------------------------------------
239
240 sub find_type_constraint {
241     my $type = shift;
242
243     if ( blessed $type and $type->isa("Moose::Meta::TypeConstraint") ) {
244         return $type;
245     }
246     else {
247         return unless $REGISTRY->has_type_constraint($type);
248         return $REGISTRY->get_type_constraint($type);
249     }
250 }
251
252 sub register_type_constraint {
253     my $constraint = shift;
254     Moose->throw_error("can't register an unnamed type constraint") unless defined $constraint->name;
255     $REGISTRY->add_type_constraint($constraint);
256     return $constraint;
257 }
258
259 # type constructors
260
261 sub type {
262     splice(@_, 1, 0, undef);
263     goto &_create_type_constraint;
264 }
265
266 sub subtype {
267     # NOTE:
268     # this adds an undef for the name
269     # if this is an anon-subtype:
270     #   subtype(Num => where { $_ % 2 == 0 }) # anon 'even' subtype
271     #     or
272     #   subtype(Num => where { $_ % 2 == 0 }) message { "$_ must be an even number" }
273     #
274     # but if the last arg is not a code ref then it is a subtype
275     # alias:
276     #
277     #   subtype(MyNumbers => as Num); # now MyNumbers is the same as Num
278     # ... yeah I know it's ugly code
279     # - SL
280     unshift @_ => undef if scalar @_ == 2 && ( 'CODE' eq ref( $_[-1] ) );
281     unshift @_ => undef
282         if scalar @_ == 3 && all { ref($_) =~ /^(?:CODE|HASH)$/ } @_[ 1, 2 ];
283     goto &_create_type_constraint;
284 }
285
286 sub class_type {
287     register_type_constraint(
288         create_class_type_constraint(
289             $_[0],
290             ( defined($_[1]) ? $_[1] : () ),
291         )
292     );
293 }
294
295 sub role_type ($;$) {
296     register_type_constraint(
297         create_role_type_constraint(
298             $_[0],
299             ( defined($_[1]) ? $_[1] : () ),
300         )
301     );
302 }
303
304 sub coerce {
305     my ($type_name, @coercion_map) = @_;
306     _install_type_coercions($type_name, \@coercion_map);
307 }
308
309 sub as          { @_ }
310 sub from        { @_ }
311 sub where   (&) { $_[0] }
312 sub via     (&) { $_[0] }
313
314 sub message     (&) { +{ message   => $_[0] } }
315 sub optimize_as (&) { +{ optimized => $_[0] } }
316
317 sub enum {
318     my ($type_name, @values) = @_;
319     # NOTE:
320     # if only an array-ref is passed then
321     # you get an anon-enum
322     # - SL
323     if (ref $type_name eq 'ARRAY' && !@values) {
324         @values    = @$type_name;
325         $type_name = undef;
326     }
327     (scalar @values >= 2)
328         || Moose->throw_error("You must have at least two values to enumerate through");
329     my %valid = map { $_ => 1 } @values;
330
331     register_type_constraint(
332         create_enum_type_constraint(
333             $type_name,
334             \@values,
335         )
336     );
337 }
338
339 sub create_enum_type_constraint {
340     my ( $type_name, $values ) = @_;
341
342     Moose::Meta::TypeConstraint::Enum->new(
343         name   => $type_name || '__ANON__',
344         values => $values,
345     );
346 }
347
348 ## --------------------------------------------------------
349 ## desugaring functions ...
350 ## --------------------------------------------------------
351
352 sub _create_type_constraint ($$$;$$) {
353     my $name   = shift;
354     my $parent = shift;
355     my $check  = shift;
356
357     my ( $message, $optimized );
358     for (@_) {
359         $message   = $_->{message}   if exists $_->{message};
360         $optimized = $_->{optimized} if exists $_->{optimized};
361     }
362
363     my $pkg_defined_in = scalar( caller(0) );
364
365     if ( defined $name ) {
366         my $type = $REGISTRY->get_type_constraint($name);
367
368         ( $type->_package_defined_in eq $pkg_defined_in )
369             || _confess(
370                   "The type constraint '$name' has already been created in "
371                 . $type->_package_defined_in
372                 . " and cannot be created again in "
373                 . $pkg_defined_in )
374             if defined $type;
375     }
376
377     my %opts = (
378         name => $name,
379         package_defined_in => $pkg_defined_in,
380
381         ( $check     ? ( constraint => $check )     : () ),
382         ( $message   ? ( message    => $message )   : () ),
383         ( $optimized ? ( optimized  => $optimized ) : () ),
384     );
385
386     my $constraint;
387     if ( defined $parent
388         and $parent
389         = blessed $parent ? $parent : find_or_parse_type_constraint($parent) )
390     {
391         $constraint = $parent->create_child_type(%opts);
392     }
393     else {
394         $constraint = Moose::Meta::TypeConstraint->new(%opts);
395     }
396
397     $REGISTRY->add_type_constraint($constraint)
398         if defined $name;
399
400     return $constraint;
401 }
402
403 sub _install_type_coercions ($$) {
404     my ($type_name, $coercion_map) = @_;
405     my $type = find_type_constraint($type_name);
406     (defined $type)
407         || Moose->throw_error("Cannot find type '$type_name', perhaps you forgot to load it.");
408     if ($type->has_coercion) {
409         $type->coercion->add_type_coercions(@$coercion_map);
410     }
411     else {
412         my $type_coercion = Moose::Meta::TypeCoercion->new(
413             type_coercion_map => $coercion_map,
414             type_constraint   => $type
415         );
416         $type->coercion($type_coercion);
417     }
418 }
419
420 ## --------------------------------------------------------
421 ## type notation parsing ...
422 ## --------------------------------------------------------
423
424 {
425     # All I have to say is mugwump++ cause I know
426     # do not even have enough regexp-fu to be able
427     # to have written this (I can only barely
428     # understand it as it is)
429     # - SL
430
431     use re "eval";
432
433     my $valid_chars = qr{[\w:]};
434     my $type_atom   = qr{ $valid_chars+ };
435
436     my $any;
437
438     my $type                = qr{  $valid_chars+  (?: \[ \s* (??{$any})   \s* \] )? }x;
439     my $type_capture_parts  = qr{ ($valid_chars+) (?: \[ \s* ((??{$any})) \s* \] )? }x;
440     my $type_with_parameter = qr{  $valid_chars+      \[ \s* (??{$any})   \s* \]    }x;
441
442     my $op_union = qr{ \s* \| \s* }x;
443     my $union    = qr{ $type (?: $op_union $type )+ }x;
444
445     $any = qr{ $type | $union }x;
446
447     sub _parse_parameterized_type_constraint {
448         { no warnings 'void'; $any; } # force capture of interpolated lexical
449         $_[0] =~ m{ $type_capture_parts }x;
450         return ($1, $2);
451     }
452
453     sub _detect_parameterized_type_constraint {
454         { no warnings 'void'; $any; } # force capture of interpolated lexical
455         $_[0] =~ m{ ^ $type_with_parameter $ }x;
456     }
457
458     sub _parse_type_constraint_union {
459         { no warnings 'void'; $any; } # force capture of interpolated lexical
460         my $given = shift;
461         my @rv;
462         while ( $given =~ m{ \G (?: $op_union )? ($type) }gcx ) {
463             push @rv => $1;
464         }
465         (pos($given) eq length($given))
466             || Moose->throw_error("'$given' didn't parse (parse-pos="
467                      . pos($given)
468                      . " and str-length="
469                      . length($given)
470                      . ")");
471         @rv;
472     }
473
474     sub _detect_type_constraint_union {
475         { no warnings 'void'; $any; } # force capture of interpolated lexical
476         $_[0] =~ m{^ $type $op_union $type ( $op_union .* )? $}x;
477     }
478 }
479
480 ## --------------------------------------------------------
481 # define some basic built-in types
482 ## --------------------------------------------------------
483
484 # By making these classes immutable before creating all the types we
485 # below, we avoid repeatedly calling the slow MOP-based accessors.
486 $_->make_immutable(
487     inline_constructor => 1,
488     constructor_name   => "_new",
489
490     # these are Class::MOP accessors, so they need inlining
491     inline_accessors => 1
492     ) for grep { $_->is_mutable }
493     map { $_->meta }
494     qw(
495     Moose::Meta::TypeConstraint
496     Moose::Meta::TypeConstraint::Union
497     Moose::Meta::TypeConstraint::Parameterized
498     Moose::Meta::TypeConstraint::Parameterizable
499     Moose::Meta::TypeConstraint::Class
500     Moose::Meta::TypeConstraint::Role
501     Moose::Meta::TypeConstraint::Enum
502     Moose::Meta::TypeConstraint::Registry
503 );
504
505 type 'Any'  => where { 1 }; # meta-type including all
506 type 'Item' => where { 1 }; # base-type
507
508 subtype 'Undef'   => as 'Item' => where { !defined($_) };
509 subtype 'Defined' => as 'Item' => where {  defined($_) };
510
511 subtype 'Bool'
512     => as 'Item'
513     => where { !defined($_) || $_ eq "" || "$_" eq '1' || "$_" eq '0' };
514
515 subtype 'Value'
516     => as 'Defined'
517     => where { !ref($_) }
518     => optimize_as \&Moose::Util::TypeConstraints::OptimizedConstraints::Value;
519
520 subtype 'Ref'
521     => as 'Defined'
522     => where {  ref($_) }
523     => optimize_as \&Moose::Util::TypeConstraints::OptimizedConstraints::Ref;
524
525 subtype 'Str'
526     => as 'Value'
527     => where { 1 }
528     => optimize_as \&Moose::Util::TypeConstraints::OptimizedConstraints::Str;
529
530 subtype 'Num'
531     => as 'Value'
532     => where { Scalar::Util::looks_like_number($_) }
533     => optimize_as \&Moose::Util::TypeConstraints::OptimizedConstraints::Num;
534
535 subtype 'Int'
536     => as 'Num'
537     => where { "$_" =~ /^-?[0-9]+$/ }
538     => optimize_as \&Moose::Util::TypeConstraints::OptimizedConstraints::Int;
539
540 subtype 'ScalarRef' => as 'Ref' => where { ref($_) eq 'SCALAR' } => optimize_as \&Moose::Util::TypeConstraints::OptimizedConstraints::ScalarRef;
541 subtype 'CodeRef'   => as 'Ref' => where { ref($_) eq 'CODE'   } => optimize_as \&Moose::Util::TypeConstraints::OptimizedConstraints::CodeRef;
542 subtype 'RegexpRef' => as 'Ref' => where { ref($_) eq 'Regexp' } => optimize_as \&Moose::Util::TypeConstraints::OptimizedConstraints::RegexpRef;
543 subtype 'GlobRef'   => as 'Ref' => where { ref($_) eq 'GLOB'   } => optimize_as \&Moose::Util::TypeConstraints::OptimizedConstraints::GlobRef;
544
545 # NOTE:
546 # scalar filehandles are GLOB refs,
547 # but a GLOB ref is not always a filehandle
548 subtype 'FileHandle'
549     => as 'GlobRef'
550     => where { Scalar::Util::openhandle($_) || ( blessed($_) && $_->isa("IO::Handle") ) }
551     => optimize_as \&Moose::Util::TypeConstraints::OptimizedConstraints::FileHandle;
552
553 # NOTE:
554 # blessed(qr/.../) returns true,.. how odd
555 subtype 'Object'
556     => as 'Ref'
557     => where { blessed($_) && blessed($_) ne 'Regexp' }
558     => optimize_as \&Moose::Util::TypeConstraints::OptimizedConstraints::Object;
559
560 subtype 'Role'
561     => as 'Object'
562     => where { $_->can('does') }
563     => optimize_as \&Moose::Util::TypeConstraints::OptimizedConstraints::Role;
564
565 my $_class_name_checker = sub {
566 };
567
568 subtype 'ClassName'
569     => as 'Str'
570     => where { Class::MOP::is_class_loaded($_) }
571     => optimize_as \&Moose::Util::TypeConstraints::OptimizedConstraints::ClassName;
572
573 ## --------------------------------------------------------
574 # parameterizable types ...
575
576 $REGISTRY->add_type_constraint(
577     Moose::Meta::TypeConstraint::Parameterizable->new(
578         name                 => 'ArrayRef',
579         package_defined_in   => __PACKAGE__,
580         parent               => find_type_constraint('Ref'),
581         constraint           => sub { ref($_) eq 'ARRAY'  },
582         optimized            => \&Moose::Util::TypeConstraints::OptimizedConstraints::ArrayRef,
583         constraint_generator => sub {
584             my $type_parameter = shift;
585             my $check = $type_parameter->_compiled_type_constraint;
586             return sub {
587                 foreach my $x (@$_) {
588                     ($check->($x)) || return
589                 } 1;
590             }
591         }
592     )
593 );
594
595 $REGISTRY->add_type_constraint(
596     Moose::Meta::TypeConstraint::Parameterizable->new(
597         name                 => 'HashRef',
598         package_defined_in   => __PACKAGE__,
599         parent               => find_type_constraint('Ref'),
600         constraint           => sub { ref($_) eq 'HASH'  },
601         optimized            => \&Moose::Util::TypeConstraints::OptimizedConstraints::HashRef,
602         constraint_generator => sub {
603             my $type_parameter = shift;
604             my $check = $type_parameter->_compiled_type_constraint;
605             return sub {
606                 foreach my $x (values %$_) {
607                     ($check->($x)) || return
608                 } 1;
609             }
610         }
611     )
612 );
613
614 $REGISTRY->add_type_constraint(
615     Moose::Meta::TypeConstraint::Parameterizable->new(
616         name                 => 'Maybe',
617         package_defined_in   => __PACKAGE__,
618         parent               => find_type_constraint('Item'),
619         constraint           => sub { 1 },
620         constraint_generator => sub {
621             my $type_parameter = shift;
622             my $check = $type_parameter->_compiled_type_constraint;
623             return sub {
624                 return 1 if not(defined($_)) || $check->($_);
625                 return;
626             }
627         }
628     )
629 );
630
631 my @PARAMETERIZABLE_TYPES = map {
632     $REGISTRY->get_type_constraint($_)
633 } qw[ArrayRef HashRef Maybe];
634
635 sub get_all_parameterizable_types { @PARAMETERIZABLE_TYPES }
636 sub add_parameterizable_type {
637     my $type = shift;
638     (blessed $type && $type->isa('Moose::Meta::TypeConstraint::Parameterizable'))
639         || Moose->throw_error("Type must be a Moose::Meta::TypeConstraint::Parameterizable not $type");
640     push @PARAMETERIZABLE_TYPES => $type;
641 }
642
643 ## --------------------------------------------------------
644 # end of built-in types ...
645 ## --------------------------------------------------------
646
647 {
648     my @BUILTINS = list_all_type_constraints();
649     sub list_all_builtin_type_constraints { @BUILTINS }
650 }
651
652 1;
653
654 __END__
655
656 =pod
657
658 =head1 NAME
659
660 Moose::Util::TypeConstraints - Type constraint system for Moose
661
662 =head1 SYNOPSIS
663
664   use Moose::Util::TypeConstraints;
665
666   type 'Num' => where { Scalar::Util::looks_like_number($_) };
667
668   subtype 'Natural'
669       => as 'Int'
670       => where { $_ > 0 };
671
672   subtype 'NaturalLessThanTen'
673       => as 'Natural'
674       => where { $_ < 10 }
675       => message { "This number ($_) is not less than ten!" };
676
677   coerce 'Num'
678       => from 'Str'
679         => via { 0+$_ };
680
681   enum 'RGBColors' => qw(red green blue);
682
683 =head1 DESCRIPTION
684
685 This module provides Moose with the ability to create custom type
686 contraints to be used in attribute definition.
687
688 =head2 Important Caveat
689
690 This is B<NOT> a type system for Perl 5. These are type constraints,
691 and they are not used by Moose unless you tell it to. No type
692 inference is performed, expression are not typed, etc. etc. etc.
693
694 This is simply a means of creating small constraint functions which
695 can be used to simplify your own type-checking code, with the added
696 side benefit of making your intentions clearer through self-documentation.
697
698 =head2 Slightly Less Important Caveat
699
700 It is B<always> a good idea to quote your type and subtype names.
701
702 This is to prevent perl from trying to execute the call as an indirect
703 object call. This issue only seems to come up when you have a subtype
704 the same name as a valid class, but when the issue does arise it tends
705 to be quite annoying to debug.
706
707 So for instance, this:
708
709   subtype DateTime => as Object => where { $_->isa('DateTime') };
710
711 will I<Just Work>, while this:
712
713   use DateTime;
714   subtype DateTime => as Object => where { $_->isa('DateTime') };
715
716 will fail silently and cause many headaches. The simple way to solve
717 this, as well as future proof your subtypes from classes which have
718 yet to have been created yet, is to simply do this:
719
720   use DateTime;
721   subtype 'DateTime' => as 'Object' => where { $_->isa('DateTime') };
722
723 =head2 Default Type Constraints
724
725 This module also provides a simple hierarchy for Perl 5 types, here is
726 that hierarchy represented visually.
727
728   Any
729   Item
730       Bool
731       Maybe[`a]
732       Undef
733       Defined
734           Value
735               Num
736                 Int
737               Str
738                 ClassName
739           Ref
740               ScalarRef
741               ArrayRef[`a]
742               HashRef[`a]
743               CodeRef
744               RegexpRef
745               GlobRef
746                 FileHandle
747               Object
748                   Role
749
750 B<NOTE:> Any type followed by a type parameter C<[`a]> can be
751 parameterized, this means you can say:
752
753   ArrayRef[Int]    # an array of integers
754   HashRef[CodeRef] # a hash of str to CODE ref mappings
755   Maybe[Str]       # value may be a string, may be undefined
756
757 B<NOTE:> Unless you parameterize a type, then it is invalid to
758 include the square brackets. I.e. C<ArrayRef[]> will be
759 literally interpreted as a type name.
760
761 B<NOTE:> The C<Undef> type constraint for the most part works
762 correctly now, but edge cases may still exist, please use it
763 sparringly.
764
765 B<NOTE:> The C<ClassName> type constraint does a complex package
766 existence check. This means that your class B<must> be loaded for
767 this type constraint to pass. I know this is not ideal for all,
768 but it is a saner restriction than most others.
769
770 =head2 Type Constraint Naming
771
772 Since the types created by this module are global, it is suggested
773 that you namespace your types just as you would namespace your
774 modules. So instead of creating a I<Color> type for your B<My::Graphics>
775 module, you would call the type I<My::Graphics::Color> instead.
776
777 =head2 Use with Other Constraint Modules
778
779 This module should play fairly nicely with other constraint
780 modules with only some slight tweaking. The C<where> clause
781 in types is expected to be a C<CODE> reference which checks
782 it's first argument and returns a boolean. Since most constraint
783 modules work in a similar way, it should be simple to adapt
784 them to work with Moose.
785
786 For instance, this is how you could use it with
787 L<Declare::Constraints::Simple> to declare a completely new type.
788
789   type 'HashOfArrayOfObjects'
790       => IsHashRef(
791           -keys   => HasLength,
792           -values => IsArrayRef( IsObject ));
793
794 For more examples see the F<t/200_examples/204_example_w_DCS.t>
795 test file.
796
797 Here is an example of using L<Test::Deep> and it's non-test
798 related C<eq_deeply> function.
799
800   type 'ArrayOfHashOfBarsAndRandomNumbers'
801       => where {
802           eq_deeply($_,
803               array_each(subhashof({
804                   bar           => isa('Bar'),
805                   random_number => ignore()
806               })))
807         };
808
809 For a complete example see the
810 F<t/200_examples/205_example_w_TestDeep.t> test file.
811
812 =head1 FUNCTIONS
813
814 =head2 Type Constraint Constructors
815
816 The following functions are used to create type constraints.
817 They will then register the type constraints in a global store
818 where Moose can get to them if it needs to.
819
820 See the L<SYNOPSIS> for an example of how to use these.
821
822 =over 4
823
824 =item B<type ($name, $where_clause)>
825
826 This creates a base type, which has no parent.
827
828 =item B<subtype ($name, $parent, $where_clause, ?$message)>
829
830 This creates a named subtype.
831
832 =item B<subtype ($parent, $where_clause, ?$message)>
833
834 This creates an unnamed subtype and will return the type
835 constraint meta-object, which will be an instance of
836 L<Moose::Meta::TypeConstraint>.
837
838 =item B<class_type ($class, ?$options)>
839
840 Creates a type constraint with the name C<$class> and the metaclass
841 L<Moose::Meta::TypeConstraint::Class>.
842
843 =item B<role_type ($role, ?$options)>
844
845 Creates a type constraint with the name C<$role> and the metaclass
846 L<Moose::Meta::TypeConstraint::Role>.
847
848 =item B<enum ($name, @values)>
849
850 This will create a basic subtype for a given set of strings.
851 The resulting constraint will be a subtype of C<Str> and
852 will match any of the items in C<@values>. It is case sensitive.
853 See the L<SYNOPSIS> for a simple example.
854
855 B<NOTE:> This is not a true proper enum type, it is simple
856 a convient constraint builder.
857
858 =item B<enum (\@values)>
859
860 If passed an ARRAY reference instead of the C<$name>, C<@values> pair,
861 this will create an unnamed enum. This can then be used in an attribute
862 definition like so:
863
864   has 'sort_order' => (
865       is  => 'ro',
866       isa => enum([qw[ ascending descending ]]),
867   );
868
869 =item B<as>
870
871 This is just sugar for the type constraint construction syntax.
872
873 =item B<where>
874
875 This is just sugar for the type constraint construction syntax.
876
877 Takes a block/code ref as an argument. When the type constraint is
878 tested, the supplied code is run with the value to be tested in
879 $_. This block should return true or false to indicate whether or not
880 the constraint check passed.
881
882 =item B<message>
883
884 This is just sugar for the type constraint construction syntax.
885
886 Takes a block/code ref as an argument. When the type constraint fails,
887 then the code block is run (with the value provided in $_). This code
888 ref should return a string, which will be used in the text of the
889 exception thrown.
890
891 =item B<optimize_as>
892
893 This can be used to define a "hand optimized" version of your
894 type constraint which can be used to avoid traversing a subtype
895 constraint heirarchy.
896
897 B<NOTE:> You should only use this if you know what you are doing,
898 all the built in types use this, so your subtypes (assuming they
899 are shallow) will not likely need to use this.
900
901 =back
902
903 =head2 Type Coercion Constructors
904
905 Type constraints can also contain type coercions as well. If you
906 ask your accessor to coerce, then Moose will run the type-coercion
907 code first, followed by the type constraint check. This feature
908 should be used carefully as it is very powerful and could easily
909 take off a limb if you are not careful.
910
911 See the L<SYNOPSIS> for an example of how to use these.
912
913 =over 4
914
915 =item B<coerce>
916
917 =item B<from>
918
919 This is just sugar for the type coercion construction syntax.
920
921 =item B<via>
922
923 This is just sugar for the type coercion construction syntax.
924
925 =back
926
927 =head2 Type Constraint Construction & Locating
928
929 =over 4
930
931 =item B<normalize_type_constraint_name ($type_constraint_name)>
932
933 Given a string that is expected to match a type constraint, will normalize the
934 string so that extra whitespace and newlines are removed.
935
936 =item B<create_type_constraint_union ($pipe_seperated_types | @type_constraint_names)>
937
938 Given string with C<$pipe_seperated_types> or a list of C<@type_constraint_names>,
939 this will return a L<Moose::Meta::TypeConstraint::Union> instance.
940
941 =item B<create_parameterized_type_constraint ($type_name)>
942
943 Given a C<$type_name> in the form of:
944
945   BaseType[ContainerType]
946
947 this will extract the base type and container type and build an instance of
948 L<Moose::Meta::TypeConstraint::Parameterized> for it.
949
950 =item B<create_class_type_constraint ($class, ?$options)>
951
952 Given a class name it will create a new L<Moose::Meta::TypeConstraint::Class>
953 object for that class name.
954
955 =item B<create_role_type_constraint ($role, ?$options)>
956
957 Given a role name it will create a new L<Moose::Meta::TypeConstraint::Role>
958 object for that role name.
959
960 =item B<create_enum_type_constraint ($name, $values)>
961
962 =item B<find_or_parse_type_constraint ($type_name)>
963
964 This will attempt to find or create a type constraint given the a C<$type_name>.
965 If it cannot find it in the registry, it will see if it should be a union or
966 container type an create one if appropriate
967
968 =item B<find_or_create_type_constraint ($type_name, ?$options_for_anon_type)>
969
970 This function will first call C<find_or_parse_type_constraint> with the type name.
971
972 If no type is found or created, but C<$options_for_anon_type> are provided, it
973 will create the corresponding type.
974
975 This was used by the C<does> and C<isa> parameters to L<Moose::Meta::Attribute>
976 and are now superseded by C<find_or_create_isa_type_constraint> and
977 C<find_or_create_does_type_constraint>.
978
979 =item B<find_or_create_isa_type_constraint ($type_name)>
980
981 =item B<find_or_create_does_type_constraint ($type_name)>
982
983 Attempts to parse the type name using C<find_or_parse_type_constraint> and if
984 no appropriate constraint is found will create a new anonymous one.
985
986 The C<isa> variant will use C<create_class_type_constraint> and the C<does>
987 variant will use C<create_role_type_constraint>.
988
989 =item B<find_type_constraint ($type_name)>
990
991 This function can be used to locate a specific type constraint
992 meta-object, of the class L<Moose::Meta::TypeConstraint> or a
993 derivative. What you do with it from there is up to you :)
994
995 =item B<register_type_constraint ($type_object)>
996
997 This function will register a named type constraint with the type registry.
998
999 =item B<get_type_constraint_registry>
1000
1001 Fetch the L<Moose::Meta::TypeConstraint::Registry> object which
1002 keeps track of all type constraints.
1003
1004 =item B<list_all_type_constraints>
1005
1006 This will return a list of type constraint names, you can then
1007 fetch them using C<find_type_constraint ($type_name)> if you
1008 want to.
1009
1010 =item B<list_all_builtin_type_constraints>
1011
1012 This will return a list of builtin type constraints, meaning,
1013 those which are defined in this module. See the section
1014 labeled L<Default Type Constraints> for a complete list.
1015
1016 =item B<export_type_constraints_as_functions>
1017
1018 This will export all the current type constraints as functions
1019 into the caller's namespace. Right now, this is mostly used for
1020 testing, but it might prove useful to others.
1021
1022 =item B<get_all_parameterizable_types>
1023
1024 This returns all the parameterizable types that have been registered.
1025
1026 =item B<add_parameterizable_type ($type)>
1027
1028 Adds C<$type> to the list of parameterizable types
1029
1030 =back
1031
1032 =head2 Namespace Management
1033
1034 =over 4
1035
1036 =item B<unimport>
1037
1038 This will remove all the type constraint keywords from the
1039 calling class namespace.
1040
1041 =back
1042
1043 =head1 BUGS
1044
1045 All complex software has bugs lurking in it, and this module is no
1046 exception. If you find a bug please either email me, or add the bug
1047 to cpan-RT.
1048
1049 =head1 AUTHOR
1050
1051 Stevan Little E<lt>stevan@iinteractive.comE<gt>
1052
1053 =head1 COPYRIGHT AND LICENSE
1054
1055 Copyright 2006-2008 by Infinity Interactive, Inc.
1056
1057 L<http://www.iinteractive.com>
1058
1059 This library is free software; you can redistribute it and/or modify
1060 it under the same terms as Perl itself.
1061
1062 =cut