---
name: "Clone::Choose"
section: "3pm"
platform: "linux"
package: "perl-clone-choose"
version: "0.010-4"
release: "Arch Linux 2026-11-01"
platforms: ["linux"]
url: "https://new.carta.tech/Clone::Choose"
---

# Clone::Choose(3pm)

Choose appropriate clone utility

## NAME

Clone::Choose - Choose appropriate clone utility

## SYNOPSIS

```
  use Clone::Choose;
  my $data = {
      value => 42,
      href  => {
          set   => [ 'foo', 'bar' ],
          value => 'baz',
      },
  };
  my $cloned_data = clone $data;
  # it's also possible to use Clone::Choose and pass a clone preference
  use Clone::Choose qw(:Storable);
```

## DESCRIPTION

`"Clone::Choose"` checks several different modules which provides a `clone()` function and selects an appropriate one. The default preference is

```
  Clone
  Storable
  Clone::PP
```

This list might evolve in future. Please see "EXPORTS" how to pick a particular one.

## EXPORTS

`"Clone::Choose"` exports `clone()` by default.

One can explicitly import `"clone"` by using

```
  use Clone::Choose qw(clone);
```

or pick a particular `"clone"` implementation

```
  use Clone::Choose qw(:Storable clone);
```

The exported implementation is resolved dynamically, which means that any using module can either rely on the default backend preference or choose a particular one.

It is also possible to select a particular `"clone"` backend by setting the environment variable CLONE\_CHOOSE\_PREFERRED\_BACKEND to your preferred backend.

This also means, an already chosen import can't be modified like

```
  use Clone::Choose qw(clone :Storable);
```

When one seriously needs different clone implementations, our *recommended* way to use them would be:

```
  use Clone::Choose (); # do not import
  my ($xs_clone, $st_clone);
  { local @Clone::Choose::BACKENDS = (Clone => "clone"); $xs_clone = Clone::Choose->can("clone"); }
  { local @Clone::Choose::BACKENDS = (Storable => "dclone"); $st_clone = Clone::Choose->can("clone"); }
```

Don't misinterpret *recommended* - modifying `@Clone::Choose::BACKENDS` has a lot of pitfalls and is unreliable beside such small examples. Do not hesitate open a request with an appropriate proposal for choosing implementations dynamically.

The use of `@Clone::Choose::BACKENDS` is discouraged and will be deprecated as soon as anyone provides a better idea.

## PACKAGE METHODS

### backend

`"backend"` tells the caller about the dynamic chosen backend:

```
  use Clone::Choose;
  say Clone::Choose->backend; # Clone
```

This method currently exists for debug purposes only.

### get\_backends

`"get_backends"` returns a list of the currently supported backends.

## AUTHOR

```
  Jens Rehsack <rehsack at cpan dot org>
  Stefan Hermes <hermes at cpan dot org>
```

## BUGS

Please report any bugs or feature requests to `"bug-Clone-Choose at rt.cpan.org"`, or through the web interface at \<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Clone-Choose\>. I will be notified, and then you'll automatically be notified of progress on your bug as I make changes.

## SUPPORT

You can find documentation for this module with the perldoc command.

```
  perldoc Clone::Choose
```

You can also look for information at:

- •

  RT: CPAN's request tracker

  \<http://rt.cpan.org/NoAuth/Bugs.html?Dist=Clone-Choose\>

- •

  AnnoCPAN: Annotated CPAN documentation

  \<http://annocpan.org/dist/Clone-Choose\>

- •

  CPAN Ratings

  \<http://cpanratings.perl.org/d/Clone-Choose\>

- •

  Search CPAN

  \<http://search.cpan.org/dist/Clone-Choose/\>

## LICENSE AND COPYRIGHT

```
  Copyright 2017 Jens Rehsack
  Copyright 2017 Stefan Hermes
```

This program is free software; you can redistribute it and/or modify it under the terms of either: the GNU General Public License as published by the Free Software Foundation; or the Artistic License.

See http://dev.perl.org/licenses/ for more information.

## SEE ALSO

Clone, Clone::PP, Storable
