#!/usr/bin/env perl use 5.010; use strict; use warnings; { package Calc::Role::BinaryOperation; use Moo::Role; use MooX::Options; option a => ( is => 'ro', required => 1, format => 's', documentation => 'first number', ); option b => ( is => 'ro', required => 1, format => 's', documentation => 'second number', ); } { package Calc::Cmd::add; use Moo; use MooX::Cmd; use MooX::Options; with 'Calc::Role::BinaryOperation'; sub execute { my $self = shift; say($self->a + $self->b); exit(0); } } { package Calc::Cmd::subtract; use Moo; use MooX::Cmd; use MooX::Options; with 'Calc::Role::BinaryOperation'; sub execute { my $self = shift; say($self->a - $self->b); exit(0); } } { package Calc; use Moo; use MooX::Cmd; sub execute { my $self = shift; my ($args, $chain) = @_; die "Need to specify a sub-command!\n"; } } Calc->new_with_cmd->execute;