Initial script infrastructure
Matt S Trout [Fri, 11 Nov 2011 05:46:24 +0000 (05:46 +0000)]
bin/tak [new file with mode: 0644]
lib/Tak/MyScript.pm [new file with mode: 0644]
lib/Tak/Script.pm [new file with mode: 0644]

diff --git a/bin/tak b/bin/tak
new file mode 100644 (file)
index 0000000..00898c3
--- /dev/null
+++ b/bin/tak
@@ -0,0 +1,6 @@
+#!/usr/bin/env perl
+
+use strictures 1;
+use App::Tak;
+
+App::Tak->new_from_environment->run;
diff --git a/lib/Tak/MyScript.pm b/lib/Tak/MyScript.pm
new file mode 100644 (file)
index 0000000..149e910
--- /dev/null
@@ -0,0 +1,13 @@
+package Tak::MyScript;
+
+use Moo;
+
+extends 'Tak::Script';
+
+sub _my_script_package { 'Tak::MyScript' }
+
+sub _load_file_in_my_script {
+  require $_[1];
+}
+
+1;
diff --git a/lib/Tak/Script.pm b/lib/Tak/Script.pm
new file mode 100644 (file)
index 0000000..6868fe4
--- /dev/null
@@ -0,0 +1,76 @@
+package Tak::Script;
+
+use Getopt::Long qw(GetOptionsFromArray :config posix_defaults bundling);
+use Config::Settings;
+use IO::Handle;
+use Moo;
+
+has options => (is => 'ro', required => 1);
+has env => (is => 'ro', required => 1);
+
+has stdin => (is => 'lazy');
+has stdout => (is => 'lazy');
+has stderr => (is => 'lazy');
+
+sub _build_stdin { shift->env->{stdin} }
+sub _build_stdout { shift->env->{stdout} }
+sub _build_stderr { shift->env->{stderr} }
+
+has config => (is => 'lazy');
+
+sub _build_config {
+  my ($self) = @_;
+  Config::Settings->new->parse_file(
+    $self->options->{config} || '.tak/default.conf'
+  );
+}
+
+sub BUILD {
+  shift->setup_logger;
+}
+
+sub setup_logger { }
+
+sub _parse_options {
+  my ($self, $string, \@argv) = @_;
+  my @spec = split ';', $string;
+
+sub run {
+  my ($self) = @_;
+  my @argv = @{$self->env->{argv}};
+  unless (@argv && $argv[0]) {
+    return $self->local_help;
+  }
+  my $cmd = shift(@argv);
+  if (my $code = $self->can("local_$cmd")) {
+    return $self->_run($cmd, $code, @argv);
+  } elsif ($code = $self->can("each_$cmd")) {
+    return $self->_run_each($cmd, $code, @argv);
+  }
+  $self->stderr->print("No such command: ${cmd}\n");
+  return $self->local_help;
+}
+
+sub _load_file {
+  my ($self, $file) = @_;
+  $self->_load_file_in_my_script($file);
+}
+
+sub local_help {
+  my ($self) = @_;
+  $self->stderr->print("Help unimplemented\n");
+}
+
+sub _run_local {
+  my ($self, $cmd, $code, @argv) = @_;
+  my $opt = do {
+    if (my $proto = prototype($code)) {
+      $self->_parse_options($proto, \@argv);
+    } else {
+      {};
+    }
+  };
+  $self->$code($opt, @argv);
+}
+
+1;