From b66368ad64ceb4d30c79d079895199cf51301af4 Mon Sep 17 00:00:00 2001 From: dakkar Date: Thu, 2 Dec 2010 20:49:22 +0000 Subject: mutable objects, all status in attributes --- lib/GridFiller.pm | 57 +++++++++++++++++++++++++++++++++++-------- lib/GridFiller/Result.pm | 17 ++++++++++++- lib/GridFiller/Status.pm | 63 ++++++++++++++++++++++++++++++------------------ script/qr-color.pl | 9 ++++--- 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); -- cgit v1.2.3