env dir code
[scpubgit/DKit.git] / lib / DX / Lib / FS / Role / RunOn.pm
diff --git a/lib/DX/Lib/FS/Role/RunOn.pm b/lib/DX/Lib/FS/Role/RunOn.pm
new file mode 100644 (file)
index 0000000..9191cd2
--- /dev/null
@@ -0,0 +1,24 @@
+package DX::Lib::FS::Role::RunOn;
+
+use DX::Lib::FS::Guts;
+use Moo::Role;
+
+my $local = DX::Lib::FS::Guts->new;
+my %conn_cache; # HEINOUS
+
+sub _call_guts {
+  my ($self, $type, @args) = @_;
+  my ($on, $path) = $self->path =~ /^(?:([^\/]+):)?(.*)$/;
+  my $guts = $on ? $self->_conn_to($on) : $local;
+  $guts->$type($path, @args);
+}
+
+sub _conn_to {
+  my ($self, $on) = @_;
+  $conn_cache{$on} ||= do {
+    require Object::Remote;
+    DX::Lib::FS::Guts->new::on($on);
+  };
+}
+
+1;