Add a comment to Changes
[gitmo/Mouse.git] / xs-src / Mouse.xs
index 627eabd..0a94ec8 100644 (file)
@@ -150,7 +150,7 @@ mouse_class_update_xc(pTHX_ SV* const metaclass PERL_UNUSED_DECL, HV* const stas
     sv_setuv(MOUSE_xc_gen(xc), mro_get_pkg_gen(stash));
 }
 
-AV*
+static AV*
 mouse_get_xc(pTHX_ SV* const metaclass) {
     AV* xc;
     SV* gen;
@@ -202,7 +202,7 @@ mouse_get_xc(pTHX_ SV* const metaclass) {
     return xc;
 }
 
-HV*
+static HV*
 mouse_buildargs(pTHX_ SV* metaclass, SV* const klass, I32 ax, I32 items) {
     HV* args;
 
@@ -237,7 +237,7 @@ mouse_buildargs(pTHX_ SV* metaclass, SV* const klass, I32 ax, I32 items) {
     return args;
 }
 
-void
+static void
 mouse_class_initialize_object(pTHX_ SV* const meta, SV* const object, HV* const args, bool const ignore_triggers) {
     AV* const xc    = mouse_get_xc(aTHX_ meta);
     AV* const attrs = MOUSE_xc_attrall(xc);
@@ -257,8 +257,8 @@ mouse_class_initialize_object(pTHX_ SV* const meta, SV* const object, HV* const
     }
 
     for(i = 0; i < len; i++){
-        SV* const attr = AvARRAY(attrs)[i];
-        AV* const xa   = mouse_get_xa(aTHX_ AvARRAY(attrs)[i]);
+        SV* const attr = MOUSE_av_at(attrs, i);
+        AV* const xa   = mouse_get_xa(aTHX_ attr);
 
         SV* const slot     = MOUSE_xa_slot(xa);
         U16 const flags    = (U16)MOUSE_xa_flags(xa);
@@ -306,7 +306,7 @@ mouse_class_initialize_object(pTHX_ SV* const meta, SV* const object, HV* const
     }
 
     if(MOUSE_xc_flags(xc) & MOUSEf_XC_IS_ANON){
-        set_slot(object, newSVpvs_flags("__ANON__", SVs_TEMP), meta);
+        set_slot(object, newSVpvs_flags("__METACLASS__", SVs_TEMP), meta);
     }
 
     FREETMPS;
@@ -403,8 +403,8 @@ CODE:
         SV*  sv = code_ref;  /* used in tryAMAGICunDEREF */
         SV** sp = &sv;       /* used in tryAMAGICunDEREF */
         tryAMAGICunDEREF(to_cv); /* try \&{$code} */
-        if(SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVCV){
-            mouse_throw_error(self, NULL, "Not a CODE reference");
+        if(!(SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVCV)){
+            mouse_throw_error(self, NULL, "You must pass a CODE reference to add_method");
         }
         code_ref = sv;
     }
@@ -419,14 +419,16 @@ CODE:
 
     set_slot(methods, name, code); /* $self->{methods}{$name} = $code */
 
-    /* TODO: name the CODE ref if it's anonymous */
-    //code_entity = (CV*)SvRV(code_ref);
-    //if(CvANON(code_entity)
-    //    && CvGV(code_entity) /* a cv under construction has no gv */ ){
+    /* name the CODE ref if it's anonymous */
+    {
+        CV* const code_entity = (CV*)SvRV(code_ref);
+        if(CvANON(code_entity)
+            && CvGV(code_entity) /* a cv under construction has no gv */ ){
 
-    //    CvGV(code_entity) = gv;
-    //    CvANON_off(code_entity);
-    //}
+            CvGV(code_entity) = gv;
+            CvANON_off(code_entity);
+        }
+    }
 }
 
 MODULE = Mouse  PACKAGE = Mouse::Meta::Class
@@ -434,11 +436,11 @@ MODULE = Mouse  PACKAGE = Mouse::Meta::Class
 BOOT:
     INSTALL_SIMPLE_READER(Class, roles);
     INSTALL_SIMPLE_PREDICATE_WITH_KEY(Class, is_anon_class, anon_serial_id);
-    newCONSTSUB(gv_stashpvs("Mouse::Meta::Class", TRUE), "constructor_class",
-        newSVpvs("Mouse::Meta::Method::Constructor::XS"));
-    newCONSTSUB(gv_stashpvs("Mouse::Meta::Class", TRUE), "destructor_class",
-        newSVpvs("Mouse::Meta::Method::Destructor::XS"));
 
+    INSTALL_CLASS_HOLDER(Class, method_metaclass,     "Mouse::Meta::Method");
+    INSTALL_CLASS_HOLDER(Class, attribute_metaclass,  "Mouse::Meta::Attribute");
+    INSTALL_CLASS_HOLDER(Class, constructor_class,    "Mouse::Meta::Method::Constructor::XS");
+    INSTALL_CLASS_HOLDER(Class, destructor_class,     "Mouse::Meta::Method::Destructor::XS");
 
     newCONSTSUB(gv_stashpvs("Mouse::Meta::Method::Constructor::XS", TRUE), "_generate_constructor",
         newRV_inc((SV*)get_cvs("Mouse::Object::new", TRUE)));
@@ -470,7 +472,7 @@ get_all_attributes(SV* self)
 PPCODE:
 {
     AV* const xc        = mouse_get_xc(aTHX_ self);
-    AV* const all_attrs =  MOUSE_xc_attrall(xc);
+    AV* const all_attrs = MOUSE_xc_attrall(xc);
     I32 const len       = AvFILLp(all_attrs) + 1;
     I32 i;
 
@@ -481,7 +483,7 @@ PPCODE:
 }
 
 SV*
-new_object_(SV* meta, ...)
+new_object(SV* meta, ...)
 CODE:
 {
     AV* const xc   = mouse_get_xc(aTHX_ meta);
@@ -490,7 +492,8 @@ CODE:
     RETVAL = mouse_instance_create(aTHX_ MOUSE_xc_stash(xc));
     mouse_class_initialize_object(aTHX_ meta, RETVAL, args, FALSE);
 }
-
+OUTPUT:
+    RETVAL
 
 void
 _initialize_object(SV* meta, SV* object, HV* args, bool ignore_triggers = FALSE)
@@ -499,22 +502,14 @@ CODE:
     mouse_class_initialize_object(aTHX_ meta, object, args, ignore_triggers);
 }
 
-void
-__xc(SV* meta)
-PPCODE:
-{
-    AV* const xc = mouse_get_xc(aTHX_ meta);
-    mXPUSHu(MOUSE_xc_flags(xc));
-    mXPUSHs(newRV_inc((SV*)MOUSE_xc_buildall(xc)));
-    mXPUSHs(newRV_inc((SV*)MOUSE_xc_demolishall(xc)));
-}
-
 MODULE = Mouse  PACKAGE = Mouse::Meta::Role
 
 BOOT:
     INSTALL_SIMPLE_READER_WITH_KEY(Role, get_roles, roles);
     INSTALL_SIMPLE_PREDICATE_WITH_KEY(Role, is_anon_role, anon_serial_id);
 
+    INSTALL_CLASS_HOLDER(Role, method_metaclass,  "Mouse::Meta::Role::Method");
+
 MODULE = Mouse  PACKAGE = Mouse::Object
 
 SV*
@@ -565,7 +560,7 @@ CODE:
 
         PUSHMARK(SP);
         EXTEND(SP, 2);
-        PUSHs(RETVAL);
+        PUSHs(RETVAL); /* self */
         PUSHs(args);
         PUTBACK;