add non-hack MX::Runnable
[gitmo/MooseX-Runnable.git] / lib / MooseX / Runnable / Run.pm
index 4fe5759..9e1ab01 100644 (file)
@@ -2,23 +2,70 @@ package MooseX::Runnable::Run;
 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!