value = mouse_xa_apply_type_constraint(aTHX_ xa, value, flags);
}
value = set_slot(object, slot, value);
- if(SvROK(value) && flags & MOUSEf_ATTR_IS_WEAK_REF){
+ if(flags & MOUSEf_ATTR_IS_WEAK_REF && SvROK(value)){
weaken_slot(object, slot);
}
if(flags & MOUSEf_ATTR_HAS_TRIGGER){
mouse_xa_set_default(aTHX_ xa, object);
}
}
- /* don't check while cloning (or reblesseing) */
- else if(!is_cloning && flags & MOUSEf_ATTR_IS_REQUIRED) {
+ else if(is_cloning) {
+ if(flags & MOUSEf_ATTR_IS_WEAK_REF){
+ SV* const value = get_slot(object, slot);
+ if(SvROK(value)) {
+ weaken_slot(object, slot);
+ }
+ }
+ }
+ /* don't check "required" while cloning (or reblesseing) */
+ else if(flags & MOUSEf_ATTR_IS_REQUIRED) {
mouse_throw_error(attr, NULL, "Attribute (%"SVf") is required", slot);
}
}
return (AV*)SvRV(storage_ref);
}
-static void
-XS_Mouse_value_holder(pTHX_ CV* const cv PERL_UNUSED_DECL) {
+static
+XSPROTO(XS_Mouse_value_holder) {
dVAR; dXSARGS;
SV* const value = (SV*)XSANY.any_ptr;
assert(value);
/* *{$package . '::' . $name} -> *gv */
gv = gv_fetchpv(form("%"SVf"::%"SVf, package, name), GV_ADDMULTI, SVt_PVCV);
mouse_install_sub(aTHX_ gv, code_ref);
- //CvMETHOD_on((CV*)SvRV(code_ref));
+ /* CvMETHOD_on((CV*)SvRV(code_ref)); */
(void)set_slot(methods, name, code); /* $self->{methods}{$name} = $code */
}
linearized_isa() */
HV* const stash = mouse_get_namespace(aTHX_ self);
AV* const linearized_isa = mro_get_linear_isa(stash);
- I32 len;
+ I32 const len = AvFILLp(linearized_isa) + 1;
I32 i;
- len = AvFILLp(linearized_isa) + 1;
EXTEND(SP, len);
for(i = 0; i < len; i++){
PUSHs(AvARRAY(linearized_isa)[i]);
object = mouse_instance_create(aTHX_ MOUSE_xc_stash(xc));
mouse_class_initialize_object(aTHX_ meta, object, args, FALSE);
- mouse_buildall(aTHX_ xc, object, sv_2mortal(newRV_inc((SV*)args))); /* BUILDALL */
+ mouse_buildall(aTHX_ xc, object, sv_2mortal(newRV_inc((SV*)args)));
ST(0) = object; /* because object is mortal, we should return it as is */
XSRETURN(1);
}
mouse_class_initialize_object(aTHX_ meta, object, args, is_cloning);
}
+void
+_invalidate_metaclass_cache(SV* meta)
+CODE:
+{
+ AV* const xc = mouse_get_xc_if_fresh(aTHX_ meta);
+ if(xc) {
+ SV* const gen = MOUSE_xc_gen(xc);
+ sv_setuv(gen, 0U);
+ }
+ delete_slot(meta, newSVpvs_flags("_mouse_cache_", SVs_TEMP));
+}
+
+
MODULE = Mouse PACKAGE = Mouse::Meta::Role
BOOT:
get_after_method_modifiers = MOUSE_M_AFTER
PPCODE:
{
- AV* const storage = mouse_get_modifier_storage(aTHX_ self, (enum mouse_modifier_t)ix, name);
+ AV* const storage = mouse_get_modifier_storage(aTHX_ self,
+ (enum mouse_modifier_t)ix, name);
I32 const len = av_len(storage) + 1;
if(GIMME_V == G_ARRAY) {
I32 i;
/* new_object */
object = mouse_instance_create(aTHX_ MOUSE_xc_stash(xc));
mouse_class_initialize_object(aTHX_ meta, object, (HV*)SvRV(args), FALSE);
- mouse_buildall(aTHX_ xc, object, args); /* BUILDALL */
+ /* BUILDALL */
+ mouse_buildall(aTHX_ xc, object, args);
ST(0) = object; /* because object is mortal, we should return it as is */
XSRETURN(1);
}