X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=xs-src%2FMouse.xs;h=ecc6e8c7ff965f1e0f734d41ee0727ac6f6b078d;hb=f3e4c7ebdc35a752e69f6031121b5cab1630b09a;hp=19d98c6eba6dd49d6e51c3e39e67a120a4b3a92d;hpb=fcdc12ac0d67969cf79745b062fd706ae56c8b92;p=gitmo%2FMouse.git diff --git a/xs-src/Mouse.xs b/xs-src/Mouse.xs index 19d98c6..ecc6e8c 100644 --- a/xs-src/Mouse.xs +++ b/xs-src/Mouse.xs @@ -123,7 +123,7 @@ mouse_class_update_xc(pTHX_ SV* const metaclass PERL_UNUSED_DECL, HV* const stas flags |= MOUSEf_XC_HAS_BUILDARGS; } - if(predicate_calls(metaclass, "__strict_constructor")){ + if(predicate_calls(metaclass, "strict_constructor")){ flags |= MOUSEf_XC_CONSTRUCTOR_IS_STRICT; } @@ -297,7 +297,7 @@ mouse_class_initialize_object(pTHX_ SV* const meta, SV* const object, HV* const I32 const len = AvFILLp(attrs) + 1; I32 i; AV* triggers_queue = NULL; - I32 used = 0; + U32 used = 0; assert(meta || object); assert(args); @@ -524,7 +524,6 @@ BOOT: INSTALL_SIMPLE_READER(Class, roles); INSTALL_SIMPLE_PREDICATE_WITH_KEY(Class, is_anon_class, anon_serial_id); INSTALL_SIMPLE_READER(Class, is_immutable); - INSTALL_SIMPLE_READER_WITH_KEY(Class, __strict_constructor, strict_constructor); INSTALL_CLASS_HOLDER(Class, method_metaclass, "Mouse::Meta::Method"); INSTALL_CLASS_HOLDER(Class, attribute_metaclass, "Mouse::Meta::Attribute"); @@ -536,7 +535,6 @@ BOOT: newCONSTSUB(gv_stashpvs("Mouse::Meta::Method::Destructor::XS", TRUE), "_generate_destructor", newRV_inc((SV*)get_cvs("Mouse::Object::DESTROY", TRUE))); - void linearized_isa(SV* self) PPCODE: @@ -613,6 +611,45 @@ 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: