[Bioperl-l] Generalized _setparams proposal

Sendu Bala bix at sendu.me.uk
Wed Jan 10 15:49:31 UTC 2007


Bioperl-run wrappers (and some other modules) typically store parameters 
from the user intended for the program they wrap via methods of similar 
name to the parameter. The wrappers then implement their own way of 
taking the values of those methods and generating a parameter string 
suitable for passing to the program.

Typically this is done in a _setparams() method with code along the 
lines of:

$param_string .= ' --param_x '.$self->param_x if $self->param_x;

or a number of modules have their own variation on:

# clustalw's _setparam method
my $param_string = "";
for  $attr ( @CLUSTALW_PARAMS ) {
   $value = $self->$attr();
   next unless (defined $value);
   my $attr_key = lc $attr; #put params in format expected by clustalw
   $attr_key = ' -'.$attr_key;
   $param_string .= $attr_key.'='.$value;
}
#...


I propose generalizing this into a _setparams method in 
Bio::Tools::Run::WrapperBase, eg. such that the above could be 
re-implemented as:

# clustalw's _setparam method
my $param_string = $self->SUPER::_setparam(
   -methods => \@CLUSTALW_PARAMS,
   -dash => 1,
   -lc => 1,
   -join => '=');
#...



Proposed code follows:

=head2  _setparams()

  Title   : _setparams
  Usage   : $params = $self->_setparams(-methods => [qw(window 
evalue_cutoff)])
  Function: For internal use by wrapper modules to build parameter strings
            suitable for sending to the program being wrapped. For each 
method
            name supplied, calls the method and adds the method name (as 
modified
            by optional things) along with its value (unless a switch) 
to the
            parameter string
  Example : $params = $self->_setparams(-methods => [qw(window 
evalue_cutoff)],
                                        -double_dash => 1,
                                        -underscore_to_dash => 1);
            If window() had not been previously called, but 
evalue_cutoff(0.5)
            had been called, $params would be ' --evalue-cutoff 0.5'

            A separate call should be used for methods that store values 
that
            are intended to be valueless switches:

            $params .= $self->_setparams(-methods => [qw(simple large all)],
                                         -switches => 1,
                                         -double_dash => 1,
                                         -underscore_to_dash => 1);
            If simple() had not been called, large(1) had been called 
and all(0)
            had been called, $params would now be ' --evalue-cutoff 0.5 
--large'

  Returns : parameter string
  Args    : -methods => [] or {} # REQUIRED, array ref of method names 
to call,
                                   or hash ref where keys are method 
names and
                                   values are how those names should be 
output
                                   in the params string
            -join => string      # define how parameters and their 
values are
                                   joined, default ' '. (eg. could be 
'=' for
                                   param=value)
            -switches => boolean # all supplied methods are treated as 
switches
            -lc => boolean       # lc() method names prior to output in 
string
            -dash => boolean     # prefix all method names with a single 
dash
            -double_dash => bool # prefix all method names with a double 
dash
            -underscore_to_dash => boolean # convert all underscores in 
method
                                             names to dashes

=cut

sub _setparams {
     my ($self, @args) = @_;

     my ($methods, $switch, $join, $lc, $d, $dd, $utd) =
         $self->_rearrange([qw(METHODS
                               SWITCHES
                               JOIN
                               LC
                               DASH
                               DOUBLE_DASH
                               UNDERSCORE_TO_DASH)], @args);
     $self->throw('-methods is required') unless $methods;
     $self->throw("-dash and -double_dash are mutually exclusive") if 
($d && $dd);
     $join ||= ' ';

     my %methods = ref($methods) eq 'HASH' ? %{$methods} : map { $_ => 
$_ } @{$methods};

     my $param_string = '';
     while (my ($method, $method_out) = each %methods) {
         my $value = $self->$method();
         next unless (defined $value);
         next if ($switch && ! $value);

         $method_out = lc($method_out) if $lc;
         $method_out = '-'.$method_out if $d;
         $method_out = '--'.$method_out if $dd;
         $method_out =~ s/_/-/g if $utd;

         $param_string .= ' '.$method_out.($switch ? '' : $join.$value);
     }

     return $param_string;
}



More information about the Bioperl-l mailing list