package GridFiller; use Moose; use namespace::autoclean; use GridFiller::Types qw(GridT WordListT); use GridFiller::Status; use GridFiller::Result; use GridFiller::Chooser; use Carp; with 'MooseX::Log::Log4perl'; has words => ( isa => WordListT, required => 1, is => 'ro', ); has grid => ( isa => GridT, required => 1, is => 'ro', ); sub fill { my ($self) = @_; my $status = GridFiller::Status->new({grid => $self->grid, words => $self->words}); my $result = GridFiller::Result->new({source_grid => $self->grid}); my $chooser = GridFiller::Chooser->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;