The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Faker::Generator::Unique;

use Bubblegum::Class;
use Bubblegum::Constraints -minimal;
use Bubblegum::Functions 'raise';

has generator => (
    is       => 'ro',
    isa      => _obj,
    required => 1
);

has max_retries => (
    is      => 'ro',
    isa     => _str,
    default => 10000
);

my $values = {};

sub AUTOLOAD {
    my $self = _obj shift;
    my ($package, $formatter) =
        split /::(\w+)$/, our $AUTOLOAD;

    if ($formatter) {
        my $count = -1;
        while ($count++ <= $self->max_retries) {
            my $data   = $self->generator->format($formatter, @_);
            my $chksum = $data->digest->encode;
            next if exists $values->{$formatter}{$chksum};
            return $values->{$formatter}{$chksum} = $data;
        }
        raise qq{
            Maximum retries of "$count" reached without finding a unique value
        };
    }
    else {
        raise qq{
            Can't locate object method "$formatter" via package "$package"
        };
    }
}

sub DESTROY {
    # noop
}

1;