Your own types
- use subtype operator
package Cable::Ethernet;
use Moose;
use Moose::Util::TypeConstraints;
subtype EvenNumber
=> as Int
=> where { $_ % 2 == 0 };
has 'wire_count' => ( # Ethernet cables only have pairs of wires
is => 'ro',
isa => 'EvenNumber',
);
Cable::Ethernet->new( wire_count => 8 ); # OK
Cable::Ethernet->new( wire_count => 7 ); # fails "EvenNumber" with "7"