sub new { my ($pkg, $holes, $level) = @_; unless ( $holes ) { # # create the holes # my $holeLevel = 0; for ( my $i=0; $i<15; $i++ ) { if ( $i > 0 ) { $holeLevel = 1; } if ( $i > 2 ) { $holeLevel = 2; } if ( $i > 5 ) { $holeLevel = 3; } if ( $i > 9 ) { $holeLevel = 4; } # # the 5th hole is usaully has no peg initially. # $holes->[$i] = new hole( ( $i == 4 ) ? 'white' : 'black' , $i, $holeLevel ); } # # link the holes # $holes->[0]->setLinks( [ $holes->[1], $holes->[2] ] ); $holes->[1]->setLinks( [ $holes->[0], $holes->[2], $holes->[3], $holes->[4] ] ); $holes->[2]->setLinks( [ $holes->[0], $holes->[1], $holes->[4], $holes->[5] ] ); $holes->[3]->setLinks( [ $holes->[1], $holes->[4], $holes->[6], $holes->[7] ] ); $holes->[4]->setLinks( [ $holes->[1], $holes->[2], $holes->[3], $holes->[5], $holes->[7], $holes->[8] ] ); $holes->[5]->setLinks( [ $holes->[2], $holes->[4], $holes->[8], $holes->[9] ] ); $holes->[6]->setLinks( [ $holes->[3], $holes->[7], $holes->[10], $holes->[11] ] ); $holes->[7]->setLinks( [ $holes->[3], $holes->[4], $holes->[6], $holes->[8], $holes->[11], $holes->[12] ] ); $holes->[8]->setLinks( [ $holes->[4], $holes->[5], $holes->[7], $holes->[9], $holes->[12], $holes->[13] ] ); $holes->[9]->setLinks( [ $holes->[5], $holes->[8], $holes->[13], $holes->[14] ] ); $holes->[10]->setLinks( [ $holes->[6], $holes->[11] ] ); $holes->[11]->setLinks( [ $holes->[6], $holes->[7], $holes->[10], $holes->[12] ] ); $holes->[12]->setLinks( [ $holes->[7], $holes->[8], $holes->[11], $holes->[13] ] ); $holes->[13]->setLinks( [ $holes->[8], $holes->[9], $holes->[12], $holes->[14] ] ); $holes->[14]->setLinks( [ $holes->[9], $holes->[13] ] ); } my $obj = bless { holes => $holes, # ref to array of holes level => defined( $level ) ? $level : 0 }, $pkg; return $obj; }