1 package Moose::Util::TypeConstraints::Builtins;
6 use List::MoreUtils ();
7 use Scalar::Util qw( blessed looks_like_number reftype );
9 sub type { goto &Moose::Util::TypeConstraints::type }
10 sub subtype { goto &Moose::Util::TypeConstraints::subtype }
11 sub as { goto &Moose::Util::TypeConstraints::as }
12 sub where (&) { goto &Moose::Util::TypeConstraints::where }
13 sub optimize_as (&) { goto &Moose::Util::TypeConstraints::optimize_as }
14 sub inline_as (&) { goto &Moose::Util::TypeConstraints::inline_as }
19 type 'Any' # meta-type including all
23 subtype 'Item' # base-type
29 => where { !defined($_) }
30 => inline_as { '!defined(' . $_[1] . ')' };
34 => where { defined($_) }
35 => inline_as { 'defined(' . $_[1] . ')' };
39 => where { !defined($_) || $_ eq "" || "$_" eq '1' || "$_" eq '0' }
41 '!defined(' . $_[1] . ') '
42 . '|| ' . $_[1] . ' eq "" '
43 . '|| "' . $_[1] . '" eq "1" '
44 . '|| "' . $_[1] . '" eq "0"'
50 => inline_as { 'defined(' . $_[1] . ') && !ref(' . $_[1] . ')' };
55 => inline_as { 'ref(' . $_[1] . ')' };
59 => where { ref(\$_) eq 'SCALAR' || ref(\(my $val = $_)) eq 'SCALAR' }
61 'defined(' . $_[1] . ') '
62 . '&& (ref(\\' . $_[1] . ') eq "SCALAR"'
63 . '|| ref(\\(my $val = ' . $_[1] . ')) eq "SCALAR")'
68 => where { Scalar::Util::looks_like_number($_) }
70 '!ref(' . $_[1] . ') '
71 . '&& Scalar::Util::looks_like_number(' . $_[1] . ')'
76 => where { (my $val = $_) =~ /\A-?[0-9]+\z/ }
78 'defined(' . $_[1] . ') '
79 . '&& !ref(' . $_[1] . ') '
80 . '&& (my $val = ' . $_[1] . ') =~ /\A-?[0-9]+\z/'
85 => where { ref($_) eq 'CODE' }
86 => inline_as { 'ref(' . $_[1] . ') eq "CODE"' };
90 => where( \&_RegexpRef )
92 'Moose::Util::TypeConstraints::Builtins::_RegexpRef(' . $_[1] . ')'
97 => where { ref($_) eq 'GLOB' }
98 => inline_as { 'ref(' . $_[1] . ') eq "GLOB"' };
100 # NOTE: scalar filehandles are GLOB refs, but a GLOB ref is not always a
105 (ref($_) eq "GLOB" && Scalar::Util::openhandle($_))
106 || (blessed($_) && $_->isa("IO::Handle"));
109 '(ref(' . $_[1] . ') eq "GLOB" '
110 . '&& Scalar::Util::openhandle(' . $_[1] . ')) '
111 . '|| (Scalar::Util::blessed(' . $_[1] . ') '
112 . '&& ' . $_[1] . '->isa("IO::Handle"))'
117 => where { blessed($_) }
118 => inline_as { 'Scalar::Util::blessed(' . $_[1] . ')' };
120 # This type is deprecated.
123 => where { $_->can('does') };
127 => where { Class::MOP::is_class_loaded($_) }
128 => inline_as { 'Class::MOP::is_class_loaded(' . $_[1] . ')' };
133 (Class::MOP::class_of($_) || return)->isa('Moose::Meta::Role');
136 'Class::MOP::is_class_loaded(' . $_[1] . ') '
137 . '&& (Class::MOP::class_of(' . $_[1] . ') || return)->isa('
138 . '"Moose::Meta::Role"'
142 $registry->add_type_constraint(
143 Moose::Meta::TypeConstraint::Parameterizable->new(
145 package_defined_in => __PACKAGE__,
147 Moose::Util::TypeConstraints::find_type_constraint('Ref'),
148 constraint => sub { ref($_) eq 'SCALAR' || ref($_) eq 'REF' },
149 constraint_generator => sub {
150 my $type_parameter = shift;
151 my $check = $type_parameter->_compiled_type_constraint;
153 return $check->( ${$_} );
157 'ref(' . $_[1] . ') eq "SCALAR" '
158 . '|| ref(' . $_[1] . ') eq "REF"'
160 inline_generator => sub {
162 my $type_parameter = shift;
164 '(ref(' . $val . ') eq "SCALAR" || ref(' . $val . ') eq "REF") '
165 . '&& ' . $type_parameter->_inline_check('${(' . $val . ')}')
170 $registry->add_type_constraint(
171 Moose::Meta::TypeConstraint::Parameterizable->new(
173 package_defined_in => __PACKAGE__,
175 Moose::Util::TypeConstraints::find_type_constraint('Ref'),
176 constraint => sub { ref($_) eq 'ARRAY' },
177 constraint_generator => sub {
178 my $type_parameter = shift;
179 my $check = $type_parameter->_compiled_type_constraint;
181 foreach my $x (@$_) {
182 ( $check->($x) ) || return;
187 inlined => sub { 'ref(' . $_[1] . ') eq "ARRAY"' },
188 inline_generator => sub {
190 my $type_parameter = shift;
192 'ref(' . $val . ') eq "ARRAY" '
193 . '&& &List::MoreUtils::all('
194 . 'sub { ' . $type_parameter->_inline_check('$_') . ' }, '
201 $registry->add_type_constraint(
202 Moose::Meta::TypeConstraint::Parameterizable->new(
204 package_defined_in => __PACKAGE__,
206 Moose::Util::TypeConstraints::find_type_constraint('Ref'),
207 constraint => sub { ref($_) eq 'HASH' },
208 constraint_generator => sub {
209 my $type_parameter = shift;
210 my $check = $type_parameter->_compiled_type_constraint;
212 foreach my $x ( values %$_ ) {
213 ( $check->($x) ) || return;
218 inlined => sub { 'ref(' . $_[1] . ') eq "HASH"' },
219 inline_generator => sub {
221 my $type_parameter = shift;
223 'ref(' . $val . ') eq "HASH" '
224 . '&& &List::MoreUtils::all('
225 . 'sub { ' . $type_parameter->_inline_check('$_') . ' }, '
226 . 'values %{' . $val . '}'
232 $registry->add_type_constraint(
233 Moose::Meta::TypeConstraint::Parameterizable->new(
235 package_defined_in => __PACKAGE__,
237 Moose::Util::TypeConstraints::find_type_constraint('Item'),
238 constraint => sub {1},
239 constraint_generator => sub {
240 my $type_parameter = shift;
241 my $check = $type_parameter->_compiled_type_constraint;
243 return 1 if not( defined($_) ) || $check->($_);
247 inlined => sub {'1'},
248 inline_generator => sub {
250 my $type_parameter = shift;
252 '!defined(' . $val . ') '
253 . '|| (' . $type_parameter->_inline_check($val) . ')'