use v5.14; package Top { use Moose; has letter => ( is => 'ro', isa => Moose::Util::TypeConstraints::enum(['A', 'B']), required => 1, ); sub BUILD { my $self = shift; my $class = "Subordinate" . $self->letter; $class->meta->rebless_instance($self); } } package SubordinateA { use Moose; extends 'Top'; } package SubordinateB { use Moose; extends 'Top'; } print Top->new(letter => "B")->dump;