package GridFiller;
use Moose;
use namespace::autoclean;
use GridFiller::Types qw(GridT WordListT);
use GridFiller::Status;
use GridFiller::Result;
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});
while ($status->unfilled() && $status->has_next_word()) {
my $word = $status->get_next_word();
$self->log->debug("Placing $word");
my ($x,$y,$dir) = $status->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;