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;