sub clone { my ($value) = @_; if (ref $value) { if (blessed $value) { if ($value->can('clone')) { return $value->clone; } else { die "Sorry object is not cloneable"; } } else { if (ref $value eq 'ARRAY') { return [ map { clone( $_ ) } @$value ]; } elsif (ref $value eq 'HASH') { return { map { $_ => clone( $value->{$_} ) } keys %$value }; } else { die "Sorry cant clone that $value"; } } } else { return $value } }