1 package Object::Remote;
3 use Object::Remote::MiniLoop;
4 use Object::Remote::Handle;
5 use Module::Runtime qw(use_module);
8 my ($class, $on, @args) = @_;
9 my $conn = __PACKAGE__->connect($on);
10 return $conn->remote_object(class => $class, args => \@args);
14 my ($class, $on, $name) = @_;
15 my $conn = __PACKAGE__->connect($on);
16 return $conn->remote_sub(join('::', $class, $name));
21 Object::Remote::Handle->new(@_)->proxy;
25 my ($class, $to) = @_;
26 use_module('Object::Remote::Connection')->new_from_spec($to);
30 our $Current_Loop ||= Object::Remote::MiniLoop->new
37 Object::Remote - Call methods on objects in other processes or on other hosts
41 Creating a connection:
45 my $conn = Object::Remote->connect('myserver'); # invokes ssh
49 my $capture = IPC::System::Simple->can::on($conn, 'capture');
51 warn $capture->('uptime');
55 my $eval = Eval::WithLexicals->new::on($conn);
57 $eval->eval(q{my $x = `uptime`});
59 warn $eval->eval(q{$x});
61 Importantly: 'myserver' only requires perl 5.8+ - no non-core modules need to
62 be installed on the far side, Object::Remote takes care of it for you!
66 Object::Remote allows you to create an object in another process - usually
67 one running on another machine you can connect to via ssh, although there
68 are other connection mechanisms available.
70 The idea here is that in many cases one wants to be able to run a piece of
71 code on another machine, or perhaps many other machines - but without having
72 to install anything on the far side.
78 The "main" API, which provides the L</connect> method to create a connection
79 to a remote process/host, L</new::on> to create an object on a connection,
80 and L</can::on> to retrieve a subref over a connection.
82 =head2 Object::Remote::Connection
84 The object representing a connection, which provides the
85 L<Object::Remote::Connection/remote_object> and
86 L<Object::Remote::Connection/remote_sub> methods that are used by
87 L</new::on> and L</can::on> to return proxies for objects and subroutines
90 =head2 Object::Remote::Future
92 Code for dealing with asynchronous operations, which provides the
93 L<Object::Remote::Future/start::method> syntax for calling a possibly
94 asynchronous method without blocking, and
95 L<Object::Remote::Future/await_future> and L<Object::Remote::Future/await_all>
96 to block until an asynchronous call completes or fails.
102 my $conn = Object::Remote->connect('-'); # fork()ed connection
104 my $conn = Object::Remote->connect('myserver'); # connection over ssh
106 my $conn = Object::Remote->connect('user@myserver'); # connection over ssh
108 my $conn = Object::Remote->connect('root@'); # connection over sudo
112 my $eval = Eval::WithLexicals->new::on($conn);
114 my $eval = Eval::WithLexicals->new::on('myserver'); # implicit connect
116 my $obj = Some::Class->new::on($conn, %args); # with constructor arguments
120 my $hostname = Sys::Hostname->can::on($conn, 'hostname');
122 my $hostname = Sys::Hostname->can::on('myserver', 'hostname');
126 IRC: #web-simple on irc.perl.org
130 mst - Matt S. Trout (cpan:MSTROUT) <mst@shadowcat.co.uk>
134 phaylon - Robert Sedlacek (cpan:PHAYLON) <r.sedlacek@shadowcat.co.uk>
138 Parts of this code were paid for by
140 Socialflow L<http://www.socialflow.com>
142 Shadowcat Systems L<http://www.shadow.cat>
146 Copyright (c) 2012 the Object::Remote L</AUTHOR>, L</CONTRIBUTORS> and
147 L</SPONSORS> as listed above.
151 This library is free software and may be distributed under the same terms