Generalize inheritable class accessors
[gitmo/Mouse.git] / xs-src / Mouse.xs
index efd1e94..431d7c5 100644 (file)
@@ -530,6 +530,8 @@ BOOT:
     INSTALL_SIMPLE_PREDICATE_WITH_KEY(Class, is_anon_class, anon_serial_id);
     INSTALL_SIMPLE_READER(Class, is_immutable);
 
+    INSTALL_INHERITABLE_CLASS_ACCESSOR(strict_constructor);
+
     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");
@@ -616,45 +618,6 @@ CODE:
     mouse_class_initialize_object(aTHX_ meta, object, args, is_cloning);
 }
 
-void
-strict_constructor(SV* self, SV* value = NULL)
-CODE:
-{
-    SV* const slot      = sv_2mortal(newSVpvs_share("strict_constructor"));
-    SV* const stash_ref = mcall0(self, mouse_namespace);
-    HV* stash;
-
-    if(!(SvROK(stash_ref) && SvTYPE(SvRV(stash_ref)) == SVt_PVHV)) {
-        croak("namespace() didn't return a HASH reference");
-    }
-    stash = (HV*)SvRV(stash_ref);
-
-    if(value) { /* setter */
-        set_slot(self, slot, value);
-        mro_method_changed_in(stash);
-    }
-
-    value = get_slot(self, slot);
-
-    if(!value) {
-        AV* const isa   = mro_get_linear_isa(stash);
-        I32 const len   = av_len(isa) + 1;
-        I32 i;
-        for(i = 1; i < len; i++) {
-            SV* const klass = MOUSE_av_at(isa, i);
-            SV* const meta  = get_metaclass(klass);
-            if(!SvOK(meta)){
-                continue; /* skip non-Mouse classes */
-            }
-            value = get_slot(meta, slot);
-            if(value) {
-                break;
-            }
-        }
-    }
-    ST(0) = value ? value : &PL_sv_no;
-}
-
 MODULE = Mouse  PACKAGE = Mouse::Meta::Role
 
 BOOT: