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);
}
}