File Coverage

blib/lib/Moose/Util/TypeConstraints.pm
Criterion Covered Total %
statement 280 288 97.2
branch 106 112 94.6
condition 44 60 73.3
subroutine 66 68 97.0
pod 35 36 97.2
total 531 564 94.1


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