#define CHECK_INSTANCE(instance) STMT_START{ \
if(!(SvROK(instance) && SvTYPE(SvRV(instance)) == SVt_PVHV)){ \
- croak("Invalid object for instance managers"); \
+ croak("Invalid object instance"); \
} \
} STMT_END
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)));
}
* before calling methods, so SvGETMAGIC(self) is not necessarily needed here.
*/
- self = ST(0);
- if(!IsObject(self)){
- croak("Cant call %s as a class method", GvNAME(CvGV(cv)));
- }
- return self;
+ return ST(0);
}
}
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(!IsCodeRef(tc_code)){
+ mouse_throw_error(MOUSE_xa_attribute(xa), tc, "Not a CODE reference");
}
}
else{
}
if(flags & MOUSEf_TC_IS_ARRAYREF){
- AV* const av = (AV*)SvRV(value);
+ AV* av;
I32 len;
I32 i;
- if(SvTYPE(av) != SVt_PVAV){
+ if(!IsArrayRef(value)){
croak("Mouse-panic: Not an ARRAY reference");
}
+ av = (AV*)SvRV(value);
len = av_len(av) + 1;
EXTEND(SP, len);
for(i = 0; i < len; i++){
}
}
else if(flags & MOUSEf_TC_IS_HASHREF){
- HV* const hv = (HV*)SvRV(value);
+ HV* hv;
HE* he;
- if(SvTYPE(hv) != SVt_PVHV){
+ if(!IsHashRef(value)){
croak("Mouse-panic: Not a HASH reference");
}
+ hv = (HV*)SvRV(value);
hv_iterinit(hv);
while((he = hv_iternext(hv))){
EXTEND(SP, 2);
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 ){
- AV* const xa = MOUSE_mg_xa(mg);
+ AV* const xa = MOUSE_mg_xa(mg);
SV* const attr = MOUSE_xa_attribute(xa);
- /* get default value by $attr->default or $attr->builder */
- if(flags & MOUSEf_ATTR_HAS_DEFAULT){
- value = mcall0s(attr, "default");
-
- if(SvROK(value) && SvTYPE(SvRV(value)) == SVt_PVCV){
- value = mcall0(self, value);
- }
- }
- else if(flags & MOUSEf_ATTR_HAS_BUILDER){
+ /* get default value by $attr->builder or $attr->default */
+ if(flags & MOUSEf_ATTR_HAS_BUILDER){
SV* const builder = mcall0s(attr, "builder");
value = mcall0(self, builder);
}
+ else {
+ value = mcall0s(attr, "default");
- if(!value){
- value = sv_newmortal();
+ if(IsCodeRef(value)){
+ value = mcall0(self, value);
+ }
}
/* apply coerce and type constraint */
}
/* 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){
PUSH_VALUE(value, flags);
}
-XS(mouse_xs_accessor)
+XS(XS_Mouse_accessor)
{
dVAR; dXSARGS;
dMOUSE_self;
}
-XS(mouse_xs_reader)
+XS(XS_Mouse_reader)
{
dVAR; dXSARGS;
dMOUSE_self;
mouse_attr_get(aTHX_ self, mg);
}
-XS(mouse_xs_writer)
+XS(XS_Mouse_writer)
{
dVAR; dXSARGS;
dMOUSE_self;
return xsub;
}
-XS(mouse_xs_simple_reader)
+XS(XS_Mouse_simple_reader)
{
dVAR; dXSARGS;
dMOUSE_self;
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);
}
-XS(mouse_xs_simple_writer)
+XS(XS_Mouse_simple_writer)
{
dVAR; dXSARGS;
dMOUSE_self;
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);
}
-XS(mouse_xs_simple_clearer)
+XS(XS_Mouse_simple_clearer)
{
dVAR; dXSARGS;
dMOUSE_self;
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);
}
-XS(mouse_xs_simple_predicate)
+XS(XS_Mouse_simple_predicate)
{
dVAR; dXSARGS;
dMOUSE_self;
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);
}
-/* simple instance slot accessor */
+/* simple instance slot accessor (or Mouse::Meta::Instance) */
SV*
mouse_instance_create(pTHX_ HV* const stash) {
_generate_accessor(klass, SV* attr, metaclass)
CODE:
{
- RETVAL = mouse_instantiate_xs_accessor(aTHX_ attr, mouse_xs_accessor);
+ RETVAL = mouse_instantiate_xs_accessor(aTHX_ attr, XS_Mouse_accessor);
}
OUTPUT:
RETVAL
_generate_reader(klass, SV* attr, metaclass)
CODE:
{
- RETVAL = mouse_instantiate_xs_accessor(aTHX_ attr, mouse_xs_reader);
+ RETVAL = mouse_instantiate_xs_accessor(aTHX_ attr, XS_Mouse_reader);
}
OUTPUT:
RETVAL
_generate_writer(klass, SV* attr, metaclass)
CODE:
{
- RETVAL = mouse_instantiate_xs_accessor(aTHX_ attr, mouse_xs_writer);
+ RETVAL = mouse_instantiate_xs_accessor(aTHX_ attr, XS_Mouse_writer);
}
OUTPUT:
RETVAL
SV* const slot = mcall0s(attr, "name");
STRLEN len;
const char* const pv = SvPV_const(slot, len);
- RETVAL = mouse_install_simple_accessor(aTHX_ NULL, pv, len, mouse_xs_simple_clearer);
+ RETVAL = mouse_install_simple_accessor(aTHX_ NULL, pv, len, XS_Mouse_simple_clearer);
}
OUTPUT:
RETVAL
SV* const slot = mcall0s(attr, "name");
STRLEN len;
const char* const pv = SvPV_const(slot, len);
- RETVAL = mouse_install_simple_accessor(aTHX_ NULL, pv, len, mouse_xs_simple_predicate);
+ RETVAL = mouse_install_simple_accessor(aTHX_ NULL, pv, len, XS_Mouse_simple_predicate);
}
OUTPUT:
RETVAL