#!/usr/bin/perl -w # deob.pl --- # Last modify Time-stamp: # Version: v 0.0 2007/10/27 07:43:18 # Author: Ye Wenbin use strict; use warnings; #{{{ Ring package Ring; # # method: # - insert: insert an element to ring # - peek: return current element # - roll_back: remove current element # - resize: resize the ring sub new { my $_class = shift; my $class = ref $_class || $_class; my $self = {size => 0, data => [], curr=> 0, length => 0}; if ( ref $_[0] ) { $self->{data} = shift; $self->{size} = scalar(@{$self->{data}}); $self->{length} = $self->{size}; } if ( @_ ) { $self->{size} = shift; } bless $self, $class; return $self; } sub insert { my $self = shift; if ( $self->{size} == 0 ) { return; } $self->{data}[$self->{curr}] = shift; $self->{curr}++; if ( $self->{curr} == $self->{size} ) { $self->{curr} = 0; } if ( $self->{length} < $self->{size} ) { $self->{length}++; } return $self->{length}; } sub roll_back { my $self = shift; if ( $self->{length} == 0 ) { return; } $self->{curr}--; if ( $self->{curr} < 0 ) { $self->{curr} = $self->{size}-1; } $self->{length}--; } sub peek { my $self = shift; if ( $self->{length} == 0 ) { return; } return $self->{data}[$self->{curr}-1]; } sub toarray { my $self = shift; if ( $self->{length} == 0 ) { return; } my ($data, $curr, $len) = ($self->{data}, $self->{curr}, $self->{length}); if ( $curr - $len < 0 ) { return (@{$data}[$#$data-($len-$curr)+1..$#$data], @{$data}[0..$curr-1]); } else { return @{$data}[($curr-$len)..$curr-1]; } } sub length { my $self = shift; return $self->{length}; } sub size { my $self = shift; return $self->{size}; } sub resize { my $self = shift; my $newsize = shift; if ( $newsize > $self->{size} ) { splice(@{$self->{data}}, $self->{curr}, 0, (undef)x($newsize-$self->{size})); } else { my $len = $self->{size}-$newsize; if ( $self->{curr} + $len > $self->{size} ) { splice(@{$self->{data}}, $self->{curr}, $self->{size}-$self->{curr}); splice(@{$self->{data}}, 0, $len-$self->{size}+$self->{curr}); } else { splice(@{$self->{data}}, $self->{curr}, $len); } if ( $self->{length} > $newsize ) { $self->{length} = $newsize; } } $self->{size} = $newsize; } #}}} package main; use Deobfuscator; use Getopt::Long; use Pod::Usage; use List::Util qw(max min); use Text::Abbrev; use Text::Wrap; use Data::Dumper qw(Dumper); use FindBin qw($Bin); # Turn all buffering off. select((select(STDOUT), $| = 1)[0]); select((select(STDERR), $| = 1)[0]); select((select(STDIN), $| = 1)[0]); #{{{ Main Loop #{{{ Global Variables our %commands = ( alias => \&alias, desc => \&desc, exit => \&quit, help => \&help, history => \&history, isa => \&isa, method => \&method, pop => \&pop_history, quit => \&quit, search => \&search, show => \&show, synopsis => \&synopsis, ); our %cmd_abbv = abbrev( keys %commands ); #{{{ Help documents our %help_doc = ( help => <<"HELP", Syntax: command [options] [parameters] Available commands: alias [ -quiet ] alias command desc [ -short ] [ module ] exit help [ command ] history [ -method -show_all ] number isa [ -tree -child ] [ modlue ] method [-sort method|class ] [ module ] pop [ -method ] [ number ] quit search [ -ignorecase -case -method ] pattern show method synopsis [ module ] HELP search => <<"SEARCH", search [-ignorecase -case -method] patten Search the modules or methods that match the pattern. SEARCH isa => <<"ISA", isa [-child -tree] [module] Show the superclass or child class of module. Option -tree indicate using Data::TreeDumper show the hierarchy tree of the module. Option -child indicate show the child class of the module. The parameters module can be the full name of the module, or the Id number in last search result. If omit, use the modules last time used. ISA exit => <<"EXIT", exit Exit the program. EXIT quit => <<"QUIT", quit Exit the program. QUIT desc => <<"DESC", desc [-short] [module] Show the description of the module. option -short indicate show the short description of the module. The parameters module can be the full name of the module, or the Id number in last search result. If omit, use the modules last time used. DESC history => <<"HISTORY", history [-method -show_all] [ number ] Show the last number history in the module or method ring. Option -show_all indicate show all items in history, override the \$Config{history_max_items}. HISTORY pop => << "POP", pop [-method ] [number] Remove the last number item in history. POP alias => <<"ALIAS", alias [-quiet] new command Make the name "new" do the same as original "command". ALIAS method => <<"METHOD", method [-sort class|method] [module] Show the method of the module. Option -sort indicate the order to display the table. Current support two sort method: class or method. The parameters module can be the full name of the module, or the Id number in last search result. If omit, use the modules last time used. METHOD synopsis => <<"SYNOPSIS", synopsis [module] Show the synopsis of the module. The parameters module can be the full name of the module, or the Id number in last search result. If omit, use the modules last time used. SYNOPSIS show => <<"SHOW", show method Show the detail information of the method. The parameters method can be the full name of the module, or the Id number in last query using command "method". SHOW ); #}}} our $current_cmd; our @last_module; our ($module_history, $method_history); our ($packages, $methods); our ($isa, $risa, $tree); #{{{ Configuration our %Config = ( # File create by deob_index.pl 'packages' => "packages.db", 'methods' => "methods.db", # ignore case for search pattern and commands 'ignorecase' => 1, # list methods order 'sort_method_by' => 'class', # Max items record in history 'history_length' => 30, # Max items to show using command 'history' 'history_max_items' => 3, # Max rows in the table 'max_rows' => 1000, # Table output style, current only three style # support: 'table', 'orgtbl', 'tab' 'table_style' => 'table', # Max column width of table 'max_width' => 50, # Column width for each command that output table 'width' => { method => [ undef, undef, undef, 30, 30 ], }, # Output row seperator or not for each command 'row_separator' => { 'method' => 1, }, ); my $home; eval { require File::HomeDir }; if ( $@ ) { $home = File::HomeDir->my_home; } else { $home = $ENV{HOME} || $Bin; } if ( -e "$home/.deob" ) { eval { require "$home/.deob" }; if ( $@ ) { print STDERR "Error when load config file!\n"; } } #}}} $packages = Deobfuscator::open_db($Config{packages}); $methods = Deobfuscator::open_db($Config{methods}); $module_history = Ring->new( $Config{history_length} ); $method_history = Ring->new( $Config{history_length} ); #}}} while ( 1 ) { print "deob> "; $current_cmd = ; if ( !defined $current_cmd ) { quit(); } chomp($current_cmd); trim($current_cmd); if ( $current_cmd ) { my @words = split /\s/, $current_cmd; if ( $Config{ignorecase} ) { $words[0] = lc($words[0]); } if ( exists $cmd_abbv{$words[0]} ) { my $cmd = $cmd_abbv{shift @words}; $commands{$cmd}->(@words); } else { print "Unknown command \"$words[0]\"\n" } } } #}}} #{{{ Helper function # replace_index($array_ref, $history) # if the item in the array ref is a number, replace it with the thing # in the nth of last item of history. sub replace_index { my ($args, $history) = @_; my $last; foreach ( @$args ) { if ( /^\d+$/ ) { unless ( $last ) { $last = $history->peek; if ( defined $last ) { $last = $last->[1]; } else { print "No last item found! Please do some search first.\n"; } } if ( defined $last ) { if ( $_ <= $#$last+1 ) { $_ = $last->[$_-1]; } else { $_ = undef; print "$_ out of range! Max index is ", $#$last+1, "\n"; } } else { $_ = undef; } } } @$args = grep { defined $_ } @$args; } sub save_history { my $mods = shift; if ( @$mods ) { replace_index($mods, $module_history); @last_module = @$mods; } else { @$mods = @last_module; } } sub trim_table { my $table = shift; if ( $#$table > $Config{max_rows} ) { print "Match item exceed the max rows!\n"; $#$table = $Config{max_rows}; } } #}}} #{{{ Commands sub eval_input { (my $code = $current_cmd) =~ s/^\w+//; eval($code); } sub quit { print "\nByebye!\n"; exit; } sub help { my @args = @_; if ( @args ) { my %seen; foreach ( @args ) { if ( !exists $cmd_abbv{$_} ) { print "No command \"$_\" found!\n"; next; } my $full = $cmd_abbv{$_}; next if exists $seen{$full}; $seen{$full}++; if ( exists $help_doc{$full} ) { print "* $_\n"; print $help_doc{$full}, "\n"; } else { print "Sorry, the document about \"$_\" is not write yet!\n"; } } } else { print $help_doc{help}, "\n"; } } sub pop_history { my @args = shift; my $method; parse_args(\@args, {'-method' => \$method }); my $n = $args[0] || 1; my $history = $module_history; if ( $method ) { $history = $method_history; } while ( $n > 0 ) { last if !$history->roll_back; $n--; } } sub history { my @args = @_; my ($method, $show_all, $n); parse_args(\@args, { '-method' => \$method, '-show_all' => \$show_all, }); my @history = ( $method ? $method_history->toarray : $module_history->toarray ); if ( @args ) { $n = shift @args; if ( $n< scalar(@history) ) { splice(@history, 0, $#history-$n+1); } } foreach ( 1..$#history+1 ) { my $h = $history[$_-1]; print "$_. ", $h->[0], "\n"; my $idx = ( $show_all ? $#{$h->[1]} : min($Config{history_max_items}, $#{$h->[1]})); for ( 0..$idx ) { print " ", sprintf("%3d. ", $_+1), $h->[1][$_], "\n"; } if ( $#{$h->[1]} > $idx ) { print " ...\n"; } } } sub show { my @args = @_; replace_index( \@args, $method_history ); foreach my $m (@args) { print "* $m\n"; my @table; foreach ( "title", "usage", "function", "returns", "args" ) { my $doc = Deobfuscator::get_method_docs( $methods, $m, $_ ); if ( $doc eq "0" ) { $doc = "not documented"; } else { normal_space(trim($doc)) } push @table, [ ucfirst($_), $doc ]; } print_table( \@table, style => $Config{table_style}, max_width => $Config{max_width}, width => $Config{width}{show}, row_separator => $Config{row_separator}{show}, ); } } sub alias { my @args = @_; my ($quiet); parse_args(\@args, { -quiet => \$quiet }); my ($alias, $cmd) = @args; if ( !exists $cmd_abbv{$cmd} ) { print "Unknown command \"$cmd\"\n"; return; } if ( !$quiet ) { print "\"$alias\" alias to \"$cmd_abbv{$cmd}\"\n"; } add_abbrev(\%cmd_abbv, $alias); $commands{$alias} = $commands{$cmd}; } sub synopsis { my @args = @_; save_history(\@args); foreach ( @args ) { print "* $_\n"; print trim(normal_space(Deobfuscator::get_pkg_docs($packages, $_, 'synopsis'))); print "\n"; } } sub isa { my @args = @_; if ( !defined $isa ) { #{{{ ISA $isa = { 'Bio::DB::GFF::Adaptor::dbi' => [ 'Bio::DB::GFF' ], 'Bio::OntologyIO::InterProParser' => [ 'Bio::OntologyIO' ], 'Bio::Seq::Quality' => [ 'Bio::LocatableSeq', 'Bio::Seq::Meta::Array' ], 'Bio::Graphics::FeatureFile::Iterator' => [], 'Bio::DB::GenericWebDBI' => [ 'Bio::Root::Root', 'LWP::UserAgent' ], 'Bio::Map::Clone' => [ 'Bio::Root::Root', 'Bio::Map::MappableI' ], 'Bio::Tools::RestrictionEnzyme' => [ 'Bio::Root::Root', 'Exporter' ], 'Bio::SeqIO::raw' => [ 'Bio::SeqIO' ], 'Bio::Map::EntityI' => [ 'Bio::Root::RootI' ], 'Bio::AlignIO::phylip' => [ 'Bio::AlignIO' ], 'Bio::FeatureIO::interpro' => [ 'Bio::FeatureIO' ], 'Bio::DB::ReferenceI' => [], 'Bio::Assembly::IO::ace' => [ 'Bio::Assembly::IO' ], 'Bio::Root::Version' => [], 'Bio::Annotation::SimpleValue' => [ 'Bio::Root::Root', 'Bio::AnnotationI' ], 'Bio::Tools::Phylo::PAML' => [ 'Bio::Root::Root', 'Bio::Root::IO', 'Bio::AnalysisParserI' ], 'Bio::Factory::SeqAnalysisParserFactoryI' => [ 'Bio::Root::RootI' ], 'Bio::Seq::SeqBuilder' => [ 'Bio::Root::Root', 'Bio::Factory::ObjectBuilderI' ], 'Bio::Factory::ResultFactoryI' => [ 'Bio::Root::RootI' ], 'Bio::Tools::BPlite::Iteration' => [ 'Bio::Root::Root' ], 'Bio::Ontology::Path' => [ 'Bio::Ontology::Relationship', 'Bio::Ontology::PathI' ], 'Bio::DB::GFF::Aggregator::ucsc_twinscan' => [ 'Bio::DB::GFF::Aggregator' ], 'Bio::DB::Flat' => [ 'Bio::Root::Root', 'Bio::DB::RandomAccessI' ], 'Bio::IdentifiableI' => [ 'Bio::Root::RootI' ], 'Bio::SeqIO::tigr' => [ 'Bio::SeqIO' ], 'Bio::DB::GFF::Adaptor::biofetch_oracle' => [ 'Bio::DB::GFF::Adaptor::dbi::oracle' ], 'Bio::DB::QueryI' => [ 'Bio::Root::RootI' ], 'Bio::Seq::RichSeq' => [ 'Bio::Seq', 'Bio::Seq::RichSeqI' ], 'Bio::Search::HSP::PsiBlastHSP' => [ 'Bio::SeqFeature::SimilarityPair', 'Bio::Search::HSP::HSPI' ], 'Bio::LiveSeq::Exon' => [ 'Bio::LiveSeq::Range' ], 'Bio::DB::GFF::Feature' => [ 'Bio::DB::GFF::RelSegment', 'Bio::SeqFeatureI' ], 'Bio::PopGen::IO::csv' => [ 'Bio::PopGen::IO' ], 'Bio::Tools::Run::GenericParameters' => [ 'Bio::Root::Root', 'Bio::Tools::Run::ParametersI' ], 'Bio::SeqIO::tigrxml' => [ 'Bio::SeqIO', 'XML::SAX::Base' ], 'Bio::DB::Flat::BinarySearch' => [ 'Bio::DB::RandomAccessI' ], 'Bio::Search::Hit::BlastHit' => [ 'Bio::Search::Hit::GenericHit' ], 'Bio::Graphics::Glyph::ruler_arrow' => [ 'Bio::Graphics::Glyph::generic' ], 'Bio::Ontology::TermFactory' => [ 'Bio::Factory::ObjectFactory' ], 'Bio::Ontology::InterProTerm' => [ 'Bio::Ontology::Term' ], 'Bio::DB::RandomAccessI' => [ 'Bio::Root::Root' ], 'Bio::Search::HSP::FastaHSP' => [ 'Bio::Search::HSP::GenericHSP' ], 'Bio::Symbol::Symbol' => [ 'Bio::Root::Root', 'Bio::Symbol::SymbolI' ], 'Bio::Tools::tRNAscanSE' => [ 'Bio::Tools::AnalysisResult' ], 'Bio::Taxonomy::Tree' => [ 'Bio::Root::Root', 'Bio::Tree::TreeI', 'Bio::Tree::TreeFunctionsI' ], 'Bio::DB::GFF::Adaptor::dbi::pg' => [ 'Bio::DB::GFF::Adaptor::dbi' ], 'Bio::Search::Result::WABAResult' => [ 'Bio::Search::Result::GenericResult' ], 'Bio::PopGen::PopulationI' => [ 'Bio::Root::RootI' ], 'Bio::SeqFeature::Gene::GeneStructure' => [ 'Bio::SeqFeature::Generic', 'Bio::SeqFeature::Gene::GeneStructureI' ], 'Bio::SeqIO::scf' => [ 'Bio::SeqIO' ], 'Bio::Tools::ECnumber' => [ 'Bio::Root::Root' ], 'Bio::DB::Flat::BDB' => [ 'Bio::DB::Flat' ], 'Bio::Factory::ApplicationFactoryI' => [ 'Bio::Root::RootI' ], 'Bio::RangeI' => [ 'Bio::Root::RootI' ], 'Bio::OntologyIO::Handlers::InterProHandler' => [ 'Bio::Root::Root' ], 'Bio::Factory::DriverFactory' => [ 'Bio::Root::Root' ], 'Bio::Variation::SNP' => [ 'Bio::Variation::SeqDiff', 'Bio::Variation::Allele' ], 'Bio::Graphics::Glyph::dumbbell' => [ 'Bio::Graphics::Glyph::generic' ], 'Bio::SearchIO::Writer::HTMLResultWriter' => [ 'Bio::Root::Root', 'Bio::SearchIO::SearchWriterI' ], 'Bio::MapIO::fpc' => [ 'Bio::MapIO' ], 'Bio::Phenotype::MeSH::Twig' => [ 'Bio::Root::Root' ], 'Bio::Tools::Hmmpfam' => [ 'Bio::Root::Root', 'Bio::Root::IO' ], 'Bio::SeqIO::game::gameWriter' => [ 'Bio::SeqIO::game::gameSubs' ], 'Bio::SearchIO::Writer::ResultTableWriter' => [ 'Bio::Root::Root', 'Bio::SearchIO::SearchWriterI' ], 'Bio::DB::GFF::Aggregator::ucsc_refgene' => [ 'Bio::DB::GFF::Aggregator' ], 'Bio::Assembly::ScaffoldI' => [ 'Bio::Root::RootI' ], 'Bio::Graphics::Glyph' => [ 'Bio::Root::Root' ], 'Bio::DB::Taxonomy::list' => [ 'Bio::DB::Taxonomy' ], 'Bio::LiveSeq::Range' => [ 'Bio::LiveSeq::SeqI' ], 'Bio::SearchIO::waba' => [ 'Bio::SearchIO' ], 'Bio::Structure::IO::pdb' => [ 'Bio::Structure::IO' ], 'Bio::Search::Result::HMMERResult' => [ 'Bio::Search::Result::GenericResult' ], 'Bio::Biblio::Patent' => [ 'Bio::Biblio::Ref' ], 'Bio::Structure::SecStr::STRIDE::Res' => [ 'Bio::Root::Root' ], 'Bio::DB::SeqFeature::NormalizedFeatureI' => [], 'Bio::Align::ProteinStatistics' => [ 'Bio::Root::Root', 'Bio::Align::StatisticsI' ], 'Bio::Tree::DistanceFactory' => [ 'Bio::Root::Root' ], 'Bio::Structure::SecStr::DSSP::Res' => [ 'Bio::Root::Root' ], 'Bio::ClusterIO' => [ 'Bio::Root::Root', 'Bio::Root::IO' ], 'Bio::MapIO' => [ 'Bio::Root::Root', 'Bio::Root::IO', 'Bio::Factory::MapFactoryI' ], 'Bio::Tools::SeqStats' => [ 'Bio::Root::Root' ], 'Bio::Index::Qual' => [ 'Bio::Index::AbstractSeq' ], 'Bio::Map::Position' => [ 'Bio::Root::Root', 'Bio::Map::PositionI' ], 'Bio::Search::Hit::PsiBlastHit' => [ 'Bio::Root::Root', 'Bio::Search::Hit::HitI' ], 'Bio::Expression::DataSet' => [ 'Bio::Root::Root' ], 'Bio::Tools::GFF' => [ 'Bio::Root::Root', 'Bio::SeqAnalysisParserI', 'Bio::Root::IO' ], 'Bio::DB::GFF::Aggregator::match' => [ 'Bio::DB::GFF::Aggregator' ], 'Bio::DB::GenPept' => [ 'Bio::DB::NCBIHelper' ], 'Bio::Matrix::PSM::SiteMatrixI' => [ 'Bio::Root::RootI' ], 'Bio::DB::GFF::Adaptor::dbi::mysqlcmap' => [ 'Bio::DB::GFF::Adaptor::dbi::mysql' ], 'Bio::Graphics::ConfiguratorI' => [ 'Bio::Root::RootI' ], 'Bio::Cluster::ClusterFactory' => [ 'Bio::Factory::ObjectFactory' ], 'Bio::Map::Mappable' => [ 'Bio::Root::Root', 'Bio::Map::MappableI' ], 'Bio::ClusterI' => [ 'Bio::Root::RootI' ], 'Bio::LiveSeq::Repeat_Region' => [ 'Bio::LiveSeq::Range' ], 'Bio::AnalysisResultI' => [ 'Bio::Root::RootI' ], 'Bio::Tools::RNAMotif' => [ 'Bio::Tools::AnalysisResult' ], 'Bio::Tools::ESTScan' => [ 'Bio::Tools::AnalysisResult' ], 'Bio::Ontology::GOterm' => [ 'Bio::Ontology::Term' ], 'Bio::Matrix::Generic' => [ 'Bio::Root::Root', 'Bio::Matrix::MatrixI' ], 'Bio::Variation::RNAChange' => [ 'Bio::Variation::VariantI' ], 'Bio::DB::GFF::Adaptor::berkeleydb::iterator' => [], 'Bio::AlignIO::pfam' => [ 'Bio::AlignIO' ], 'Bio::SeqIO::largefasta' => [ 'Bio::SeqIO' ], 'Bio::Coordinate::ExtrapolatingPair' => [ 'Bio::Coordinate::Pair' ], 'Bio::Align::StatisticsI' => [ 'Bio::Root::RootI' ], 'Bio::DescribableI' => [ 'Bio::Root::RootI' ], 'Bio::Root::Root' => [ 'Bio::Root::RootI' ], 'Bio::Factory::SeqAnalysisParserFactory' => [ 'Bio::Factory::DriverFactory', 'Bio::Factory::SeqAnalysisParserFactoryI' ], 'Bio::Tools::Prediction::Gene' => [ 'Bio::SeqFeature::Gene::Transcript' ], 'Bio::Symbol::AlphabetI' => [], 'Bio::DB::SeqI' => [ 'Bio::DB::RandomAccessI' ], 'Bio::Taxonomy' => [ 'Bio::Root::Root' ], 'Bio::Search::Hit::HMMERHit' => [ 'Bio::Search::Hit::GenericHit' ], 'Bio::DB::SeqFeature::Store::berkeleydb' => [ 'Bio::DB::SeqFeature::Store' ], 'Bio::Graphics::Glyph::broken_line' => [ 'Bio::Graphics::Glyph::generic' ], 'Bio::Coordinate::Result::Gap' => [ 'Bio::Location::Simple', 'Bio::Coordinate::ResultI' ], 'Bio::SearchIO::Writer::TextResultWriter' => [ 'Bio::Root::Root', 'Bio::SearchIO::SearchWriterI' ], 'Bio::Location::Fuzzy' => [ 'Bio::Location::Atomic', 'Bio::Location::FuzzyLocationI' ], 'Bio::DB::SeqFeature::NormalizedFeature' => [ 'Bio::Graphics::FeatureBase', 'Bio::DB::SeqFeature::NormalizedFeatureI' ], 'Bio::Search::Processor' => [], 'Bio::Ontology::SimpleOntologyEngine' => [ 'Bio::Root::Root', 'Bio::Ontology::OntologyEngineI' ], 'Bio::Biblio::PubmedBookArticle' => [ 'Bio::Biblio::PubmedArticle', 'Bio::Biblio::MedlineBookArticle' ], 'Bio::Search::Hit::HitI' => [ 'Bio::Root::RootI' ], 'Bio::Tools::isPcr' => [ 'Bio::Root::Root' ], 'Bio::Symbol::ProteinAlphabet' => [ 'Bio::Symbol::Alphabet' ], 'Bio::Search::Result::ResultFactory' => [ 'Bio::Root::Root', 'Bio::Factory::ObjectFactoryI' ], 'Bio::Matrix::PSM::IO::transfac' => [ 'Bio::Matrix::PSM::PsmHeader', 'Bio::Matrix::PSM::IO' ], 'Bio::OntologyIO::Handlers::InterPro_BioSQL_Handler' => [ 'Bio::OntologyIO::Handlers::BaseSAXHandler' ], 'Bio::DB::XEMBLService' => [ 'Exporter', 'SOAP::Lite' ], 'Bio::Matrix::IO' => [ 'Bio::Root::IO' ], 'Bio::SearchIO::megablast' => [ 'Bio::SearchIO' ], 'Bio::Search::HSP::HSPFactory' => [ 'Bio::Root::Root', 'Bio::Factory::ObjectFactoryI' ], 'Bio::Graphics::FeatureFile' => [], 'Bio::FeatureHolderI' => [ 'Bio::Root::RootI' ], 'Bio::Tools::Genomewise' => [ 'Bio::Tools::Genewise' ], 'Bio::Map::SimpleMap' => [ 'Bio::Root::Root', 'Bio::Map::MapI' ], 'Bio::Tools::Sim4::Results' => [ 'Bio::Tools::AnalysisResult' ], 'Bio::CodonUsage::IO' => [ 'Bio::Root::IO' ], 'Bio::Graphics::Glyph::transcript' => [ 'Bio::Graphics::Glyph::segments' ], 'Bio::Map::OrderedPositionWithDistance' => [ 'Bio::Map::Position' ], 'Bio::DB::LocationI' => [ 'Bio::Root::Root' ], 'Bio::PopGen::Simulation::Coalescent' => [ 'Bio::Root::Root', 'Bio::Factory::TreeFactoryI' ], 'Bio::Phenotype::OMIM::OMIMentry' => [ 'Bio::Phenotype::Phenotype' ], 'Bio::AlignIO::stockholm' => [ 'Bio::AlignIO' ], 'Bio::DB::EUtilities::epost' => [ 'Bio::DB::EUtilities' ], 'Bio::Cluster::SequenceFamily' => [ 'Bio::Root::Root', 'Bio::Cluster::FamilyI' ], 'Bio::Factory::LocationFactoryI' => [ 'Bio::Root::RootI' ], 'Bio::Tools::Primer::AssessorI' => [ 'Bio::Root::RootI' ], 'Bio::Tools::Tmhmm' => [ 'Bio::Root::Root', 'Bio::Root::IO', 'Bio::Tools::AnalysisResult' ], 'Bio::DB::EUtilities::elink' => [ 'Bio::DB::EUtilities' ], 'Bio::SeqIO::game' => [ 'Bio::SeqIO' ], 'Bio::DB::GFF::Util::Binning' => [ 'Exporter' ], 'Bio::Structure::Model' => [ 'Bio::Root::Root' ], 'Bio::Ontology::SimpleGOEngine::GraphAdaptor' => [ 'Bio::Root::Root' ], 'Bio::DB::GFF::Aggregator::ucsc_sanger22pseudo' => [ 'Bio::DB::GFF::Aggregator' ], 'Bio::Search::BlastStatistics' => [ 'Bio::Root::RootI', 'Bio::Search::StatisticsI' ], 'Bio::Tools::Promoterwise' => [ 'Bio::Root::Root', 'Bio::Root::IO' ], 'Bio::DB::SeqFeature::Store::DBI::Iterator' => [], 'Bio::TreeIO::cluster' => [ 'Bio::TreeIO' ], 'Bio::SeqFeature::Gene::Poly_A_site' => [ 'Bio::SeqFeature::Gene::NC_Feature' ], 'Bio::LocatableSeq' => [ 'Bio::PrimarySeq', 'Bio::RangeI' ], 'Bio::Graphics::Glyph::oval' => [ 'Bio::Graphics::Glyph::ellipse' ], 'Bio::SeqIO::fasta' => [ 'Bio::SeqIO' ], 'Bio::Ontology::OntologyI' => [ 'Bio::Ontology::OntologyEngineI' ], 'Bio::Tree::Node' => [ 'Bio::Root::Root', 'Bio::Tree::NodeI' ], 'Bio::DB::SeqFeature::NormalizedTableFeatureI' => [ 'Bio::DB::SeqFeature::NormalizedFeatureI' ], 'Bio::Map::LinkagePosition' => [ 'Bio::Map::OrderedPosition' ], 'Bio::Variation::AAReverseMutate' => [ 'Bio::Root::Root' ], 'Bio::AlignIO::selex' => [ 'Bio::AlignIO' ], 'Bio::SearchIO::wise' => [ 'Bio::SearchIO' ], 'Bio::DB::Flat::BDB::swissprot' => [ 'Bio::DB::Flat::BDB' ], 'Bio::Tools::BPlite::Sbjct' => [ 'Bio::Root::Root' ], 'Bio::AlignIO::psi' => [ 'Bio::AlignIO' ], 'Bio::Matrix::MatrixI' => [ 'Bio::Root::RootI' ], 'Bio::Assembly::Singlet' => [ 'Bio::Assembly::Contig' ], 'Bio::SearchIO::Writer::HSPTableWriter' => [ 'Bio::SearchIO::Writer::ResultTableWriter' ], 'Bio::PopGen::Simulation::GeneticDrift' => [ 'Bio::Root::Root' ], 'Bio::Graphics::Util' => [ 'Exporter' ], 'Bio::DB::InMemoryCache' => [ 'Bio::Root::Root', 'Bio::DB::SeqI' ], 'Bio::LiveSeq::ChainI' => [], 'Bio::Annotation::AnnotationFactory' => [ 'Bio::Root::Root', 'Bio::Factory::ObjectFactoryI' ], 'Bio::Ontology::Relationship' => [ 'Bio::Root::Root', 'Bio::Ontology::RelationshipI' ], 'Bio::Annotation::StructuredValue' => [ 'Bio::Annotation::SimpleValue' ], 'Bio::TreeIO::TreeEventBuilder' => [ 'Bio::Root::Root', 'Bio::Event::EventHandlerI' ], 'Bio::SeqIO::exp' => [ 'Bio::SeqIO' ], 'Bio::SeqIO::pln' => [ 'Bio::SeqIO' ], 'Bio::Map::MappableI' => [ 'Bio::Map::EntityI', 'Bio::AnnotatableI' ], 'Bio::Search::SearchUtils' => [], 'Bio::Expression::Platform' => [ 'Bio::Root::Root' ], 'Bio::Tools::Glimmer' => [ 'Bio::Tools::AnalysisResult' ], 'Bio::SeqIO::game::gameSubs' => [ 'Bio::Root::Root' ], 'Bio::AnalysisI' => [ 'Bio::Root::RootI' ], 'Bio::Restriction::IO::withrefm' => [ 'Bio::Restriction::IO::base' ], 'Bio::SeqIO::game::featHandler' => [ 'Bio::SeqIO::game::gameSubs' ], 'Bio::SeqFeature::Generic' => [ 'Bio::Root::Root', 'Bio::SeqFeatureI', 'Bio::FeatureHolderI' ], 'Bio::SeqFeature::Computation' => [ 'Bio::SeqFeature::Generic' ], 'Bio::DB::GFF::Aggregator' => [ 'Bio::Root::Root' ], 'Bio::Seq::Meta::Array' => [ 'Bio::LocatableSeq', 'Bio::Seq', 'Bio::Seq::MetaI' ], 'Bio::SeqIO::phd' => [ 'Bio::SeqIO' ], 'Bio::SearchIO::IteratedSearchResultEventBuilder' => [ 'Bio::SearchIO::SearchResultEventBuilder' ], 'Bio::Graph::SimpleGraph::Traversal' => [ 'Class::AutoClass' ], 'Bio::Tools::Genemark' => [ 'Bio::Tools::AnalysisResult' ], 'Bio::Tools::Sigcleave' => [ 'Bio::Root::Root' ], 'Bio::Species' => [ 'Bio::Taxon' ], 'Bio::AlignIO::metafasta' => [ 'Bio::AlignIO' ], 'Bio::Tools::Est2Genome' => [ 'Bio::Tools::AnalysisResult' ], 'Bio::Graphics::Glyph::merged_alignment' => [ 'Bio::Graphics::Glyph::graded_segments' ], 'Bio::Search::Hit::Fasta' => [ 'Bio::Search::Hit::HitI' ], 'Bio::Search::GenericStatistics' => [ 'Bio::Root::Root', 'Bio::Search::StatisticsI' ], 'Bio::DB::GFF::Aggregator::ucsc_unigene' => [ 'Bio::DB::GFF::Aggregator' ], 'Bio::Graphics::Glyph::tic_tac_toe' => [ 'Bio::Graphics::Glyph::generic' ], 'Bio::SeqIO::pir' => [ 'Bio::SeqIO' ], 'Bio::Tools::Spidey::Exon' => [ 'Bio::SeqFeature::SimilarityPair' ], 'Bio::Restriction::IO::base' => [ 'Bio::Restriction::IO' ], 'Bio::DB::EUtilities::esummary' => [ 'Bio::DB::EUtilities' ], 'Bio::DB::Fasta' => [ 'Bio::DB::SeqI' ], 'Bio::Location::FuzzyLocationI' => [ 'Bio::LocationI' ], 'Bio::DB::GFF::Adaptor::dbi::mysqlace' => [ 'Bio::DB::GFF::Adaptor::dbi::mysql', 'Bio::DB::GFF::Adaptor::ace' ], 'Bio::DB::Registry' => [ 'Bio::Root::Root' ], 'Bio::DB::EUtilities::efetch' => [ 'Bio::DB::EUtilities' ], 'Bio::Annotation::TypeManager' => [ 'Bio::Root::Root' ], 'Bio::DB::SeqFeature::Segment' => [ 'Bio::SeqFeature::CollectionI', 'Bio::RangeI' ], 'Bio::Structure::Chain' => [ 'Bio::Root::Root' ], 'Bio::PrimarySeq' => [ 'Bio::Root::Root', 'Bio::PrimarySeqI', 'Bio::IdentifiableI', 'Bio::DescribableI' ], 'Bio::Graph::IO' => [ 'Bio::Root::IO' ], 'Bio::SeqIO::kegg' => [ 'Bio::SeqIO' ], 'Bio::Tools::Signalp' => [ 'Bio::Root::Root', 'Bio::Root::IO' ], 'Bio::DB::SeqFeature' => [ 'Bio::DB::SeqFeature::NormalizedFeature', 'Bio::DB::SeqFeature::NormalizedTableFeatureI' ], 'Bio::DB::EntrezGene' => [ 'Bio::DB::NCBIHelper' ], 'Bio::Biblio::PubmedArticle' => [ 'Bio::Biblio::MedlineArticle' ], 'Bio::Tools::Phylo::Phylip::ProtDist' => [ 'Bio::Root::Root', 'Bio::Root::IO' ], 'Bio::Biblio::Person' => [ 'Bio::Biblio::Provider' ], 'Bio::Tools::Sim4::Exon' => [ 'Bio::SeqFeature::SimilarityPair' ], 'Bio::Search::HSP::HSPI' => [ 'Bio::SeqFeature::SimilarityPair' ], 'Bio::SearchIO::SearchWriterI' => [ 'Bio::Root::RootI' ], 'Bio::Tools::BPbl2seq' => [ 'Bio::Root::Root', 'Bio::SeqAnalysisParserI', 'Bio::Root::IO' ], 'Bio::Matrix::IO::phylip' => [ 'Bio::Matrix::IO' ], 'Bio::SeqIO::qual' => [ 'Bio::SeqIO' ], 'Bio::Graph::ProteinGraph' => [ 'Bio::Graph::SimpleGraph' ], 'Bio::Tools::Analysis::Protein::NetPhos' => [ 'Bio::Tools::Analysis::SimpleAnalysisBase' ], 'Bio::SeqIO::excel' => [ 'Bio::SeqIO::table' ], 'Bio::Graphics::Glyph::rndrect' => [ 'Bio::Graphics::Glyph::generic' ], 'Bio::Phenotype::MeSH::Term' => [ 'Bio::Root::Root' ], 'Bio::Search::HSP::HMMERHSP' => [ 'Bio::Search::HSP::GenericHSP' ], 'Bio::Coordinate::MapperI' => [ 'Bio::Root::RootI' ], 'Bio::Graphics::Feature' => [ 'Bio::Graphics::FeatureBase' ], 'Bio::Tools::Blat' => [ 'Bio::Root::Root', 'Bio::Root::IO' ], 'Bio::Structure::StructureI' => [ 'Bio::Root::RootI' ], 'Bio::FeatureIO::ptt' => [ 'Bio::FeatureIO' ], 'Bio::Coordinate::Graph' => [ 'Bio::Root::Root' ], 'Bio::Biblio::IO::pubmed2ref' => [ 'Bio::Biblio::IO::medline2ref' ], 'Bio::Seq::MetaI' => [ 'Bio::Root::RootI' ], 'Bio::PopGen::IO::hapmap' => [ 'Bio::PopGen::IO' ], 'Bio::Location::CoordinatePolicyI' => [ 'Bio::Root::RootI' ], 'Bio::DB::Query::WebQuery' => [ 'Bio::Root::Root', 'Bio::DB::QueryI' ], 'Bio::Ontology::SimpleGOEngine::GraphAdaptor02' => [ 'Bio::Ontology::SimpleGOEngine::GraphAdaptor' ], 'Bio::Coordinate::Collection' => [ 'Bio::Root::Root', 'Bio::Coordinate::MapperI' ], 'Bio::UpdateableSeqI' => [ 'Bio::SeqI' ], 'Bio::Seq::QualI' => [ 'Bio::Root::RootI' ], 'Bio::DB::GFF::Aggregator::ucsc_sanger22' => [ 'Bio::DB::GFF::Aggregator' ], 'Bio::Graph::IO::dip' => [ 'Bio::Graph::IO' ], 'Bio::Graphics::Glyph::repeating_shape' => [ 'Bio::Graphics::Glyph::generic' ], 'Bio::DB::GFF::Adaptor::berkeleydb' => [ 'Bio::DB::GFF::Adaptor::memory' ], 'Bio::SeqIO::ace' => [ 'Bio::SeqIO' ], 'Bio::Seq::PrimaryQual' => [ 'Bio::Root::Root', 'Bio::Seq::QualI' ], 'Bio::SearchIO::Writer::GbrowseGFF' => [ 'Bio::Root::Root', 'Bio::SearchIO::SearchWriterI' ], 'Bio::SeqFeature::Similarity' => [ 'Bio::SeqFeature::Generic' ], 'Bio::Search::GenericDatabase' => [ 'Bio::Root::Root', 'Bio::Search::DatabaseI' ], 'Bio::DB::GFF::Aggregator::none' => [ 'Bio::DB::GFF::Aggregator' ], 'Bio::Tools::Prediction::Exon' => [ 'Bio::SeqFeature::Gene::Exon' ], 'Bio::DB::Flat::BDB::genbank' => [ 'Bio::DB::Flat::BDB' ], 'Bio::LiveSeq::Gene' => [], 'Bio::Tree::TreeI' => [ 'Bio::Tree::NodeI' ], 'Bio::Map::PositionHandler' => [ 'Bio::Root::Root', 'Bio::Map::PositionHandlerI' ], 'Bio::Annotation::Reference' => [ 'Bio::Annotation::DBLink' ], 'Bio::Search::Iteration::IterationI' => [ 'Bio::Root::RootI' ], 'Bio::Assembly::Scaffold' => [ 'Bio::Root::Root', 'Bio::Assembly::ScaffoldI' ], 'Bio::Tools::Phylo::PAML::Result' => [ 'Bio::Root::Root', 'Bio::AnalysisResultI' ], 'Bio::DB::GFF::Aggregator::transcript' => [ 'Bio::DB::GFF::Aggregator' ], 'Bio::DB::GFF::Adaptor::dbi::oracle' => [ 'Bio::DB::GFF::Adaptor::dbi' ], 'Bio::Tools::Primer::Pair' => [ 'Bio::Root::Root' ], 'Bio::Search::Hit::HitFactory' => [ 'Bio::Root::Root', 'Bio::Factory::ObjectFactoryI' ], 'Bio::Ontology::OBOterm' => [ 'Bio::Ontology::Term' ], 'Bio::Annotation::Collection' => [ 'Bio::Root::Root', 'Bio::AnnotationCollectionI', 'Bio::AnnotationI' ], 'Bio::Das::SegmentI' => [ 'Bio::Root::RootI' ], 'Bio::Graphics::Glyph::transcript2' => [ 'Bio::Graphics::Glyph::transcript' ], 'Bio::Annotation::OntologyTerm' => [ 'Bio::Root::Root', 'Bio::AnnotationI', 'Bio::Ontology::TermI' ], 'Bio::SearchIO::SearchResultEventBuilder' => [ 'Bio::Root::Root', 'Bio::SearchIO::EventHandlerI' ], 'Bio::SearchIO::Writer::BSMLResultWriter' => [ 'Bio::Root::Root', 'Bio::SearchIO::SearchWriterI' ], 'Bio::Restriction::IO' => [ 'Bio::SeqIO' ], 'Bio::TreeIO::svggraph' => [ 'Bio::TreeIO' ], 'Bio::Search::HSP::PSLHSP' => [ 'Bio::Search::HSP::GenericHSP' ], 'Bio::Matrix::PSM::PsmHeader' => [ 'Bio::Root::Root', 'Bio::Matrix::PSM::PsmHeaderI' ], 'Bio::Graphics::Glyph::group' => [ 'Bio::Graphics::Glyph::segmented_keyglyph' ], 'Bio::Variation::IO::xml' => [ 'Bio::Variation::IO' ], 'Bio::Graphics::Glyph::merge_parts' => [ 'Bio::Graphics::Glyph' ], 'Bio::Tools::OddCodes' => [ 'Bio::Root::Root' ], 'Bio::Variation::AAChange' => [ 'Bio::Variation::VariantI' ], 'Bio::DB::EUtilities::ElinkData' => [ 'Bio::Root::Root' ], 'Bio::Expression::FeatureI' => [ 'Bio::Root::RootI', 'Bio::PrimarySeqI' ], 'Bio::AlignIO::msf' => [ 'Bio::AlignIO' ], 'Bio::Location::Split' => [ 'Bio::Location::Atomic', 'Bio::Location::SplitLocationI' ], 'Bio::Biblio::BiblioBase' => [ 'Bio::Root::Root' ], 'Bio::Tools::Run::RemoteBlast' => [ 'Bio::Root::Root', 'Bio::Root::IO' ], 'Bio::Seq::LargeSeqI' => [ 'Bio::Root::RootI' ], 'Bio::Graphics::Glyph::whiskerplot' => [ 'Bio::Graphics::Glyph::xyplot' ], 'Bio::Annotation::Comment' => [ 'Bio::Root::Root', 'Bio::AnnotationI' ], 'Bio::Seq::BaseSeqProcessor' => [ 'Bio::Root::Root', 'Bio::Factory::SequenceProcessorI' ], 'Bio::AlignIO::prodom' => [ 'Bio::AlignIO' ], 'Bio::Graphics::Glyph::diamond' => [ 'Bio::Graphics::Glyph::generic' ], 'Bio::Tools::Prints' => [ 'Bio::Root::Root', 'Bio::Root::IO' ], 'Bio::DB::Biblio::biofetch' => [ 'Bio::DB::DBFetch', 'Bio::Biblio' ], 'Bio::Biblio::IO::medlinexml' => [ 'Bio::Biblio::IO' ], 'Bio::DB::Expression' => [ 'Bio::Root::HTTPget' ], 'Bio::DB::WebDBSeqI' => [ 'Bio::DB::RandomAccessI' ], 'Bio::Taxonomy::FactoryI' => [ 'Bio::Root::Root' ], 'Bio::Graphics::Glyph::box' => [ 'Bio::Graphics::Glyph::generic' ], 'Bio::SeqFeature::SiRNA::Oligo' => [ 'Bio::SeqFeature::Generic' ], 'Bio::AnnotationCollectionI' => [ 'Bio::Root::RootI' ], 'Bio::Biblio::MedlineArticle' => [ 'Bio::Biblio::Article' ], 'Bio::Graphics::Glyph::arrow' => [ 'Bio::Graphics::Glyph::generic' ], 'Bio::Biblio::Service' => [ 'Bio::Biblio::Provider' ], 'Bio::Tools::RepeatMasker' => [ 'Bio::Root::Root', 'Bio::Root::IO' ], 'Bio::Graphics::Glyph::splice_site' => [ 'Bio::Graphics::Glyph::generic' ], 'Bio::LiveSeq::Prim_Transcript' => [ 'Bio::LiveSeq::Range' ], 'Bio::DB::Failover' => [ 'Bio::Root::Root', 'Bio::DB::RandomAccessI' ], 'Bio::Biblio::WebResource' => [ 'Bio::Biblio::Ref' ], 'Bio::Biblio::PubmedJournalArticle' => [ 'Bio::Biblio::PubmedArticle', 'Bio::Biblio::MedlineJournalArticle' ], 'Bio::PopGen::Population' => [ 'Bio::Root::Root', 'Bio::PopGen::PopulationI' ], 'Bio::DB::GFF::Adaptor::dbi::mysql' => [ 'Bio::DB::GFF::Adaptor::dbi' ], 'Bio::Tree::Statistics' => [ 'Bio::Root::Root' ], 'Bio::SeqIO::chadoxml' => [ 'Bio::SeqIO' ], 'Bio::SeqFeature::Tools::Unflattener' => [ 'Bio::Root::Root' ], 'Bio::SeqFeature::Primer' => [ 'Bio::Root::Root', 'Bio::SeqFeature::Generic' ], 'Bio::Restriction::EnzymeI' => [ 'Bio::Root::RootI' ], 'Bio::Taxon' => [ 'Bio::Tree::Node', 'Bio::IdentifiableI' ], 'Bio::Tools::Analysis::Protein::Sopma' => [ 'Bio::Tools::Analysis::SimpleAnalysisBase' ], 'Bio::Biblio::Provider' => [ 'Bio::Biblio::BiblioBase' ], 'Bio::Graphics::Glyph::flag' => [ 'Bio::Graphics::Glyph::generic' ], 'Bio::Tools::HMMER::Domain' => [ 'Bio::SeqFeature::FeaturePair' ], 'Bio::Location::SplitLocationI' => [ 'Bio::LocationI' ], 'Bio::FeatureIO::bed' => [ 'Bio::FeatureIO' ], 'Bio::LocationI' => [ 'Bio::RangeI' ], 'Bio::Tools::ipcress' => [ 'Bio::Root::Root' ], 'Bio::DB::Taxonomy::flatfile' => [ 'Bio::DB::Taxonomy' ], 'Bio::Matrix::PhylipDist' => [ 'Bio::Root::Root', 'Bio::Matrix::MatrixI' ], 'Bio::DB::SeqFeature::Store::memory' => [ 'Bio::DB::SeqFeature::Store' ], 'Bio::Seq::RichSeqI' => [ 'Bio::SeqI' ], 'Bio::Graph::SimpleGraph' => [ 'Class::AutoClass' ], 'Bio::SeqIO::embl' => [ 'Bio::SeqIO' ], 'Bio::Tools::AnalysisResult' => [ 'Bio::Root::Root', 'Bio::SeqAnalysisParserI', 'Bio::AnalysisResultI', 'Bio::Root::IO' ], 'Bio::Coordinate::Result' => [ 'Bio::Location::Split', 'Bio::Coordinate::ResultI' ], 'Bio::Biblio::IO::medline2ref' => [ 'Bio::Root::Root' ], 'Bio::Tools::EMBOSS::Palindrome' => [ 'Bio::Root::IO' ], 'Bio::Structure::Entry' => [ 'Bio::Root::Root', 'Bio::Structure::StructureI' ], 'Bio::DB::GFF::Aggregator::so_transcript' => [ 'Bio::DB::GFF::Aggregator' ], 'Bio::Matrix::PSM::IO::psiblast' => [ 'Bio::Matrix::PSM::PsmHeader', 'Bio::Matrix::PSM::IO' ], 'Bio::Factory::SequenceStreamI' => [ 'Bio::Root::RootI' ], 'Bio::Index::Hmmer' => [ 'Bio::Index::Abstract' ], 'Bio::Graphics::Glyph::ex' => [ 'Bio::Graphics::Glyph::generic' ], 'Bio::Matrix::IO::scoring' => [ 'Bio::Matrix::IO' ], 'Bio::DB::SeqFeature::Store' => [ 'Bio::SeqFeature::CollectionI' ], 'Bio::DB::CUTG' => [ 'Bio::WebAgent' ], 'Bio::PopGen::IO::prettybase' => [ 'Bio::PopGen::IO' ], 'Bio::ClusterIO::dbsnp' => [ 'Bio::ClusterIO' ], 'Bio::Graph::Edge' => [ 'Bio::Root::Root', 'Bio::IdentifiableI' ], 'Bio::Root::Exception' => [ 'Error' ], 'Bio::Biblio::MedlineJournalArticle' => [ 'Bio::Biblio::MedlineArticle', 'Bio::Biblio::JournalArticle' ], 'Bio::Align::DNAStatistics' => [ 'Bio::Root::Root', 'Bio::Align::StatisticsI' ], 'Bio::SeqFeature::Gene::ExonI' => [ 'Bio::SeqFeatureI' ], 'Bio::Graphics::Glyph::segmented_keyglyph' => [ 'Bio::Graphics::Glyph::generic' ], 'Bio::Variation::IO::flat' => [ 'Bio::Variation::IO' ], 'Bio::SeqIO::game::seqHandler' => [ 'Bio::SeqIO::game::gameSubs' ], 'Bio::WebAgent' => [ 'LWP::UserAgent', 'Bio::Root::Root' ], 'Bio::Biblio::Proceeding' => [ 'Bio::Biblio::Ref' ], 'Bio::Tools::Run::WrapperBase' => [ 'Bio::Root::Root' ], 'Bio::Map::Contig' => [ 'Bio::Map::SimpleMap' ], 'Bio::CodonUsage::Table' => [ 'Bio::Root::Root' ], 'Bio::Graphics::Glyph::xyplot' => [ 'Bio::Graphics::Glyph::minmax' ], 'Bio::Search::Result::BlastResult' => [ 'Bio::Search::Result::GenericResult' ], 'Bio::Search::DatabaseI' => [ 'Bio::Root::RootI' ], 'Bio::DB::GFF::Aggregator::ucsc_genscan' => [ 'Bio::DB::GFF::Aggregator' ], 'Bio::PopGen::MarkerI' => [ 'Bio::Root::RootI', 'Bio::AnnotatableI' ], 'Bio::Annotation::DBLink' => [ 'Bio::Root::Root', 'Bio::AnnotationI', 'Bio::IdentifiableI' ], 'Bio::Tools::SiRNA::Ruleset::saigo' => [ 'Bio::Tools::SiRNA' ], 'Bio::Seq::LargeSeq' => [ 'Bio::Seq', 'Bio::Seq::LargeSeqI' ], 'Bio::FeatureIO' => [ 'Bio::Root::Root', 'Bio::Root::IO' ], 'Bio::TreeIO' => [ 'Bio::Root::Root', 'Bio::Root::IO', 'Bio::Event::EventGeneratorI', 'Bio::Factory::TreeFactoryI' ], 'Bio::SeqIO::swiss' => [ 'Bio::SeqIO' ], 'Bio::Matrix::PSM::InstanceSite' => [ 'Bio::LocatableSeq', 'Bio::Matrix::PSM::InstanceSiteI' ], 'Bio::Biblio::JournalArticle' => [ 'Bio::Biblio::Article' ], 'Bio::Graphics::Glyph::alignment' => [ 'Bio::Graphics::Glyph::graded_segments' ], 'Bio::Tools::Analysis::Protein::Domcut' => [ 'Bio::Tools::Analysis::SimpleAnalysisBase' ], 'Bio::LiveSeq::Intron' => [ 'Bio::LiveSeq::Range' ], 'Bio::Map::PositionI' => [ 'Bio::Map::EntityI', 'Bio::RangeI' ], 'Bio::Assembly::IO::phrap' => [ 'Bio::Assembly::IO' ], 'Bio::Map::MapI' => [ 'Bio::Map::EntityI', 'Bio::AnnotatableI' ], 'Bio::Ontology::RelationshipFactory' => [ 'Bio::Factory::ObjectFactory' ], 'Bio::Variation::VariantI' => [ 'Bio::Root::Root', 'Bio::SeqFeature::Generic', 'Bio::DBLinkContainerI' ], 'Bio::Range' => [ 'Bio::Root::Root', 'Bio::RangeI' ], 'Bio::Matrix::PSM::IO::mast' => [ 'Bio::Matrix::PSM::PsmHeader', 'Bio::Matrix::PSM::IO' ], 'Bio::Root::IO' => [ 'Bio::Root::Root' ], 'Bio::DB::EUtilities::Cookie' => [ 'Bio::Root::Root' ], 'Bio::Tools::SiRNA::Ruleset::tuschl' => [ 'Bio::Tools::SiRNA' ], 'Bio::DB::GFF' => [ 'Bio::Root::Root', 'Bio::DasI' ], 'Bio::FeatureIO::gtf' => [ 'Bio::FeatureIO::gff' ], 'Bio::Expression::ProbeI' => [ 'Bio::Expression::FeatureI' ], 'Bio::SeqIO::tinyseq::tinyseqHandler' => [ 'Bio::Root::Root' ], 'Bio::SeqIO::gcg' => [ 'Bio::SeqIO' ], 'Bio::Tools::Spidey::Results' => [ 'Bio::Tools::AnalysisResult' ], 'Bio::DB::Ace' => [ 'Bio::DB::RandomAccessI' ], 'Bio::SeqFeature::FeaturePair' => [ 'Bio::SeqFeature::Generic' ], 'Bio::AlignIO::maf' => [ 'Bio::AlignIO' ], 'Bio::SearchIO::blast' => [ 'Bio::SearchIO' ], 'Bio::SeqIO::alf' => [ 'Bio::SeqIO' ], 'Bio::SearchIO::blastxml' => [ 'Bio::SearchIO' ], 'Bio::LiveSeq::Translation' => [ 'Bio::LiveSeq::Transcript' ], 'Bio::Map::CytoPosition' => [ 'Bio::Map::Position' ], 'Bio::Tools::Analysis::Protein::Mitoprot' => [ 'Bio::Tools::Analysis::SimpleAnalysisBase' ], 'Bio::Search::Result::GenericResult' => [ 'Bio::Root::Root', 'Bio::Search::Result::ResultI' ], 'Bio::AlignIO::po' => [ 'Bio::AlignIO' ], 'Bio::Graphics::Glyph::three_letters' => [ 'Bio::Graphics::Glyph::repeating_shape' ], 'Bio::OntologyIO' => [ 'Bio::Root::Root', 'Bio::Root::IO' ], 'Bio::Graphics::Glyph::redgreen_box' => [ 'Bio::Graphics::Glyph::generic' ], 'Bio::SeqIO::asciitree' => [ 'Bio::SeqIO' ], 'Bio::MapIO::mapmaker' => [ 'Bio::MapIO' ], 'Bio::SearchIO::exonerate' => [ 'Bio::SearchIO' ], 'Bio::Ontology::OBOEngine' => [ 'Bio::Root::Root', 'Bio::Ontology::OntologyEngineI' ], 'Bio::Coordinate::Utils' => [ 'Bio::Root::Root' ], 'Bio::PopGen::Genotype' => [ 'Bio::Root::Root', 'Bio::PopGen::GenotypeI' ], 'Bio::Graphics::Glyph::minmax' => [ 'Bio::Graphics::Glyph::segments' ], 'Bio::LiveSeq::DNA' => [ 'Bio::LiveSeq::SeqI' ], 'Bio::Coordinate::ResultI' => [ 'Bio::LocationI' ], 'Bio::Expression::Sample' => [ 'Bio::Root::Root' ], 'Bio::SearchIO::psl' => [ 'Bio::SearchIO' ], 'Bio::AnalysisParserI' => [ 'Bio::Root::RootI' ], 'Bio::SeqAnalysisParserI' => [ 'Bio::Root::RootI' ], 'Bio::Graphics::Glyph::cds' => [ 'Bio::Graphics::Glyph::segmented_keyglyph', 'Bio::Graphics::Glyph::translation' ], 'Bio::SeqFeature::TypedSeqFeatureI' => [ 'Bio::SeqFeatureI' ], 'Bio::DB::GFF::Aggregator::processed_transcript' => [ 'Bio::DB::GFF::Aggregator' ], 'Bio::SearchIO::axt' => [ 'Bio::SearchIO' ], 'Bio::TreeIO::tabtree' => [ 'Bio::TreeIO' ], 'Bio::Graph::IO::psi_xml' => [ 'Bio::Graph::IO' ], 'Bio::Variation::IO' => [ 'Bio::SeqIO' ], 'Bio::Graphics::Glyph::primers' => [ 'Bio::Graphics::Glyph::generic' ], 'Bio::Tree::AlleleNode' => [ 'Bio::Tree::Node', 'Bio::PopGen::IndividualI' ], 'Bio::Matrix::PSM::PsmHeaderI' => [ 'Bio::Matrix::PSM::PsmI' ], 'Bio::Coordinate::GeneMapper' => [ 'Bio::Root::Root', 'Bio::Coordinate::MapperI' ], 'Bio::Index::AbstractSeq' => [ 'Bio::Index::Abstract', 'Bio::DB::SeqI' ], 'Bio::DB::GFF::Util::Rearrange' => [ 'Exporter' ], 'Bio::Graphics::Glyph::gene' => [ 'Bio::Graphics::Glyph::processed_transcript' ], 'Bio::Biblio::BookArticle' => [ 'Bio::Biblio::Article' ], 'Bio::DB::FileCache' => [ 'Bio::Root::Root', 'Bio::DB::SeqI' ], 'Bio::Graphics::Glyph::graded_segments' => [ 'Bio::Graphics::Glyph::minmax', 'Bio::Graphics::Glyph::merge_parts' ], 'Bio::Graphics::Glyph::dashed_line' => [ 'Bio::Graphics::Glyph::generic' ], 'Bio::DB::BiblioI' => [ 'Bio::Root::RootI' ], 'Bio::Expression::Contact' => [ 'Bio::Root::Root' ], 'Bio::OntologyIO::Handlers::BaseSAXHandler' => [ 'Bio::Root::Root' ], 'Bio::Tools::Fgenesh' => [ 'Bio::Tools::AnalysisResult' ], 'Bio::SeqFeature::SimilarityPair' => [ 'Bio::SeqFeature::FeaturePair' ], 'Bio::DB::GFF::Adaptor::memory::feature_serializer' => [ 'Exporter' ], 'Bio::PrimarySeqI' => [ 'Bio::Root::RootI' ], 'Bio::Search::StatisticsI' => [ 'Bio::Root::RootI' ], 'Bio::Biblio::Ref' => [ 'Bio::Biblio::BiblioBase' ], 'Bio::Tools::HMMER::Results' => [ 'Bio::Root::Root', 'Bio::Root::IO', 'Bio::SeqAnalysisParserI' ], 'Bio::PopGen::IO' => [ 'Bio::Root::IO' ], 'Bio::Search::HSP::HmmpfamHSP' => [ 'Bio::Search::HSP::PullHSPI' ], 'Bio::Biblio::MedlineBookArticle' => [ 'Bio::Biblio::BookArticle', 'Bio::Biblio::MedlineArticle' ], 'Bio::Biblio::TechReport' => [ 'Bio::Biblio::Ref' ], 'Bio::DB::Biblio::eutils' => [ 'Bio::Biblio' ], 'Bio::SeqIO::game::gameHandler' => [ 'Bio::SeqIO::game::gameSubs' ], 'Bio::SeqIO::abi' => [ 'Bio::SeqIO' ], 'Bio::Factory::AnalysisI' => [ 'Bio::Root::RootI' ], 'Bio::Index::EMBL' => [ 'Bio::Index::AbstractSeq' ], 'Bio::Matrix::PSM::ProtPsm' => [ 'Bio::Matrix::PSM::ProtMatrix', 'Bio::Matrix::PSM::PsmI', 'Bio::Annotation::Collection' ], 'Bio::Graphics::Glyph::wave' => [ 'Bio::Graphics::Glyph::generic' ], 'Bio::OntologyIO::simplehierarchy' => [ 'Bio::OntologyIO' ], 'Bio::DB::GFF::Aggregator::coding' => [ 'Bio::DB::GFF::Aggregator' ], 'Bio::AlignIO::emboss' => [ 'Bio::AlignIO' ], 'Bio::Map::OrderedPosition' => [ 'Bio::Map::Position' ], 'Bio::Tools::EPCR' => [ 'Bio::Root::Root', 'Bio::SeqAnalysisParserI', 'Bio::Root::IO' ], 'Bio::Tools::Gel' => [ 'Bio::Root::Root' ], 'Bio::DB::GFF::Adaptor::dbi::iterator' => [], 'Bio::AlignIO::mega' => [ 'Bio::AlignIO' ], 'Bio::Factory::ObjectBuilderI' => [ 'Bio::Root::RootI' ], 'Bio::Tools::Analysis::DNA::ESEfinder' => [ 'Bio::Tools::Analysis::SimpleAnalysisBase' ], 'Bio::SeqIO::FTHelper' => [ 'Bio::Root::Root' ], 'Bio::Tree::RandomFactory' => [ 'Bio::Root::Root', 'Bio::Factory::TreeFactoryI' ], 'Bio::Seq' => [ 'Bio::Root::Root', 'Bio::SeqI', 'Bio::IdentifiableI', 'Bio::DescribableI' ], 'Bio::Restriction::Analysis' => [ 'Bio::Root::Root' ], 'Bio::Seq::PrimedSeq' => [ 'Bio::Root::Root', 'Bio::SeqFeature::Generic' ], 'Bio::DB::UpdateableSeqI' => [ 'Bio::DB::SeqI' ], 'Bio::Ontology::Term' => [ 'Bio::Root::Root', 'Bio::Ontology::TermI', 'Bio::IdentifiableI', 'Bio::DescribableI' ], 'Bio::SeqIO::chaos' => [ 'Bio::SeqIO' ], 'Bio::DB::GFF::Homol' => [ 'Bio::DB::GFF::Segment' ], 'Bio::Index::Fastq' => [ 'Bio::Index::AbstractSeq' ], 'Bio::TreeIO::nhx' => [ 'Bio::TreeIO' ], 'Bio::Phenotype::PhenotypeI' => [ 'Bio::Root::RootI' ], 'Bio::Graphics::Glyph::text_in_box' => [ 'Bio::Graphics::Glyph::generic' ], 'Bio::SeqIO::ctf' => [ 'Bio::SeqIO' ], 'Bio::Graphics::Glyph::processed_transcript' => [ 'Bio::Graphics::Glyph::transcript2' ], 'Bio::Graphics::Glyph::image' => [ 'Bio::Graphics::Glyph::generic' ], 'Bio::DB::Flat::BDB::embl' => [ 'Bio::DB::Flat::BDB' ], 'Bio::SeqIO::locuslink' => [ 'Bio::SeqIO' ], 'Bio::DB::BioFetch' => [ 'Bio::DB::WebDBSeqI' ], 'Bio::Search::HSP::BlastHSP' => [ 'Bio::SeqFeature::SimilarityPair', 'Bio::Search::HSP::HSPI' ], 'Bio::Tools::Alignment::Trim' => [ 'Bio::Root::Root' ], 'Bio::SeqIO::fastq' => [ 'Bio::SeqIO' ], 'Bio::Tree::TreeFunctionsI' => [ 'Bio::Tree::TreeI' ], 'Bio::DB::GDB' => [ 'Bio::Root::Root' ], 'Bio::Ontology::RelationshipI' => [ 'Bio::Root::RootI' ], 'Bio::Tools::Analysis::Protein::HNN' => [ 'Bio::Tools::Analysis::SimpleAnalysisBase' ], 'Bio::Tools::IUPAC' => [ 'Bio::Root::Root' ], 'Bio::DB::EUtilities::esearch' => [ 'Bio::DB::EUtilities' ], 'Bio::SeqI' => [ 'Bio::PrimarySeqI', 'Bio::AnnotatableI', 'Bio::FeatureHolderI' ], 'Bio::Symbol::SymbolI' => [ 'Bio::Root::RootI' ], 'Bio::AnnotatableI' => [ 'Bio::Root::RootI' ], 'Bio::Tools::PrositeScan' => [ 'Bio::Root::Root', 'Bio::Root::IO' ], 'Bio::Graphics::Glyph::Factory' => [ 'Bio::Root::Root' ], 'Bio::SeqFeature::CollectionI' => [ 'Bio::Root::RootI' ], 'Bio::Tools::Eponine' => [ 'Bio::Tools::AnalysisResult' ], 'Bio::Graphics' => [], 'Bio::Tools::Phylo::PAML::ModelResult' => [ 'Bio::Root::Root' ], 'Bio::SeqFeature::Annotated' => [ 'Bio::Root::Root', 'Bio::SeqFeatureI', 'Bio::FeatureHolderI' ], 'Bio::TreeIO::pag' => [ 'Bio::TreeIO' ], 'Bio::Graphics::Glyph::track' => [ 'Bio::Graphics::Glyph' ], 'Bio::SeqIO::MultiFile' => [ 'Bio::SeqIO' ], 'Bio::SimpleAlign' => [ 'Bio::Root::Root', 'Bio::Align::AlignI', 'Bio::AnnotatableI' ], 'Bio::Matrix::PSM::SiteMatrix' => [ 'Bio::Root::Root', 'Bio::Matrix::PSM::SiteMatrixI' ], 'Bio::SeqIO::lasergene' => [ 'Bio::SeqIO' ], 'Bio::LiveSeq::Repeat_Unit' => [ 'Bio::LiveSeq::Repeat_Region' ], 'Bio::Factory::ObjectFactory' => [ 'Bio::Root::Root', 'Bio::Factory::ObjectFactoryI' ], 'Bio::Assembly::Contig' => [ 'Bio::Root::Root', 'Bio::Align::AlignI' ], 'Bio::Map::Relative' => [ 'Bio::Root::Root', 'Bio::Map::RelativeI' ], 'Bio::Matrix::PSM::ProtMatrix' => [ 'Bio::Root::Root', 'Bio::Matrix::PSM::SiteMatrixI' ], 'Bio::Tools::Coil' => [ 'Bio::Root::Root', 'Bio::Root::IO' ], 'Bio::AlignIO::nexus' => [ 'Bio::AlignIO' ], 'Bio::Variation::DNAMutation' => [ 'Bio::Variation::VariantI' ], 'Bio::Matrix::PSM::Psm' => [ 'Bio::Matrix::PSM::SiteMatrix', 'Bio::Matrix::PSM::PsmI', 'Bio::Annotation::Collection' ], 'Bio::SearchIO::Writer::HitTableWriter' => [ 'Bio::SearchIO::Writer::ResultTableWriter' ], 'Bio::DB::EMBL' => [ 'Bio::DB::DBFetch' ], 'Bio::OntologyIO::dagflat' => [ 'Bio::OntologyIO' ], 'Bio::Map::CytoMarker' => [ 'Bio::Map::Marker' ], 'Bio::Map::CytoMap' => [ 'Bio::Map::SimpleMap' ], 'Bio::Location::Simple' => [ 'Bio::Location::Atomic' ], 'Bio::Matrix::PSM::IO::meme' => [ 'Bio::Matrix::PSM::PsmHeader', 'Bio::Matrix::PSM::IO' ], 'Bio::Tools::QRNA' => [ 'Bio::Root::IO', 'Bio::SeqAnalysisParserI' ], 'Bio::Symbol::Alphabet' => [ 'Bio::Root::Root', 'Bio::Symbol::AlphabetI' ], 'Bio::Seq::EncodedSeq' => [ 'Bio::LocatableSeq' ], 'Bio::Graphics::Glyph::weighted_arrow' => [ 'Bio::Graphics::Glyph::generic' ], 'Bio::DB::GFF::Adaptor::ace' => [], 'Bio::Graphics::Glyph::saw_teeth' => [ 'Bio::Graphics::Glyph::repeating_shape' ], 'Bio::Search::Hit::PullHitI' => [ 'Bio::PullParserI', 'Bio::Search::Hit::HitI' ], 'Bio::Map::Microsatellite' => [ 'Bio::Map::Marker' ], 'Bio::SeqFeature::Gene::Transcript' => [ 'Bio::SeqFeature::Generic', 'Bio::SeqFeature::Gene::TranscriptI' ], 'Bio::Graphics::Glyph::triangle' => [ 'Bio::Graphics::Glyph::generic' ], 'Bio::DB::SeqVersion' => [ 'Bio::WebAgent' ], 'Bio::Index::Swissprot' => [ 'Bio::Index::AbstractSeq' ], 'Bio::Ontology::PathI' => [ 'Bio::Ontology::RelationshipI' ], 'Bio::Ontology::TermI' => [ 'Bio::Root::RootI' ], 'Bio::SeqUtils' => [ 'Bio::Root::Root' ], 'Bio::DB::GFF::Adaptor::biofetch' => [ 'Bio::DB::GFF::Adaptor::dbi::mysql' ], 'Bio::Graphics::Glyph::christmas_arrow' => [ 'Bio::Graphics::Glyph::generic' ], 'Bio::Symbol::DNAAlphabet' => [ 'Bio::Symbol::Alphabet' ], 'Bio::DB::GFF::Adaptor::dbi::oracleace' => [ 'Bio::DB::GFF::Adaptor::ace', 'Bio::DB::GFF::Adaptor::dbi::oracle' ], 'Bio::Factory::SequenceFactoryI' => [ 'Bio::Factory::ObjectFactoryI' ], 'Bio::Tree::NodeI' => [ 'Bio::Root::RootI' ], 'Bio::Graphics::Pictogram' => [ 'Bio::Root::Root' ], 'Bio::Tools::pICalculator' => [ 'Bio::Root::Root' ], 'Bio::PopGen::Utilities' => [ 'Bio::Root::Root' ], 'Bio::AlignIO::fasta' => [ 'Bio::AlignIO' ], 'Bio::DB::Universal' => [ 'Bio::DB::RandomAccessI' ], 'Bio::Map::MarkerI' => [ 'Bio::Map::MappableI' ], 'Bio::Tools::Run::ParametersI' => [ 'Bio::Root::RootI' ], 'Bio::Graphics::Glyph::span' => [ 'Bio::Graphics::Glyph::anchored_arrow' ], 'Bio::DB::GFF::Adaptor::memory' => [ 'Bio::DB::GFF' ], 'Bio::Graphics::Glyph::ragged_ends' => [ 'Bio::Graphics::Glyph::generic' ], 'Bio::Tools::FootPrinter' => [ 'Bio::Root::Root', 'Bio::Root::IO' ], 'Bio::Search::Result::HmmpfamResult' => [ 'Bio::Root::Root', 'Bio::Search::Result::PullResultI' ], 'Bio::Location::NarrowestCoordPolicy' => [ 'Bio::Root::Root', 'Bio::Location::CoordinatePolicyI' ], 'Bio::Tools::BPlite' => [ 'Bio::Root::Root', 'Bio::SeqAnalysisParserI', 'Bio::Root::IO' ], 'Bio::Tree::NodeNHX' => [ 'Bio::Tree::Node' ], 'Bio::Phenotype::OMIM::OMIMparser' => [ 'Bio::Root::Root' ], 'Bio::Tools::Profile' => [ 'Bio::Root::Root', 'Bio::Root::IO' ], 'Bio::Graphics::Glyph::dot' => [ 'Bio::Graphics::Glyph::generic' ], 'Bio::Graphics::RendererI' => [ 'Bio::Root::RootI' ], 'Bio::SeqFeature::Gene::Intron' => [ 'Bio::SeqFeature::Gene::NC_Feature' ], 'Bio::Biblio::IO' => [ 'Bio::Root::Root', 'Bio::Root::IO' ], 'Bio::Seq::SeqFastaSpeedFactory' => [ 'Bio::Root::Root', 'Bio::Factory::SequenceFactoryI' ], 'Bio::Graphics::FeatureBase' => [ 'Bio::Root::Root', 'Bio::SeqFeatureI', 'Bio::LocationI', 'Bio::SeqI' ], 'Bio::Graphics::Glyph::crossbox' => [ 'Bio::Graphics::Glyph::generic' ], 'Bio::SeqIO::interpro' => [ 'Bio::SeqIO' ], 'Bio::Structure::Atom' => [ 'Bio::Root::Root' ], 'Bio::Tools::Lucy' => [ 'Bio::Root::Root', 'Bio::Root::IO' ], 'Bio::Index::Abstract' => [ 'Bio::Root::Root' ], 'Bio::Tools::MZEF' => [ 'Bio::Tools::AnalysisResult' ], 'Bio::Graphics::Glyph::toomany' => [ 'Bio::Graphics::Glyph::generic' ], 'Bio::Matrix::Scoring' => [ 'Bio::Matrix::Generic' ], 'Bio::Ontology::SimpleGOEngine' => [ 'Bio::Ontology::OBOEngine' ], 'Bio::Search::Result::PullResultI' => [ 'Bio::PullParserI', 'Bio::Search::Result::ResultI' ], 'Bio::Index::Blast' => [ 'Bio::Index::Abstract' ], 'Bio::Graphics::Glyph::dna' => [ 'Bio::Graphics::Glyph::generic' ], 'Bio::DB::GFF::Segment' => [ 'Bio::Root::Root', 'Bio::RangeI', 'Bio::SeqI', 'Bio::Das::SegmentI' ], 'Bio::Tools::RandomDistFunctions' => [ 'Bio::Root::Root' ], 'Bio::Graphics::Glyph::two_bolts' => [ 'Bio::Graphics::Glyph::generic' ], 'Bio::DBLinkContainerI' => [ 'Bio::Root::RootI' ], 'Bio::DB::GFF::Featname' => [ 'Bio::Root::RootI' ], 'Bio::SearchIO::hmmer' => [ 'Bio::SearchIO' ], 'Bio::Biblio::Book' => [ 'Bio::Biblio::Ref' ], 'Bio::Seq::Meta' => [ 'Bio::LocatableSeq', 'Bio::Seq::MetaI' ], 'Bio::Tools::SeqPattern' => [ 'Bio::Root::Root' ], 'Bio::Graphics::Glyph::ellipse' => [ 'Bio::Graphics::Glyph::generic' ], 'Bio::DB::GFF::Adaptor::dbi::mysqlopt' => [ 'Bio::DB::GFF::Adaptor::dbi::mysql' ], 'Bio::Search::HSP::GenericHSP' => [ 'Bio::Search::HSP::HSPI' ], 'Bio::ClusterIO::unigene' => [ 'Bio::ClusterIO' ], 'Bio::Phenotype::Phenotype' => [ 'Bio::Root::Root', 'Bio::Phenotype::PhenotypeI' ], 'Bio::OntologyIO::goflat' => [ 'Bio::OntologyIO::dagflat' ], 'Bio::SeqFeature::Gene::Promoter' => [ 'Bio::SeqFeature::Gene::NC_Feature' ], 'Bio::Event::EventGeneratorI' => [ 'Bio::Root::RootI' ], 'Bio::Restriction::IO::bairoch' => [ 'Bio::Restriction::IO::base' ], 'Bio::Variation::Allele' => [ 'Bio::PrimarySeq', 'Bio::DBLinkContainerI' ], 'Bio::SimpleAnalysisI' => [ 'Bio::Root::RootI' ], 'Bio::PopGen::Individual' => [ 'Bio::Root::Root', 'Bio::PopGen::IndividualI' ], 'Bio::Root::Storable' => [ 'Bio::Root::Root' ], 'Bio::Cluster::UniGeneI' => [ 'Bio::ClusterI' ], 'Bio::Search::Result::ResultI' => [ 'Bio::AnalysisResultI' ], 'Bio::Search::BlastUtils' => [], 'Bio::Phenotype::Measure' => [ 'Bio::Root::Root' ], 'Bio::LiveSeq::IO::BioPerl' => [ 'Bio::LiveSeq::IO::Loader' ], 'Bio::DB::SeqHound' => [ 'Bio::DB::WebDBSeqI' ], 'Bio::Root::RootI' => [], 'Bio::Graphics::Glyph::translation' => [ 'Bio::Graphics::Glyph::generic' ], 'Bio::SeqIO::metafasta' => [ 'Bio::SeqIO' ], 'Bio::Tools::GuessSeqFormat' => [ 'Bio::Root::Root' ], 'Bio::Cluster::FamilyI' => [ 'Bio::ClusterI' ], 'Bio::Tools::Pseudowise' => [ 'Bio::Tools::AnalysisResult' ], 'Bio::DB::Flat::BDB::swiss' => [ 'Bio::DB::Flat::BDB' ], 'Bio::Coordinate::Result::Match' => [ 'Bio::Location::Simple', 'Bio::Coordinate::ResultI' ], 'Bio::DB::GFF::Aggregator::clone' => [ 'Bio::DB::GFF::Aggregator' ], 'Bio::Das::FeatureTypeI' => [ 'Bio::Root::RootI' ], 'Bio::Graphics::Glyph::anchored_arrow' => [ 'Bio::Graphics::Glyph::arrow' ], 'Bio::DB::SeqFeature::Store::bdb' => [ 'Bio::DB::SeqFeature::Store' ], 'Bio::SeqIO::entrezgene' => [ 'Bio::SeqIO' ], 'Bio::SeqFeature::Gene::UTR' => [ 'Bio::SeqFeature::Gene::Exon' ], 'Bio::PopGen::Statistics' => [ 'Bio::Root::Root' ], 'Bio::SeqIO::tinyseq' => [ 'Bio::SeqIO' ], 'Bio::SeqIO' => [ 'Bio::Root::Root', 'Bio::Root::IO', 'Bio::Factory::SequenceStreamI' ], 'Bio::SearchIO' => [ 'Bio::Root::IO', 'Bio::Event::EventGeneratorI', 'Bio::AnalysisParserI' ], 'Bio::Ontology::DocumentRegistry' => [ 'Bio::Root::Root' ], 'Bio::Align::Utilities' => [ 'Exporter' ], 'Bio::TreeIO::lintree' => [ 'Bio::TreeIO' ], 'Bio::DasI' => [ 'Bio::Root::RootI', 'Bio::SeqFeature::CollectionI' ], 'Bio::Biblio::Article' => [ 'Bio::Biblio::Ref' ], 'Bio::Tools::Analysis::Protein::Scansite' => [ 'Bio::Tools::Analysis::SimpleAnalysisBase' ], 'Bio::Assembly::ContigAnalysis' => [ 'Bio::Root::Root' ], 'Bio::Biblio::Organisation' => [ 'Bio::Biblio::Provider' ], 'Bio::PopGen::IO::phase' => [ 'Bio::PopGen::IO' ], 'Bio::Map::PositionHandlerI' => [ 'Bio::Root::RootI' ], 'Bio::Tree::Compatible' => [ 'Bio::Root::Root' ], 'Bio::SearchIO::EventHandlerI' => [ 'Bio::Event::EventHandlerI' ], 'Bio::PopGen::Marker' => [ 'Bio::Root::Root', 'Bio::PopGen::MarkerI' ], 'Bio::SeqIO::chaosxml' => [ 'Bio::SeqIO::chaos' ], 'Bio::Location::AvWithinCoordPolicy' => [ 'Bio::Location::WidestCoordPolicy' ], 'Bio::Tools::SeqWords' => [ 'Bio::Root::Root' ], 'Bio::Variation::SeqDiff' => [ 'Bio::Root::Root' ], 'Bio::Align::AlignI' => [ 'Bio::Root::RootI' ], 'Bio::Biblio::Journal' => [ 'Bio::Biblio::BiblioBase' ], 'Bio::Biblio::IO::pubmedxml' => [ 'Bio::Biblio::IO::medlinexml' ], 'Bio::Map::LinkageMap' => [ 'Bio::Map::SimpleMap' ], 'Bio::Graphics::Glyph::lightning' => [ 'Bio::Graphics::Glyph::generic' ], 'Bio::Map::RelativeI' => [ 'Bio::Root::RootI' ], 'Bio::LiveSeq::Mutator' => [ 'Bio::Root::Root' ], 'Bio::DB::Query::GenBank' => [ 'Bio::DB::Query::WebQuery' ], 'Bio::SeqIO::bsml' => [ 'Bio::SeqIO' ], 'Bio::DB::NCBIHelper' => [ 'Bio::DB::WebDBSeqI' ], 'Bio::PullParserI' => [ 'Bio::Root::RootI' ], 'Bio::Taxonomy::Taxon' => [ 'Bio::Root::Root', 'Bio::Tree::NodeI' ], 'Bio::DB::GFF::Adaptor::dbi::pg_fts' => [ 'Bio::DB::GFF::Adaptor::dbi::pg' ], 'Bio::DB::EUtilities' => [ 'Bio::DB::GenericWebDBI' ], 'Bio::Index::SwissPfam' => [ 'Bio::Index::Abstract' ], 'Bio::FeatureIO::gff' => [ 'Bio::FeatureIO' ], 'Bio::SeqFeature::SiRNA::Pair' => [ 'Bio::SeqFeature::Generic' ], 'Bio::SearchIO::sim4' => [ 'Bio::SearchIO' ], 'Bio::LiveSeq::Mutation' => [ 'Bio::Root::Root' ], 'Bio::DB::Taxonomy' => [ 'Bio::Root::Root' ], 'Bio::Search::Iteration::GenericIteration' => [ 'Bio::Root::Root', 'Bio::Search::Iteration::IterationI' ], 'Bio::AlignIO::bl2seq' => [ 'Bio::AlignIO' ], 'Bio::Graphics::Glyph::segments' => [ 'Bio::Graphics::Glyph::segmented_keyglyph' ], 'Bio::TreeIO::newick' => [ 'Bio::TreeIO' ], 'Bio::Location::WidestCoordPolicy' => [ 'Bio::Root::Root', 'Bio::Location::CoordinatePolicyI' ], 'Bio::Tools::BPlite::HSP' => [ 'Bio::SeqFeature::SimilarityPair' ], 'Bio::DB::RefSeq' => [ 'Bio::DB::DBFetch' ], 'Bio::DB::GFF::Aggregator::ucsc_softberry' => [ 'Bio::DB::GFF::Aggregator' ], 'Bio::Event::EventHandlerI' => [ 'Bio::Root::RootI' ], 'Bio::Factory::SequenceProcessorI' => [ 'Bio::Factory::SequenceStreamI' ], 'Bio::PopGen::IndividualI' => [ 'Bio::Root::RootI' ], 'Bio::Tools::Phylo::Molphy' => [ 'Bio::Root::Root', 'Bio::Root::IO' ], 'Bio::Map::Marker' => [ 'Bio::Map::Mappable', 'Bio::Map::MarkerI' ], 'Bio::Root::HTTPget' => [ 'Bio::Root::Root' ], 'Bio::Index::Fasta' => [ 'Bio::Index::AbstractSeq' ], 'Bio::Search::HSP::PullHSPI' => [ 'Bio::Search::HSP::HSPI', 'Bio::PullParserI' ], 'Bio::Graphics::Panel' => [ 'Bio::Root::Root' ], 'Bio::Matrix::PSM::IO' => [ 'Bio::Root::IO' ], 'Bio::OntologyIO::obo' => [ 'Bio::OntologyIO' ], 'Bio::SeqIO::genbank' => [ 'Bio::SeqIO' ], 'Bio::DB::SwissProt' => [ 'Bio::DB::WebDBSeqI' ], 'Bio::Phenotype::OMIM::OMIMentryAllelicVariant' => [ 'Bio::Root::Root' ], 'Bio::DB::GFF::Typename' => [ 'Bio::Root::Root', 'Bio::Das::FeatureTypeI' ], 'Bio::SearchIO::FastHitEventBuilder' => [ 'Bio::Root::Root', 'Bio::SearchIO::EventHandlerI' ], 'Bio::Ontology::Ontology' => [ 'Bio::Root::Root', 'Bio::Ontology::OntologyI', 'Bio::AnnotatableI' ], 'Bio::Annotation::Target' => [ 'Bio::Root::Root', 'Bio::AnnotationI', 'Bio::Range' ], 'Bio::OntologyIO::soflat' => [ 'Bio::OntologyIO::dagflat' ], 'Bio::Factory::MapFactoryI' => [ 'Bio::Root::RootI' ], 'Bio::Graphics::Glyph::so_transcript' => [ 'Bio::Graphics::Glyph::processed_transcript' ], 'Bio::SeqFeatureI' => [ 'Bio::RangeI', 'Bio::AnnotatableI' ], 'Bio::Factory::HitFactoryI' => [ 'Bio::Root::RootI' ], 'Bio::Assembly::IO' => [ 'Bio::Root::Root', 'Bio::Root::IO' ], 'Bio::SeqFeature::Tools::TypeMapper' => [ 'Bio::Root::Root' ], 'Bio::SeqIO::agave' => [ 'Bio::SeqIO' ], 'Bio::Tools::Analysis::Protein::GOR4' => [ 'Bio::Tools::Analysis::SimpleAnalysisBase' ], 'Bio::DB::SeqFeature::Store::GFF3Loader' => [ 'Bio::Root::Root' ], 'Bio::Location::Atomic' => [ 'Bio::Root::Root', 'Bio::LocationI' ], 'Bio::Coordinate::Chain' => [ 'Bio::Coordinate::Collection' ], 'Bio::Structure::IO' => [ 'Bio::Root::Root', 'Bio::Root::IO' ], 'Bio::Factory::ObjectFactoryI' => [ 'Bio::Root::RootI' ], 'Bio::LiveSeq::SeqI' => [ 'Bio::Root::Root', 'Bio::LiveSeq::ChainI', 'Bio::PrimarySeqI' ], 'Bio::AlignIO::clustalw' => [ 'Bio::AlignIO' ], 'Bio::Tools::Run::StandAloneBlast' => [ 'Bio::Root::Root', 'Bio::Tools::Run::WrapperBase', 'Bio::Factory::ApplicationFactoryI' ], 'Bio::Factory::TreeFactoryI' => [ 'Bio::Root::RootI' ], 'Bio::Seq::LargeLocatableSeq' => [ 'Bio::Seq::LargePrimarySeq', 'Bio::LocatableSeq' ], 'Bio::Perl' => [ 'Exporter' ], 'Bio::PopGen::GenotypeI' => [ 'Bio::Root::RootI' ], 'Bio::DB::GFF::Aggregator::ucsc_ensgene' => [ 'Bio::DB::GFF::Aggregator' ], 'Bio::SeqFeature::Gene::TranscriptI' => [ 'Bio::SeqFeatureI' ], 'Bio::DB::GFF::Adaptor::memory::iterator' => [], 'Bio::SeqIO::ztr' => [ 'Bio::SeqIO' ], 'Bio::Restriction::Enzyme' => [ 'Bio::Root::Root', 'Bio::Restriction::EnzymeI' ], 'Bio::Tools::ERPIN' => [ 'Bio::Tools::AnalysisResult' ], 'Bio::TreeIO::nexus' => [ 'Bio::TreeIO' ], 'Bio::Restriction::Enzyme::MultiCut' => [ 'Bio::Restriction::Enzyme' ], 'Bio::Biblio::MedlineJournal' => [ 'Bio::Biblio::Journal' ], 'Bio::Tools::Analysis::Protein::ELM' => [ 'Bio::Tools::Analysis::SimpleAnalysisBase' ], 'Bio::Seq::SeqFactory' => [ 'Bio::Root::Root', 'Bio::Factory::SequenceFactoryI' ], 'Bio::DB::DBFetch' => [ 'Bio::DB::WebDBSeqI' ], 'Bio::SeqIO::strider' => [ 'Bio::SeqIO' ], 'Bio::AlignIO::mase' => [ 'Bio::AlignIO' ], 'Bio::Phenotype::Correlate' => [ 'Bio::Root::Root' ], 'Bio::Tools::Genscan' => [ 'Bio::Tools::AnalysisResult' ], 'Bio::Biblio::Thesis' => [ 'Bio::Biblio::Ref' ], 'Bio::Graphics::Glyph::pinsertion' => [ 'Bio::Graphics::Glyph::generic' ], 'Bio::DB::Flat::BDB::fasta' => [ 'Bio::DB::Flat::BDB' ], 'Bio::Graphics::Glyph::pentagram' => [ 'Bio::Graphics::Glyph::generic' ], 'Bio::Tools::Geneid' => [ 'Bio::Root::Root', 'Bio::Root::IO' ], 'Bio::Biblio::MedlineBook' => [ 'Bio::Biblio::Book' ], 'Bio::Map::Physical' => [ 'Bio::Map::SimpleMap' ], 'Bio::LiveSeq::Chain' => [], 'Bio::SeqFeature::AnnotationAdaptor' => [ 'Bio::Root::Root', 'Bio::AnnotationCollectionI', 'Bio::AnnotatableI' ], 'Bio::Tools::Primer3' => [ 'Bio::Root::Root', 'Bio::Root::IO' ], 'Bio::Ontology::OntologyEngineI' => [ 'Bio::Root::RootI' ], 'Bio::Tools::Seg' => [ 'Bio::Root::Root', 'Bio::Root::IO' ], 'Bio::Graphics::Glyph::heterogeneous_segments' => [ 'Bio::Graphics::Glyph::graded_segments' ], 'Bio::Matrix::PSM::IO::masta' => [ 'Bio::Matrix::PSM::IO' ], 'Bio::Index::GenBank' => [ 'Bio::Index::AbstractSeq' ], 'Bio::SeqFeature::Gene::Exon' => [ 'Bio::SeqFeature::Generic', 'Bio::SeqFeature::Gene::ExonI' ], 'Bio::Tools::HMMER::Set' => [ 'Bio::Root::Root' ], 'Bio::DB::SeqVersion::gi' => [ 'Bio::DB::SeqVersion' ], 'Bio::Graphics::Glyph::extending_arrow' => [ 'Bio::Graphics::Glyph::anchored_arrow' ], 'Bio::Phenotype::OMIM::MiniMIMentry' => [ 'Bio::Root::Root' ], 'Bio::Matrix::PSM::PsmI' => [ 'Bio::Matrix::PSM::SiteMatrixI' ], 'Bio::AlignIO::meme' => [ 'Bio::AlignIO' ], 'Bio::DB::GFF::Adaptor::dbi::caching_handle' => [ 'Bio::Root::Root' ], 'Bio::Ontology::OntologyStore' => [ 'Bio::Root::Root' ], 'Bio::DB::Biblio::pdf' => [ 'Bio::Biblio' ], 'Bio::Restriction::IO::itype2' => [ 'Bio::Restriction::IO::base' ], 'Bio::Map::FPCMarker' => [ 'Bio::Root::Root', 'Bio::Map::MappableI' ], 'Bio::DB::GenBank' => [ 'Bio::DB::NCBIHelper' ], 'Bio::Search::HSP::WABAHSP' => [ 'Bio::Search::HSP::GenericHSP' ], 'Bio::Graphics::Glyph::line' => [ 'Bio::Graphics::Glyph::generic' ], 'Bio::Tree::Draw::Cladogram' => [ 'Bio::Root::Root' ], 'Bio::LiveSeq::AARange' => [ 'Bio::LiveSeq::SeqI' ], 'Bio::SeqFeature::Collection' => [ 'Bio::Root::Root' ], 'Bio::Seq::TraceI' => [], 'Bio::DB::Expression::geo' => [ 'Bio::DB::Expression' ], 'Bio::DB::XEMBL' => [ 'Bio::DB::RandomAccessI' ], 'Bio::AlignIO::largemultifasta' => [ 'Bio::AlignIO', 'Bio::SeqIO', 'Bio::SimpleAlign' ], 'Bio::DB::EUtilities::egquery' => [ 'Bio::DB::EUtilities' ], 'Bio::SeqFeature::Gene::GeneStructureI' => [ 'Bio::SeqFeatureI' ], 'Bio::Tools::Phylo::Molphy::Result' => [ 'Bio::Root::Root' ], 'Bio::Tools::CodonTable' => [ 'Bio::Root::Root' ], 'Bio::Structure::Residue' => [ 'Bio::Root::Root' ], 'Bio::DB::Biblio::soap' => [ 'Bio::Biblio' ], 'Bio::Seq::SequenceTrace' => [ 'Bio::Root::Root', 'Bio::Seq::Quality', 'Bio::Seq::TraceI' ], 'Bio::Taxonomy::Node' => [ 'Bio::Taxon' ], 'Bio::Tools::Primer::Feature' => [ 'Bio::SeqFeature::Generic' ], 'Bio::Restriction::Enzyme::MultiSite' => [ 'Bio::Restriction::Enzyme' ], 'Bio::SearchIO::fasta' => [ 'Bio::SearchIO' ], 'Bio::DB::MeSH' => [ 'Bio::Tools::Analysis::SimpleAnalysisBase' ], 'Bio::Tools::Primer::Assessor::Base' => [ 'Bio::Root::Root' ], 'Bio::SeqFeature::PositionProxy' => [ 'Bio::Root::Root', 'Bio::SeqFeatureI' ], 'Bio::Align::PairwiseStatistics' => [ 'Bio::Root::Root', 'Bio::Align::StatisticsI' ], 'Bio::SeqFeature::Tools::IDHandler' => [ 'Bio::Root::Root' ], 'Bio::DB::GFF::RelSegment' => [ 'Bio::DB::GFF::Segment' ], 'Bio::LiveSeq::Transcript' => [ 'Bio::LiveSeq::SeqI' ], 'Bio::Tools::Alignment::Consed' => [ 'Bio::Root::Root', 'Bio::Root::IO' ], 'Bio::DB::EUtilities::einfo' => [ 'Bio::DB::EUtilities' ], 'Bio::Seq::LargePrimarySeq' => [ 'Bio::PrimarySeq', 'Bio::Root::IO', 'Bio::Seq::LargeSeqI' ], 'Bio::Restriction::EnzymeCollection' => [ 'Bio::Root::Root' ], 'Bio::Search::Hit::HmmpfamHit' => [ 'Bio::Root::Root', 'Bio::Search::Hit::PullHitI' ], 'Bio::Cluster::UniGene' => [ 'Bio::Root::Root', 'Bio::Cluster::UniGeneI', 'Bio::IdentifiableI', 'Bio::DescribableI', 'Bio::AnnotatableI', 'Bio::Factory::SequenceStreamI' ], 'Bio::SeqIO::bsml_sax' => [ 'Bio::SeqIO', 'XML::SAX::Base' ], 'Bio::AlignIO' => [ 'Bio::Root::Root', 'Bio::Root::IO' ], 'Bio::PopGen::PopStats' => [ 'Bio::Root::Root' ], 'Bio::Coordinate::Pair' => [ 'Bio::Root::Root', 'Bio::Coordinate::MapperI' ], 'Bio::Tree::Tree' => [ 'Bio::Root::Root', 'Bio::Tree::TreeI', 'Bio::Tree::TreeFunctionsI' ], 'Bio::Expression::FeatureGroup' => [ 'Bio::Root::Root', 'Bio::Expression::FeatureI' ], 'Bio::Seq::SeqWithQuality' => [ 'Bio::Root::Root', 'Bio::PrimarySeqI', 'Bio::Seq::QualI' ], 'Bio::Tools::BPpsilite' => [ 'Bio::Root::Root', 'Bio::Root::IO' ], 'Bio::Search::Hit::GenericHit' => [ 'Bio::Root::Root', 'Bio::Search::Hit::HitI' ], 'Bio::DB::SeqFeature::Store::DBI::mysql' => [ 'Bio::DB::SeqFeature::Store' ], 'Bio::SeqFeature::Tools::FeatureNamer' => [ 'Bio::Root::Root' ], 'Bio::DB::GFF::Aggregator::alignment' => [ 'Bio::DB::GFF::Aggregator' ], 'Bio::IdCollectionI' => [ 'Bio::Root::RootI' ], 'Bio::Biblio' => [ 'Bio::Root::Root', 'Bio::DB::BiblioI' ], 'Bio::Ontology::RelationshipType' => [ 'Bio::Ontology::Term' ], 'Bio::Graphics::Glyph::generic' => [ 'Bio::Graphics::Glyph' ], 'Bio::DB::Taxonomy::entrez' => [ 'Bio::WebAgent', 'Bio::DB::Taxonomy' ], 'Bio::Matrix::PSM::InstanceSiteI' => [ 'Bio::Root::RootI' ], 'Bio::SearchIO::hmmer_pull' => [ 'Bio::SearchIO', 'Bio::PullParserI' ], 'Bio::SeqIO::tab' => [ 'Bio::SeqIO' ], 'Bio::DB::GFF::Aggregator::ucsc_acembly' => [ 'Bio::DB::GFF::Aggregator' ], 'Bio::LiveSeq::IO::Loader' => [], 'Bio::Factory::FTLocationFactory' => [ 'Bio::Root::Root', 'Bio::Factory::LocationFactoryI' ], 'Bio::Tools::Analysis::SimpleAnalysisBase' => [ 'Bio::WebAgent', 'Bio::SimpleAnalysisI' ], 'Bio::Tools::Grail' => [ 'Bio::Root::IO' ], 'Bio::AnnotationI' => [ 'Bio::Root::RootI' ], 'Bio::Graphics::Glyph::protein' => [ 'Bio::Graphics::Glyph::generic' ], 'Bio::Tools::Genewise' => [ 'Bio::Root::Root', 'Bio::Root::IO' ], 'Bio::SearchIO::blasttable' => [ 'Bio::SearchIO' ], 'Bio::SeqIO::table' => [ 'Bio::SeqIO' ] }; #}}} foreach ( keys %$isa ) { my $parent = $isa->{$_}; foreach my $p ( @$parent ) { push @{$risa->{$p}}, $_; } } } my ($tree, $show_child); parse_args(\@args, {'-child'=> \$show_child, '-tree' => \$tree }); save_history(\@args); my $db = ( $show_child ? $risa : $isa ); my @history; my $cnt = 0; if ( $tree ) { eval { require Data::TreeDumper }; if ( $@ ) { print "The Data::TreeDumper seem not installed.\n", "Use \"cpan -i Data::TreeDumper\" to install it first.\n"; return; } foreach my $mod ( @args ) { next if !exists $db->{$mod}; print Data::TreeDumper::DumpTree( [ $mod ], $mod, FILTER => sub { my $s = shift; if ( ref($s) eq 'ARRAY' ) { my $i = 0; return ( 'ARRAY', [ map { [$_] } @{$db->{$s->[0]}} ], map { push @history, $_; $cnt++; [ $i++, $_ . "($cnt)" ] } @{$db->{$s->[0]}} ); } return(Data::TreeDumper::DefaultNodesToDisplay($s)) ; }, USE_ASCII => 1, DISPLAY_ADDRESS => 0, ); } } else { foreach my $mod ( @args ) { next if !exists $db->{$mod}; print "* $mod\n"; foreach ( @{$db->{$mod}} ) { $cnt++; print " ", sprintf("%3d. ", $cnt), $_, "\n"; push @history, $_; } } } if ( @history ) { $module_history->insert( [ "isa " . ( $show_child ? "-child " : "") . ($tree ? "-tree " : "") . join(" ", @args), \@history ]); } } sub search { my @args = @_; my $ignorecase = $Config{ignorecase}; my $case; my $is_method; parse_args( \@args, { '-ignorecase' => \$ignorecase, '-case' => \$case, '-method' => \$is_method, } ); unless ( $case ) { $case = !$ignorecase; } my $pattern = shift @args; if ( !$case ) { $pattern = '(?i)'.$pattern; } my $i = 1; if ( $is_method ) { my @table = map { my $first = $_; $first =~ /^(.+)::/; my $package_name = $1; my $return = trim(Deobfuscator::get_method_docs($methods, $first, 'returns')); if ( $return eq '0' ) { $return = 'not documented'; } my $usage = trim(Deobfuscator::get_method_docs($methods, $first, 'usage')); if ( $usage eq '0' ) { $usage = 'not documented'; } [ $i++, substr($first, length($package_name)+2), $package_name, $return, $usage, ] } grep { /$pattern/ } sort keys %$methods; return unless @table; trim_table(\@table); print_table( \@table, header => ['Id', 'Method', 'Class', 'Return', 'Usage'], style => $Config{table_style}, max_width => $Config{max_width}, width => $Config{width}{method}, row_separator => $Config{row_separator}{method}, ); $method_history->insert( ["search -method " . ( $case ? "-case " : "-ignorecase ") . $pattern, [map { $_->[2]."::".$_->[1] } @table]] ); } else { my @table = map { [ $i++, $_, trim(normal_space(Deobfuscator::get_pkg_docs($packages, $_, 'short_desc'))) ] } grep { /$pattern/ } sort keys %$packages; return unless @table; trim_table(\@table); print_table( \@table, header => ["Id", "Module", "Description"], style => $Config{table_style}, max_width => $Config{max_width}, width => $Config{width}{search}, row_separator => $Config{row_separator}{search}, ); $module_history->insert( ["search " . ( $case ? "-case " : "-ignorecase " ) . $pattern, [map { $_->[1] } @table]] ); } } sub method { my @args = @_; my ($sortby); parse_args(\@args, {'-sort|1'=> \$sortby}); if ( defined $sortby ) { $sortby = $sortby->[0]; } else { $sortby = $Config{sort_method_by}; } save_history(\@args); my (@all_method, @methods); my $i = 1; foreach ( @args ) { print "* $_\n"; my @table; my $all = eval { Deobfuscator::return_methods($_) }; if ( $@ ) { print "Can't find methods for $_:\n$@\n"; return; } my %full; foreach my $array_ref ( @{ $all->{$_} } ) { my $key = $array_ref->[1] . "::" . $array_ref->[0]; $full{$key} = $array_ref->[0]; } if ( 'class' =~ /^\Q$sortby\E/ ) { @methods = sort keys %full; } else { @methods = sort { $full{$a} cmp $full{$b} } keys %full } foreach my $first ( @methods ) { my @row; push @row, $i++; $first =~ /^(.+)::/; my $package_name = $1; my $return = trim(Deobfuscator::get_method_docs($methods, $first, 'returns')); if ( $return eq '0' ) { $return = 'not documented'; } my $usage = trim(Deobfuscator::get_method_docs($methods, $first, 'usage')); if ( $usage eq '0' ) { $usage = 'not documented'; } push @row, ($full{$first}, $package_name, $return, $usage); push @table, \@row; } print_table( \@table, header => ['Id', 'Method', 'Class', 'Return', 'Usage'], style => $Config{table_style}, max_width => $Config{max_width}, width => $Config{width}{method}, row_separator => $Config{row_separator}{method}, ); push @all_method, @methods; } $method_history->insert( [join(" ", "method", @args), \@all_method] ); } sub desc { my @args = @_; my ($short); parse_args(\@args, {'-short' => \$short }); save_history(\@args); if ( $short ) { print_table( [ map { [ $_, trim(Deobfuscator::get_pkg_docs($packages, $_, 'short_desc')) ] } @args ], style => $Config{table_style}, max_width => $Config{max_width}, width => $Config{width}{desc}, row_separator => $Config{row_separator}{desc}, ); } else { foreach ( @args ) { print "* $_\n"; print Deobfuscator::get_pkg_docs($packages, $_, 'desc'); print "\n"; } } } #}}} #{{{ Utils sub add_abbrev { my ($hashref, @abbv) = @_; my %table = map {$_ => 1} keys %$hashref; WORD: foreach my $word (@abbv) { for (my $len = (length $word) - 1; $len > 0; --$len) { my $abbrev = substr($word,0,$len); my $seen = ++$table{$abbrev}; if ($seen == 1) { # We're the first word so far to have # this abbreviation. $hashref->{$abbrev} = $word; } elsif ($seen == 2) { # We're the second word to have this # abbreviation, so we can't use it. delete $hashref->{$abbrev}; } else { # We're the third word to have this # abbreviation, so skip to the next word. next WORD; } } } # Non-abbreviations always get entered, even if they aren't unique foreach my $word (@abbv) { $hashref->{$word} = $word; } } sub uniq { my (%seen, @uniq); foreach ( @_ ) { next if exists $seen{$_}; push @uniq, $_; } return @uniq; } sub trim { $_[0] =~ s/^\s+//; $_[0] =~ s/\s+$//; return $_[0]; } sub normal_space { $_[0] =~ s/\s+/ /g; return $_[0]; } sub parse_args { my ($args, $options) = @_; return if $#$args == -1; my @options; foreach ( keys %$options ) { if ( /^(.*)\|(\d+)$/) { push @options, $1; $options->{$1} = $2; } else { push @options, $_; } } my %abbrev = abbrev(@options); while ( defined $args->[0] && exists $abbrev{$args->[0]} ) { my $opt = $abbrev{$args->[0]}; if ( exists $options->{$opt} && !ref $options->{$opt} ) { shift @$args; my @val = splice(@$args, 0, $options->{$opt}); ${$options->{$opt."|".$options->{$opt}}} = \@val; } else { ${$options->{$opt}} = 1; shift @$args; } } } # col width prorioty: length > width > max_width sub print_table { my ($table, %options) = @_; return unless $#$table != -1; my ($header, $valign, $halign, $style, $row_separator, $max_width, $width) = ( $options{header}, $options{valign}, $options{halign}, $options{style}, $options{row_separator}, $options{max_width}, $options{width}, ); if ( $style eq 'tab' ) { foreach ( $header, @$table ) { print join("\t", @{$_}), "\n"; } return; } local $Text::Wrap::columns; if ( !defined $max_width ) { $max_width = 1000; } my %table_style = ( 'orgtbl' => { 'horizontal' => '-', 'vertical' => '|', 'center' => '+', 'leftup_corner' => '|', 'rightup_corner' => '|', 'leftbot_corner' => '|', 'rightbot_corner' => '|', 'up_edge' => '+', 'left_edge' => '|', 'right_edge' => '|', 'bot_edge' => '+', }, 'table' => { 'horizontal' => '-', 'vertical' => '|', 'center' => '+', 'leftup_corner' => '+', 'rightup_corner' => '+', 'leftbot_corner' => '+', 'rightbot_corner' => '+', 'up_edge' => '+', 'left_edge' => '+', 'right_edge' => '+', 'bot_edge' => '+', }, ); if ( !defined $style || !exists $table_style{$style} ) { $style = 'table'; } my %table_char = %{$table_style{$style}}; my $cols = $#{$table->[0]}; my $last = $#$table; my $i = 0; my @colwid; if ( $header ) { @colwid = map { max(length($_), 1) } @$header; } else { @colwid = (3)x($cols+1); } foreach my $c ( 0..$cols ) { $colwid[$c] = max($colwid[$c], map { max(length($_->[$c]), 1) } @$table); } @colwid = map { min($_+2, $max_width) } @colwid; if ( defined $width ) { @colwid = map { defined $width->[$_] ? min($width->[$_], $colwid[$_]) : $colwid[$_] } 0..$#colwid; } my $top = $table_char{leftup_corner} . join($table_char{up_edge}, map { $table_char{horizontal} x $_ } @colwid) . $table_char{rightup_corner}."\n"; my $center = $table_char{left_edge} . join($table_char{center}, map { $table_char{horizontal} x $_ } @colwid) . $table_char{right_edge}."\n"; my $bottom = $table_char{leftbot_corner} . join($table_char{bot_edge}, map { $table_char{horizontal} x $_ } @colwid) . $table_char{rightbot_corner}."\n"; my $fill = sub { my ($str, $len, $just) = @_; if ( defined $just && $just == 2 ) { # right return ' 'x($len-length($str)).$str; } elsif ( defined $just && $just == 1 ) { # center my $l = int(($len-length($str))/2); my $r = ($len-length($str)-$l); return ' 'x$l . $str . ' 'x$r; } else { # left return $str . ' 'x($len-length($str)); } }; my $format_row = sub { my $row = shift; my (@lines, $max); $max = 0; foreach my $c ( 0..$cols ) { my $len = length($row->[$c]); my @row_lines; if ( $len <= $colwid[$c]-2 ) { push @row_lines, $row->[$c]; } else { $Text::Wrap::columns = $colwid[$c]-2; @row_lines = split("\n", wrap('', '', $row->[$c])); } if ( $halign && $halign eq 'center' ) { foreach ( @row_lines ) { $_ = $fill->($_, $colwid[$c], 1); } } else { foreach ( @row_lines ) { $_ = ' ' . $fill->($_, $colwid[$c]-2) . ' '; } } $max = max($max, $#row_lines); push @lines, \@row_lines; } if ( $max != 0 ) { foreach ( 0..$cols ) { my $lines = $lines[$_]; if ( $#$lines != $max ) { if ( defined $valign && $valign ) { my $l = int(($max-$#$lines)/2); my $r = ($max-$#$lines-$l); unshift @$lines, (' 'x$colwid[$_])x$l; push @$lines, (' 'x$colwid[$_])x$r; } else { push @$lines, (' 'x$colwid[$_])x($max-$#$lines); } } } } my $text = ""; foreach my $i ( 0..$max ) { $text .= $table_char{vertical} . join($table_char{vertical}, map { $_->[$i] } @lines) . $table_char{vertical}."\n"; } return $text; }; print $top; if ( $header) { print $format_row->($header); print $center; } foreach ( @$table ) { print $format_row->($_); if ( $row_separator && $i != $last ) { print $center; } $i++; } print $bottom; } #}}} __END__ =head1 NAME deob - A command line interface to Deobfuscaotr.pm =head1 SYNOPSIS perl deob.pl - console interface of Deobfuscaotr =head1 DESCRIPTION This script is an console version of Deobfuscaotr. It is designed for easily query method and module documents without a web server. This is a session of using the program: $ perl deob.pl deob> se SeqIO +----+-------------------------------------------------+--------------------------------------------------+ | Id | Module | Description | +----+-------------------------------------------------+--------------------------------------------------+ | 1 | Bio::Bio::SeqIO::Handler::GenericRichSeqHandler | Bio::HandlerI-based data handler for | | | | GenBank/EMBL/UniProt (and other) sequence data | | 2 | Bio::SeqIO | Handler for SeqIO Formats | | ..... | | 52 | Bio::SeqIO::ztr | ztr trace sequence input/output stream | +----+-------------------------------------------------+--------------------------------------------------+ deob> se seqfe +----+----------------------------------------------+--------------------------------------------------+ | Id | Module | Description | +----+----------------------------------------------+--------------------------------------------------+ | 1 | Bio::DB::SeqFeature | Normalized feature for use with | | | | Bio::DB::SeqFeature::Store | | 2 | Bio::DB::SeqFeature::NormalizedFeature | Normalized feature for use with | | | | Bio::DB::SeqFeature::Store | | ...... | | 42 | Bio::SeqFeatureI | Abstract interface of a Sequence Feature | +----+----------------------------------------------+--------------------------------------------------+ deob> se -c seqfe deob> hi 1. search -ignorecase (?i)SeqIO 1. Bio::Bio::SeqIO::Handler::GenericRichSeqHandler 2. Bio::SeqIO ... 2. search -ignorecase (?i)seqfe 1. Bio::DB::SeqFeature 2. Bio::DB::SeqFeature::NormalizedFeature ... deob> me 42 * Bio::SeqFeatureI +----+-----------------------+------------------+------------------------------+------------------------------+ | Id | Method | Class | Return | Usage | +----+-----------------------+------------------+------------------------------+------------------------------+ | 1 | contains | Bio::RangeI | true if the argument is | if($r1->contains($r2) { do | | | | | totally contained within | stuff } | | | | | this range | | +----+-----------------------+------------------+------------------------------+------------------------------+ | 2 | disconnected_ranges | Bio::RangeI | a list of objects of the | my @disc_ranges = | | | | | same type as the input | Bio::Range->disconnected_ra | | | | | (conforms to RangeI) | nges(@ranges); | | ..... | +----+-----------------------+------------------+------------------------------+------------------------------+ | 37 | source_tag | Bio::SeqFeatureI | a string | $tag = $feat->source_tag() | +----+-----------------------+------------------+------------------------------+------------------------------+ | 38 | spliced_seq | Bio::SeqFeatureI | A L object | $seq = | | | | | | $feature->spliced_seq() | | | | | | $seq = | | | | | | $feature_with_remote_locati | | | | | | ons->spliced_seq($db_for_se | | | | | | qs) | +----+-----------------------+------------------+------------------------------+------------------------------+ deob> de * Bio::SeqFeatureI This interface is the functions one can expect for any Sequence Feature, whatever its implementation or whether it is a more complex type (eg, a Gene). This object does not actually provide any implemention, it just provides the definitions of what methods one can call. See Bio::SeqFeature::Generic for a good standard implementation of this object deob> de -s +------------------+------------------------------------------+ | Bio::SeqFeatureI | Abstract interface of a Sequence Feature | +------------------+------------------------------------------+ deob> show 37 * Bio::SeqFeatureI::source_tag +----------+--------------------------------------------------+ | Title | source_tag | | Usage | $tag = $feat->source_tag() | | Function | Returns the source tag for a feature, eg, | | | 'genscan' | | Returns | a string | | Args | none | +----------+--------------------------------------------------+ deob> hi -m 1. method Bio::SeqFeatureI 1. Bio::RangeI::contains 2. Bio::RangeI::disconnected_ranges 3. Bio::RangeI::end 4. Bio::RangeI::equals ... deob> hi -s 1 1. search -ignorecase (?i)seqfe 1. Bio::DB::SeqFeature 2. Bio::DB::SeqFeature::NormalizedFeature ..... 42. Bio::SeqFeatureI deob> h Unknown command "h" deob> alias h help "h" alias to "help" deob> h Syntax: command [options] [parameters] Available commands: alias [ -quiet ] alias command desc [ -short ] [ module ] exit help [ command ] history [ -method -show_all ] number isa [ -tree -child ] [ modlue ] method [-sort method|class ] [ module ] pop [ -method ] [ number ] quit search [ -ignorecase -case -method ] pattern show method synopsis [ module ] deob> isa * Bio::SeqFeatureI 1. Bio::RangeI 2. Bio::AnnotatableI deob> isa -t Bio::SeqFeatureI |- Bio::RangeI(1) | `- Bio::Root::RootI(3) `- Bio::AnnotatableI(2) `- Bio::Root::RootI(4) deob> hi 1. search -ignorecase (?i)SeqIO 1. Bio::Bio::SeqIO::Handler::GenericRichSeqHandler 2. Bio::SeqIO 3. Bio::SeqIO::FTHelper 4. Bio::SeqIO::MultiFile ... 2. search -ignorecase (?i)seqfe 1. Bio::DB::SeqFeature 2. Bio::DB::SeqFeature::NormalizedFeature 3. Bio::DB::SeqFeature::NormalizedFeatureI 4. Bio::DB::SeqFeature::NormalizedTableFeatureI ... 3. isa Bio::SeqFeatureI 1. Bio::RangeI 2. Bio::AnnotatableI 4. isa -tree Bio::SeqFeatureI 1. Bio::RangeI 2. Bio::AnnotatableI 3. Bio::Root::RootI 4. Bio::Root::RootI deob> pop deob> hi 1. search -ignorecase (?i)SeqIO 1. Bio::Bio::SeqIO::Handler::GenericRichSeqHandler 2. Bio::SeqIO 3. Bio::SeqIO::FTHelper 4. Bio::SeqIO::MultiFile ... 2. search -ignorecase (?i)seqfe 1. Bio::DB::SeqFeature 2. Bio::DB::SeqFeature::NormalizedFeature 3. Bio::DB::SeqFeature::NormalizedFeatureI 4. Bio::DB::SeqFeature::NormalizedTableFeatureI ... 3. isa Bio::SeqFeatureI 1. Bio::RangeI 2. Bio::AnnotatableI deob> q Byebye! =head1 CONFIGURATION The configuration file should be the file with name ".deob" inside the home directory. If File::HomeDir is install, the home directory is determine by the module, otherwise it is in $ENV{HOME}. For the OS the doesn't have $ENV{HOME}, the file could be with same directory with this directory. The file could contain any perl code. This is an example: %Config = ( %Config, 'packages' => "c:/Program Files/Apache Group/Apache2/cgi-bin/packages.db", 'methods' => "c:/Program Files/Apache Group/Apache2/cgi-bin/methods.db", ); alias("-q", "?", "help"); # helpful for debug add_abbrev(\%cmd_abbv, 'eval'); $commands{'eval'} = \&eval_input; The customizable value in %Config is as following: packages - the full path of packages.db methods - the full path of methods.db ignorecase - ignore case for search pattern and commands sort_method_by - the order for list methods history_length - the length of history ring history_max_items - the max number of item to list using command "history" max_rows - Max rows in the table(in case too slow after search) table_style - Table output style, one of ('table', 'orgtbl', 'tab') max_width - Max column width of table width - Column width for each command that output table row_separator - Output row seperator or not for each command =head1 AUTHOR Ye Wenbin =head1 SEE ALSO L, L =cut