The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package BioGrepSkip;

use English qw( -no_match_vars );
use File::Spec;

sub check_prereq {
    # check if some backend is found
    my %res = ( backend => 0, bioperl => 0, bioperl_run => 0, emboss => 0 );
    my @backends = qw(vmatch guugle agrep );
    BACKEND:
    for my $backend (@backends) {
        if (find_binary_in_path($backend) ne '') {
            $res{backend} = 1;
            last BACKEND;
        }    
    }    
    eval { require Bio::Root::Root; };
    $res{bioperl} = !$EVAL_ERROR;
    eval { require Bio::Factory::EMBOSS; };
    $res{bioperl_run} = !$EVAL_ERROR;
    $res{emboss} = 1 if find_binary_in_path('needle') ne '';
    return %res;
}    

sub skip_all {
    my %prereq = check_prereq();
    my $binary = shift;
    if (defined $binary) {
        set_path($binary);
        if (!find_binary_in_path( $binary ) ) {
            return (1, "$binary not in path");
        }
    }    
    if ( !$prereq{bioperl} ) {
        return (1, 'Bioperl not found');
    }
    elsif ( !$prereq{bioperl_run} ) {
        return (1, 'Bioperl-run not found');
    }
    else {
        return (0, '');
    }
}    
sub find_binary_in_path {
   my ( $name ) = @_;
   my @PATH = File::Spec->path();
   foreach my $path (@PATH) {
      if ( -e $path . "/$name" && !-d $path . "/$name") {
         return $path ;
      }
   }
   return '';
}

sub set_path {
    my ( @execs) = @_;
    my @paths = ( '/bin', '/usr/bin' );
    
    foreach my $exec (@execs) {
        my $path = find_binary_in_path($exec);
        push @paths, $path if $path ne '';
    }
    ( $ENV{PATH} ) = join(':', @paths) =~ /(.*)/; 
}

1;