package GridFiller; use Moose; use namespace::autoclean; use GridFiller::Types qw(GridT WordListT); use GridFiller::Status; use GridFiller::Result; use GridFiller::Chooser::Smarter; use Carp; use Class::MOP; with 'MooseX::Log::Log4perl'; has words => ( isa => WordListT, required => 1, is => 'ro', ); has grid => ( isa => GridT, required => 1, is => 'ro', ); sub fill { my ($self,$args) = @_; my $status = GridFiller::Status->new({ grid => $self->grid, words => $self->words, mode => $args->{mode} }); my $chooser_class = 'GridFiller::Chooser::'.($args->{chooser} || 'Random'); Class::MOP::load_class($chooser_class); my $result = GridFiller::Result->new({source_grid => $self->grid}); my $chooser = $chooser_class->new({status => $status}); while ($status->unfilled() && $status->has_next_word()) { my $word = $status->get_next_word(); $self->log->debug("Placing $word"); my ($x,$y,$dir) = $chooser->find_place_for($word); if (! defined $x) { $self->log->debug("No place for $word"); $result->mark_leftover($word); next; }; $result->place_word_at($word,$x,$y,$dir); $status->place_word_at($word,$x,$y,$dir); if ($self->log->is_debug) { $self->log->debug($status->to_string); $self->log->debug($result->to_string); } } return $result; } 1;