Acme-Wabby
view release on metacpan or search on metacpan
use constant DEF_MIN_LEN => 3;
use constant DEF_MAX_LEN => 30;
use constant DEF_MAX_ATTEMPTS => 1000;
use constant DEF_PUNCTUATION => [".","?","!","..."];
use constant DEF_HASH_FILE => "./wabbyhash.dat";
use constant DEF_LIST_FILE => "./wabbylist.dat";
use constant DEF_AUTOSAVE => 0;
# Constructor. Note that Acme::Wabby only supports an OO interface.
# Arguments: A reference to a hash containing configuration key/value pairs.
# Returns: A reference to the created object. Dies on error.
sub new {
my $self = shift;
my %conf;
if (@_ == 1) {
my $ref = shift;
if (!ref($ref)) {
die "Sanity check: One parameter passed, and it is not a reference";
}
elsif (ref($ref) eq "HASH") {
}
}
# A method for dumping the current state to files using Storable.
# Arguments: None.
# Returns: undef on failure, true on success.
sub save {
my $self = shift;
die "Invalid object" unless (ref($self) eq __PACKAGE__);
# Since Storable can die on serious errors, or simply return an undef,
# we need to wrap these calls in evals
eval {
if (!store($self->{'data'}{'list'}, $self->{'conf'}{'list_file'})) {
$@ = 1;
}
};
if ($@) {
return undef;
}
return 1;
}
# A method for loading a previously saved state from files using Storable.
# Arguments: None.
# Returns: undef on failure, true on success
sub load {
my $self = shift;
die "Invalid object" unless (ref($self) eq __PACKAGE__);
# Since Storable can die on serious errors, or simply return an undef,
# we need to wrap these calls in evals
my $ref;
eval {
if (!($ref = retrieve($self->{'conf'}{'list_file'}))) {
$@ = "Error retrieving list from " . $self->{'conf'}{'list_file'};
}
};
if ($@) {
return undef;
}
}
}
return 1;
}
# A function for generating a random line of text.
# Arguments: If no arguments, spew will try to generate a completely random
# sentence. If a string is passed in, spew will try to generate a
# random sentence beginning with the provided text.
# Returns: The generated string, or undef on any of several error conditions.
# Note that these error conditions are not fatal. They are:
# * At least (min_len * 10) words haven't been run through yet.
# (Must ->add() more text before trying again.)
# * A string was passed in containing nothing. (Don't do that.)
# * We don't know the last word in the sentence, and can therefore
# not generate a sentence with it. (Either teach us about it
# with ->add(), or try something else.)
# * A sentence of at least min_len words could not be generated,
# even after max_attempts tries at doing so. (Likely need to
# ->add() more text before trying again.)
#
1;
__END__
=head1 NAME
Acme::Wabby - Create semi-random sentences based upon a body of text.
=head1 SYNOPSIS
use Acme::Wabby qw(:errors);
# Use the default options
my $wabby = Acme::Wabby->new;
# Pass in explicit options. (All options below are defaults)
my $wabby = Acme::Wabby->new( min_len => 3, max_len => 30,
punctuation => [".","?","!","..."], case_sensitive => 1,
hash_file => "./wabbyhash.dat", list_file => "./wabbylist.dat",
autosave_on_destroy => 0, max_attempts => 1000 );
This text can come from virtually any source, although I enjoy using e-Texts
from the good folks at Project Gutenberg (http://promo.net/pg). To add text to
the state, simply call the B<add()> method on the object, passing it a scalar
containing the text.
$wabby->add($complete_works_of_shakespeare);
It is acceptable for the input text to contain embedded newlines or other such
things. It is acceptable to call the B<add()> method many times, and at any
point in the object's life-span. The B<add()> method will return B<undef> upon
error, and true upon success.
=head2 Generating random sentences
Once you have some text loaded into the object, you can generate random
sentences. To do this, we use the B<spew()> method. The B<spew()> method has
two modes of operation: If no argument is given, it will generate and return a
random sentence. If a single string is passed in, it will generate and return
a random sentence beginning with the provided string.
my $random_sentence = $wabby->spew;
my $not_so_random_sentence = $wabby->spew("Romeo and Juliet");
The B<spew()> method will return the generated string, or B<undef> upon error.
There are several error conditions which can occur in the B<spew()> method.
None of them are fatal, but they must be taken into account by the calling
program. They are:
* At least (min_len * 10) words haven't been run through yet. (Must B<add()>
more text before trying again.)
* A string was passed in containing nothing. (Don't do that.)
* We don't know the last word in the string passed in, and can therefore not
generate a sentence with it. (Either teach us about it with B<add()>, or try
( run in 0.232 second using v1.01-cache-2.11-cpan-65fba6d93b7 )