Acme-ID-CompanyName

 view release on metacpan or  search on metacpan

lib/Acme/ID/CompanyName.pm  view on Meta::CPAN

            schema => ['bool*'],
            default => 1,
        },
        # XXX option to use some more specific words & suffixes/prefixes
        desired_initials => {
            schema => ['str*', min_len=>1, match=>qr/\A[A-Za-z]+\z/],
        },
    },
    result_naked => 1,
    examples => [
        {
            summary => 'Generate five random PT names',
            argv => [qw/5/],
            test => 0,
        },
        {
            summary => 'Generate three PT names with desired initials "ACME"',
            argv => [qw/-n3 --desired-initials ACME/],
            test => 0,
        },
    ],
};
sub gen_generic_ind_company_names {
    my %args = @_;

    my $type = $args{type} // 'PT';
    my $num_names = $args{num_names} // 1;
    my $num_words = $args{num_words} // 3;
    my $desired_initials = lc($args{desired_initials} // "");
    my $add_prefixes = $args{add_prefixes} // 1;
    my $add_suffixes = $args{add_suffixes} // 1;

    $num_words = length($desired_initials)
        if $num_words < length($desired_initials);

    my @res;
    my $name_tries = 0;
    for my $i (1..$num_names) {
        die "Can't produce that many unique company names"
            if ++$name_tries > 5*$num_names;

        my @words;
        my $word_tries = 0;
        my $has_added_prefix;
        my $has_added_suffix;
      WORD:
        for my $j (1..$num_words) {
            die "Can't produce a company name that satisfies requirements"
                if ++$word_tries > 1000;

            my $will_add_prefix =
                !$add_prefixes ? 0 :
                $has_added_prefix ? 0 :
                rand()*$num_words*6 > 1 ? 0 : 1;

            my $word;
            my $desired_initial = length($desired_initials) >= $j ?
                substr($desired_initials, $j-1, 1) : undef;

            if (!$will_add_prefix && $desired_initial) {
                die "There are no words that start with '$desired_initial'"
                    unless $Per_Letter_Words{$desired_initial};
                $word = $Per_Letter_Words{$desired_initial}->[
                    @{ $Per_Letter_Words{$desired_initial} } * rand()
                ];
            } else {
                $word = $Words[@Words * rand()];
            }
            next if $word =~ /^#/;

          ADD_PREFIX:
            {
                last unless $will_add_prefix;
                my $prefix = $Prefixes[@Prefixes * rand()];
                redo WORD if $desired_initial && substr($prefix, 0, 1) ne $desired_initial;

                # avoid prefixing e.g. 'indo-' to 'indonesia'
                last if $word =~ /^\Q$prefix\E/;

                # amalgamate letter
                if (substr($prefix, -1, 1) eq substr($word, 0, 1)) {
                    $word =~ s/^.//;
                }

                $word = "$prefix$word";
                $has_added_prefix++;
            }

          ADD_SUFFIX:
            {
                last unless $add_suffixes;
                last unless !$has_added_suffix && rand()*$num_words*3 < 1;
                my $suffix = $Suffixes[@Suffixes * rand()];

                # avoid suffixing e.g. '-tama' to 'pertama'
                last if $word =~ /\Q$suffix\E$/;

                # amalgamate letter
                if (substr($word, -1, 1) eq substr($suffix, 0, 1)) {
                    $word =~ s/.$//;
                }

                $word = "$word$suffix";
                $has_added_suffix++;
            }

            # avoid duplicate words
            redo if grep { $word eq $_ } @words;

            push @words, ucfirst $word;
        }
        my $name = join(" ", $type, @words);

        # avoid duplicate name
        redo if grep { $name eq $_ } @res;

        push @res, $name;

    }
    return \@res;
}



( run in 2.015 seconds using v1.01-cache-2.11-cpan-cdf2f3d4e48 )