sub BUILDARGS { my $class = shift; my %args = ref $_[0] ? %{$_[0]} : @_; $args{code} = uc $args{code} if exists $args{code}; return \%args; } #### package UpperCaseDemo; use Moose; use Moose::Util::TypeConstraints; with 'MooseX::Getopt'; subtype 'CurrencyCode' => as 'Str' => where { /^[A-Z]{3}$/ } => message { 'Currency codes should be three characters' }, ; coerce 'CurrencyCode' => from 'Str' => via { uc } ; has 'code' => ( is => 'ro', isa => 'CurrencyCode', coerce => 1, ); 1; # ----------- # Usage: lookup --code abc or lookup --code ABC # package main; my $cc = UpperCaseDemo->new_with_options(); print "code is ", $cc->code // 'not set', "\n";