Games-Board

 view release on metacpan or  search on metacpan

lib/Games/Board.pm  view on Meta::CPAN

use strict;
use warnings;
package Games::Board 1.014;
# ABSTRACT: a parent class for board games

use Carp;
use Games::Board::Space;
use Games::Board::Piece;

#pod =head1 SYNOPSIS
#pod
#pod   use Games::Board;
#pod
#pod   my $board = Games::Board->new;
#pod
#pod   $board->add_space(
#pod     id  => 'go',
#pod     dir => { next => 'mediterranean', prev => 'boardwalk' },
#pod     cost => undef
#pod   );
#pod
#pod   my $tophat = Games::Board::Piece->new(id => 'tophat')->move(to => 'go');
#pod
#pod =head1 DESCRIPTION
#pod
#pod This module provides a base class for representing board games.  
#pod
#pod =method new
#pod
#pod This method constructs a new game board and returns it.  As constructed it has
#pod no spaces or pieces on it.
#pod
#pod =cut

sub new {
  my $class = shift;

  my $board = {
    spaces => { }
  };

  bless $board => $class;
}

#pod =method space
#pod
#pod   my $space = $board->space($id);
#pod
#pod This method returns the space with the given C<$id>.  If no space with that id
#pod exists, undef is returned.
#pod
#pod =cut

sub space {
  my $board = shift;
  my $space = shift;

  return $board->{spaces}{$space};
}

#pod =method add_space
#pod
#pod   my $space = $board->add_space(%args);
#pod
#pod This method adds a space to the board.  It is passed a hash of attributes to
#pod use in creating a Games::Board::Space object.  The object is created by calling
#pod the constructor on the class whose name is returned by the C<spaceclass>
#pod method.  This class must inherit from Games::Board::Space.
#pod
#pod =cut

sub add_space {
  my ($board, %args) = @_;
  my $space;

  $space = $board->spaceclass->new(board => $board, %args);

  return unless eval { $space->isa('Games::Board::Space') };

  if ($board->space($space->id)) {
    carp "space '" . $space->id . "' already exists on board";
  } else {
    $board->{spaces}{$space->id} = $space;
    return $space;
  }
}

#pod =method piececlass
#pod
#pod This method returns the class used for pieces on this board.
#pod
#pod =cut

sub piececlass { 'Games::Board::Piece' }

#pod =method spaceclass
#pod
#pod This method returns the class used for spaces on this board.
#pod
#pod =cut

sub spaceclass { 'Games::Board::Space' }

 view all matches for this distribution
 view release on metacpan -  search on metacpan

( run in 1.223 second using v1.00-cache-2.02-grep-82fe00e-cpan-3b7f77b76a6c )