use strict;
use warnings;
-use Class::MOP;
+use MooseX::Runnable::Invocation;
-use Sub::Exporter -setup => {
- exports => ['run_as_application'],
- groups => {
- default => ['run_as_application'],
- },
-};
-
-sub run_as_application($;@){
+sub run_application($;@) {
my ($app, @args) = @_;
- eval 'package main; use FindBin qw($Bin); use lib "$Bin/../lib"; 1;' or die;
+ exit MooseX::Runnable::Invocation->new(
+ class => $app,
+ )->run(@args);
+}
+
+sub import {
+ my ($class, $app) = @_;
- Class::MOP::load_class($app);
- die "$app is not runnable" unless $app->does('MooseX::Runnable');
- $app->run_as_application(@args);
+ if($app){
+ run_application $app, @ARGV;
+ }
+ else {
+ my $c = caller;
+ no strict 'refs';
+ *{ $c. '::run_application' } = \&run_application;
+ }
}
1;
+
+__END__
+
+=head1 NAME
+
+MooseX::Runnable::Run - run a MooseX::Runnable class as an application
+
+=head1 SYNOPSIS
+
+Write an app:
+
+ package MyApp;
+ use Moose; with 'MooseX::Runnable';
+ sub run { say 'Hello, world.'; return 0 } # (UNIX exit code)
+
+Write a wrapper script, C<myapp.pl>. With sugar:
+
+ #!/usr/bin/env perl
+ use MooseX::Runnable::Run 'MyApp';
+
+Or without:
+
+ #!/usr/bin/env perl
+ use MooseX::Runnable::Run;
+
+ run_application 'MyApp', @ARGV;
+
+Then, run your app:
+
+ $ ./myapp.pl
+ Hello, world.
+ $ echo $?
+ 0
+
+=head1 DESCRIPTION
+
+This is a utility module that runs a L<MooseX::Runnable|MooseX::Runnable> class with
+L<MooseX::Runnable::Invocation|MooseX::Runnable::Invocation>.
+
+=head1 SEE ALSO
+
+L<mx-run>, a script that will run MooseX::Runnable apps, saving you
+valuable seconds!