Games::Solitaire::Verify::Column - a class wrapper for Solitaire


Games-Solitaire-Verify documentation Contained in the Games-Solitaire-Verify distribution.

Index


Code Index:

NAME

Top

Games::Solitaire::Verify::Column - a class wrapper for Solitaire columns that are composed of a sequence of cards.

VERSION

Top

Version 0.0101

SYNOPSIS

Top

    use Games::Solitaire::Verify::Column;

    # Initialise a column
    my $column = Games::Solitaire::Verify::Column->new(
        {
            string => ": KH QS 5C",
        },
    );

    # Prints 3
    print $column->len();

    my $queen_card = $column->pos(1);

FUNCTIONS

Top

$column->len()

Returns an integer representing the number of cards in the column.

$column->pos($idx)

Returns the card (a Games::Solitaire::Verify::Card object) at position $idx in Column. $idx starts at 0.

$columnt->top()

Returns the top card.

$column->clone()

Returns a clone of the column.

$base_column->append($column_with_more_cards)

Appends the column $column_with_more_cards to $base_column .

$column->push($card)

Appends a single card to the top of the column.

my $card_at_top = $column->pop()

Pops a card from the top of the column and returns it.

$column->to_string()

Converts to a string.

AUTHOR

Top

Shlomi Fish, <shlomif at iglu.org.il>

BUGS

Top

Please report any bugs or feature requests to bug-games-solitaire-verifysolution-move at rt.cpan.org, or through the web interface at http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Games-Solitaire-Verify. I will be notified, and then you'll automatically be notified of progress on your bug as I make changes.

SUPPORT

Top

You can find documentation for this module with the perldoc command.

    perldoc Games::Solitaire::Verify::Column




You can also look for information at:

* RT: CPAN's request tracker

http://rt.cpan.org/NoAuth/Bugs.html?Dist=Games-Solitaire-Verify

* AnnoCPAN: Annotated CPAN documentation

http://annocpan.org/dist/Games-Solitaire-Verify

* CPAN Ratings

http://cpanratings.perl.org/d/Games-Solitaire-Verify

* Search CPAN

http://search.cpan.org/dist/Games-Solitaire-Verify

ACKNOWLEDGEMENTS

Top

COPYRIGHT & LICENSE

Top


Games-Solitaire-Verify documentation Contained in the Games-Solitaire-Verify distribution.
package Games::Solitaire::Verify::Column;

use warnings;
use strict;

our $VERSION = '0.0901';

use base 'Games::Solitaire::Verify::Base';

use Games::Solitaire::Verify::Exception;
use Games::Solitaire::Verify::Card;

__PACKAGE__->mk_acc_ref([qw(
    _cards
    )]);

sub _card_num_normalize
{
    my $arg = shift;

    if (ref($arg) eq "")
    {
        return +{ map { $_ => $arg } (qw(t non_t)) };
    }
    else
    {
        return $arg
    }
}

sub _from_string
{
    my ($self, $str) = @_;

    if ($str !~ s{\A:(?: )?}{})
    {
        Games::Solitaire::Verify::Exception::Parse::Column::Prefix->throw(
            error => "String does not start with \": \"",
        );
    }

    # Ignore trailing whitespace, so we don't have -1.
    my @cards = split(/ +/, $str);

    $self->_cards(
        [
            map
            { 
                Games::Solitaire::Verify::Card->new(
                    {string => $_ } 
                )
            }
            @cards
        ]
    );

    return;
}

sub _init
{
    my ($self, $args) = @_;

    if (exists($args->{string}))
    {
        return $self->_from_string($args->{string});
    }
    elsif (exists($args->{cards}))
    {
        $self->_cards($args->{cards});
        return;
    }
    else
    {
        die "Cannot init - no 'string' or 'cards' specified."
    }
}

sub len
{
    my $self = shift;

    return scalar(@{$self->_cards()});
}

sub pos
{
    my $self = shift;
    my $idx = shift;

    return $self->_cards->[$idx];
}

sub top
{
    my $self = shift;

    return $self->pos(-1);
}

sub clone
{
    my $self = shift;

    my $new_col = Games::Solitaire::Verify::Column->new(
        {
            cards => [ map { $_->clone() } @{$self->_cards()} ],
        }
    );

    return $new_col;
}

sub append
{
    my ($self, $more_cards) = @_;

    my $more_copy = $more_cards->clone();

    push @{$self->_cards()}, @{$more_copy->_cards()};
}

sub push
{
    my ($self, $card) = @_;

    push @{$self->_cards()}, $card;
}

sub pop
{
    my $self = shift;

    return pop(@{$self->_cards()});
}

sub to_string
{
    my $self = shift;

    return ":" .
        ($self->len()
            ? $self->_non_zero_cards_string()
            : " " # We need the single trailing space for
                  # Freecell Solver compatibility
        );
}

sub _non_zero_cards_string
{
    my $self = shift;

    return join("",
            (map
                { " " . $self->pos($_)->to_string() }
                (0 .. ($self->len()-1))
            )
        );
}

1; # End of Games::Solitaire::Verify::Move