Add mouse_initialize_metaclass()
[gitmo/Mouse.git] / xs-src / Mouse.xs
index e5670b2..1dd44b3 100644 (file)
@@ -308,6 +308,28 @@ mouse_class_initialize_object(pTHX_ SV* const meta, SV* const object, HV* const
     LEAVE;
 }
 
+SV*
+mouse_initialize_metaclass(pTHX_ SV* const klass) {
+    SV* meta = get_metaclass(klass);
+
+    if(!SvOK(meta)){
+        dSP;
+        PUSHMARK(SP);
+
+        EXTEND(SP, 2);
+        mPUSHp("Mouse::Meta::Class", sizeof("Mouse::Meta::Class")-1);
+        PUSHs(klass);
+        PUTBACK;
+
+        call_method("initialize", G_SCALAR);
+        SPAGAIN;
+        meta = POPs;
+        PUTBACK;
+    }
+
+    return meta;
+}
+
 MODULE = Mouse  PACKAGE = Mouse
 
 PROTOTYPES: DISABLE
@@ -407,6 +429,8 @@ 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"));
 
 void
 linearized_isa(SV* self)
@@ -483,7 +507,7 @@ SV*
 new(SV* klass, ...)
 CODE:
 {
-    SV* const meta = get_metaclass(klass);
+    SV* const meta = mouse_initialize_metaclass(aTHX_ klass);
     AV* const xc   = mouse_get_xc(aTHX_ meta);
     UV const flags = MOUSE_xc_flags(xc);
     SV* args;
@@ -545,3 +569,16 @@ CODE:
 }
 OUTPUT:
     RETVAL
+
+MODULE = Mouse  PACKAGE = Mouse::Meta::Method::Constructor::XS
+
+CV*
+_generate_constructor(...)
+CODE:
+{
+    RETVAL = get_cvs("Mouse::Object::new", TRUE);
+    SvREFCNT_inc_simple_void_NN(RETVAL);
+}
+OUTPUT:
+    RETVAL
+