our
$VERSION
=
'2.2207'
;
__PACKAGE__->meta->add_attribute(
'type_parameter'
=> (
accessor
=>
'type_parameter'
,
predicate
=>
'has_type_parameter'
,
Class::MOP::_definition_context(),
));
__PACKAGE__->meta->add_attribute(
'parameterized_from'
=> (
accessor
=>
'parameterized_from'
,
predicate
=>
'has_parameterized_from'
,
Class::MOP::_definition_context(),
));
sub
equals {
my
(
$self
,
$type_or_name
) =
@_
;
my
$other
= Moose::Util::TypeConstraints::find_type_constraint(
$type_or_name
);
return
unless
$other
->isa(__PACKAGE__);
return
(
$self
->type_parameter->equals(
$other
->type_parameter )
and
$self
->parent->equals(
$other
->parent )
);
}
sub
compile_type_constraint {
my
$self
=
shift
;
unless
(
$self
->has_type_parameter ) {
throw_exception(
CannotCreateHigherOrderTypeWithoutATypeParameter
=>
type_name
=>
$self
->name );
}
my
$type_parameter
=
$self
->type_parameter;
unless
( blessed
$type_parameter
&&
$type_parameter
->isa(
'Moose::Meta::TypeConstraint'
) ) {
throw_exception(
TypeParameterMustBeMooseMetaType
=>
type_name
=>
$self
->name );
}
foreach
my
$type
(Moose::Util::TypeConstraints::get_all_parameterizable_types()) {
if
(
my
$constraint
=
$type
->generate_constraint_for(
$self
)) {
$self
->_set_constraint(
$constraint
);
return
$self
->SUPER::compile_type_constraint;
}
}
throw_exception(
TypeConstraintCannotBeUsedForAParameterizableType
=>
type_name
=>
$self
->name,
parent_type_name
=>
$self
->parent->name,
);
}
sub
can_be_inlined {
my
$self
=
shift
;
return
$self
->has_parameterized_from
&&
$self
->parameterized_from->has_inline_generator
&&
$self
->type_parameter->can_be_inlined;
}
sub
inline_environment {
my
$self
=
shift
;
return
{
(
$self
->has_parameterized_from
? (%{
$self
->parameterized_from->inline_environment })
: ()),
(
$self
->has_type_parameter
? (%{
$self
->type_parameter->inline_environment })
: ()),
};
}
sub
_inline_check {
my
$self
=
shift
;
return
unless
$self
->can_be_inlined;
return
$self
->parameterized_from->generate_inline_for(
$self
->type_parameter,
@_
);
}
sub
create_child_type {
my
(
$self
,
%opts
) =
@_
;
return
Moose::Meta::TypeConstraint::Parameterizable->new(
%opts
,
parent
=>
$self
);
}
1;