Listing 1.
Main Program Output
Mike Stok

A Subjective Look at Object-Oriented Programming
The Perl Journal, Winter 1996
 
sub first { 
    my $self = shift;

    $self->{row} = 1;

    if ($self->{neighbor}->first()){
        return $self->testOrAdvance(); 
    }
    return 0; 
}

sub testOrAdvance { 
    my $self = shift;

    if ($self->{neighbor}->canAttack(@{$self}{'row','column'})){
        return $self->next (); 
    }
    return 1; 
}


sub print { 
    my $self = shift;

    $self->{neighbor}->print(); 

    print "row: $self->{row} column: $self->{column}\n";
    return; 
}

sub canAttack { 
    my $self = shift; 
    my $row = shift; 
    my $column = shift;

    $self->{row} == $row and return 1;

    # $cd and $rd contain the column and row
    # differences between the position and this queen.
    # If $cd == $rd, they're on the same diagonal.

    my $cd = abs ($column - $self->{column});
    my $rd = abs ($row - $self->{row});
    $cd == $rd and return 1;

    return $self->{neighbor}->canAttack($row,$column);
}


sub next { 
    my $self = shift;
    local $^W = 0;   # turn warnings off
    if ($self->{row} == 8) { 
        unless ($self->{neighbor}->next ()) { return 0; }
        else { $self->{row} = 0; } 
    }
    $self->{row}++;
    return $self->testOrAdvance (); 
}