my $class_name = "Felidae::Tiger"; # Does the class already exist? return $class_name if is_class_loaded($class_name); # No, create it my $superclass = "Felidae"; my $role_name = "Felidae::Role::Tiger"; # create the Role my $role = Moose::Meta::Role->create($role_name); # A leopard does not have stripes but spots $role->add_attribute( "stripecount", ( is => 'rw', isa => 'Int', ... # builder, lazy etc ) ); my $my_class = Moose::Meta::Class->create( $class_name, superclasses => [$superclass], roles => [$role_name], ); my $garfield = $class_name->new($felidae_obj);