fallback => 1;
-use Carp ();
-
sub new {
my($class, %args) = @_;
$check = $args{constraint};
if(defined($check) && ref($check) ne 'CODE'){
- Carp::confess("Constraint for $args{name} is not a CODE reference");
+ $class->throw_error("Constraint for $args{name} is not a CODE reference");
}
my $self = bless \%args, $class;
sub message;
sub has_coercion;
+sub check;
+
sub type_parameter;
sub __is_parameterized;
sub compile_type_constraint;
+
sub _add_type_coercions{
my $self = shift;
my $action = $_[++$i];
if(exists $has{$from}){
- Carp::confess("A coercion action already exists for '$from'");
+ $self->throw_error("A coercion action already exists for '$from'");
}
my $type = Mouse::Util::TypeConstraints::find_or_parse_type_constraint($from)
- or Carp::confess("Could not find the type constraint ($from) to coerce from");
+ or $self->throw_error("Could not find the type constraint ($from) to coerce from");
push @{$coercions}, [ $type => $action ];
}
# compile
if(exists $self->{type_constraints}){ # union type
- Carp::confess("Cannot add additional type coercions to Union types");
+ $self->throw_error("Cannot add additional type coercions to Union types");
}
else{
$self->_compile_type_coercion();
return;
}
-sub check {
- my $self = shift;
- return $self->_compiled_type_constraint->(@_);
-}
-
sub coerce {
my $self = shift;
my $coercion = $self->_compiled_type_coercion;
if(!$coercion){
- Carp::confess("Cannot coerce without a type coercion");
+ $self->throw_error("Cannot coerce without a type coercion");
}
- return $_[0] if $self->_compiled_type_constraint->(@_);
+ return $_[0] if $self->check(@_);
return $coercion->(@_);
}
$name ||= sprintf '%s[%s]', $self->name, $param->name;
my $generator = $self->{constraint_generator}
- || Carp::confess("The $name constraint cannot be used, because $param doesn't subtype from a parameterizable type");
+ || $self->throw_error("The $name constraint cannot be used, because $param doesn't subtype from a parameterizable type");
return Mouse::Meta::TypeConstraint->new(
name => $name,
sub assert_valid {
my ($self, $value) = @_;
- if(!$self->_compiled_type_constraint->($value)){
- Carp::confess($self->get_message($value));
+ if(!$self->check($value)){
+ $self->throw_error($self->get_message($value));
}
return 1;
}
+sub throw_error {
+ require Mouse::Meta::Module;
+ goto &Mouse::Meta::Module::throw_error;
+}
+
1;
__END__
SV* const tc = *av_fetch(types, i, TRUE);
SV* const c = get_slots(tc, "compiled_type_constraint");
if(!(c && mouse_tc_CodeRef(aTHX_ NULL, c))){
- sv_dump(self);
- croak("'%"SVf"' has no compiled type constraint", self);
+ mouse_throw_error(self, c, "'%"SVf"' has no compiled type constraint", self);
}
av_push(union_checks, newSVsv(c));
}
(void)set_slots(self, "compiled_type_constraint", check);
}
+bool
+check(SV* self, SV* sv)
+CODE:
+{
+ SV* const check = get_slots(self, "compiled_type_constraint");
+ if(!(check && mouse_tc_CodeRef(aTHX_ NULL, check))){
+ mouse_throw_error(self, check, "'%"SVf"' has no compiled type constraint", self);
+ }
+ RETVAL = mouse_tc_check(aTHX_ check, sv) ? TRUE : FALSE;
+}
+OUTPUT:
+ RETVAL
+