sub clone { my $ref = shift; ref( $ref ) or return $ref; ref( $ref ) eq 'SCALAR' and return \$$ref; ref( $ref ) eq 'HASH' and return { map+( $_, clone( $ref->{$_} )), keys %{ $ref } }; ref( $ref ) eq 'ARRAY' and return [ map clone( $ref->[$_] ), 0 .. $#{ $ref } ]; }