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