Mercurial > repos > willmclaren > ensembl_vep
diff variant_effect_predictor/Bio/EnsEMBL/Utils/Argument.pm @ 0:21066c0abaf5 draft
Uploaded
| author | willmclaren |
|---|---|
| date | Fri, 03 Aug 2012 10:04:48 -0400 |
| parents | |
| children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/variant_effect_predictor/Bio/EnsEMBL/Utils/Argument.pm Fri Aug 03 10:04:48 2012 -0400 @@ -0,0 +1,161 @@ +=head1 LICENSE + + Copyright (c) 1999-2012 The European Bioinformatics Institute and + Genome Research Limited. All rights reserved. + + This software is distributed under a modified Apache license. + For license details, please see + + http://www.ensembl.org/info/about/code_licence.html + +=head1 CONTACT + + Please email comments or questions to the public Ensembl + developers list at <dev@ensembl.org>. + + Questions may also be sent to the Ensembl help desk at + <helpdesk@ensembl.org>. + +=cut + +=head1 NAME + +Bio::EnsEMBL::Utils::Argument - Utility functions for argument handling + +=head1 SYNOPSIS + + use Bio::EnsEMBL::Utils::Argument qw(rearrange) + + package Feature; + + sub new { + my $class = shift; + my ( $start, $end, $strand ) = + rearrange( [ 'START', 'END', 'STRAND' ], @_ ); + + return + bless( { 'start' => $start, 'end' => $end, 'strand' => $strand }, + $class ); + } + +=head1 DESCRIPTION + +This is derived from the Bio::Root module in BioPerl. The _rearrange +object method taken from BioPerl has been renamed rearrange and is now +a static class method. This method was originally written by Lincoln +Stein, and has since been refactored several times by various people (as +described below). + +It is recommended that this package be used instead of inheriting +unnecessarily from the Bio::EnsEMBL::Root or Bio::Root object. + +=head1 METHODS + +=cut + +package Bio::EnsEMBL::Utils::Argument; + +use strict; +use warnings; + +use Exporter; + +use vars qw(@ISA @EXPORT); + +@ISA = qw(Exporter); +@EXPORT = qw(rearrange); + + + +=head2 rearrange + + Usage : rearrange( array_ref, list_of_arguments) + Purpose : Rearranges named parameters to requested order. + Example : use Bio::EnsEMBL::Utils::Argument qw(rearrange); + : rearrange([qw(SEQUENCE ID DESC)],@param); + : Where @param = (-sequence => $s, + : -id => $i, + : -desc => $d); + Returns : @params - an array of parameters in the requested order. + : The above example would return ($s, $i, $d) + Argument : $order : a reference to an array which describes the desired + : order of the named parameters. + : @param : an array of parameters, either as a list (in + : which case the function simply returns the list), + : or as an associative array with hyphenated tags + : (in which case the function sorts the values + : according to @{$order} and returns that new array.) + : The tags can be upper, lower, or mixed case + : but they must start with a hyphen (at least the + : first one should be hyphenated.) + Source : This function was taken from CGI.pm, written by Dr. Lincoln + : Stein, and adapted for use in Bio::Seq by Richard Resnick and + : then adapted for use in Bio::Root::Object.pm by Steve A. Chervitz. + : This has since been adapted as an exported static method in this + class Bio::EnsEMBL::Utils::Argument + Comments : (SAC) + : This method may not be appropriate for method calls that are + : within in an inner loop if efficiency is a concern. + : + : Parameters can be specified using any of these formats: + : @param = (-name=>'me', -color=>'blue'); + : @param = (-NAME=>'me', -COLOR=>'blue'); + : @param = (-Name=>'me', -Color=>'blue'); + : A leading hyphenated argument is used by this function to + : indicate that named parameters are being used. + : Therefore, a ('me', 'blue') list will be returned as-is. + : + : Note that Perl will confuse unquoted, hyphenated tags as + : function calls if there is a function of the same name + : in the current namespace: + : -name => 'foo' is interpreted as -&name => 'foo' + : + : For ultimate safety, put single quotes around the tag: + : ('-name'=>'me', '-color' =>'blue'); + : This can be a bit cumbersome and I find not as readable + : as using all uppercase, which is also fairly safe: + : (-NAME=>'me', -COLOR =>'blue'); + : + : Personal note (SAC): I have found all uppercase tags to + : be more managable: it involves less single-quoting, + : the code is more readable, and there are no method naming + : conlicts. + : Regardless of the style, it greatly helps to line + : the parameters up vertically for long/complex lists. + +=cut + + +sub rearrange { + my $order = shift; + + if ( $order eq "Bio::EnsEMBL::Utils::Argument" ) { + # skip object if one provided + $order = shift; + } + + # If we've got parameters, we need to check to see whether + # they are named or simply listed. If they are listed, we + # can just return them. + unless ( @_ && $_[0] && substr( $_[0], 0, 1 ) eq '-' ) { + return @_; + } + + # Push undef onto the end if % 2 != 0 to stop warnings + push @_,undef unless $#_ %2; + my %param; + while( @_ ) { + #deletes all dashes & uppercases at the same time + (my $key = shift) =~ tr/a-z\055/A-Z/d; + $param{$key} = shift; + } + + # What we intend to do is loop through the @{$order} variable, + # and for each value, we use that as a key into our associative + # array, pushing the value at that key onto our return array. + return map { $param{uc($_)} } @$order; +} + +1; + +
