Acme-RemoteINC

 view release on metacpan or  search on metacpan

lib/Acme/RemoteINC.pm  view on Meta::CPAN

package Acme::RemoteINC;

use 5.008;
use strict;
use warnings;
use Net::FTP;
use File::Temp;
our $VERSION = 0.15;

sub new { 
    my($class, %args) = @_;
    my $self = {};
    bless $self, $class;
    foreach my $k ( qw(ftp host user password perl_root) ) 
      { $self->{$k} = $args{$k} if $args{$k} }
    unless( $self->{ftp} ) {
        my $ftp = new Net::FTP($self->{host}) or return;
        $ftp->login( $self->{user} => $self->{password} ) or return;
        $self->{ftp} = $ftp;
    }
    # register ourself in @INC.
    push @INC, $self;
    return $self;
}

sub Acme::RemoteINC::INC {
    my($self, $filename) = @_;
    my($tmpFH, $tmpname) = File::Temp::tmpnam();
    my @subdirs;
    if(ref $self->{perl_root}) { @subdirs = @{$self->{perl_root}} }
    else { push @subdirs, $self->{perl_root} }
    foreach my $path (@subdirs) {
        $self->{ftp}->cwd($path);
        return $tmpFH if $self->{ftp}->get($filename, $tmpname);
    }
    return undef;
}

=head1 NAME

Acme::RemoteINC - Slowest Possible Module Loading

=head1 DESCRIPTION

For your SlowCGI pleasure, loads perl modules via FTP from remote sites.
Please don thick rubber gloves and consider version and binary XS module 
compatibility before using. Requires Perl 5.8 or greater.

=head1 (IR)RATIONALE

Who do you want to kid today? A paranoid ISP admin who won't let you load 
your favorite CPAN module on his system? Yourself, for considering this as 
a valid solution to a social problem like that one?

=head1 SYNOPSIS

 use strict;
 use warnings;
    
 BEGIN {
    require Acme::RemoteINC;
    my $rinc = new Acme::RemoteINC(
        host      => 'ftp.esoteric-perl.com',
        user      => 'anonymous',
        password  => 'pwd@myhost.com',
        perl_root => '/usr/lib/perl5/site_perl/5.8.1'
    );
 }

 use DBI;  # load local DBI by default
 use DBD::Esoterica;  # if cannot load locally, will try the FTP method
 ...etc.

=head1 METHODS

=head2 B<new>

    my $rinc = new Acme::RemoteINC(
      host      => 'ftp.myserver.com',
      user      => 'anonymous',
      password  => 'pwd@myhost.com',
      perl_root => [ '/usr/lib/perl5/site_perl', /usr/lib_site_perl/5.8.1 ]
    );
    
    or 
    my $ftp = new Net::FTP;
    ...
    my $rinc = Acme::RemoteINC->new(ftp => $ftp);
    
 
The new method creates a new Acme::RemoteINC object. Three paired hash 
entry named arguments are required for new:

host => $hostname

The name of the ftp server.
      
user => $loginname

Login user name.
        
password => $pwd

Login password.
    
  Two paired hash entry named arguments are optional arguments for new:

perl_root => $wdir

Perl module directory name relative to the FTP service root.
Defaults to the default ftp service's base working directory.
Alternative: may be a reference to an array of such module directories.
        
ftp => $ftp
     
When given as an argument, this overrides use of the otherwise required 
arguments. ftp is then expected to be a Net::FTP object which has already 
been logged in.

   NOTE: It is advisable that the call to new be done in a BEGIN block. 
   It is also advisable to load Acme::RemoteINC via require in the BEGIN block.

=head2 B<INC>

    This internal method is used by the use and require directives after 
    the reference to the Acme::RemoteINC object has been placed in @INC.
    For details, see the perlfunc docs for require.

=head1 BUGS

This code is beyond bugs. Here there be monsters. The entire concept of 
loading modules via hooks to Net::FTP may well be fatally flawed. Enjoy :).

=head1 SEE ALSO

=head2 L<Acme::Everything>

=head2 L<Net::FTP>

=head2 L<Tie::FTP>

=cut

=head1 AUTHOR

William Herrera (wherrera@skylightview.com)

=head1 SUPPORT

Rude noises, questions, feature requests, rolling eye movements, and 
inquiries regarding the mental state required to upload code this slow are 
referred to the Acme, Incorporated Perl suggestion box (thanks@dev.null).

=head1 COPYRIGHT

  Copyright (C) 2004 William Hererra.  All Rights Reserved.

  This module is free software; you can redistribute it and/or mutilate it
  under the same terms as Perl itself.

=cut

1;



( run in 1.166 second using v1.01-cache-2.11-cpan-39bf76dae61 )