Make sure weak attributes remain weak when cloning (Moose 2.0007)
[gitmo/Mouse.git] / xs-src / Mouse.xs
index 10f6c09..1b124c7 100644 (file)
@@ -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);
             }
         }