1 package Moose::Util::TypeConstraints::Builtins;
6 use Scalar::Util qw( blessed reftype );
8 sub type { goto &Moose::Util::TypeConstraints::type }
9 sub subtype { goto &Moose::Util::TypeConstraints::subtype }
10 sub as { goto &Moose::Util::TypeConstraints::as }
11 sub where (&) { goto &Moose::Util::TypeConstraints::where }
12 sub optimize_as (&) { goto &Moose::Util::TypeConstraints::optimize_as }
17 type 'Any' => where {1}; # meta-type including all
18 subtype 'Item' => as 'Any'; # base-type
20 subtype 'Undef' => as 'Item' => where { !defined($_) };
21 subtype 'Defined' => as 'Item' => where { defined($_) };
25 => where { !defined($_) || $_ eq "" || "$_" eq '1' || "$_" eq '0' };
31 \&Moose::Util::TypeConstraints::OptimizedConstraints::Value;
37 \&Moose::Util::TypeConstraints::OptimizedConstraints::Ref;
41 => where { ref(\$_) eq 'SCALAR' }
43 \&Moose::Util::TypeConstraints::OptimizedConstraints::Str;
47 => where { Scalar::Util::looks_like_number($_) }
49 \&Moose::Util::TypeConstraints::OptimizedConstraints::Num;
53 => where { "$_" =~ /^-?[0-9]+$/ }
55 \&Moose::Util::TypeConstraints::OptimizedConstraints::Int;
59 => where { ref($_) eq 'CODE' }
61 \&Moose::Util::TypeConstraints::OptimizedConstraints::CodeRef;
65 => where( \&Moose::Util::TypeConstraints::OptimizedConstraints::RegexpRef )
67 \&Moose::Util::TypeConstraints::OptimizedConstraints::RegexpRef;
71 => where { ref($_) eq 'GLOB' }
73 \&Moose::Util::TypeConstraints::OptimizedConstraints::GlobRef;
75 # NOTE: scalar filehandles are GLOB refs, but a GLOB ref is not always a
80 Scalar::Util::openhandle($_) || ( blessed($_) && $_->isa("IO::Handle") );
83 \&Moose::Util::TypeConstraints::OptimizedConstraints::FileHandle;
87 => where { blessed($_) }
89 \&Moose::Util::TypeConstraints::OptimizedConstraints::Object;
91 # This type is deprecated.
94 => where { $_->can('does') }
95 => optimize_as \&Moose::Util::TypeConstraints::OptimizedConstraints::Role;
99 => where { Class::MOP::is_class_loaded($_) }
101 \&Moose::Util::TypeConstraints::OptimizedConstraints::ClassName;
106 (Class::MOP::class_of($_) || return)->isa('Moose::Meta::Role');
109 \&Moose::Util::TypeConstraints::OptimizedConstraints::RoleName;
111 $registry->add_type_constraint(
112 Moose::Meta::TypeConstraint::Parameterizable->new(
114 package_defined_in => __PACKAGE__,
116 Moose::Util::TypeConstraints::find_type_constraint('Ref'),
117 constraint => sub { ref($_) eq 'SCALAR' || ref($_) eq 'REF' },
119 \&Moose::Util::TypeConstraints::OptimizedConstraints::ScalarRef,
120 constraint_generator => sub {
121 my $type_parameter = shift;
122 my $check = $type_parameter->_compiled_type_constraint;
124 return $check->( ${$_} );
130 $registry->add_type_constraint(
131 Moose::Meta::TypeConstraint::Parameterizable->new(
133 package_defined_in => __PACKAGE__,
135 Moose::Util::TypeConstraints::find_type_constraint('Ref'),
136 constraint => sub { ref($_) eq 'ARRAY' },
138 \&Moose::Util::TypeConstraints::OptimizedConstraints::ArrayRef,
139 constraint_generator => sub {
140 my $type_parameter = shift;
141 my $check = $type_parameter->_compiled_type_constraint;
143 foreach my $x (@$_) {
144 ( $check->($x) ) || return;
152 $registry->add_type_constraint(
153 Moose::Meta::TypeConstraint::Parameterizable->new(
155 package_defined_in => __PACKAGE__,
157 Moose::Util::TypeConstraints::find_type_constraint('Ref'),
158 constraint => sub { ref($_) eq 'HASH' },
160 \&Moose::Util::TypeConstraints::OptimizedConstraints::HashRef,
161 constraint_generator => sub {
162 my $type_parameter = shift;
163 my $check = $type_parameter->_compiled_type_constraint;
165 foreach my $x ( values %$_ ) {
166 ( $check->($x) ) || return;
174 $registry->add_type_constraint(
175 Moose::Meta::TypeConstraint::Parameterizable->new(
177 package_defined_in => __PACKAGE__,
179 Moose::Util::TypeConstraints::find_type_constraint('Item'),
180 constraint => sub {1},
181 constraint_generator => sub {
182 my $type_parameter = shift;
183 my $check = $type_parameter->_compiled_type_constraint;
185 return 1 if not( defined($_) ) || $check->($_);