SV*
mouse_accessor_get_self(pTHX_ I32 const ax, I32 const items, CV* const cv) {
- SV* self;
-
if(items < 1){
croak("Too few arguments for %s", GvNAME(CvGV(cv)));
}
}
if(!SvOK(MOUSE_xa_tc_code(xa))){
- XS(XS_Mouse__Util__TypeConstraints_Item); /* prototype defined in Mouse.xs */
-
tc_code = mcall0s(tc, "_compiled_type_constraint");
+ av_store(xa, MOUSE_XA_TC_CODE, newSVsv(tc_code));
- if(SvROK(tc_code) && SvTYPE(SvRV(tc_code))
- && CvXSUB((CV*)SvRV(tc_code)) == XS_Mouse__Util__TypeConstraints_Item){
- /* built-in type constraints */
- mouse_tc const id = CvXSUBANY((CV*)SvRV(tc_code)).any_i32;
- av_store(xa, MOUSE_XA_TC_CODE, newSViv(id));
- }
- else{
- av_store(xa, MOUSE_XA_TC_CODE, newSVsv(tc_code));
+ if(!(SvROK(tc_code) && SvTYPE(SvRV(tc_code)) == SVt_PVCV)){
+ mouse_throw_error(MOUSE_xa_attribute(xa), tc, "Not a CODE reference");
}
}
else{
SV* const slot = MOUSE_mg_slot(mg);
SV* value;
- value = mouse_instance_get_slot(aTHX_ self, slot);
+ value = get_slot(self, slot);
/* check_lazy */
if( !value && flags & MOUSEf_ATTR_IS_LAZY ){
}
/* store value to slot */
- value = mouse_instance_set_slot(aTHX_ self, slot, value);
+ value = set_slot(self, slot, value);
}
PUSH_VALUE(value, flags);
value = mouse_apply_type_constraint(aTHX_ MOUSE_mg_xa(mg), value, flags);
}
- mouse_instance_set_slot(aTHX_ self, slot, value);
+ set_slot(self, slot, value);
if(flags & MOUSEf_ATTR_IS_WEAK_REF){
- mouse_instance_weaken_slot(aTHX_ self, slot);
+ weaken_slot(self, slot);
}
if(flags & MOUSEf_ATTR_HAS_TRIGGER){
croak("Expected exactly one argument for a reader for '%"SVf"'", slot);
}
- value = mouse_instance_get_slot(aTHX_ self, slot);
+ value = get_slot(self, slot);
ST(0) = value ? value : &PL_sv_undef;
XSRETURN(1);
}
croak("Expected exactly two argument for a writer for '%"SVf"'", slot);
}
- ST(0) = mouse_instance_set_slot(aTHX_ self, slot, ST(1));
+ ST(0) = set_slot(self, slot, ST(1));
XSRETURN(1);
}
croak("Expected exactly one argument for a clearer for '%"SVf"'", slot);
}
- value = mouse_instance_delete_slot(aTHX_ self, slot);
+ value = delete_slot(self, slot);
ST(0) = value ? value : &PL_sv_undef;
XSRETURN(1);
}
croak("Expected exactly one argument for a predicate for '%"SVf"'", slot);
}
- ST(0) = boolSV( mouse_instance_has_slot(aTHX_ self, slot) );
+ ST(0) = boolSV( has_slot(self, slot) );
XSRETURN(1);
}