/usr/local/CPAN/Padre-Plugin-Debugger/Devel/ebug/Padre.pm


package Devel::ebug::Padre;

use String::Koremutake;
use IO::Socket::INET;
use Class::Accessor::Chained::Fast;

use base (Devel::ebug);

__PACKAGE__->mk_accessors(qw(
    interpreter interpreter_args program_args));

our $VERSION = "0.49";

# This is a copy paste from Devel::ebug, except that the $command variable is
# more configurable

sub load {
  my $self = shift;
  my $program = $self->program;
  my $interpreter = $self->interpreter || $^X;
  my $interpreter_args = defined( $self->interpreter_args ) ?  $self->interpreter_args : "-Ilib";
  my $program_args = defined( $self->program_args ) ? $self->program_args : "";

  # import all the plugins into our namespace
  do { eval "use $_ " } for $self->plugins;

  my $k = String::Koremutake->new;
  my $rand = int(rand(100_000));
  my $secret = $k->integer_to_koremutake($rand);
  my $port   = 3141 + ($rand % 1024);

  $ENV{SECRET} = $secret;
  my $command = join " ", $interpreter, $interpreter_args, "-d:ebug::Backend", $program, $program_args;
#  warn "Running: $command\n";
  my $proc = Proc::Background->new(
    {'die_upon_destroy' => 1},
    $command
  );
  croak(qq{Devel::ebug: Failed to start up "$program" in load()}) unless $proc->alive;
  $self->proc($proc);
  $ENV{SECRET} = "";

  # try and connect to the server
  my $socket;
  foreach (1..10) {
    $socket = IO::Socket::INET->new(
      PeerAddr => "localhost",
      PeerPort => $port,
      Proto    => 'tcp',
      Reuse      => 1,
      ReuserAddr => 1,
    );
    last if $socket;
    sleep 1;
  }
  die "Could not connect: $!" unless $socket;
  $self->socket($socket);
 
  my $response = $self->talk({
    command => "ping",
    version => $VERSION,
    secret  => $secret,
  });
  my $version = $response->{version};
  die "Client version $version != our version $VERSION" unless $version eq $VERSION;
  $self->basic; # get basic information for the first line
}

1;