subtype USZipCodeA => as Value => where { /^$RE{zip}{US}{-extended => 'allow'}$/ }; #### my $zip_re = qr/^$RE{zip}{US}{-extended => 'allow'}$/; subtype USZipCodeB => as Value => where { $_ =~ $zip_re; }; #### package AddressA; use Moose; use Moose::Util::TypeConstraints; use Regexp::Common 'zip'; subtype USZipCodeA => as Value => where { /^$RE{zip}{US}{-extended => 'allow'}$/ }; has 'zip_code' => (is => 'rw', isa => 'USZipCodeA'); 1; #### package AddressB; use Moose; use Moose::Util::TypeConstraints; use Regexp::Common 'zip'; my $zip_re = qr/^$RE{zip}{US}{-extended => 'allow'}$/; subtype USZipCodeB => as Value => where { $_ =~ $zip_re; }; has 'zip_code' => (is => 'rw', isa => 'USZipCodeB'); 1; #### #!/usr/bin/perl use strict; use warnings; use Benchmark qw(cmpthese); use AddressA; use AddressB; my $zip = 12345; cmpthese (-5, { A => sub { AddressA->new(zip_code => $zip);}, B => sub { AddressB->new(zip_code => $zip);} } ); exit; #### Rate A B A 2976/s -- -43% B 5187/s 74% -- #### Regexp::Common::_decache Regexp::Common::new #### Class::MOP::Instance::new Class::MOP::Instance::set_slot_value #### Rate A B A 2955/s -- -7% B 3174/s 7% --