Make type check macros
[gitmo/Mouse.git] / xs-src / MouseAccessor.xs
index 6af6b03..b6c11cc 100644 (file)
@@ -165,7 +165,7 @@ mouse_apply_type_constraint(pTHX_ AV* const xa, SV* value, U16 const flags){
         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)) == SVt_PVCV)){
+        if(!IsCodeRef(tc_code)){
             mouse_throw_error(MOUSE_xa_attribute(xa), tc, "Not a CODE reference");
         }
     }
@@ -206,14 +206,15 @@ mouse_push_values(pTHX_ SV* const value, U16 const flags){
     }
 
     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++){
@@ -222,13 +223,14 @@ mouse_push_values(pTHX_ SV* const value, U16 const flags){
         }
     }
     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);
@@ -246,28 +248,24 @@ mouse_attr_get(pTHX_ SV* const self, MAGIC* const mg){
     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 */
@@ -276,7 +274,7 @@ mouse_attr_get(pTHX_ SV* const self, MAGIC* const mg){
         }
 
         /* store value to slot */
-        value = mouse_instance_set_slot(aTHX_ self, slot, value);
+        value = set_slot(self, slot, value);
     }
 
     PUSH_VALUE(value, flags);
@@ -291,10 +289,10 @@ mouse_attr_set(pTHX_ SV* const self, MAGIC* const mg, SV* value){
         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){
@@ -314,7 +312,7 @@ mouse_attr_set(pTHX_ SV* const self, MAGIC* const mg, SV* value){
     PUSH_VALUE(value, flags);
 }
 
-XS(mouse_xs_accessor)
+XS(XS_Mouse_accessor)
 {
     dVAR; dXSARGS;
     dMOUSE_self;
@@ -336,7 +334,7 @@ XS(mouse_xs_accessor)
 }
 
 
-XS(mouse_xs_reader)
+XS(XS_Mouse_reader)
 {
     dVAR; dXSARGS;
     dMOUSE_self;
@@ -353,7 +351,7 @@ XS(mouse_xs_reader)
     mouse_attr_get(aTHX_ self, mg);
 }
 
-XS(mouse_xs_writer)
+XS(XS_Mouse_writer)
 {
     dVAR; dXSARGS;
     dMOUSE_self;
@@ -401,7 +399,7 @@ mouse_install_simple_accessor(pTHX_ const char* const fq_name, const char* const
     return xsub;
 }
 
-XS(mouse_xs_simple_reader)
+XS(XS_Mouse_simple_reader)
 {
     dVAR; dXSARGS;
     dMOUSE_self;
@@ -412,13 +410,13 @@ XS(mouse_xs_simple_reader)
         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;
@@ -428,11 +426,11 @@ XS(mouse_xs_simple_writer)
         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;
@@ -443,12 +441,12 @@ XS(mouse_xs_simple_clearer)
         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;
@@ -458,7 +456,7 @@ XS(mouse_xs_simple_predicate)
         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);
 }
 
@@ -541,7 +539,7 @@ CV*
 _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
@@ -550,7 +548,7 @@ CV*
 _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
@@ -559,7 +557,7 @@ CV*
 _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
@@ -571,7 +569,7 @@ CODE:
     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
@@ -583,7 +581,7 @@ CODE:
     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