The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Riji::CLI;
use feature ':5.10';
use strict;
use warnings;

use File::Which ();
use Getopt::Long ();
use Plack::Util ();
use String::CamelCase ();

sub run {
    my ($self, @args) = @_;

    local @ARGV = @args;
    my @commands;
    my $p = Getopt::Long::Parser->new(
        config => [ "no_ignore_case", "pass_through" ],
    );
    $p->getoptions(
        "h|help"   => sub { unshift @commands, 'help' },
        'version!' => \my $version,
    );
    if ($version) {
        require Riji;
        say "Riji: $Riji::VERSION"; exit 0;
    }
    push @commands, @ARGV;

    my $cmd = shift @commands || 'help';
    if (my $cmd = File::Which::which("riji-$cmd")) {
        exec $cmd, @commands;
    }

    $cmd =~ s/-/_/g;
    my $class = String::CamelCase::camelize $cmd;

    local $@;
    $class = eval { Plack::Util::load_class($class, 'Riji::CLI') };
    if (my $err = $@) {
        if ($err =~ m!Can't locate Riji/CLI!) {
            warn "sub command `$cmd` not found\n"; exit 1;
        }
        die $@;
    }
    $class->run(@commands);
}

1;