The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package TestAppBase::Script::Server;
use Moose;
use MooseX::Types::Moose qw/Str/;
use Moose::Util::TypeConstraints;
use namespace::autoclean;

extends 'Catalyst::Script::Server';

my $appname = do {
    my $re = q{^TestApp(|DBIC|OpenID|Redirect|RenderTT)$};
    subtype Str,
    where { /$re/ },
    message { "Application name must match /$re/" };
};

# FIXME
# Gross, but overriding NoGetopt with Getopt doesn't work
# right, and nor does +application_name with cmd_aliases
# (as Moose uses a white list of options you can change
# with has +).
__PACKAGE__->meta->remove_attribute('application_name');
has application_name => (
    isa => $appname,
    traits => [qw/Getopt/],
    cmd_aliases   => ['app', 'name'],
    is       => 'ro',
    required => 1,
);

__PACKAGE__->meta->make_immutable;