added example on Tak Use
[scpubgit/Tak.git] / lib / Tak.pm
CommitLineData
31a246e4 1package Tak;
2
3use Tak::Loop;
4use strictures 1;
5
401f4e7d 6our $VERSION = '0.001003'; # 0.1.3
51c8325b 7
fb0f5964 8our ($loop, $did_upgrade);
31a246e4 9
10sub loop { $loop ||= Tak::Loop->new }
11
addc801e 12sub loop_upgrade {
fb0f5964 13 return if $did_upgrade;
addc801e 14 require IO::Async::Loop;
15 my $new_loop = IO::Async::Loop->new;
16 $loop->pass_watches_to($new_loop) if $loop;
17 $loop = $new_loop;
fb0f5964 18 $did_upgrade = 1;
addc801e 19}
20
31a246e4 21sub loop_until {
22 my ($class, $done) = @_;
23 return if $done;
addc801e 24 $class->loop->loop_once until $_[1];
31a246e4 25}
26
934a93db 27sub await_all {
28 my ($class, @requests) = @_;
29 @requests = grep !$_->is_done, @requests;
30 return unless @requests;
31 my %req = map +("$_" => "$_"), @requests;
32 my $done;
934a93db 33 my %on_r = map {
b1aab0cf 34 my $orig = $_->{on_result};
934a93db 35 my $tag = $req{$_};
36 ($_ => sub { delete $req{$tag}; $orig->(@_); $done = 1 unless keys %req; })
37 } @requests;
b1aab0cf 38 my $call = sub { $class->loop_until($done) };
39 foreach (@requests) {
40 my $req = $_;
41 my $inner = $call;
42 $call = sub { local $req->{on_result} = $on_r{$req}; $inner->() };
43 }
44 $call->();
934a93db 45 return;
46}
47
b61f9637 481;
51c8325b 49
50=head1 NAME
51
52Tak - Multi host remote control over ssh
53
54=head1 SYNOPSIS
55
56 bin/tak -h user1@host1 -h user2@host2 exec cat /etc/hostname
57
58or
59
60 in Takfile:
61
62 package Tak::MyScript;
63
64 use Tak::Takfile;
65 use Tak::ObjectClient;
66
67 sub each_get_homedir {
68 my ($self, $remote) = @_;
69 my $oc = Tak::ObjectClient->new(remote => $remote);
70 my $home = $oc->new_object('Path::Class::Dir')->absolute->stringify;
71 $self->stdout->print(
72 $remote->host.': '.$home."\n"
73 );
74 }
75
76 1;
77
78then
79
80 tak -h something get-homedir
81
82=head1 WHERE'S THE REST?
83
330ac6a2 84A drink leaked in my bag on the way back from LPW. My laptop is finally
85alive again though so I'll try and turn my slides into a vague attempt
86at documentation while I'm traveling to/from christmas things.
51c8325b 87
4a66f528 88=head1 Example
89
90$ cat Takfile
91package Tak::MyScript;
92
93use strict;
94use warnings;
95
96use Tak::Takfile;
97use Tak::ObjectClient;
98use lib "./lib";
99
100sub each_host {
101 my ($self, $remote) = @_;
102
103 my $oc = Tak::ObjectClient->new(remote => $remote);
104 my $name = $oc->new_object('My::Hostname');
105 print "Connected to hostname: " . $name . "\n";
106 }
107
1081;
109
110-----
111
112$cat ./lib/My/Hostname
113package My::Hostname;
114
115use Sys::Hostname;
116
117sub new {
118 my ($self) = @_;
119 my $name = hostname;
120 return $name;
121 }
122
1231;
124
51c8325b 125=head1 AUTHOR
126
127mst - Matt S. Trout (cpan:MSTROUT) <mst@shadowcat.co.uk>
128
129=head1 CONTRIBUTORS
130
131None required yet. Maybe this module is perfect (hahahahaha ...).
132
133=head1 COPYRIGHT
134
330ac6a2 135Copyright (c) 2011 the Tak L</AUTHOR> and L</CONTRIBUTORS>
51c8325b 136as listed above.
137
138=head1 LICENSE
139
140This library is free software and may be distributed under the same terms
141as perl itself.
142
143=cut