IPC-PerlSSH
view release on metacpan or search on metacpan
lib/IPC/PerlSSH.pm view on Meta::CPAN
=cut
sub store
{
my $self = shift;
my %funcs = @_;
foreach my $name ( keys %funcs ) {
$self->_has_stored_code( $name ) and croak "Already have a stored function called '$name'";
}
$self->write_message( "STORE", %funcs );
my ( $ret, @retargs ) = $self->read_message;
if( $ret eq "OK" ) {
$self->{stored}{$_} = 1 for keys %funcs;
return;
}
elsif( $ret eq "DIED" ) {
my ( $message ) = @retargs;
if( $message =~ m/^While compiling code for (\S+):.* at \(eval \d+\) line (\d+)/ ) {
my $code = $funcs{$1};
$message .= " ==> " . (split m/\n/, $code)[$2 - 1] . "\n";
}
die "Remote host threw an exception:\n$message";
}
elsif( $ret eq "CLOSED" ) {
die "Remote connection closed\n";
}
else {
die "Unknown return result $ret\n";
}
}
sub _has_stored_code
{
my $self = shift;
my ( $name ) = @_;
return exists $self->{stored}{$name};
}
=head2 bind
$ips->bind( $name, $code )
This method is identical to the C<store> method, except that the remote
function will be available as a plain function within the local perl
program, as a function of the given name in the caller's package.
=cut
sub bind
{
my $self = shift;
my ( $name, $code ) = @_;
$self->store( $name, $code );
my $caller = (caller)[0];
{
no strict 'refs';
*{$caller."::$name"} = sub { $self->call( $name, @_ ) };
}
}
=head2 call
@result = $ips->call( $name, @args )
This method invokes a remote method that has earlier been defined using the
C<store> or C<bind> methods. The arguments are passed and the result is
returned in the same way as with the C<eval> method.
If an exception occurs during execution, it is propagated and thrown by this
method. If the remote process exits before responding, this will be propagated
as an exception.
=cut
sub call
{
my $self = shift;
my ( $name, @args ) = @_;
$self->_has_stored_code( $name ) or croak "Do not have a stored function called '$name'";
$self->write_message( "CALL", $name, @args );
my ( $ret, @retargs ) = $self->read_message;
if( $ret eq "RETURNED" ) {
# If the caller didn't want an array and we received more than one result
# from the far end; we'll just have to throw it away...
return wantarray ? @retargs : $retargs[0];
}
elsif( $ret eq "DIED" ) {
die "Remote host threw an exception:\n$retargs[0]";
}
elsif( $ret eq "CLOSED" ) {
die "Remote connection closed\n";
}
else {
die "Unknown return result $ret\n";
}
}
=head2 use_library
$ips->use_library( $library, @funcs )
This method loads a library of code from a module, and stores them to the
remote perl by calling C<store> on each one. The C<$library> name may be a
full class name, or a name within the C<IPC::PerlSSH::Library::> space.
If the C<@funcs> list is non-empty, then only those named functions are stored
(analogous to the C<use> perl statement). This may be useful in large
libraries that define many functions, only a few of which are actually used.
For more information, see L<IPC::PerlSSH::Library>.
( run in 2.665 seconds using v1.01-cache-2.11-cpan-b16cb0d3907 )