The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
package Games::Go::Cinderblock::MoveResult;
use Moose;

has move_attempt => (
   isa => 'Games::Go::Cinderblock::MoveAttempt', # Games::Go::Cinderblock::MoveAttempt?
   is => 'ro',
   required => 1,
);

has rulemap => (
   isa => 'Games::Go::Cinderblock::Rulemap',
   is => 'ro', #shouldn't change.
   required => 1,
);
has basis_state=> (
   is => 'ro',
   required => 1,
   isa => 'Games::Go::Cinderblock::State',
);

has resulting_state=> (
   is => 'ro',
   # required if success?
   isa => 'Games::Go::Cinderblock::State',
);
has delta => (
   lazy => 1,
   is => 'ro',
   builder => '_derive_delta',
   isa => 'Games::Go::Cinderblock::Delta',
);

has succeeded => (
   isa => 'Bool',
   is => 'ro',
#   lazy => 1,
#   builder => '_determine_success',
   required => 1,
);
has reason => (
   isa => 'Str',
   is => 'ro',
   required => 0,
);

sub _derive_delta{
   my $self = shift;
   return $self->basis_state->delta_to($self->resulting_state);
}

# meh
sub failed{
   my $self = shift;
   return ($self->succeeded ? 0 : 1);
}
1;

__END__

=head1 NAME

Games::Go::Cinderblock::MoveResult

=head1 DESCRIPTION

This results from evaluate_move.

It has a L</delta>, which describes changes to the board

=head1 ATTRIBUTES

=head2 rulemap 

=head2 succeeded

0 if move failed, 1 if move succeeded.

=head2 reason

If failed, this is why. e.g. 'suicide', 'collision'

=head2 basis_state

=head2 resulting_state

=head2 delta

L</resulting_state> minus L</basis_state>, essentially.

A delta is an object that describes changes between 2 states with
the same rulemap.

=cut