X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=gitmo%2FMouse.git;a=blobdiff_plain;f=xs-src%2FMouse.xs;h=1b124c7c21e6abd6665847d0cf38f028881a5dae;hp=10f6c0917fd699ec3cc39f6140577de34415a377;hb=f1575d9f6d73252e751770a6c7ac717237059f29;hpb=7f627364a9120ef321d5903f33fb2522657817eb diff --git a/xs-src/Mouse.xs b/xs-src/Mouse.xs index 10f6c09..1b124c7 100644 --- a/xs-src/Mouse.xs +++ b/xs-src/Mouse.xs @@ -315,7 +315,7 @@ mouse_class_initialize_object(pTHX_ SV* const meta, SV* const object, HV* const 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){ @@ -337,8 +337,16 @@ mouse_class_initialize_object(pTHX_ SV* const meta, SV* const object, HV* const 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); } }