#! perl use strict; use warnings; use Data::Dump; package Square { use Moose; use namespace::autoclean; has queen_is_present => ( is => 'rw', isa => 'Bool', default => 0, ); has is_threatened => ( is => 'rw', isa => 'Int', default => 0, ); no Moose; __PACKAGE__->meta->make_immutable; } use enum qw( :Rank_=0 r1 r2 r3 r4 r5 r6 r7 r8 :File_=0 a b c d e f g h ); my @board; for my $rank (Rank_r1 .. Rank_r8) { $board[$rank][$_] = Square->new() for File_a .. File_h; } $board[1][2]->is_threatened(7); # OK: 7 is an 'Int' dd @board; $board[3][4]->is_threatened('foo'); # Runtime error: foo is not an 'Int'