Make instance cloning go through attribute setters
Florian Ragwitz [Fri, 13 May 2011 11:42:17 +0000 (13:42 +0200)]
This way things like weakening will be taken care of.

lib/Class/MOP/Instance.pm

index 499cc25..de37d54 100644 (file)
@@ -76,7 +76,14 @@ sub create_instance {
 
 sub clone_instance {
     my ($self, $instance) = @_;
-    bless { %$instance }, $self->_class_name;
+
+    my $clone = bless {}, $self->_class_name;
+    for my $attr ($self->get_all_attributes) {
+        $attr->set_value($clone, $attr->get_raw_value($instance))
+            if $attr->has_value($instance);
+    }
+
+    return $clone;
 }
 
 # operations on meta instance