summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordakkar <dakkar@thenautilus.net>2010-12-02 20:49:22 +0000
committerdakkar <dakkar@thenautilus.net>2010-12-02 20:49:22 +0000
commitb66368ad64ceb4d30c79d079895199cf51301af4 (patch)
treeed810f1af1e58711bfebf8450bc6cd1a262a180d
parentscaler, and __DATA__ (diff)
downloadqr-builder-b66368ad64ceb4d30c79d079895199cf51301af4.tar.gz
qr-builder-b66368ad64ceb4d30c79d079895199cf51301af4.tar.bz2
qr-builder-b66368ad64ceb4d30c79d079895199cf51301af4.zip
mutable objects, all status in attributes
-rw-r--r--lib/GridFiller.pm57
-rw-r--r--lib/GridFiller/Result.pm17
-rw-r--r--lib/GridFiller/Status.pm63
-rw-r--r--script/qr-color.pl9
4 files changed, 107 insertions, 39 deletions
diff --git a/lib/GridFiller.pm b/lib/GridFiller.pm
index dbe7010..c21168f 100644
--- a/lib/GridFiller.pm
+++ b/lib/GridFiller.pm
@@ -1,7 +1,8 @@
package GridFiller;
use Moose;
use namespace::autoclean;
-use GridFiller::Types qw(GridT WordListT);
+use GridFiller::Types qw(GridT WordListT ResultT GridStatusT);
+use MooseX::Types::Moose qw(CodeRef);
use GridFiller::Status;
use GridFiller::Result;
use GridFiller::Chooser::Smarter;
@@ -22,20 +23,56 @@ has grid => (
is => 'ro',
);
-sub fill {
- my ($self,$args) = @_;
+has status => (
+ isa => 'GridFiller::Status',
+ is => 'ro',
+ writer => '_status',
+ lazy_build => 1,
+);
- my $status = GridFiller::Status->new({
- grid => $self->grid,
+sub _build_status {
+ my ($self) = @_;
+ return GridFiller::Status->new({
words => $self->words,
- mode => $args->{mode}
+ grid => $self->grid,
+ });
+}
+
+has chooser => (
+ isa => 'GridFiller::Chooser',
+ is => 'rw',
+ lazy_build => 1,
+);
+
+sub _build_chooser {
+ my ($self) = @_;
+ return GridFiller::Chooser::Smarter->new({
+ status => $self->status,
});
+}
+
+has result => (
+ isa => 'GridFiller::Result',
+ is => 'rw',
+ lazy_build => 1,
+);
+
+sub _build_result {
+ my ($self) = @_;
+ return GridFiller::Result->new({
+ source_grid => $self->grid,
+ });
+}
+
+sub fill {
+ my ($self) = @_;
- my $chooser_class = 'GridFiller::Chooser::'.($args->{chooser} || 'Random');
- Class::MOP::load_class($chooser_class);
+ my $status=$self->status;
+ my $result=$self->result;
+ my $chooser=$self->chooser;
- my $result = GridFiller::Result->new({source_grid => $self->grid});
- my $chooser = $chooser_class->new({status => $status});
+ $status->reset;
+ $result->reset;
while ($status->unfilled() && $status->has_next_word()) {
my $word = $status->get_next_word();
diff --git a/lib/GridFiller/Result.pm b/lib/GridFiller/Result.pm
index d0e6684..3a2a505 100644
--- a/lib/GridFiller/Result.pm
+++ b/lib/GridFiller/Result.pm
@@ -10,17 +10,23 @@ with 'MooseX::Log::Log4perl';
has leftover_words => (
isa => WordListT,
is => 'ro',
- default => sub { [ ] },
traits => ['Array'],
handles => {
mark_leftover => 'push',
},
+ lazy_build => 1,
+ clearer => '_reset_lw',
);
+sub _build_leftover_words {
+ return [ ];
+}
+
has grid => (
isa => ResultT,
is => 'ro',
lazy_build => 1,
+ clearer => '_reset_g',
);
has source_grid => (
@@ -142,4 +148,13 @@ sub to_string {
return $str;
}
+sub reset {
+ my ($self) = @_;
+
+ $self->_reset_g;
+ $self->_reset_lw;
+
+ return;
+}
+
1;
diff --git a/lib/GridFiller/Status.pm b/lib/GridFiller/Status.pm
index b14f870..092f9a9 100644
--- a/lib/GridFiller/Status.pm
+++ b/lib/GridFiller/Status.pm
@@ -3,13 +3,32 @@ use Moose;
use namespace::autoclean;
use List::Util qw(shuffle);
use List::MoreUtils qw(uniq);
-use GridFiller::Types qw(WordListT GridStatusT);
+use GridFiller::Types qw(WordListT GridStatusT GridT WordListT);
+use MooseX::Types::Moose qw(Str);
use GridFiller::Constants ':all';
use Carp;
use feature 'switch';
with 'MooseX::Log::Log4perl';
+has words => (
+ isa => WordListT,
+ required => 1,
+ is => 'ro',
+);
+
+has grid => (
+ isa => GridT,
+ required => 1,
+ is => 'ro',
+);
+
+has mode => (
+ isa => Str,
+ is => 'rw',
+ default => 'given',
+);
+
has words_to_use => (
isa => WordListT,
traits => ['Array'],
@@ -17,32 +36,21 @@ has words_to_use => (
has_next_word => 'count',
get_next_word => 'shift',
},
- is => 'rw',
- required => 1,
+ lazy_build => 1,
+ clearer => '_reset_wts',
);
has grid_status => (
isa => GridStatusT,
- is => 'rw',
- required => 1,
+ is => 'ro',
+ lazy_build => 1,
+ clearer => '_reset_gs',
);
-around BUILDARGS => sub {
- my ($orig, $class, $args, @rest) = @_;
-
- if (exists $args->{words} && exists $args->{grid}) {
- $args->{words_to_use} = _munge_words_to_use(delete $args->{words},$args);
- $args->{grid_status} = _munge_grid_status(delete $args->{grid});
- }
-
- return $class->$orig($args,@rest);
-};
-
-sub _munge_words_to_use {
- my ($words,$args) = @_;
- # clone initial word list
-
- my $mode = delete $args->{mode} || 'random';
+sub _build_words_to_use {
+ my ($self) = @_;
+ my $words = $self->words;
+ my $mode = $self->mode;
given ($mode) {
when ('random') { return [ shuffle uniq @$words ] }
@@ -53,8 +61,8 @@ sub _munge_words_to_use {
}
}
-sub _munge_grid_status {
- my ($grid) = @_;
+sub _build_grid_status {
+ my ($self) = @_;
return [
map {
[
@@ -62,7 +70,7 @@ sub _munge_grid_status {
$_ eq '*' ? $BLACK : $WHITE
} @$_
]
- } @$grid
+ } @{$self->grid}
];
}
@@ -129,4 +137,11 @@ sub to_string {
}
}
+sub reset {
+ my ($self) = @_;
+
+ $self->_reset_gs;
+ $self->_reset_wts;
+}
+
1;
diff --git a/script/qr-color.pl b/script/qr-color.pl
index 5841e0f..268d4c9 100644
--- a/script/qr-color.pl
+++ b/script/qr-color.pl
@@ -7,6 +7,7 @@ use TextPrinter::ColourGrid;
use TextPrinter::StarGrid;
use GridFiller;
use GridFiller::Scaler;
+use GridFiller::Chooser::Smarter;
use feature 'say';
use open ':std',':locale';
use Log::Log4perl qw(:easy);
@@ -29,10 +30,10 @@ my $filler=GridFiller->new({
grid=> GridFiller::Scaler->scale($arr,2),
});
-my $result = $filler->fill({
- mode => 'longest',
- chooser => 'Smarter',
-});
+$filler->status->mode('longest');
+$filler->fill();
+
+my $result=$filler->result;
TextPrinter::ColourGrid->new->draw_whole($result->grid,1);