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);
}
}
/* *{$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 */
}