The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
BUGS 22
Bio/Align/AlignI.pm 11
Bio/Align/DNAStatistics.pm 11
Bio/Align/Graphics.pm 1111
Bio/Align/PairwiseStatistics.pm 11
Bio/Align/ProteinStatistics.pm 11
Bio/Align/StatisticsI.pm 11
Bio/Align/Utilities.pm 11
Bio/AlignIO/Handler/GenericAlignHandler.pm 12
Bio/AlignIO/arp.pm 11
Bio/AlignIO/bl2seq.pm 11
Bio/AlignIO/clustalw.pm 11
Bio/AlignIO/emboss.pm 11
Bio/AlignIO/fasta.pm 12
Bio/AlignIO/largemultifasta.pm 11
Bio/AlignIO/maf.pm 11
Bio/AlignIO/mase.pm 11
Bio/AlignIO/mega.pm 11
Bio/AlignIO/meme.pm 32
Bio/AlignIO/metafasta.pm 11
Bio/AlignIO/msf.pm 62
Bio/AlignIO/nexml.pm 11
Bio/AlignIO/nexus.pm 22
Bio/AlignIO/pfam.pm 11
Bio/AlignIO/phylip.pm 23
Bio/AlignIO/po.pm 11
Bio/AlignIO/proda.pm 11
Bio/AlignIO/prodom.pm 11
Bio/AlignIO/psi.pm 22
Bio/AlignIO/selex.pm 11
Bio/AlignIO/stockholm.pm 11
Bio/AlignIO/xmfa.pm 11
Bio/AlignIO.pm 44
Bio/AnalysisI.pm 11
Bio/AnalysisParserI.pm 11
Bio/AnalysisResultI.pm 11
Bio/AnnotatableI.pm 11
Bio/Annotation/AnnotationFactory.pm 11
Bio/Annotation/Collection.pm 11
Bio/Annotation/OntologyTerm.pm 11
Bio/Annotation/Relation.pm 11
Bio/Annotation/SimpleValue.pm 11
Bio/Annotation/StructuredValue.pm 11
Bio/Annotation/TagTree.pm 11
Bio/Annotation/TypeManager.pm 11
Bio/AnnotationCollectionI.pm 11
Bio/AnnotationI.pm 179
Bio/Assembly/Contig.pm 11
Bio/Assembly/ContigAnalysis.pm 11
Bio/Assembly/IO/ace.pm 11
Bio/Assembly/IO/bowtie.pm 44
Bio/Assembly/IO/maq.pm 11
Bio/Assembly/IO/phrap.pm 11
Bio/Assembly/IO/sam.pm 11
Bio/Assembly/IO/tigr.pm 11
Bio/Assembly/IO.pm 22
Bio/Assembly/Scaffold.pm 11
Bio/Assembly/ScaffoldI.pm 11
Bio/Assembly/Singlet.pm 11
Bio/Assembly/Tools/ContigSpectrum.pm 22
Bio/Cluster/ClusterFactory.pm 11
Bio/Cluster/FamilyI.pm 11
Bio/Cluster/SequenceFamily.pm 8481
Bio/Cluster/UniGene.pm 11
Bio/Cluster/UniGeneI.pm 11
Bio/ClusterI.pm 11
Bio/ClusterIO/dbsnp.pm 11
Bio/ClusterIO/unigene.pm 11
Bio/ClusterIO.pm 22
Bio/CodonUsage/IO.pm 11
Bio/CodonUsage/Table.pm 11
Bio/Coordinate/Chain.pm 9226
Bio/Coordinate/Collection.pm 12358
Bio/Coordinate/ExtrapolatingPair.pm 8425
Bio/Coordinate/GeneMapper.pm 380315
Bio/Coordinate/Graph.pm 173100
Bio/Coordinate/MapperI.pm 7010
Bio/Coordinate/Pair.pm 10747
Bio/Coordinate/Result/Gap.pm 639
Bio/Coordinate/Result/Match.pm 6514
Bio/Coordinate/Result.pm 8519
Bio/Coordinate/ResultI.pm 669
Bio/Coordinate/Utils.pm 13782
Bio/DB/Ace.pm 11
Bio/DB/BioFetch.pm 44
Bio/DB/CUTG.pm 11
Bio/DB/DBFetch.pm 11
Bio/DB/EMBL.pm 11
Bio/DB/EntrezGene.pm 11
Bio/DB/Expression/geo.pm 11
Bio/DB/Expression.pm 11
Bio/DB/Failover.pm 11
Bio/DB/FileCache.pm 11
Bio/DB/Flat/BDB/embl.pm 11
Bio/DB/Flat/BDB/fasta.pm 11
Bio/DB/Flat/BDB/genbank.pm 11
Bio/DB/Flat/BDB/swiss.pm 11
Bio/DB/Flat/BDB.pm 11
Bio/DB/Flat/BinarySearch.pm 2318
Bio/DB/Flat.pm 33
Bio/DB/GFF/Adaptor/berkeleydb.pm 46
Bio/DB/GFF.pm 43
Bio/DB/GenBank.pm 33
Bio/DB/GenPept.pm 11
Bio/DB/GenericWebAgent.pm 11
Bio/DB/HIV/HIVAnnotProcessor.pm 11
Bio/DB/HIV/HIVQueryHelper.pm 11
Bio/DB/HIV.pm 1515
Bio/DB/InMemoryCache.pm 11
Bio/DB/IndexedBase.pm 416
Bio/DB/LocationI.pm 11
Bio/DB/MeSH.pm 617
Bio/DB/NCBIHelper.pm 11
Bio/DB/Query/GenBank.pm 510
Bio/DB/Query/HIVQuery.pm 75
Bio/DB/Query/WebQuery.pm 11
Bio/DB/QueryI.pm 11
Bio/DB/RandomAccessI.pm 11
Bio/DB/RefSeq.pm 11
Bio/DB/ReferenceI.pm 11
Bio/DB/Registry.pm 34
Bio/DB/SeqFeature/Store/DBI/Pg.pm 45
Bio/DB/SeqFeature/Store/DBI/SQLite.pm 1314
Bio/DB/SeqFeature/Store/berkeleydb.pm 67
Bio/DB/SeqFeature/Store.pm 55
Bio/DB/SeqHound.pm 713
Bio/DB/SeqI.pm 11
Bio/DB/SeqVersion/gi.pm 11
Bio/DB/SeqVersion.pm 11
Bio/DB/SwissProt.pm 11
Bio/DB/TFBS/transfac_pro.pm 83166
Bio/DB/TFBS.pm 11
Bio/DB/Taxonomy/entrez.pm 22
Bio/DB/Taxonomy/flatfile.pm 924
Bio/DB/Taxonomy/greengenes.pm 22
Bio/DB/Taxonomy/list.pm 11
Bio/DB/Taxonomy/silva.pm 22
Bio/DB/Taxonomy.pm 11
Bio/DB/Universal.pm 11
Bio/DB/UpdateableSeqI.pm 11
Bio/DB/WebDBSeqI.pm 1521
Bio/DBLinkContainerI.pm 66
Bio/Das/FeatureTypeI.pm 11
Bio/Das/SegmentI.pm 11
Bio/DasI.pm 11
Bio/DescribableI.pm 11
Bio/Draw/Pictogram.pm 11
Bio/Event/EventGeneratorI.pm 11
Bio/Event/EventHandlerI.pm 11
Bio/Factory/AnalysisI.pm 11
Bio/Factory/ApplicationFactoryI.pm 11
Bio/Factory/DriverFactory.pm 11
Bio/Factory/FTLocationFactory.pm 11
Bio/Factory/LocationFactoryI.pm 11
Bio/Factory/MapFactoryI.pm 11
Bio/Factory/ObjectBuilderI.pm 11
Bio/Factory/ObjectFactory.pm 11
Bio/Factory/ObjectFactoryI.pm 11
Bio/Factory/SeqAnalysisParserFactory.pm 11
Bio/Factory/SeqAnalysisParserFactoryI.pm 11
Bio/Factory/SequenceFactoryI.pm 11
Bio/Factory/SequenceProcessorI.pm 11
Bio/Factory/SequenceStreamI.pm 11
Bio/Factory/TreeFactoryI.pm 11
Bio/FeatureHolderI.pm 11
Bio/HandlerBaseI.pm 11
Bio/IdCollectionI.pm 11
Bio/IdentifiableI.pm 11
Bio/Index/Abstract.pm 67
Bio/Index/AbstractSeq.pm 11
Bio/Index/Blast.pm 22
Bio/Index/BlastTable.pm 22
Bio/Index/EMBL.pm 22
Bio/Index/Fasta.pm 22
Bio/Index/Fastq.pm 22
Bio/Index/GenBank.pm 32
Bio/Index/Hmmer.pm 22
Bio/Index/Qual.pm 22
Bio/Index/Stockholm.pm 32
Bio/Index/SwissPfam.pm 22
Bio/Index/Swissprot.pm 22
Bio/LiveSeq/ChainI.pm 11
Bio/LiveSeq/IO/Loader.pm 35
Bio/LiveSeq/Mutation.pm 11
Bio/LiveSeq/Mutator.pm 11
Bio/LiveSeq/SeqI.pm 11
Bio/LocatableSeq.pm 11
Bio/Location/Atomic.pm 11
Bio/Location/AvWithinCoordPolicy.pm 11
Bio/Location/CoordinatePolicyI.pm 11
Bio/Location/Fuzzy.pm 11
Bio/Location/FuzzyLocationI.pm 11
Bio/Location/NarrowestCoordPolicy.pm 11
Bio/Location/Simple.pm 11
Bio/Location/Split.pm 175
Bio/Location/SplitLocationI.pm 11
Bio/Location/WidestCoordPolicy.pm 11
Bio/LocationI.pm 11
Bio/Map/Clone.pm 11
Bio/Map/Contig.pm 11
Bio/Map/CytoMap.pm 11
Bio/Map/CytoMarker.pm 11
Bio/Map/CytoPosition.pm 11
Bio/Map/EntityI.pm 11
Bio/Map/FPCMarker.pm 22
Bio/Map/Gene.pm 11
Bio/Map/GeneMap.pm 11
Bio/Map/GenePosition.pm 11
Bio/Map/GeneRelative.pm 11
Bio/Map/LinkageMap.pm 11
Bio/Map/LinkagePosition.pm 11
Bio/Map/MapI.pm 11
Bio/Map/Mappable.pm 11
Bio/Map/MappableI.pm 11
Bio/Map/Marker.pm 11
Bio/Map/MarkerI.pm 11
Bio/Map/Microsatellite.pm 11
Bio/Map/OrderedPosition.pm 11
Bio/Map/OrderedPositionWithDistance.pm 11
Bio/Map/Physical.pm 35
Bio/Map/Position.pm 11
Bio/Map/PositionHandler.pm 11
Bio/Map/PositionHandlerI.pm 11
Bio/Map/PositionI.pm 11
Bio/Map/PositionWithSequence.pm 11
Bio/Map/Prediction.pm 11
Bio/Map/Relative.pm 11
Bio/Map/RelativeI.pm 11
Bio/Map/SimpleMap.pm 11
Bio/Map/TranscriptionFactor.pm 11
Bio/MapIO/fpc.pm 55
Bio/MapIO/mapmaker.pm 11
Bio/MapIO.pm 11
Bio/Matrix/Generic.pm 11
Bio/Matrix/IO/mlagan.pm 11
Bio/Matrix/IO/phylip.pm 11
Bio/Matrix/IO/scoring.pm 11
Bio/Matrix/IO.pm 22
Bio/Matrix/MatrixI.pm 11
Bio/Matrix/Mlagan.pm 11
Bio/Matrix/PSM/IO/mast.pm 11
Bio/Matrix/PSM/IO/masta.pm 11
Bio/Matrix/PSM/IO/meme.pm 11
Bio/Matrix/PSM/IO/psiblast.pm 11
Bio/Matrix/PSM/IO/transfac.pm 11
Bio/Matrix/PSM/IO.pm 11
Bio/Matrix/PSM/InstanceSite.pm 11
Bio/Matrix/PSM/InstanceSiteI.pm 11
Bio/Matrix/PSM/ProtMatrix.pm 11
Bio/Matrix/PSM/ProtPsm.pm 11
Bio/Matrix/PSM/Psm.pm 11
Bio/Matrix/PSM/PsmHeader.pm 11
Bio/Matrix/PSM/PsmHeaderI.pm 11
Bio/Matrix/PSM/PsmI.pm 11
Bio/Matrix/PSM/SiteMatrix.pm 11
Bio/Matrix/PSM/SiteMatrixI.pm 11
Bio/Matrix/PhylipDist.pm 11
Bio/Matrix/Scoring.pm 11
Bio/MolEvol/CodonModel.pm 11
Bio/Nexml/Factory.pm 11
Bio/NexmlIO.pm 11
Bio/Ontology/DocumentRegistry.pm 11
Bio/Ontology/GOterm.pm 11
Bio/Ontology/InterProTerm.pm 22
Bio/Ontology/OBOEngine.pm 11
Bio/Ontology/OBOterm.pm 11
Bio/Ontology/Ontology.pm 11
Bio/Ontology/OntologyEngineI.pm 11
Bio/Ontology/OntologyI.pm 11
Bio/Ontology/OntologyStore.pm 11
Bio/Ontology/Path.pm 11
Bio/Ontology/PathI.pm 11
Bio/Ontology/Relationship.pm 11
Bio/Ontology/RelationshipFactory.pm 11
Bio/Ontology/RelationshipI.pm 11
Bio/Ontology/RelationshipType.pm 11
Bio/Ontology/SimpleGOEngine/GraphAdaptor.pm 11
Bio/Ontology/SimpleOntologyEngine.pm 11
Bio/Ontology/Term.pm 11
Bio/Ontology/TermFactory.pm 11
Bio/Ontology/TermI.pm 11
Bio/OntologyIO/Handlers/BaseSAXHandler.pm 11
Bio/OntologyIO/Handlers/InterProHandler.pm 11
Bio/OntologyIO/InterProParser.pm 11
Bio/OntologyIO/dagflat.pm 11
Bio/OntologyIO/goflat.pm 11
Bio/OntologyIO/obo.pm 11
Bio/OntologyIO/simplehierarchy.pm 11
Bio/OntologyIO/soflat.pm 11
Bio/OntologyIO.pm 11
Bio/ParameterBaseI.pm 11
Bio/Perl.pm 11
Bio/Phenotype/Correlate.pm 11
Bio/Phenotype/MeSH/Term.pm 11
Bio/Phenotype/MeSH/Twig.pm 11
Bio/Phenotype/Measure.pm 11
Bio/Phenotype/OMIM/MiniMIMentry.pm 11
Bio/Phenotype/OMIM/OMIMentry.pm 11
Bio/Phenotype/OMIM/OMIMentryAllelicVariant.pm 11
Bio/Phenotype/OMIM/OMIMparser.pm 11
Bio/Phenotype/Phenotype.pm 11
Bio/Phenotype/PhenotypeI.pm 11
Bio/PhyloNetwork/GraphViz.pm 33
Bio/PopGen/Genotype.pm 11
Bio/PopGen/GenotypeI.pm 11
Bio/PopGen/HtSNP.pm 11
Bio/PopGen/IO/csv.pm 11
Bio/PopGen/IO/hapmap.pm 11
Bio/PopGen/IO/phase.pm 11
Bio/PopGen/IO/prettybase.pm 11
Bio/PopGen/IO.pm 22
Bio/PopGen/Individual.pm 11
Bio/PopGen/IndividualI.pm 11
Bio/PopGen/Marker.pm 11
Bio/PopGen/MarkerI.pm 11
Bio/PopGen/PopStats.pm 11
Bio/PopGen/Population.pm 11
Bio/PopGen/PopulationI.pm 11
Bio/PopGen/Simulation/Coalescent.pm 11
Bio/PopGen/Simulation/GeneticDrift.pm 11
Bio/PopGen/Statistics.pm 11
Bio/PopGen/TagHaplotype.pm 11
Bio/PopGen/Utilities.pm 11
Bio/PrimarySeq.pm 75
Bio/PrimarySeqI.pm 11
Bio/PullParserI.pm 22
Bio/Range.pm 11
Bio/RangeI.pm 11
Bio/Restriction/Analysis.pm 11
Bio/Restriction/Enzyme/MultiCut.pm 11
Bio/Restriction/Enzyme/MultiSite.pm 11
Bio/Restriction/Enzyme.pm 11
Bio/Restriction/EnzymeCollection.pm 11
Bio/Restriction/EnzymeI.pm 11
Bio/Restriction/IO/bairoch.pm 11
Bio/Restriction/IO/base.pm 11
Bio/Restriction/IO/itype2.pm 11
Bio/Restriction/IO/prototype.pm 11
Bio/Restriction/IO/withrefm.pm 11
Bio/Restriction/IO.pm 11
Bio/Root/Build.pm 156183
Bio/Root/Exception.pm 11479
Bio/Root/HTTPget.pm 11
Bio/Root/IO.pm 567551
Bio/Root/Root.pm 7337
Bio/Root/RootI.pm 164166
Bio/Root/Storable.pm 321272
Bio/Root/Test.pm 9645
Bio/Root/Utilities.pm 296287
Bio/Root/Version.pm 6712
Bio/Search/BlastStatistics.pm 11
Bio/Search/DatabaseI.pm 11
Bio/Search/GenericDatabase.pm 11
Bio/Search/GenericStatistics.pm 11
Bio/Search/HSP/BlastHSP.pm 11
Bio/Search/HSP/BlastPullHSP.pm 11
Bio/Search/HSP/FastaHSP.pm 11
Bio/Search/HSP/GenericHSP.pm 462
Bio/Search/HSP/HMMERHSP.pm 11
Bio/Search/HSP/HSPFactory.pm 11
Bio/Search/HSP/HSPI.pm 11
Bio/Search/HSP/HmmpfamHSP.pm 11
Bio/Search/HSP/ModelHSP.pm 11
Bio/Search/HSP/PSLHSP.pm 11
Bio/Search/HSP/PsiBlastHSP.pm 11
Bio/Search/HSP/PullHSPI.pm 11
Bio/Search/HSP/WABAHSP.pm 11
Bio/Search/Hit/BlastHit.pm 11
Bio/Search/Hit/BlastPullHit.pm 11
Bio/Search/Hit/Fasta.pm 11
Bio/Search/Hit/GenericHit.pm 1118
Bio/Search/Hit/HMMERHit.pm 11
Bio/Search/Hit/HitFactory.pm 11
Bio/Search/Hit/HitI.pm 11
Bio/Search/Hit/HmmpfamHit.pm 11
Bio/Search/Hit/ModelHit.pm 11
Bio/Search/Hit/PsiBlastHit.pm 11
Bio/Search/Hit/PullHitI.pm 11
Bio/Search/Hit/hmmer3Hit.pm 11
Bio/Search/Iteration/GenericIteration.pm 11
Bio/Search/Iteration/IterationI.pm 11
Bio/Search/Processor.pm 11
Bio/Search/Result/BlastPullResult.pm 11
Bio/Search/Result/BlastResult.pm 11
Bio/Search/Result/CrossMatchResult.pm 11
Bio/Search/Result/GenericResult.pm 11
Bio/Search/Result/HMMERResult.pm 11
Bio/Search/Result/HmmpfamResult.pm 11
Bio/Search/Result/PullResultI.pm 11
Bio/Search/Result/ResultFactory.pm 11
Bio/Search/Result/ResultI.pm 11
Bio/Search/Result/WABAResult.pm 11
Bio/Search/Result/hmmer3Result.pm 11
Bio/Search/StatisticsI.pm 11
Bio/Search/Tiling/MapTiling.pm 11
Bio/Search/Tiling/TilingI.pm 11
Bio/SearchDist.pm 11
Bio/SearchIO/EventHandlerI.pm 11
Bio/SearchIO/FastHitEventBuilder.pm 11
Bio/SearchIO/IteratedSearchResultEventBuilder.pm 330101
Bio/SearchIO/SearchResultEventBuilder.pm 81301
Bio/SearchIO/Writer/BSMLResultWriter.pm 11
Bio/SearchIO/Writer/GbrowseGFF.pm 11
Bio/SearchIO/Writer/HSPTableWriter.pm 11
Bio/SearchIO/Writer/HTMLResultWriter.pm 11
Bio/SearchIO/Writer/HitTableWriter.pm 11
Bio/SearchIO/Writer/ResultTableWriter.pm 11
Bio/SearchIO/Writer/TextResultWriter.pm 11
Bio/SearchIO/XML/BlastHandler.pm 11
Bio/SearchIO/XML/PsiBlastHandler.pm 11
Bio/SearchIO/axt.pm 11
Bio/SearchIO/blast.pm 413
Bio/SearchIO/blast_pull.pm 11
Bio/SearchIO/blasttable.pm 11
Bio/SearchIO/blastxml.pm 12
Bio/SearchIO/cross_match.pm 11
Bio/SearchIO/erpin.pm 11
Bio/SearchIO/exonerate.pm 11
Bio/SearchIO/fasta.pm 11
Bio/SearchIO/gmap_f9.pm 11
Bio/SearchIO/hmmer.pm 11
Bio/SearchIO/hmmer2.pm 551386
Bio/SearchIO/hmmer3.pm 233386
Bio/SearchIO/hmmer_pull.pm 11
Bio/SearchIO/infernal.pm 11
Bio/SearchIO/megablast.pm 22
Bio/SearchIO/psl.pm 11
Bio/SearchIO/rnamotif.pm 11
Bio/SearchIO/sim4.pm 11
Bio/SearchIO/waba.pm 11
Bio/SearchIO/wise.pm 11
Bio/SearchIO.pm 22
Bio/Seq/BaseSeqProcessor.pm 11
Bio/Seq/EncodedSeq.pm 11
Bio/Seq/LargeLocatableSeq.pm 11
Bio/Seq/LargePrimarySeq.pm 11
Bio/Seq/LargeSeq.pm 11
Bio/Seq/LargeSeqI.pm 11
Bio/Seq/Meta/Array.pm 11
Bio/Seq/Meta.pm 11
Bio/Seq/MetaI.pm 11
Bio/Seq/PrimaryQual.pm 11
Bio/Seq/PrimedSeq.pm 11
Bio/Seq/QualI.pm 11
Bio/Seq/Quality.pm 11
Bio/Seq/RichSeq.pm 11
Bio/Seq/RichSeqI.pm 11
Bio/Seq/SeqBuilder.pm 11
Bio/Seq/SeqFactory.pm 11
Bio/Seq/SeqFastaSpeedFactory.pm 11
Bio/Seq/SeqWithQuality.pm 11
Bio/Seq/SequenceTrace.pm 11
Bio/Seq/TraceI.pm 11
Bio/Seq.pm 11
Bio/SeqAnalysisParserI.pm 11
Bio/SeqEvolution/DNAPoint.pm 11
Bio/SeqEvolution/EvolutionI.pm 11
Bio/SeqEvolution/Factory.pm 11
Bio/SeqFeature/Amplicon.pm 11
Bio/SeqFeature/AnnotationAdaptor.pm 11
Bio/SeqFeature/Collection.pm 11
Bio/SeqFeature/CollectionI.pm 11
Bio/SeqFeature/Computation.pm 11
Bio/SeqFeature/Gene/Exon.pm 11
Bio/SeqFeature/Gene/ExonI.pm 11
Bio/SeqFeature/Gene/GeneStructure.pm 11
Bio/SeqFeature/Gene/GeneStructureI.pm 11
Bio/SeqFeature/Gene/Intron.pm 11
Bio/SeqFeature/Gene/NC_Feature.pm 11
Bio/SeqFeature/Gene/Poly_A_site.pm 11
Bio/SeqFeature/Gene/Promoter.pm 11
Bio/SeqFeature/Gene/Transcript.pm 11
Bio/SeqFeature/Gene/TranscriptI.pm 11
Bio/SeqFeature/Gene/UTR.pm 11
Bio/SeqFeature/Generic.pm 11
Bio/SeqFeature/Lite.pm 33
Bio/SeqFeature/PositionProxy.pm 11
Bio/SeqFeature/Primer.pm 11
Bio/SeqFeature/SiRNA/Oligo.pm 11
Bio/SeqFeature/SiRNA/Pair.pm 11
Bio/SeqFeature/Similarity.pm 11
Bio/SeqFeature/SimilarityPair.pm 11
Bio/SeqFeature/SubSeq.pm 11
Bio/SeqFeature/Tools/FeatureNamer.pm 11
Bio/SeqFeature/Tools/IDHandler.pm 11
Bio/SeqFeature/Tools/TypeMapper.pm 11
Bio/SeqFeature/Tools/Unflattener.pm 33
Bio/SeqFeature/TypedSeqFeatureI.pm 11
Bio/SeqFeatureI.pm 178242
Bio/SeqI.pm 11
Bio/SeqIO/FTHelper.pm 52
Bio/SeqIO/Handler/GenericRichSeqHandler.pm 11
Bio/SeqIO/MultiFile.pm 9679
Bio/SeqIO/abi.pm 11
Bio/SeqIO/ace.pm 11
Bio/SeqIO/agave.pm 22
Bio/SeqIO/alf.pm 11
Bio/SeqIO/asciitree.pm 11
Bio/SeqIO/bsml.pm 11
Bio/SeqIO/bsml_sax.pm 11
Bio/SeqIO/chadoxml.pm 11
Bio/SeqIO/chaos.pm 11
Bio/SeqIO/chaosxml.pm 11
Bio/SeqIO/ctf.pm 11
Bio/SeqIO/embl.pm 22
Bio/SeqIO/embldriver.pm 11
Bio/SeqIO/entrezgene.pm 1135
Bio/SeqIO/excel.pm 11
Bio/SeqIO/exp.pm 11
Bio/SeqIO/fasta.pm 11
Bio/SeqIO/fastq.pm 11
Bio/SeqIO/flybase_chadoxml.pm 11
Bio/SeqIO/game/featHandler.pm 11
Bio/SeqIO/game/gameHandler.pm 11
Bio/SeqIO/game/gameSubs.pm 11
Bio/SeqIO/game/gameWriter.pm 11
Bio/SeqIO/game/seqHandler.pm 11
Bio/SeqIO/game.pm 11
Bio/SeqIO/gbdriver.pm 11
Bio/SeqIO/gbxml.pm 11
Bio/SeqIO/gcg.pm 11
Bio/SeqIO/genbank.pm 825870
Bio/SeqIO/interpro.pm 11
Bio/SeqIO/kegg.pm 11
Bio/SeqIO/largefasta.pm 11
Bio/SeqIO/lasergene.pm 11
Bio/SeqIO/locuslink.pm 11
Bio/SeqIO/mbsout.pm 11
Bio/SeqIO/metafasta.pm 11
Bio/SeqIO/msout.pm 11
Bio/SeqIO/nexml.pm 11
Bio/SeqIO/phd.pm 11
Bio/SeqIO/pir.pm 11
Bio/SeqIO/pln.pm 11
Bio/SeqIO/qual.pm 11
Bio/SeqIO/raw.pm 11
Bio/SeqIO/scf.pm 11
Bio/SeqIO/seqxml.pm 11
Bio/SeqIO/strider.pm 11
Bio/SeqIO/swiss.pm 11
Bio/SeqIO/swissdriver.pm 11
Bio/SeqIO/tab.pm 11
Bio/SeqIO/table.pm 6458
Bio/SeqIO/tigr.pm 11
Bio/SeqIO/tigrxml.pm 11
Bio/SeqIO/tinyseq/tinyseqHandler.pm 11
Bio/SeqIO/tinyseq.pm 120116
Bio/SeqIO/ztr.pm 11
Bio/SeqIO.pm 5259
Bio/SeqUtils.pm 11
Bio/SimpleAlign.pm 22
Bio/SimpleAnalysisI.pm 11
Bio/Species.pm 35
Bio/Structure/Atom.pm 11
Bio/Structure/Chain.pm 11
Bio/Structure/Entry.pm 11
Bio/Structure/IO/pdb.pm 11
Bio/Structure/IO.pm 22
Bio/Structure/Model.pm 11
Bio/Structure/Residue.pm 11
Bio/Structure/SecStr/DSSP/Res.pm 11
Bio/Structure/SecStr/STRIDE/Res.pm 11
Bio/Structure/StructureI.pm 66
Bio/Symbol/Alphabet.pm 11
Bio/Symbol/AlphabetI.pm 11
Bio/Symbol/DNAAlphabet.pm 11
Bio/Symbol/ProteinAlphabet.pm 11
Bio/Symbol/Symbol.pm 11
Bio/Symbol/SymbolI.pm 11
Bio/Taxon.pm 11
Bio/Taxonomy/Node.pm 11
Bio/Taxonomy.pm 11
Bio/Tools/Alignment/Consed.pm 1221
Bio/Tools/Alignment/Trim.pm 11
Bio/Tools/AmpliconSearch.pm 11
Bio/Tools/Analysis/DNA/ESEfinder.pm 11
Bio/Tools/Analysis/Protein/Domcut.pm 11
Bio/Tools/Analysis/Protein/ELM.pm 11
Bio/Tools/Analysis/Protein/GOR4.pm 11
Bio/Tools/Analysis/Protein/HNN.pm 11
Bio/Tools/Analysis/Protein/Mitoprot.pm 11
Bio/Tools/Analysis/Protein/NetPhos.pm 11
Bio/Tools/Analysis/Protein/Scansite.pm 11
Bio/Tools/Analysis/Protein/Sopma.pm 11
Bio/Tools/Analysis/SimpleAnalysisBase.pm 11
Bio/Tools/AnalysisResult.pm 11
Bio/Tools/Blat.pm 11
Bio/Tools/CodonTable.pm 11
Bio/Tools/Coil.pm 11
Bio/Tools/ECnumber.pm 11
Bio/Tools/EMBOSS/Palindrome.pm 11
Bio/Tools/EPCR.pm 11
Bio/Tools/ERPIN.pm 11
Bio/Tools/ESTScan.pm 11
Bio/Tools/Eponine.pm 11
Bio/Tools/Est2Genome.pm 11
Bio/Tools/Fgenesh.pm 11
Bio/Tools/FootPrinter.pm 11
Bio/Tools/GFF.pm 22
Bio/Tools/Gel.pm 11
Bio/Tools/Geneid.pm 11
Bio/Tools/Genemark.pm 11
Bio/Tools/Genewise.pm 11
Bio/Tools/Genomewise.pm 11
Bio/Tools/Genscan.pm 11
Bio/Tools/Glimmer.pm 11
Bio/Tools/Grail.pm 11
Bio/Tools/GuessSeqFormat.pm 5046
Bio/Tools/HMMER/Results.pm 11
Bio/Tools/HMMER/Set.pm 11
Bio/Tools/Hmmpfam.pm 11
Bio/Tools/IUPAC.pm 11
Bio/Tools/Infernal.pm 11
Bio/Tools/Lucy.pm 1212
Bio/Tools/MZEF.pm 11
Bio/Tools/Match.pm 11
Bio/Tools/OddCodes.pm 11
Bio/Tools/Phylo/Gerp.pm 11
Bio/Tools/Phylo/Gumby.pm 11
Bio/Tools/Phylo/Molphy/Result.pm 11
Bio/Tools/Phylo/Molphy.pm 11
Bio/Tools/Phylo/PAML/ModelResult.pm 11
Bio/Tools/Phylo/PAML/Result.pm 11
Bio/Tools/Phylo/PAML.pm 411
Bio/Tools/Phylo/Phylip/ProtDist.pm 11
Bio/Tools/Prediction/Exon.pm 11
Bio/Tools/Prediction/Gene.pm 11
Bio/Tools/Primer/Assessor/Base.pm 11
Bio/Tools/Primer/AssessorI.pm 66
Bio/Tools/Primer/Feature.pm 11
Bio/Tools/Primer/Pair.pm 11
Bio/Tools/Primer3.pm 11
Bio/Tools/Prints.pm 11
Bio/Tools/Profile.pm 11
Bio/Tools/Promoterwise.pm 11
Bio/Tools/Pseudowise.pm 11
Bio/Tools/QRNA.pm 11
Bio/Tools/RNAMotif.pm 11
Bio/Tools/RandomDistFunctions.pm 11
Bio/Tools/RepeatMasker.pm 11
Bio/Tools/Run/GenericParameters.pm 11
Bio/Tools/Run/ParametersI.pm 11
Bio/Tools/Run/RemoteBlast.pm 2325
Bio/Tools/Run/StandAloneBlast.pm 11
Bio/Tools/Run/StandAloneNCBIBlast.pm 15
Bio/Tools/Run/StandAloneWUBlast.pm 15
Bio/Tools/Run/WrapperBase/CommandExts.pm 56
Bio/Tools/Run/WrapperBase.pm 11
Bio/Tools/Seg.pm 11
Bio/Tools/SeqPattern.pm 11
Bio/Tools/SeqStats.pm 11
Bio/Tools/SeqWords.pm 11
Bio/Tools/SiRNA/Ruleset/saigo.pm 11
Bio/Tools/SiRNA/Ruleset/tuschl.pm 11
Bio/Tools/SiRNA.pm 11
Bio/Tools/Sigcleave.pm 11
Bio/Tools/Signalp/ExtendedSignalp.pm 11
Bio/Tools/Signalp.pm 11
Bio/Tools/Sim4/Exon.pm 11
Bio/Tools/Sim4/Results.pm 11
Bio/Tools/Spidey/Exon.pm 11
Bio/Tools/Spidey/Results.pm 11
Bio/Tools/TandemRepeatsFinder.pm 11
Bio/Tools/TargetP.pm 11
Bio/Tools/Tmhmm.pm 11
Bio/Tools/dpAlign.pm 11
Bio/Tools/ipcress.pm 44
Bio/Tools/isPcr.pm 11
Bio/Tools/pICalculator.pm 11
Bio/Tools/pSW.pm 11
Bio/Tools/tRNAscanSE.pm 11
Bio/Tree/AlleleNode.pm 11
Bio/Tree/AnnotatableNode.pm 11
Bio/Tree/Compatible.pm 11
Bio/Tree/DistanceFactory.pm 11
Bio/Tree/Draw/Cladogram.pm 22
Bio/Tree/Node.pm 11
Bio/Tree/NodeI.pm 11
Bio/Tree/NodeNHX.pm 11
Bio/Tree/RandomFactory.pm 11
Bio/Tree/Statistics.pm 11
Bio/Tree/Tree.pm 22
Bio/Tree/TreeFunctionsI.pm 22
Bio/Tree/TreeI.pm 11
Bio/TreeIO/NewickParser.pm 29
Bio/TreeIO/TreeEventBuilder.pm 11
Bio/TreeIO/cluster.pm 11
Bio/TreeIO/lintree.pm 11
Bio/TreeIO/newick.pm 11
Bio/TreeIO/nexml.pm 11
Bio/TreeIO/nexus.pm 11
Bio/TreeIO/nhx.pm 11
Bio/TreeIO/pag.pm 11
Bio/TreeIO/phyloxml.pm 11
Bio/TreeIO/svggraph.pm 11
Bio/TreeIO/tabtree.pm 11
Bio/TreeIO.pm 22
Bio/UpdateableSeqI.pm 11
Bio/Variation/AAChange.pm 11
Bio/Variation/AAReverseMutate.pm 11
Bio/Variation/Allele.pm 11
Bio/Variation/DNAMutation.pm 11
Bio/Variation/IO/flat.pm 11
Bio/Variation/IO/xml.pm 11
Bio/Variation/IO.pm 11
Bio/Variation/README 11
Bio/Variation/RNAChange.pm 11
Bio/Variation/SNP.pm 11
Bio/Variation/SeqDiff.pm 11
Bio/Variation/VariantI.pm 11
Bio/WebAgent.pm 11
BioPerl.pm 11
Build.PL 523
Changes 594
INSTALL 3520
INSTALL.WIN 113115
MANIFEST 1010
META.json 43311
META.yml 452526
README 22
README.md 22
doc/Deobfuscator/bin/deob_index.pl 22
doc/Deobfuscator/cgi-bin/deob_help.html 11
doc/Deobfuscator/cgi-bin/deob_interface.cgi 55
examples/contributed/rebase2list.pl 43
examples/db/rfetch.pl 23
examples/make_primers.pl 33
examples/root/lib/TestObject.pm 33
examples/subsequence.cgi 33
examples/tools/extract_genes.pl 35
examples/tools/run_primer3.pl 11
ide/bioperl-mode/site-lisp/bioperl-skel.el 11
ide/bioperl.komodo 11
maintenance/authors.pl 2730
maintenance/check_NAME.pl 11
maintenance/check_URLs.pl 22
maintenance/cvs2cl_by_file.pl 2627
maintenance/dependencies.pl 33
maintenance/deprecated.pl 54
maintenance/find_mod_deps.pl 22
maintenance/modules.pl 107
maintenance/pod.pl 11
maintenance/symlink_script.pl 11
scripts/Bio-DB-GFF/bp_genbank2gff.pl 56
scripts/Bio-DB-GFF/bp_genbank2gff3.pl 22
scripts/Bio-DB-GFF/bp_process_gadfly.pl 711
scripts/DB/bp_flanks.pl 11
scripts/DB-HIV/bp_hivq.pl 11
scripts/das/bp_das_server.pl 33
scripts/index/bp_fetch.pl 11
scripts/index/bp_index.pl 11
scripts/popgen/bp_composite_LD.pl 41
scripts/searchio/bp_fastam9_to_table.pl 11
scripts/searchio/bp_filter_search.pl 11
scripts/searchio/bp_hmmer_to_table.pl 11
scripts/searchio/bp_parse_hmmsearch.pl 44
scripts/searchio/bp_search2table.pl 22
scripts/seq/bp_extract_feature_seq.pl 11
scripts/seq/bp_seqconvert.pl 11
scripts/seq/bp_seqcut.pl 11
scripts/seq/bp_seqpart.pl 11
scripts/seq/bp_seqretsplit.pl 11
scripts/seq/bp_split_seq.pl 45
scripts/seq/bp_translate_seq.pl 11
scripts/seq/bp_unflatten_seq.pl 11
scripts/seqstats/bp_aacomp.pl 11
scripts/seqstats/bp_chaos_plot.pl 55
scripts/seqstats/bp_gccalc.pl 11
scripts/seqstats/bp_oligo_count.pl 79
scripts/taxa/bp_taxid4species.pl 11
scripts/tree/bp_blast2tree.pl 66
scripts/utilities/bp_dbsplit.pl 11
scripts/utilities/bp_download_query_genbank.pl 1011
scripts/utilities/bp_mutate.pl 11
scripts/utilities/bp_netinstall.pl 2121
scripts/utilities/bp_pairwise_kaks.pl 11
scripts/utilities/bp_remote_blast.pl 11
scripts/utilities/bp_revtrans-motif.pl 11
scripts/utilities/bp_search2tribe.pl 11
scripts/utilities/bp_seq_length.pl 11
t/Align/AlignStats.t 22
t/Align/SimpleAlign.t 33
t/AlignIO/AlignIO.t 34
t/AlignIO/arp.t 22
t/AlignIO/clustalw.t 33
t/AlignIO/mega.t 11
t/AlignIO/po.t 11
t/Annotation/Annotation.t 12
t/Assembly/ContigSpectrum.t 44
t/Assembly/core.t 3857
t/ClusterIO/SequenceFamily.t 12
t/Coordinate/CoordinateBoundaryTest.t 43
t/Coordinate/CoordinateGraph.t 2017
t/Coordinate/CoordinateMapper.t 7774
t/Coordinate/GeneCoordinateMapper.t 7976
t/LocalDB/Fasta.t 1159
t/LocalDB/Index/Blast.t 26
t/LocalDB/Index/BlastTable.t 12
t/LocalDB/Index/Index.t 213
t/LocalDB/SeqFeature.t 12
t/LocalDB/transfac_pro.t 12
t/Map/Physical.t 63
t/Ontology/IO/interpro.t 3836
t/RemoteDB/BioFetch.t 9799
t/RemoteDB/HIV/HIVAnnotProcessor.t 63
t/RemoteDB/HIV/HIVQuery.t 36
t/RemoteDB/MeSH.t 11
t/RemoteDB/SwissProt.t 2626
t/RemoteDB/Taxonomy.t 33
t/Root/Exception.t 2020
t/Root/HTTPget.t 11
t/Root/IO.t 0424
t/Root/RootI.t 8795
t/Root/RootIO.t 2700
t/Root/Storable.t 55
t/Root/Tempfile.t 800
t/Root/Utilities.t 511
t/SearchIO/blast.t 446
t/SearchIO/hmmer.t 1521026
t/SearchIO/infernal.t 43
t/Seq/MetaSeq.t 76
t/Seq/PrimarySeq.t 124
t/SeqFeature/Collection.t 33
t/SeqFeature/Location.t 111
t/SeqFeature/Unflattener.t 102216
t/SeqFeature/Unflattener2.t 1670
t/SeqIO/Handler.t 78
t/SeqIO/MultiFile.t 1625
t/SeqIO/SeqIO.t 2762
t/SeqIO/Splicedseq.t 2253
t/SeqIO/ace.t 3027
t/SeqIO/chaos.t 87
t/SeqIO/embl.t 44
t/SeqIO/entrezgene.t 824
t/SeqIO/fasta.t 24
t/SeqIO/gcg.t 35
t/SeqIO/genbank.t 195196
t/SeqIO/largefasta.t 11
t/SeqIO/mbsout.t 1712
t/SeqIO/msout.t 53
t/SeqIO/raw.t 34
t/SeqIO/swiss.t 55
t/SeqIO/tinyseq.t 1414
t/SeqTools/GuessSeqFormat.t 9598
t/SeqTools/SeqUtils.t 7267
t/Species.t 20
t/Tools/Alignment/Consed.t 21
t/Tools/Analysis/Protein/ELM.t 1112
t/Tools/Analysis/Protein/Scansite.t 79
t/Tools/Genewise.t 43
t/Tools/Genomewise.t 22
t/Tools/GuessSeqFormat.t 180
t/Tools/Run/Dummy/Config.pm 11
t/Tools/Run/RemoteBlast.t 134141
t/Tools/Run/RemoteBlast_rpsblast.t 5961
t/Tools/Run/WBCommandExts.t 22
t/Tools/Run/WrapperBase.t 11
t/Tree/PhyloNetwork/RandomFactory.t 10
t/Tree/TreeIO/newick.t 311
t/Tree/TreeIO/nhx.t 44
t/Variation/Variation_IO.t 86
t/data/U71225.gb.mac 01
t/data/amphora.newick 01
t/data/bl2seq+.blastn 078
t/data/entrezgene_bug3453.dat 06855
t/data/hemoglobinA.meg 330
t/data/hmmpfam.out 33
t/data/hmmscan.out 050
t/data/hmmsearch3_multi.out 0211
t/data/test.mase 2980
t/data/test.pfam 380
t/data/testaln.aln 660
t/data/testaln.clustalw 066
t/data/testaln.mega 033
874 files changed (This is a version diff) 1005923387
@@ -3,7 +3,7 @@
 Known Bugs
 
 Bugs are tracked at this URL:
-https://redmine.open-bio.org/projects/bioperl/
+https://github.com/bioperl/bioperl-live/issues
 
 Bioperl 1.6 series
 =============
@@ -11,7 +11,7 @@ Bioperl 1.6 series
 Though a stable release, some bugs and enhancements remain for this series
 that will be addressed in future point releases. For a full list please see:
 
-https://redmine.open-bio.org/projects/bioperl/
+https://github.com/bioperl/bioperl-live/issues
 
 Bug     Summary (additional info)
 
@@ -70,7 +70,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -313,7 +313,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -278,24 +278,24 @@ $self->_domain_label();
  
 if($self->{output})
 {
-  open(OUTPUT, ">$self->{output}");
-  binmode OUTPUT;
+  open my $OUTPUT, '>', $self->{output} or die "Could not read file '$self->{output}': $!\n";
+  binmode $OUTPUT;
   
 	if(defined($self->{out_format}))
 	{
 		SWITCH: {
-		if($self->{out_format} eq "png") {print OUTPUT $self->{image}->png; last SWITCH;}
-		if($self->{out_format} eq "jpeg") {print OUTPUT $self->{image}->jpeg; last SWITCH;}
-		if($self->{out_format} eq "gif") {print OUTPUT $self->{image}->gif; last SWITCH;}
-		if($self->{out_format} eq "gd") {print OUTPUT $self->{image}->gd; last SWITCH;}
+		if($self->{out_format} eq "png")  {print $OUTPUT $self->{image}->png;  last SWITCH;}
+		if($self->{out_format} eq "jpeg") {print $OUTPUT $self->{image}->jpeg; last SWITCH;}
+		if($self->{out_format} eq "gif")  {print $OUTPUT $self->{image}->gif;  last SWITCH;}
+		if($self->{out_format} eq "gd")   {print $OUTPUT $self->{image}->gd;   last SWITCH;}
 		}
 
 	}else
 	{
-	 print OUTPUT $self->{image}->png;
+	 print $OUTPUT $self->{image}->png;
 	}
   
-  close OUTPUT;
+  close $OUTPUT;
 }else
  {
 	binmode STDOUT;
@@ -303,10 +303,10 @@ if($self->{output})
 	if(defined($self->{out_format}))
 	{
 		SWITCH: {
-		if($self->{out_format} eq "png") {print STDOUT $self->{image}->png; last SWITCH;}
+		if($self->{out_format} eq "png")  {print STDOUT $self->{image}->png;  last SWITCH;}
 		if($self->{out_format} eq "jpeg") {print STDOUT $self->{image}->jpeg; last SWITCH;}
-		if($self->{out_format} eq "gif") {print STDOUT $self->{image}->gif; last SWITCH;}
-		if($self->{out_format} eq "gd") {print STDOUT $self->{image}->gd; last SWITCH;}
+		if($self->{out_format} eq "gif")  {print STDOUT $self->{image}->gif;  last SWITCH;}
+		if($self->{out_format} eq "gd")   {print STDOUT $self->{image}->gd;   last SWITCH;}
 		}
 
 	}else
@@ -58,7 +58,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -68,7 +68,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -51,7 +51,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -91,7 +91,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -119,6 +119,7 @@ sub build_alignment {
     if (defined $param->{-seqs}) {
         return Bio::SimpleAlign->new(%$param, -source => $self->format);
     }
+    return;
 }
 
 sub annotation_collection {
@@ -562,7 +563,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Chris Fields
 
@@ -77,7 +77,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHORS
 
@@ -87,7 +87,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Peter Schattner
 
@@ -54,7 +54,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHORS - Peter Schattner
 
@@ -59,7 +59,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -41,7 +41,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHORS
 
@@ -163,6 +163,7 @@ sub next_aln {
 
     # no sequences means empty alignment (possible EOF)
     return $aln if $aln->num_sequences;
+    return;
 }
 
 
@@ -53,7 +53,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHORS - Albert Vilella, Heikki Lehvaslaiho
 
@@ -64,7 +64,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHORS - Allen Day
 
@@ -46,7 +46,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHORS - Peter Schattner
 
@@ -59,7 +59,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -59,7 +59,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHORS - Benjamin Berman
 
@@ -114,7 +114,6 @@ sub next_aln {
             if ( $line =~ /^\s*MEME\s+version\s+(\S+)/ ) {
                 $self->{'meme_vers'} = $1;
                 my ($vers) = $self->{'meme_vers'} =~ /^(\d)/;
-
                 $self->throw($MEME_VERS_ERR) unless ( $vers >= 3 );
                 $self->{'seen_header'} = 1;
             }
@@ -190,7 +189,7 @@ sub next_aln {
         }
         else {
             $self->warn("Unrecognized format:\n$line");
-            return 0;
+            return;
         }
     }
 
@@ -58,7 +58,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Heikki Lehvaslaiho
 
@@ -45,7 +45,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHORS - Peter Schattner
 
@@ -119,11 +119,7 @@ sub next_aln {
 	};
     }
 
-    # return 0 if scalar @names < 1;
-    if (scalar(@names) < 1) {
-	undef $aln;
-	return $aln;
-    }
+    return if @names < 1;
 
     # now got this as a name - sequence hash. Let's make some sequences!
 
@@ -38,7 +38,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHORS
 
@@ -49,7 +49,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHORS - Heikki Lehvaslaiho
 
@@ -292,7 +292,7 @@ sub next_aln {
 	}
     }
     
-    return 0 if @names < 1;
+    return if @names < 1;
     
     # sequence creation
     $count = 0;
@@ -46,7 +46,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHORS - Peter Schattner
 
@@ -71,7 +71,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHORS - Heikki Lehvaslaiho and Jason Stajich
 
@@ -190,7 +190,8 @@ sub next_aln {
             return;
         }
     }
-
+    return unless $seqcount and $residuecount;
+    
     # First alignment section. We expect to see a name and (part of) a sequence.
     my $idlen = $self->idlength;
     $count = 0;
@@ -46,7 +46,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHORS - Matthew Betts
 
@@ -56,7 +56,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHORS - Albert Vilella
 
@@ -46,7 +46,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHORS - Peter Schattner
 
@@ -51,7 +51,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -129,7 +129,7 @@ sub next_aln {
 	$aln->add_seq($seq);
     }
     return $aln if defined $aln && $aln->num_sequences;
-	return $aln;
+	return;
 }
 
 =head2 write_aln
@@ -55,7 +55,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHORS - Peter Schattner
 
@@ -198,7 +198,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHORS - Chris Fields, Peter Schattner
 
@@ -49,7 +49,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHORS
 
@@ -36,10 +36,10 @@ Bio::AlignIO - Handler for AlignIO Formats
 
     use Bio::AlignIO;
 
-    open MYIN,"testaln.fasta";
+    open MYIN, '<', 'testaln.fasta' or die "Could not read file 'testaln.fasta': $!\n";
     $in  = Bio::AlignIO->newFh(-fh     => \*MYIN,
                                -format => 'fasta');
-    open my $MYOUT, '>', 'testaln.pfam';
+    open my $MYOUT, '>', 'testaln.pfam' or die "Could not write file 'testaln.pfam': $!\n";
     $out = Bio::AlignIO->newFh(-fh     =>  $MYOUT,
                                -format => 'pfam');
 
@@ -254,7 +254,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Peter Schattner
 
@@ -507,7 +507,7 @@ sub TIEHANDLE {
 
 sub READLINE {
   my $self = shift;
-  return $self->{'alignio'}->next_aln() unless wantarray;
+  return $self->{'alignio'}->next_aln() || undef unless wantarray;
   my (@list,$obj);
   push @list,$obj  while $obj = $self->{'alignio'}->next_aln();
   return @list;
@@ -55,7 +55,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -108,7 +108,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Steve Chervitz, Jason Stajich, Hilmar Lapp
 
@@ -68,7 +68,7 @@ with code and data examples if at all possible.
 Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Steve Chervitz, Hilmar Lapp
 
@@ -62,7 +62,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -72,7 +72,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Hilmar Lapp
 
@@ -66,7 +66,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Ewan Birney
 
@@ -85,7 +85,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Hilmar Lapp
 
@@ -57,7 +57,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR  - Mira Han
 
@@ -56,7 +56,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR  - Ewan Birney 
 
@@ -65,7 +65,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via
 or the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Hilmar Lapp
 
@@ -99,7 +99,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via
 or the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR 
 
@@ -60,7 +60,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.
 Bug reports can be submitted via the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Ewan Birney
 
@@ -112,7 +112,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Ewan Birney
 
@@ -1,4 +1,3 @@
-
 #
 # BioPerl module for Bio::AnnotationI
 #
@@ -31,7 +30,6 @@ Bio::AnnotationI - Annotation interface
        }
    }
 
-
 =head1 DESCRIPTION
 
 Interface all annotations must support. There are two things that each
@@ -46,30 +44,28 @@ store/represent the annotation.
 
 The second method allows annotations to at least attempt to represent
 themselves as pure data for storage/display/whatever. The method
-hash_tree
+hash_tree should return an anonymous hash with "XML-like" formatting:
 
    $hash = $annotation->hash_tree();
 
-should return an anonymous hash with "XML-like" formatting. The
-formatting is as follows.
+The formatting is as follows.
 
   (1) For each key in the hash, if the value is a reference'd array -
 
-      (2) For each element of the array if the value is a object -
+  (2) For each element of the array if the value is a object -
           Assume the object has the method "hash_tree";
-      (3) else if the value is a referene to a hash
+  (3) else if the value is a reference to a hash
           Recurse again from point (1)
-      (4) else
-          Assumme the value is a scalar, and handle it directly as text
-
-   (5) else (if not an array) apply rules 2,3 and 4 to value
+  (4) else
+          Assume the value is a scalar, and handle it directly as text
+  (5) else (if not an array) apply rules 2,3 and 4 to value
 
 The XML path in tags is represented by the keys taken in the
 hashes. When arrays are encountered they are all present in the path
 level of this tag
 
 This is a pretty "natural" representation of an object tree in an XML
-style, without forcing everything to inheriet off some super-generic
+style, without forcing everything to inherit off some super-generic
 interface for representing things in the hash.
 
 =head1 FEEDBACK
@@ -100,7 +96,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Ewan Birney
 
@@ -121,11 +117,8 @@ use strict;
 
 # Object preamble - inherits from Bio::Root::Root
 
-
-
 use base qw(Bio::Root::RootI);
 
-
 =head2 as_text
 
  Title   : as_text
@@ -178,7 +171,6 @@ sub display_text {
  Returns : a hash reference
  Args    : none
 
-
 =cut
 
 sub hash_tree{
@@ -201,7 +201,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Robson Francisco de Souza
 
@@ -65,7 +65,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Robson Francisco de Souza
 
@@ -136,7 +136,7 @@ with code and data examples if at all possible.
 Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Robson Francisco de Souza
 
@@ -85,7 +85,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Dan Kortschak
 
@@ -185,7 +185,7 @@ sub _bowtie_to_sam {
     if ($file =~ m/\.gz[^.]*$/) {
         $file = $self->_uncompress($file);
         $self->close;
-        open (my $fh,$file);
+        open my $fh, '<', $file or $self->throw("Could not read file '$file': $!");
         $self->file($file);
         $self->_fh($fh);
     }
@@ -279,8 +279,8 @@ sub _bowtie_to_sam {
     print $samh $PG;
     
     # print alignments
-    open($sam_tmp_h, $sam_tmp_f) or
-        $self->throw("Can not open '$sam_tmp_f' for reading: $!");
+    open $sam_tmp_h, '<', $sam_tmp_f or
+        $self->throw("Could not read file '$sam_tmp_f': $!");
 
     print $samh $_ while (<$sam_tmp_h>);
     
@@ -117,7 +117,7 @@ the bugs and their resolution. Bug reports can be submitted via email
 or the web:
 
   bioperl-bugs@bio.perl.org
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Mark A. Jensen
 
@@ -139,7 +139,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 
 =head1 AUTHOR - Robson Francisco de Souza
@@ -146,7 +146,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Mark A. Jensen
 
@@ -212,7 +212,7 @@ the bugs and their resolution. Bug reports can be submitted via email
 or the web:
 
   bioperl-bugs@bio.perl.org
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Florent E Angly
 
@@ -69,7 +69,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -385,7 +385,7 @@ sub TIEHANDLE {
 
 sub READLINE {
     my $self = shift;
-    return $self->{'seqio'}->next_seq() unless wantarray;
+    return $self->{'seqio'}->next_seq() || undef unless wantarray;
     my (@list, $obj);
     push @list, $obj while $obj = $self->{'seqio'}->next_seq();
     return @list;
@@ -60,7 +60,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Robson Francisco de Souza
 
@@ -52,7 +52,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Robson Francisco de Souza
 
@@ -70,7 +70,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Chad S. Matsalla
 
@@ -188,7 +188,7 @@ the bugs and their resolution. Bug reports can be submitted via email
 or the web:
 
   bioperl-bugs@bio.perl.org
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Florent E Angly
 
@@ -2050,7 +2050,7 @@ sub _draw_graph {
     }
     $viz->add_edge($id1 => $id2, label => $edge_val);
   }
-  open my $fh, '>', $outfile or die "Error: Could not write file '$outfile'\n$!\n";
+  open my $fh, '>', $outfile or $self->throw("Error: Could not write file '$outfile': $!");
   print $fh $viz->as_png;
   close $fh;
   return 1;
@@ -71,7 +71,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Hilmar Lapp
 
@@ -59,7 +59,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Shawn Hoon
 
@@ -1,7 +1,7 @@
 #
 # BioPerl module for Bio::Cluster::SequenceFamily
 #
-# Please direct questions and support issues to <bioperl-l@bioperl.org> 
+# Please direct questions and support issues to <bioperl-l@bioperl.org>
 #
 # Cared for by Shawn Hoon <shawnh@fugu-sg.org>
 #
@@ -68,15 +68,15 @@ of the Bioperl mailing lists. Your participation is much appreciated.
   bioperl-l@bioperl.org                  - General discussion
   http://bioperl.org/wiki/Mailing_lists  - About the mailing lists
 
-=head2 Support 
+=head2 Support
 
 Please direct usage questions or support issues to the mailing list:
 
 I<bioperl-l@bioperl.org>
 
-rather than to the module maintainer directly. Many experienced and 
-reponsive experts will be able look at the problem and quickly 
-address it. Please include a thorough description of the problem 
+rather than to the module maintainer directly. Many experienced and
+reponsive experts will be able look at the problem and quickly
+address it. Please include a thorough description of the problem
 with code and data examples if at all possible.
 
 =head2 Reporting Bugs
@@ -85,7 +85,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Shawn Hoon
 
@@ -123,22 +123,21 @@ See L<Bio::Cluster::SequenceFamily>.
 =cut
 
 sub new {
-	my ($class,@args) = @_;
-  my $self = $class->SUPER::new(@args);
-  my ($id,$description,$version,$annot_score,
-  $family_score,$members) = $self->_rearrange([qw(FAMILY_ID DESCRIPTION VERSION 
-                                                   ANNOTATION_SCORE 
-                                                   FAMILY_SCORE MEMBERS)],@args);
-  $self->{'_members'} = [];
-  $id && $self->family_id($id);
-  $description && $self->description($description);
-  $version && $self->version($version);
-  $annot_score && $self->annotation_score($annot_score);
-  $family_score && $self->family_score($family_score);
-  $members && $self->add_members($members);
-
-  return $self;
-
+    my ($class,@args) = @_;
+    my $self = $class->SUPER::new(@args);
+    my ($id,$description,$version,$annot_score,
+    $family_score,$members) = $self->_rearrange([qw(FAMILY_ID DESCRIPTION VERSION
+                                                    ANNOTATION_SCORE
+                                                    FAMILY_SCORE MEMBERS)],@args);
+    $self->{'_members'} = [];
+    $id             && $self->family_id($id);
+    $description    && $self->description($description);
+    $version        && $self->version($version);
+    $annot_score    && $self->annotation_score($annot_score);
+    $family_score   && $self->family_score($family_score);
+    $members        && $self->add_members($members);
+
+    return $self;
 }
 
 =head2 version
@@ -146,16 +145,16 @@ sub new {
  Title   : version
  Usage   : $family->version("1.0");
  Function: get/set for version
- Returns : a string version of the family generated. 
+ Returns : a string version of the family generated.
 
 =cut
 
 sub version{
-  my ($self,$value) = @_;
-  if($value){
-    $self->{'_version'} =$value;
-  }
-  return $self->{'_version'};
+    my ($self,$value) = @_;
+    if($value){
+        $self->{'_version'} =$value;
+    }
+    return $self->{'_version'};
 }
 
 =head2 annotation_score
@@ -163,7 +162,7 @@ sub version{
  Title   : annotation_score
  Usage   : $family->annotation_score(100);
  Function: get/set for annotation_score which
-           represent the confidence in which the 
+           represent the confidence in which the
            consensus description has been assigned
            to the family.
  Returns : Bio::SimpleAlign
@@ -173,11 +172,11 @@ See L<Bio::SimpleAlign>
 =cut
 
 sub annotation_score{
-  my ($self,$score) = @_;
-  if($score){
-    $self->{'_annotation_score'} = $score;
-  }
-  return $self->{'_annotation_score'};
+    my ($self,$score) = @_;
+    if($score){
+        $self->{'_annotation_score'} = $score;
+    }
+    return $self->{'_annotation_score'};
 }
 
 =head2 alignment
@@ -193,10 +192,10 @@ See L<Bio::SimpleAlign>
 =cut
 
 sub alignment {
-	my ($self,$align) = @_;
-  if($align){
-    $self->{'_alignment'} = $align;
-  }
+    my ($self,$align) = @_;
+    if($align){
+        $self->{'_alignment'} = $align;
+    }
     return $self->{'_alignment'};
 }
 
@@ -205,7 +204,7 @@ sub alignment {
  Title   : tree
  Usage   : $family->tree($tree);
  Function: get/set for an tree object representing
-           the phylogenetic tree of the family. 
+           the phylogenetic tree of the family.
  Returns : Bio::Tree
 
 See L<Bio::Tree>
@@ -213,11 +212,11 @@ See L<Bio::Tree>
 =cut
 
 sub tree {
-  my ($self,$tree) = @_;
-  if($tree) {
-    $self->{'_tree'} = $tree;
-  }
-  return $self->{'_tree'};
+    my ($self,$tree) = @_;
+    if($tree) {
+        $self->{'_tree'} = $tree;
+    }
+    return $self->{'_tree'};
 }
 
 =head1 L<Bio::Cluster::FamilyI> methods
@@ -246,17 +245,17 @@ sub family_score {
 =head2 family_id
 
  Title   : family_id
- Usage   : $family->family_id("Family_1"); 
- Function: get/set for family id 
+ Usage   : $family->family_id("Family_1");
+ Function: get/set for family id
 
            This is aliased to display_id().
 
- Returns : a string specifying identifier of the family 
+ Returns : a string specifying identifier of the family
 
 =cut
 
 sub family_id{
-	return shift->display_id(@_);
+    return shift->display_id(@_);
 }
 
 =head1 L<Bio::ClusterI> methods
@@ -266,7 +265,7 @@ sub family_id{
 =head2 display_id
 
  Title   : display_id
- Usage   : 
+ Usage   :
  Function: Get/set the display name or identifier for the cluster
  Returns : a string
  Args    : optional, on set the display ID ( a string)
@@ -274,11 +273,11 @@ sub family_id{
 =cut
 
 sub display_id{
-	my ($self,$id) = @_;
-	if($id){
-		$self->{'_cluster_id'} = $id;
-	}
-	return $self->{'_cluster_id'};
+    my ($self,$id) = @_;
+    if($id){
+        $self->{'_cluster_id'} = $id;
+    }
+    return $self->{'_cluster_id'};
 }
 
 =head2 description
@@ -286,17 +285,17 @@ sub display_id{
  Title   : description
  Usage   : $fam->description("POLYUBIQUITIN")
  Function: get/set for the consensus description of the cluster
- Returns : the description string 
- Args    : Optional the description string 
+ Returns : the description string
+ Args    : Optional the description string
 
 =cut
 
 sub description{
-	my ($self,$desc) = @_;
-	if($desc){
-		$self->{'_description'} = $desc;
-	}
-	return $self->{'_description'};
+    my ($self,$desc) = @_;
+    if($desc){
+        $self->{'_description'} = $desc;
+    }
+    return $self->{'_description'};
 }
 
 =head2 get_members
@@ -317,7 +316,7 @@ sub description{
 
  Function: get members using methods from L<Bio::Species>
            the phylogenetic tree of the family.
- Returns : an array of objects that are member of this family. 
+ Returns : an array of objects that are member of this family.
 
 =cut
 
@@ -345,18 +344,16 @@ sub get_members {
 
  Title   : size
  Usage   : $fam->size();
- Function: get/set for the size of the family, 
+ Function: get/set for the size of the family,
            calculated from the number of members
- Returns : the size of the family 
- Args    : 
+ Returns : the size of the family
+ Args    :
 
 =cut
 
 sub size {
-  my ($self) = @_;
-
-  return scalar(@{$self->{'_members'}});
-
+    my ($self) = @_;
+    return scalar(@{$self->{'_members'}});
 }
 
 =head2 cluster_score
@@ -371,11 +368,11 @@ sub size {
 =cut
 
 sub cluster_score{
-  my ($self,$score) = @_;
-  if($score){
-    $self->{'_cluster_score'} = $score;
-  }
-  return $self->{'_cluster_score'};
+    my ($self,$score) = @_;
+    if($score){
+        $self->{'_cluster_score'} = $score;
+    }
+    return $self->{'_cluster_score'};
 }
 
 
@@ -390,7 +387,7 @@ sub cluster_score{
  Title   : add_members
  Usage   : $fam->add_member([$seq1,$seq1]);
  Function: add members to a family
- Returns : 
+ Returns :
  Args    : the member(s) to add, as an array or arrayref
 
 =cut
@@ -414,7 +411,7 @@ sub add_members{
 
  Title   : remove_members
  Usage   : $fam->remove_members();
- Function: remove all members from a family 
+ Function: remove all members from a family
  Returns : the previous array of members
  Args    : none
 
@@ -445,15 +442,15 @@ sub remove_members{
 sub members{
     my $self = shift;
     if(@_) {
-	# this is in set mode
-	$self->warn("setting members() in ".ref($self)." is deprecated.\n".
-		    "Use add_members() instead.");
-	return $self->add_members(@_);
+        # this is in set mode
+        $self->warn("setting members() in ".ref($self)." is deprecated.\n".
+                    "Use add_members() instead.");
+        return $self->add_members(@_);
     } else {
-	# get mode
-	$self->warn("members() in ".ref($self)." is deprecated.\n".
-		    "Use get_members() instead.");
-	return $self->get_members();
+        # get mode
+        $self->warn("members() in ".ref($self)." is deprecated.\n".
+                    "Use get_members() instead.");
+        return $self->get_members();
     }
 }
 
@@ -161,7 +161,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Andrew Macgregor
 
@@ -67,7 +67,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Andrew Macgregor
 
@@ -59,7 +59,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Shawn Hoon
 
@@ -47,7 +47,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -57,7 +57,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHORS - Andrew Macgregor
 
@@ -124,7 +124,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Andrew Macgregor
 
@@ -324,7 +324,7 @@ sub TIEHANDLE {
 
 sub READLINE {
   my $self = shift;
-  return $self->{'seqio'}->next_seq() unless wantarray;
+  return $self->{'seqio'}->next_seq() || undef unless wantarray;
   my (@list, $obj);
   push @list, $obj while $obj = $self->{'seqio'}->next_seq();
   return @list;
@@ -69,7 +69,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHORS
 
@@ -92,7 +92,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHORS
 
@@ -1,19 +1,17 @@
-#
-# bioperl module for Bio::Coordinate::Chain
-#
-# Please direct questions and support issues to <bioperl-l@bioperl.org> 
-#
-# Cared for by Heikki Lehvaslaiho <heikki-at-bioperl-dot-org>
-#
-# Copyright Heikki Lehvaslaiho
-#
-# You may distribute this module under the same terms as perl itself
-
-# POD documentation - main docs before the code
+package Bio::Coordinate::Chain;
+use utf8;
+use strict;
+use warnings;
+use Bio::Root::Root;
+use Bio::Coordinate::Result;
+use parent qw(Bio::Coordinate::Collection Bio::Coordinate::MapperI);
 
-=head1 NAME
+# ABSTRACT: Mapping locations through a chain of coordinate mappers.
+# AUTHOR:   Heikki Lehvaslaiho <heikki@bioperl.org>
+# OWNER:    Heikki Lehvaslaiho
+# LICENSE:  Perl_5
 
-Bio::Coordinate::Chain - Mapping locations through a chain of  coordinate mappers
+# CONTRIBUTOR: Ewan Birney <birney@ebi.ac.uk>
 
 =head1 SYNOPSIS
 
@@ -53,64 +51,8 @@ It would be neat to an internal function that would generate a new
 single step mapper from those included in the chain. It should speed
 things up considerably. Any volunteers?
 
-=head1 FEEDBACK
-
-=head2 Mailing Lists
-
-User feedback is an integral part of the evolution of this and other
-Bioperl modules. Send your comments and suggestions preferably to the
-Bioperl mailing lists  Your participation is much appreciated.
-
-  bioperl-l@bioperl.org                  - General discussion
-  http://bioperl.org/wiki/Mailing_lists  - About the mailing lists
-
-=head2 Support 
-
-Please direct usage questions or support issues to the mailing list:
-
-I<bioperl-l@bioperl.org>
-
-rather than to the module maintainer directly. Many experienced and 
-reponsive experts will be able look at the problem and quickly 
-address it. Please include a thorough description of the problem 
-with code and data examples if at all possible.
-
-=head2 Reporting Bugs
-
-Report bugs to the Bioperl bug tracking system to help us keep track
-the bugs and their resolution.  Bug reports can be submitted via the
-web:
-
-  https://redmine.open-bio.org/projects/bioperl/
-
-=head1 AUTHOR - Heikki Lehvaslaiho
-
-Email:  heikki-at-bioperl-dot-org
-
-=head1 CONTRIBUTORS
-
-Ewan Birney, birney@ebi.ac.uk
-
-=head1 APPENDIX
-
-The rest of the documentation details each of the object
-methods. Internal methods are usually preceded with a _
-
 =cut
 
-
-# Let the code begin...
-
-package Bio::Coordinate::Chain;
-use strict;
-
-# Object preamble - inherits from Bio::Root::Root
-use Bio::Root::Root;
-use Bio::Coordinate::Result;
-
-use base qw(Bio::Coordinate::Collection Bio::Coordinate::MapperI);
-
-
 =head2 map
 
  Title   : map
@@ -126,63 +68,54 @@ sub map {
     my ($self,$value) = @_;
 
     $self->throw("Need to pass me a value.")
-	unless defined $value;
+        unless defined $value;
     $self->throw("I need a Bio::Location, not [$value]")
-	unless $value->isa('Bio::LocationI');
+        unless $value->isa('Bio::LocationI');
     $self->throw("No coordinate mappers!")
-	unless $self->each_mapper;
+        unless $self->each_mapper;
 
     my $res = Bio::Coordinate::Result->new();
 
     foreach my $mapper ($self->each_mapper) {
 
-	my $res = $mapper->map($value);
-	return unless $res->each_match;
-	$value = $res->match;
+        my $res = $mapper->map($value);
+        return unless $res->each_match;
+        $value = $res->match;
     }
 
    return $value;
 }
 
-
 =head2 Inherited methods
 
-=cut
-
 =head2 add_mapper
 
  Title   : add_mapper
  Usage   : $obj->add_mapper($mapper)
  Function: Pushes one Bio::Coodinate::MapperI into the list of mappers.
            Sets _is_sorted() to false.
- Example : 
+ Example :
  Returns : 1 when succeeds, 0 for failure.
  Args    : mapper object
 
-=cut
-
 =head2 mappers
 
  Title   : mappers
  Usage   : $obj->mappers();
  Function: Returns or sets a list of mappers.
- Example : 
+ Example :
  Returns : array of mappers
  Args    : array of mappers
 
-=cut
-
 =head2 each_mapper
 
  Title   : each_mapper
  Usage   : $obj->each_mapper();
  Function: Returns a list of mappers.
- Example : 
+ Example :
  Returns : array of mappers
  Args    : none
 
-=cut
-
 =head2 swap
 
  Title   : swap
@@ -190,9 +123,7 @@ sub map {
  Function: Swap the direction of mapping;input <-> output
  Example :
  Returns : 1
- Args    : 
-
-=cut
+ Args    :
 
 =head2 test
 
@@ -206,7 +137,11 @@ sub map {
 
 =cut
 
+=head2 sort
 
+You do not really want to sort your chain, do you! This function does nothing
+other than a warning.
+=cut
 
 sub sort{
    my ($self) = @_;
@@ -214,4 +149,3 @@ sub sort{
 }
 
 1;
-
@@ -1,19 +1,17 @@
-#
-# bioperl module for Bio::Coordinate::Collection
-#
-# Please direct questions and support issues to <bioperl-l@bioperl.org> 
-#
-# Cared for by Heikki Lehvaslaiho <heikki-at-bioperl-dot-org>
-#
-# Copyright Heikki Lehvaslaiho
-#
-# You may distribute this module under the same terms as perl itself
-
-# POD documentation - main docs before the code
+package Bio::Coordinate::Collection;
+use utf8;
+use strict;
+use warnings;
+use Bio::Coordinate::Result;
+use Bio::Coordinate::Result::Gap;
+use parent qw(Bio::Root::Root Bio::Coordinate::MapperI);
 
-=head1 NAME
+# ABSTRACT: Noncontinuous match between two coordinate sets.
+# AUTHOR:   Heikki Lehvaslaiho <heikki@bioperl.org>
+# OWNER:    Heikki Lehvaslaiho
+# LICENSE:  Perl_5
 
-Bio::Coordinate::Collection - Noncontinuous match between two coordinate sets
+# CONTRIBUTOR: Ewan Birney <birney@ebi.ac.uk>
 
 =head1 SYNOPSIS
 
@@ -52,65 +50,10 @@ To map coordinates to the other direction, you have to swap() the
 collection. Keeping track of the direction and ID restrictions
 are left to the calling code.
 
-
-
-=head1 FEEDBACK
-
-=head2 Mailing Lists
-
-User feedback is an integral part of the evolution of this and other
-Bioperl modules. Send your comments and suggestions preferably to the
-Bioperl mailing lists  Your participation is much appreciated.
-
-  bioperl-l@bioperl.org                  - General discussion
-  http://bioperl.org/wiki/Mailing_lists  - About the mailing lists
-
-=head2 Support 
-
-Please direct usage questions or support issues to the mailing list:
-
-I<bioperl-l@bioperl.org>
-
-rather than to the module maintainer directly. Many experienced and 
-reponsive experts will be able look at the problem and quickly 
-address it. Please include a thorough description of the problem 
-with code and data examples if at all possible.
-
-=head2 Reporting Bugs
-
-report bugs to the Bioperl bug tracking system to help us keep track
-the bugs and their resolution.  Bug reports can be submitted via the
-web:
-
-  https://redmine.open-bio.org/projects/bioperl/
-
-=head1 AUTHOR - Heikki Lehvaslaiho
-
-Email:  heikki-at-bioperl-dot-org
-
-=head1 CONTRIBUTORS
-
-Ewan Birney, birney@ebi.ac.uk
-
-=head1 APPENDIX
-
-The rest of the documentation details each of the object
-methods. Internal methods are usually preceded with a _
-
 =cut
 
-
-# Let the code begin...
-
-package Bio::Coordinate::Collection;
-use strict;
-
-# Object preamble - inherits from Bio::Root::Root
-use Bio::Coordinate::Result;
-use Bio::Coordinate::Result::Gap;
-
-use base qw(Bio::Root::Root Bio::Coordinate::MapperI);
-
+=head2 new
+=cut
 
 sub new {
     my($class,@args) = @_;
@@ -119,13 +62,13 @@ sub new {
     $self->{'_mappers'} = [];
 
     my($in, $out, $strict, $mappers, $return_match) =
-	$self->_rearrange([qw(IN
+        $self->_rearrange([qw(IN
                               OUT
                               STRICT
                               MAPPERS
                               RETURN_MATCH
-			     )],
-			 @args);
+                             )],
+                         @args);
 
     $in  && $self->in($in);
     $out  && $self->out($out);
@@ -134,14 +77,13 @@ sub new {
     return $self; # success - we hope!
 }
 
-
 =head2 add_mapper
 
  Title   : add_mapper
  Usage   : $obj->add_mapper($mapper)
  Function: Pushes one Bio::Coordinate::MapperI into the list of mappers.
            Sets _is_sorted() to false.
- Example : 
+ Example :
  Returns : 1 when succeeds, 0 for failure.
  Args    : mapper object
 
@@ -152,11 +94,11 @@ sub add_mapper {
 
   $self->throw("Is not a Bio::Coordinate::MapperI but a [$self]")
       unless defined $value && $value->isa('Bio::Coordinate::MapperI');
-  
+
   # test pair range lengths
   $self->warn("Coordinates in pair [". $value . ":" .
-	      $value->in->seq_id . "/". $value->out->seq_id .
-	      "] are not right.")
+              $value->in->seq_id . "/". $value->out->seq_id .
+              "] are not right.")
       unless $value->test;
 
   $self->_is_sorted(0);
@@ -168,32 +110,33 @@ sub add_mapper {
  Title   : mappers
  Usage   : $obj->mappers();
  Function: Returns or sets a list of mappers.
- Example : 
+ Example :
  Returns : array of mappers
  Args    : array of mappers
 
 =cut
 
 sub mappers{
-   my ($self,@args) = @_;
-
-   if (@args) {
-
-       $self->throw("Is not a Bio::Coordinate::MapperI but a [$self]")
-	   unless defined $args[0] && $args[0]->isa('Bio::Coordinate::MapperI');
-       push(@{$self->{'_mappers'}}, @args);
-   }
-
-   return @{$self->{'_mappers'}};
+        my ($self,@args) = @_;
+
+        if (@args) {
+                if (@args == 1 && ref $args[0] eq 'ARRAY') {
+                        @args = @{$args[0]};
+                }
+                $self->throw("Is not a Bio::Coordinate::MapperI but a [$self]")
+                        unless defined $args[0] && $args[0]->isa('Bio::Coordinate::MapperI');
+                push(@{$self->{'_mappers'}}, @args);
+        }
+
+        return @{$self->{'_mappers'}};
 }
 
-
 =head2 each_mapper
 
  Title   : each_mapper
  Usage   : $obj->each_mapper();
  Function: Returns a list of mappers.
- Example : 
+ Example :
  Returns : list of mappers
  Args    : none
 
@@ -208,13 +151,12 @@ sub each_mapper{
 
  Title   : mapper_count
  Usage   : my $count = $collection->mapper_count;
- Function: Get the count of the number of mappers stored 
+ Function: Get the count of the number of mappers stored
            in this collection
  Example :
  Returns : integer
  Args    : none
 
-
 =cut
 
 sub mapper_count{
@@ -222,7 +164,6 @@ sub mapper_count{
    return scalar @{$self->{'_mappers'} || []};
 }
 
-
 =head2 swap
 
  Title   : swap
@@ -230,7 +171,7 @@ sub mapper_count{
  Function: Swap the direction of mapping;input <-> output
  Example :
  Returns : 1
- Args    : 
+ Args    :
 
 =cut
 
@@ -264,16 +205,15 @@ sub test {
 
    foreach my $mapper ($self->each_mapper) {
        unless( $mapper->test ) {
-	   $self->warn("Coordinates in pair [". $mapper . ":" .
-		       $mapper->in->seq_id . "/". $mapper->out->seq_id .
-		       "] are not right."); 
-	   $res = 0;
+           $self->warn("Coordinates in pair [". $mapper . ":" .
+                       $mapper->in->seq_id . "/". $mapper->out->seq_id .
+                       "] are not right.");
+           $res = 0;
        }
    }
    $res;
 }
 
-
 =head2 map
 
  Title   : map
@@ -298,7 +238,6 @@ sub map {
 
    $self->sort unless $self->_is_sorted;
 
-
    if ($value->isa("Bio::Location::SplitLocationI")) {
 
        my $result = Bio::Coordinate::Result->new();
@@ -314,10 +253,8 @@ sub map {
        return $self->_map($value);
    }
 
-
 }
 
-
 =head2 _map
 
  Title   : _map
@@ -338,23 +275,23 @@ sub _map {
 
 IDMATCH: {
 
-       # bail out now we if are forcing the use of an ID 
+       # bail out now we if are forcing the use of an ID
        # and it is not in this collection
-       last IDMATCH if defined $value->seq_id && 
-	   ! $self->{'_in_ids'}->{$value->seq_id};
+       last IDMATCH if defined $value->seq_id &&
+           ! $self->{'_in_ids'}->{$value->seq_id};
 
        foreach my $pair ($self->each_mapper) {
 
-	   # if we are limiting input to a certain ID
-	   next if defined $value->seq_id && $value->seq_id ne $pair->in->seq_id;
+           # if we are limiting input to a certain ID
+           next if defined $value->seq_id && $value->seq_id ne $pair->in->seq_id;
 
-	   # if we haven't even reached the start, move on
-	   next if $pair->in->end < $value->start;
-	   # if we have over run, break
-	   last if $pair->in->start > $value->end;
+           # if we haven't even reached the start, move on
+           next if $pair->in->end < $value->start;
+           # if we have over run, break
+           last if $pair->in->start > $value->end;
 
-	   my $subres = $pair->map($value);
-	   $result->add_result($subres);
+           my $subres = $pair->map($value);
+           $result->add_result($subres);
        }
    }
 
@@ -362,10 +299,10 @@ IDMATCH: {
    unless ($result->each_Location) {
        #build one gap;
        my $gap = Bio::Location::Simple->new(-start => $value->start,
-					    -end => $value->end,
-					    -strand => $value->strand,
-					    -location_type => $value->location_type
-					   );
+                                            -end => $value->end,
+                                            -strand => $value->strand,
+                                            -location_type => $value->location_type
+                                           );
        $gap->seq_id($value->seq_id) if defined $value->seq_id;
        bless $gap, 'Bio::Coordinate::Result::Gap';
        $result->seq_id($value->seq_id) if defined $value->seq_id;
@@ -374,7 +311,6 @@ IDMATCH: {
    return $result;
 }
 
-
 =head2 sort
 
  Title   : sort
@@ -383,7 +319,7 @@ IDMATCH: {
            input coordinate start
  Example :
  Returns : 1
- Args    : 
+ Args    :
 
 =cut
 
@@ -392,7 +328,7 @@ sub sort{
 
    @{$self->{'_mappers'}} = map { $_->[0] }
                             sort { $a->[1] <=> $b->[1] }
-                            map { [ $_, $_->in->start] } 
+                            map { [ $_, $_->in->start] }
                             @{$self->{'_mappers'}};
 
    #create hashes for sequence ids
@@ -425,4 +361,3 @@ sub _is_sorted{
 }
 
 1;
-
@@ -1,39 +1,33 @@
-#
-# bioperl module for Bio::Coordinate::ExtrapolatingPair
-#
-# Please direct questions and support issues to <bioperl-l@bioperl.org> 
-#
-# Cared for by Heikki Lehvaslaiho <heikki-at-bioperl-dot-org>
-#
-# Copyright Heikki Lehvaslaiho
-#
-# You may distribute this module under the same terms as perl itself
-
-# POD documentation - main docs before the code
-
-=head1 NAME
+package Bio::Coordinate::ExtrapolatingPair;
+use utf8;
+use strict;
+use warnings;
+use Bio::Root::Root;
+use Bio::LocationI;
+use parent qw(Bio::Coordinate::Pair);
 
-Bio::Coordinate::ExtrapolatingPair - Continuous match between two coordinate sets
+# ABSTRACT: Continuous match between two coordinate sets.
+# AUTHOR:   Heikki Lehvaslaiho <heikki@bioperl.org>
+# OWNER:    Heikki Lehvaslaiho
+# LICENSE:  Perl_5
 
 =head1 SYNOPSIS
 
-
   use Bio::Location::Simple;
   use Bio::Coordinate::ExtrapolatingPair;
 
-
-  $match1 = Bio::Location::Simple->new 
+  $match1 = Bio::Location::Simple->new
     (-seq_id => 'propeptide', -start => 21, -end => 40, -strand=>1 );
   $match2 = Bio::Location::Simple->new
     (-seq_id => 'peptide', -start => 1, -end => 20, -strand=>1 );
 
   $pair = Bio::Coordinate::ExtrapolatingPair->
     new(-in => $match1,
-    	-out => $match2,
-    	-strict => 1
+        -out => $match2,
+        -strict => 1
        );
 
-  $pos = Bio::Location::Simple->new 
+  $pos = Bio::Location::Simple->new
       (-start => 40, -end => 60, -strand=> 1 );
   $res = $pair->map($pos);
   $res->start eq 20;
@@ -55,75 +49,24 @@ the chromosomal coordinate system and extends indefinetely in both
 directions. If you want to define the matching regions exactly, you
 can do that and set strict() to true.
 
-
-=head1 FEEDBACK
-
-=head2 Mailing Lists
-
-User feedback is an integral part of the evolution of this and other
-Bioperl modules. Send your comments and suggestions preferably to the
-Bioperl mailing lists  Your participation is much appreciated.
-
-  bioperl-l@bioperl.org                  - General discussion
-  http://bioperl.org/wiki/Mailing_lists  - About the mailing lists
-
-=head2 Support 
-
-Please direct usage questions or support issues to the mailing list:
-
-I<bioperl-l@bioperl.org>
-
-rather than to the module maintainer directly. Many experienced and 
-reponsive experts will be able look at the problem and quickly 
-address it. Please include a thorough description of the problem 
-with code and data examples if at all possible.
-
-=head2 Reporting Bugs
-
-report bugs to the Bioperl bug tracking system to help us keep track
-the bugs and their resolution.  Bug reports can be submitted via the
-web:
-
-  https://redmine.open-bio.org/projects/bioperl/
-
-=head1 AUTHOR - Heikki Lehvaslaiho
-
-Email:  heikki-at-bioperl-dot-org
-
-=head1 APPENDIX
-
-The rest of the documentation details each of the object
-methods. Internal methods are usually preceded with a _
-
 =cut
 
-
-# Let the code begin...
-
-package Bio::Coordinate::ExtrapolatingPair;
-use strict;
-
-# Object preamble - inherits from Bio::Root::Root
-use Bio::Root::Root;
-use Bio::LocationI;
-
-use base qw(Bio::Coordinate::Pair);
-
+=head2 new
+=cut
 
 sub new {
     my($class,@args) = @_;
     my $self = $class->SUPER::new(@args);
 
     my($strict) =
-	$self->_rearrange([qw(STRICT
-			     )],
-			 @args);
+        $self->_rearrange([qw(STRICT
+                             )],
+                         @args);
 
     $strict  && $self->strict($strict);
     return $self;
 }
 
-
 =head2 strict
 
  Title   : strict
@@ -143,7 +86,6 @@ sub strict {
    return $self->{'_strict'};
 }
 
-
 =head2 map
 
  Title   : map
@@ -190,7 +132,6 @@ sub map {
    }
 }
 
-
 =head2 _map
 
  Title   : _map
@@ -230,11 +171,11 @@ sub _map {
 
    my $match = Bio::Location::Simple->
        new(-start => $start,
-	   -end => $end,
-	   -strand => $self->strand,
-	   -seq_id => $self->out->seq_id,
-	   -location_type => $value->location_type
-	  );
+           -end => $end,
+           -strand => $self->strand,
+           -seq_id => $self->out->seq_id,
+           -location_type => $value->location_type
+          );
    $match->strand($match->strand * $value->strand) if $value->strand;
    bless $match, 'Bio::Coordinate::Result::Match';
 
@@ -1,19 +1,19 @@
-#
-# bioperl module for Bio::Coordinate::GeneMapper
-#
-# Please direct questions and support issues to <bioperl-l@bioperl.org> 
-#
-# Cared for by Heikki Lehvaslaiho <heikki-at-bioperl-dot-org>
-#
-# Copyright Heikki Lehvaslaiho
-#
-# You may distribute this module under the same terms as perl itself
-
-# POD documentation - main docs before the code
-
-=head1 NAME
+package Bio::Coordinate::GeneMapper;
+use utf8;
+use strict;
+use warnings;
+use Bio::Coordinate::Result;
+use Bio::Location::Simple;
+use Bio::Coordinate::Graph;
+use Bio::Coordinate::Collection;
+use Bio::Coordinate::Pair;
+use Bio::Coordinate::ExtrapolatingPair;
+use parent qw(Bio::Root::Root Bio::Coordinate::MapperI);
 
-Bio::Coordinate::GeneMapper - transformations between gene related coordinate systems
+# ABSTRACT: Transformations between gene related coordinate systems.
+# AUTHOR:   Heikki Lehvaslaiho <heikki@bioperl.org>
+# OWNER:    Heikki Lehvaslaiho
+# LICENSE:  Perl_5
 
 =head1 SYNOPSIS
 
@@ -41,7 +41,6 @@ Bio::Coordinate::GeneMapper - transformations between gene related coordinate sy
   # map the location into output coordinates and get a new location object
   $newloc = $gene->map($loc);
 
-
 =head1 DESCRIPTION
 
 Bio::Coordinate::GeneMapper is a module for simplifying the mappings
@@ -81,7 +80,6 @@ between them:
                              |
                             chr (or entry)
 
-
 This structure is kept in the global variable $DAG which is a
 representation of a Directed Acyclic Graph. The path calculations
 traversing this graph are done in a helper class. See
@@ -99,121 +97,73 @@ starts counting backwards from -1 as the last nucleotide in the
 intron. This used when only exon and a few flanking intron nucleotides
 are known.
 
-
 This class models coordinates within one transcript of a gene, so to
 tackle multiple transcripts you need several instances of the
 class. It is therefore valid to argue that the name of the class
 should be TranscriptMapper. GeneMapper is a catchier name, so it
 stuck.
 
-
-=head1 FEEDBACK
-
-=head2 Mailing Lists
-
-User feedback is an integral part of the evolution of this and other
-Bioperl modules. Send your comments and suggestions preferably to the
-Bioperl mailing lists  Your participation is much appreciated.
-
-  bioperl-l@bioperl.org                  - General discussion
-  http://bioperl.org/wiki/Mailing_lists  - About the mailing lists
-
-=head2 Support 
-
-Please direct usage questions or support issues to the mailing list:
-
-I<bioperl-l@bioperl.org>
-
-rather than to the module maintainer directly. Many experienced and 
-reponsive experts will be able look at the problem and quickly 
-address it. Please include a thorough description of the problem 
-with code and data examples if at all possible.
-
-=head2 Reporting Bugs
-
-Report bugs to the Bioperl bug tracking system to help us keep track
-the bugs and their resolution.  Bug reports can be submitted via the
-web:
-
-  https://redmine.open-bio.org/projects/bioperl/
-
-=head1 AUTHOR - Heikki Lehvaslaiho
-
-Email:  heikki-at-bioperl-dot-org
-
-=head1 APPENDIX
-
-The rest of the documentation details each of the object
-methods. Internal methods are usually preceded with a _
-
 =cut
 
-
-# Let the code begin...
-
-package Bio::Coordinate::GeneMapper;
-use vars qw(%COORDINATE_SYSTEMS %COORDINATE_INTS $TRANSLATION $DAG
-            $NOZERO_VALUES $NOZERO_KEYS);
-use strict;
-
-# Object preamble - inherits from Bio::Root::Root
-
-use Bio::Coordinate::Result;
-use Bio::Location::Simple;
-use Bio::Coordinate::Graph;
-use Bio::Coordinate::Collection;
-use Bio::Coordinate::Pair;
-use Bio::Coordinate::ExtrapolatingPair;
-
-use base qw(Bio::Root::Root Bio::Coordinate::MapperI);
-
 # first set internal values for all translation tables
 
-%COORDINATE_SYSTEMS = (
-		       peptide          => 10,
-		       propeptide       => 9,
-		       frame            => 8,
-		       cds              => 7,
-		       negative_intron  => 6,
-		       intron           => 5,
-		       exon             => 4,
-		       inex             => 3,
-		       gene             => 2,
-		       chr              => 1
-		      );
-
-%COORDINATE_INTS = (
-		    10 => 'peptide',
-		    9 => 'propeptide',
-		    8 => 'frame',
-		    7 => 'cds',
-		    6 => 'negative_intron',
-		    5 => 'intron',
-		    4 => 'exon',
-		    3 => 'inex',
-		    2 => 'gene',
-		    1 => 'chr'
-		   );
-
-$TRANSLATION = $COORDINATE_SYSTEMS{'cds'}. "-".
-    $COORDINATE_SYSTEMS{'propeptide'};
-
-$DAG = {
-	10 => [],
-	9  => [10],
-	8  => [],
-	7  => [8, 9],
-	6  => [],
-	5  => [6],
-	4  => [7],
-	3  => [4, 5],
-	2  => [3, 4, 5, 7],
-	1  => [2]
-       };
-
-$NOZERO_VALUES = {0 => 0, 'in' => 1, 'out' => 2, 'in&out' => 3 };
-$NOZERO_KEYS = { 0 => 0, 1 => 'in', 2 => 'out', 3 => 'in&out' };
-
+our %COORDINATE_SYSTEMS = (
+    peptide          => 10,
+    propeptide       => 9,
+    frame            => 8,
+    cds              => 7,
+    negative_intron  => 6,
+    intron           => 5,
+    exon             => 4,
+    inex             => 3,
+    gene             => 2,
+    chr              => 1,
+);
+
+our %COORDINATE_INTS = (
+    10 => 'peptide',
+    9  => 'propeptide',
+    8  => 'frame',
+    7  => 'cds',
+    6  => 'negative_intron',
+    5  => 'intron',
+    4  => 'exon',
+    3  => 'inex',
+    2  => 'gene',
+    1  => 'chr'
+);
+
+our $TRANSLATION = $COORDINATE_SYSTEMS{'cds'}. "-". $COORDINATE_SYSTEMS{'propeptide'};
+
+our $DAG = {
+    10 => [],
+    9  => [10],
+    8  => [],
+    7  => [8, 9],
+    6  => [],
+    5  => [6],
+    4  => [7],
+    3  => [4, 5],
+    2  => [3, 4, 5, 7],
+    1  => [2],
+};
+
+our $NOZERO_VALUES = {
+    0        => 0,
+    'in'     => 1,
+    'out'    => 2,
+    'in&out' => 3,
+};
+
+our $NOZERO_KEYS = {
+    0 => 0,
+    1 => 'in',
+    2 => 'out',
+    3 => 'in&out',
+};
+
+=head2 new
+=cut
 
 sub new {
     my($class,@args) = @_;
@@ -226,15 +176,15 @@ sub new {
 
     my($in, $out, $peptide_offset, $exons,
        $cds, $nozero, $strict) =
-	$self->_rearrange([qw(IN
+        $self->_rearrange([qw(IN
                               OUT
                               PEPTIDE_OFFSET
                               EXONS
                               CDS
                               NOZERO
                               STRICT
-			     )],
-			 @args);
+                             )],
+                         @args);
 
     # direction of mapping when going chr to protein
     $self->{_direction} = 1;
@@ -265,15 +215,14 @@ sub in {
    my ($self,$value) = @_;
    if( defined $value) {
        $self->throw("Not a valid input coordinate system name [$value]\n".
-		    "Valid values are ". join(", ", keys %COORDINATE_SYSTEMS ))
-	   unless defined $COORDINATE_SYSTEMS{$value};
+                    "Valid values are ". join(", ", keys %COORDINATE_SYSTEMS ))
+           unless defined $COORDINATE_SYSTEMS{$value};
 
        $self->{'_in'} = $COORDINATE_SYSTEMS{$value};
    }
    return $COORDINATE_INTS{ $self->{'_in'} };
 }
 
-
 =head2 out
 
  Title   : out
@@ -289,8 +238,8 @@ sub out {
    my ($self,$value) = @_;
    if( defined $value) {
        $self->throw("Not a valid input coordinate system name [$value]\n".
-		    "Valid values are ". join(", ", keys %COORDINATE_SYSTEMS ))
-	   unless defined $COORDINATE_SYSTEMS{$value};
+                    "Valid values are ". join(", ", keys %COORDINATE_SYSTEMS ))
+           unless defined $COORDINATE_SYSTEMS{$value};
 
        $self->{'_out'} = $COORDINATE_SYSTEMS{$value};
    }
@@ -319,7 +268,6 @@ sub strict {
    return $self->{'_strict'} || 0 ;
 }
 
-
 =head2 nozero
 
  Title   : nozero
@@ -339,8 +287,8 @@ sub nozero {
 
    if (defined $value) {
        $self->throw("Not a valid value for nozero [$value]\n".
-		    "Valid values are ". join(", ", keys %{$NOZERO_VALUES} ))
-	   unless defined $NOZERO_VALUES->{$value};
+                    "Valid values are ". join(", ", keys %{$NOZERO_VALUES} ))
+           unless defined $NOZERO_VALUES->{$value};
        $self->{'_nozero'} = $NOZERO_VALUES->{$value};
    }
 
@@ -364,7 +312,7 @@ sub graph {
    my ($self,$value) = @_;
    if( defined $value) {
        $self->throw("Not a valid graph [$value]\n")
-	   unless $value->isa('Bio::Coordinate::Graph');
+           unless $value->isa('Bio::Coordinate::Graph');
        $self->{'_graph'} = $value;
    }
    return $self->{'_graph'};
@@ -385,29 +333,28 @@ sub peptide {
    my ($self, $value) = @_;
    if( defined $value) {
        $self->throw("I need a Bio::LocationI, not  [". $value. "]")
-	   unless $value->isa('Bio::LocationI');
+           unless $value->isa('Bio::LocationI');
 
        $self->throw("Peptide start not defined")
-	   unless defined $value->start;
+           unless defined $value->start;
        $self->{'_peptide_offset'} = $value->start - 1;
 
        $self->throw("Peptide end not defined")
-	   unless defined $value->end;
+           unless defined $value->end;
        $self->{'_peptide_length'} = $value->end - $self->{'_peptide_offset'};
 
-
        my $a = $self->_create_pair
-	   ('propeptide', 'peptide', $self->strict,
-	    $self->{'_peptide_offset'}, $self->{'_peptide_length'} );
+           ('propeptide', 'peptide', $self->strict,
+            $self->{'_peptide_offset'}, $self->{'_peptide_length'} );
        my $mapper =  $COORDINATE_SYSTEMS{'propeptide'}. "-".  $COORDINATE_SYSTEMS{'peptide'};
        $self->{'_mappers'}->{$mapper} = $a;
    }
    return  Bio::Location::Simple->new
        (-seq_id => 'propeptide',
-	-start => $self->{'_peptide_offset'} + 1 ,
-	-end => $self->{'_peptide_length'} + $self->{'_peptide_offset'},
-	-strand => 1,
-	-verbose => $self->verbose,
+        -start => $self->{'_peptide_offset'} + 1 ,
+        -end => $self->{'_peptide_length'} + $self->{'_peptide_offset'},
+        -strand => 1,
+        -verbose => $self->verbose,
        );
 }
 
@@ -425,17 +372,17 @@ sub peptide_offset {
    my ($self,$offset, $len) = @_;
    if( defined $offset) {
        $self->throw("I need an integer, not [$offset]")
-	   unless $offset =~ /^[+-]?\d+$/;
+           unless $offset =~ /^[+-]?\d+$/;
        $self->{'_peptide_offset'} = $offset;
 
        if (defined $len) {
-	   $self->throw("I need an integer, not [$len]")
-	       unless $len =~ /^[+-]?\d+$/;
-	   $self->{'_peptide_length'} = $len;
+           $self->throw("I need an integer, not [$len]")
+               unless $len =~ /^[+-]?\d+$/;
+           $self->{'_peptide_length'} = $len;
        }
 
        my $a = $self->_create_pair
-	   ('propeptide', 'peptide', $self->strict, $offset, $self->{'_peptide_length'} );
+           ('propeptide', 'peptide', $self->strict, $offset, $self->{'_peptide_length'} );
        my $mapper =  $COORDINATE_SYSTEMS{'propeptide'}. "-". $COORDINATE_SYSTEMS{'peptide'};
        $self->{'_mappers'}->{$mapper} = $a;
    }
@@ -452,18 +399,16 @@ sub peptide_offset {
 
 =cut
 
-
 sub peptide_length {
    my ($self, $len) = @_;
    if( defined $len) {
        $self->throw("I need an integer, not [$len]")
-	   if defined $len && $len !~ /^[+-]?\d+$/;
+           if defined $len && $len !~ /^[+-]?\d+$/;
        $self->{'_peptide_length'} = $len;
    }
    return $self->{'_peptide_length'};
 }
 
-
 =head2 exons
 
  Title   : exons
@@ -493,51 +438,51 @@ sub exons {
 
    if(@value) {
        if (ref($value[0]) &&
-	   $value[0]->isa('Bio::SeqFeatureI') and
-	   $value[0]->location->isa('Bio::Location::SplitLocationI')) {
-	   @value = $value[0]->location->each_Location;
+           $value[0]->isa('Bio::SeqFeatureI') and
+           $value[0]->location->isa('Bio::Location::SplitLocationI')) {
+           @value = $value[0]->location->each_Location;
        } else {
-	   $self->throw("I need an array , not [@value]")
-	       unless ref \@value eq 'ARRAY';
-	   $self->throw("I need a reference to an array of Bio::LocationIs, not to [".
-			$value[0]. "]")
-	       unless ref $value[0] and $value[0]->isa('Bio::LocationI');
+           $self->throw("I need an array , not [@value]")
+               unless ref \@value eq 'ARRAY';
+           $self->throw("I need a reference to an array of Bio::LocationIs, not to [".
+                        $value[0]. "]")
+               unless ref $value[0] and $value[0]->isa('Bio::LocationI');
        }
 
        #
        # sort the input array
        #
        # and if the used has not defined CDS assume it is the complete exonic range
-       if (defined $value[0]->strand && 
-	   $value[0]->strand == - 1) {  #reverse strand
-	   @value = map { $_->[0] }
-	            sort { $b->[1] <=> $a->[1] }
-	            map { [ $_, $_->start] }
+       if (defined $value[0]->strand &&
+           $value[0]->strand == - 1) {  #reverse strand
+           @value = map { $_->[0] }
+                    sort { $b->[1] <=> $a->[1] }
+                    map { [ $_, $_->start] }
                     @value;
 
            unless ($self->cds) {
                $self->cds(Bio::Location::Simple->new
-			  (-start   => $value[-1]->start,
-			   -end     => $value[0]->end,
-			   -strand  => $value[0]->strand,
-			   -seq_id  => $value[0]->seq_id,
-			   -verbose => $self->verbose,
-			   )
-			  );
+                          (-start   => $value[-1]->start,
+                           -end     => $value[0]->end,
+                           -strand  => $value[0]->strand,
+                           -seq_id  => $value[0]->seq_id,
+                           -verbose => $self->verbose,
+                           )
+                          );
            }
        } else {               # undef or forward strand
-	   @value = map { $_->[0] }
-	            sort { $a->[1] <=> $b->[1] }
+           @value = map { $_->[0] }
+                    sort { $a->[1] <=> $b->[1] }
                     map { [ $_, $_->start] }
                     @value;
            unless ($self->cds) {
                $self->cds(Bio::Location::Simple->new
-			  (-start   => $value[0]->start,
-			   -end     => $value[-1]->end,
-			   -strand  => $value[0]->strand,
-			   -seq_id  => $value[0]->seq_id,
-			   -verbose => $self->verbose,
-			   )
+                          (-start   => $value[0]->start,
+                           -end     => $value[-1]->end,
+                           -strand  => $value[0]->strand,
+                           -seq_id  => $value[0]->seq_id,
+                           -verbose => $self->verbose,
+                           )
                          );
            }
 
@@ -552,20 +497,20 @@ sub exons {
        my $gene_mapper = "1-2";
        if (defined $self->{'_mappers'}->{$gene_mapper} ) {
 
-	   my $tmp_in = $self->{'_in'};
-	   my $tmp_out = $self->{'_out'};
-	   my $tmp_verb = $self->verbose;
-	   $self->verbose(0);
+           my $tmp_in = $self->{'_in'};
+           my $tmp_out = $self->{'_out'};
+           my $tmp_verb = $self->verbose;
+           $self->verbose(0);
 
-	   $self->in('chr');
-	   $self->out('gene');
-	   @exons = map {$self->map($_) } @value;
+           $self->in('chr');
+           $self->out('gene');
+           @exons = map {$self->map($_) } @value;
 
-	   $self->{'_in'} = ($tmp_in);
-	   $self->{'_out'} = ($tmp_out);
-	   $self->verbose($tmp_verb);
+           $self->{'_in'} = ($tmp_in);
+           $self->{'_out'} = ($tmp_out);
+           $self->verbose($tmp_verb);
        } else {
-	   @exons = @value;
+           @exons = @value;
        }
 
        my $cds_map = Bio::Coordinate::Collection->new;
@@ -581,106 +526,106 @@ sub exons {
        my $prev_exon_end;
 
        for my $exon ( @exons ) {
-	   $exon_counter++;
-
-	   #
-	   # gene -> cds
-	   #
-
-	   my $match1 = Bio::Location::Simple->new
-	       (-seq_id =>'gene' ,
-		-start  => $exon->start,
-		-end    => $exon->end, 
-		-strand => 1,
-		-verbose=> $self->verbose);
-
-	   my $match2 = Bio::Location::Simple->new
-	       (-seq_id => 'cds',
-		-start => $tr_end + 1,
-		-end => $tr_end + $exon->end - $exon->start +1,
-		-strand=>$exon->strand,
-		-verbose=>$self->verbose);
-
-	   $cds_map->add_mapper(Bio::Coordinate::Pair->new
+           $exon_counter++;
+
+           #
+           # gene -> cds
+           #
+
+           my $match1 = Bio::Location::Simple->new
+               (-seq_id =>'gene' ,
+                -start  => $exon->start,
+                -end    => $exon->end,
+                -strand => 1,
+                -verbose=> $self->verbose);
+
+           my $match2 = Bio::Location::Simple->new
+               (-seq_id => 'cds',
+                -start => $tr_end + 1,
+                -end => $tr_end + $exon->end - $exon->start +1,
+                -strand=>$exon->strand,
+                -verbose=>$self->verbose);
+
+           $cds_map->add_mapper(Bio::Coordinate::Pair->new
                                 (-in => $match1,
                                  -out => $match2,
                                 )
                                );
 
-	   if ($exon->start <= 1 and $exon->end >= 1) {
-	       $coffset = $tr_end - $exon->start + 1;
-	   }
-	   $tr_end = $tr_end  + $exon->end - $exon->start + 1;
-
-	   #
-	   # gene -> intron
-	   #
-
-	   if (defined $prev_exon_end) {
-	       my $match3 = Bio::Location::Simple->new
-		   (-seq_id  => 'gene',
-		    -start   => $prev_exon_end + 1,
-		    -end     => $exon->start -1, 
-		    -strand  => $exon->strand,
-		    -verbose => $self->verbose);
-
-	       my $match4 = Bio::Location::Simple->new
-		   (-seq_id  => 'intron'. ($exon_counter -1),
-		    -start   => 1,
-		    -end     => $exon->start - 1 - $prev_exon_end,
-		    -strand  =>$exon->strand,
-		    -verbose => $self->verbose,);
-
-	       # negative intron coordinates
-	       my $match5 = Bio::Location::Simple->new
-		   (-seq_id  => 'intron'. ($exon_counter -1),
-		    -start   => -1 * ($exon->start - 2 - $prev_exon_end) -1,
-		    -end     => -1,
-		    -strand  => $exon->strand,
-		    -verbose => $self->verbose);
-
-	       $inex_map->add_mapper(Bio::Coordinate::Pair->new
+           if ($exon->start <= 1 and $exon->end >= 1) {
+               $coffset = $tr_end - $exon->start + 1;
+           }
+           $tr_end = $tr_end  + $exon->end - $exon->start + 1;
+
+           #
+           # gene -> intron
+           #
+
+           if (defined $prev_exon_end) {
+               my $match3 = Bio::Location::Simple->new
+                   (-seq_id  => 'gene',
+                    -start   => $prev_exon_end + 1,
+                    -end     => $exon->start -1,
+                    -strand  => $exon->strand,
+                    -verbose => $self->verbose);
+
+               my $match4 = Bio::Location::Simple->new
+                   (-seq_id  => 'intron'. ($exon_counter -1),
+                    -start   => 1,
+                    -end     => $exon->start - 1 - $prev_exon_end,
+                    -strand  =>$exon->strand,
+                    -verbose => $self->verbose,);
+
+               # negative intron coordinates
+               my $match5 = Bio::Location::Simple->new
+                   (-seq_id  => 'intron'. ($exon_counter -1),
+                    -start   => -1 * ($exon->start - 2 - $prev_exon_end) -1,
+                    -end     => -1,
+                    -strand  => $exon->strand,
+                    -verbose => $self->verbose);
+
+               $inex_map->add_mapper(Bio::Coordinate::Pair->new
                                      (-in => $match3,
                                       -out => $match4
                                      )
                                     );
-	       $intron_map->add_mapper(Bio::Coordinate::Pair->new
+               $intron_map->add_mapper(Bio::Coordinate::Pair->new
                                        (-in => $self->_clone_loc($match3),
                                         -out => $self->_clone_loc($match4)
                                        )
                                       );
-	       $negative_intron_map->add_mapper(Bio::Coordinate::Pair->new
+               $negative_intron_map->add_mapper(Bio::Coordinate::Pair->new
                                                 (-in => $self->_clone_loc($match4),
                                                  -out => $match5
                                                 ));
 
-	   }
-
-	   # store the value
-	   $prev_exon_end = $exon->end;
-
-	   #
-	   # gene -> exon
-	   #
-	   my $match6 = Bio::Location::Simple->new
-	       (-seq_id => 'exon'. $exon_counter,
-		-start  => 1,
-		-end    => $exon->end - $exon->start +1,
-		-strand => $exon->strand,
-		-verbose=> $self->verbose,);
-
-	   my $pair2 = Bio::Coordinate::Pair->new(-in => $self->_clone_loc($match1),
-						  -out => $match6
-						 );
-	   my $pair3 = Bio::Coordinate::Pair->new(-in => $self->_clone_loc($match6),
-						  -out => $self->_clone_loc($match2)
-						 );
-	   $inex_map->add_mapper(Bio::Coordinate::Pair->new
+           }
+
+           # store the value
+           $prev_exon_end = $exon->end;
+
+           #
+           # gene -> exon
+           #
+           my $match6 = Bio::Location::Simple->new
+               (-seq_id => 'exon'. $exon_counter,
+                -start  => 1,
+                -end    => $exon->end - $exon->start +1,
+                -strand => $exon->strand,
+                -verbose=> $self->verbose,);
+
+           my $pair2 = Bio::Coordinate::Pair->new(-in => $self->_clone_loc($match1),
+                                                  -out => $match6
+                                                 );
+           my $pair3 = Bio::Coordinate::Pair->new(-in => $self->_clone_loc($match6),
+                                                  -out => $self->_clone_loc($match2)
+                                                 );
+           $inex_map->add_mapper(Bio::Coordinate::Pair->new
                                  (-in => $self->_clone_loc($match1),
                                   -out => $match6
                                  )
                                 );
-	   $exon_map->add_mapper(Bio::Coordinate::Pair->new
+           $exon_map->add_mapper(Bio::Coordinate::Pair->new
                                  (-in => $self->_clone_loc($match1),
                                   -out => $self->_clone_loc($match6)
                                  )
@@ -695,10 +640,10 @@ sub exons {
 
        # move coordinate start if exons have negative values
        if ($coffset) {
-	   foreach my $m ($cds_map->each_mapper) {
-	       $m->out->start($m->out->start - $coffset);
-	       $m->out->end($m->out->end - $coffset);
-	   }
+           foreach my $m ($cds_map->each_mapper) {
+               $m->out->start($m->out->start - $coffset);
+               $m->out->end($m->out->end - $coffset);
+           }
 
        }
 
@@ -722,7 +667,6 @@ sub exons {
 
 =cut
 
-
 sub _clone_loc { # clone a simple location
    my ($self,$loc) = @_;
 
@@ -731,7 +675,7 @@ sub _clone_loc { # clone a simple location
 
    return  Bio::Location::Simple->new
        (-verbose       => $self->verbose,
-	-seq_id        => $loc->seq_id,
+        -seq_id        => $loc->seq_id,
         -start         => $loc->start,
         -end           => $loc->end,
         -strand        => $loc->strand,
@@ -739,7 +683,6 @@ sub _clone_loc { # clone a simple location
        );
 }
 
-
 =head2 cds
 
  Title   : cds
@@ -762,39 +705,38 @@ sub cds {
    my ($self,$value) = @_;
    if( defined $value) {
        if ($value =~ /^[+-]?\d+$/ ) {
-	   my $loc = Bio::Location::Simple->new(-start=>$value, -end => $value,
-						-verbose=>$self->verbose);
-	   $self->{'_cds'} = $loc;
+           my $loc = Bio::Location::Simple->new(-start=>$value, -end => $value,
+                                                -verbose=>$self->verbose);
+           $self->{'_cds'} = $loc;
        }
        elsif (ref $value &&  $value->isa('Bio::RangeI') ) {
-	   $self->{'_cds'} = $value;
+           $self->{'_cds'} = $value;
        } else {
-	   $self->throw("I need an integer or Bio::RangeI, not [$value]")
+           $self->throw("I need an integer or Bio::RangeI, not [$value]")
        }
        # strand !!
        my $len;
 
        $len = $self->{'_cds'}->end - $self->{'_cds'}->start +1
-	   if defined $self->{'_cds'}->end;
+           if defined $self->{'_cds'}->end;
 
        my $a = $self->_create_pair
-	   ('chr', 'gene', 0,
-	    $self->{'_cds'}->start-1,
-	    $len,
-	    $self->{'_cds'}->strand);
+           ('chr', 'gene', 0,
+            $self->{'_cds'}->start-1,
+            $len,
+            $self->{'_cds'}->strand);
        my $mapper =  $COORDINATE_SYSTEMS{'chr'}. "-". $COORDINATE_SYSTEMS{'gene'};
        $self->{'_mappers'}->{$mapper} = $a;
 
        # recalculate exon-based mappers
        if ( defined $self->{'_chr_exons'} ) {
-	   $self->exons(@{$self->{'_chr_exons'}});
+           $self->exons(@{$self->{'_chr_exons'}});
        }
 
    }
    return $self->{'_cds'} || 0;
 }
 
-
 =head2 map
 
  Title   : map
@@ -812,80 +754,80 @@ sub map {
    my ($res);
    $self->throw("Need to pass me a Bio::Location::Simple or ".
                 "Bio::Location::Simple or Bio::SeqFeatureI, not [".
-		ref($value). "]")
+                ref($value). "]")
        unless ref($value) && ($value->isa('Bio::Location::Simple') or
                               $value->isa('Bio::Location::SplitLocationI') or
-			      $value->isa('Bio::SeqFeatureI'));
+                              $value->isa('Bio::SeqFeatureI'));
    $self->throw("Input coordinate system not set")
        unless $self->{'_in'};
    $self->throw("Output coordinate system not set")
        unless $self->{'_out'};
    $self->throw("Do not be silly. Input and output coordinate ".
-		"systems are the same!")
+                "systems are the same!")
        unless $self->{'_in'} != $self->{'_out'};
 
    $self->_check_direction();
 
    $value = $value->location if $value->isa('Bio::SeqFeatureI');
    $self->debug( "=== Start location: ". $value->start. ",".
-		 $value->end. " (". ($value->strand || ''). ")\n");
-	       
+                 $value->end. " (". ($value->strand || ''). ")\n");
+
    # if nozero coordinate system is used in the input values
    if ( defined $self->{'_nozero'} &&
-	( $self->{'_nozero'} == 1 || $self->{'_nozero'} == 3 ) ) {
+        ( $self->{'_nozero'} == 1 || $self->{'_nozero'} == 3 ) ) {
        $value->start($value->start + 1)
-	   if defined $value->start && $value->start < 1;
+           if defined $value->start && $value->start < 1;
        $value->end($value->end + 1)
-	   if defined $value->end && $value->end < 1;
+           if defined $value->end && $value->end < 1;
    }
 
    my @steps = $self->_get_path();
    $self->debug( "mapping ". $self->{'_in'}. "->". $self->{'_out'}.
-		 "  Mappers: ". join(", ", @steps). "\n");
-   
+                 "  Mappers: ". join(", ", @steps). "\n");
+
    foreach my $mapper (@steps) {
        if ($mapper eq $TRANSLATION) {
-	   if ($self->direction == 1) {
-
-	       $value = $self->_translate($value);
-	       $self->debug( "+   $TRANSLATION cds -> propeptide (translate) \n");
-	   } else {
-	       $value = $self->_reverse_translate($value);
-	       $self->debug("+   $TRANSLATION propeptide -> cds (reverse translate) \n");
-	   }
+           if ($self->direction == 1) {
+
+               $value = $self->_translate($value);
+               $self->debug( "+   $TRANSLATION cds -> propeptide (translate) \n");
+           } else {
+               $value = $self->_reverse_translate($value);
+               $self->debug("+   $TRANSLATION propeptide -> cds (reverse translate) \n");
+           }
        }
        # keep the start and end values, and go on to next iteration
        #  if this mapper is not set
        elsif ( ! defined $self->{'_mappers'}->{$mapper} ) {
-	   # update mapper name
-	   $mapper =~ /\d+-(\d+)/;   my ($counter) = $1;
-	   $value->seq_id($COORDINATE_INTS{$counter});
-	   $self->debug( "-   $mapper\n");
+           # update mapper name
+           $mapper =~ /\d+-(\d+)/;   my ($counter) = $1;
+           $value->seq_id($COORDINATE_INTS{$counter});
+           $self->debug( "-   $mapper\n");
        } else {
            #
-	   # the DEFAULT : generic mapping
+           # the DEFAULT : generic mapping
            #
-	   
-	   $value = $self->{'_mappers'}->{$mapper}->map($value);
-           
-	   $value->purge_gaps
-	       if ($value && $value->isa('Bio::Location::SplitLocationI') && 
-		   $value->can('gap'));
-	   
-	   $self->debug( "+  $mapper (". $self->direction. "):  start ".
-			 $value->start. " end ". $value->end. "\n")
-	       if $value && $self->verbose > 0;
+
+           $value = $self->{'_mappers'}->{$mapper}->map($value);
+
+           $value->purge_gaps
+               if ($value && $value->isa('Bio::Location::SplitLocationI') &&
+                   $value->can('gap'));
+
+           $self->debug( "+  $mapper (". $self->direction. "):  start ".
+                         $value->start. " end ". $value->end. "\n")
+               if $value && $self->verbose > 0;
        }
    }
 
    # if nozero coordinate system is asked to be used in the output values
    if ( defined $value && defined $self->{'_nozero'} &&
-	( $self->{'_nozero'} == 2 || $self->{'_nozero'} == 3 ) ) {
+        ( $self->{'_nozero'} == 2 || $self->{'_nozero'} == 3 ) ) {
 
        $value->start($value->start - 1)
-	   if defined $value->start && $value->start < 1;
+           if defined $value->start && $value->start < 1;
        $value->end($value->end - 1)
-	   if defined $value->end && $value->end < 1;
+           if defined $value->end && $value->end < 1;
    }
 
    # handle merging of adjacent split locations!
@@ -901,8 +843,8 @@ sub map {
                push @matches, $prevloc;
                next;
            }
-           if ($prevloc->end == ($loc->start - 1) && 
-	       $prevloc->seq_id eq $loc->seq_id) {
+           if ($prevloc->end == ($loc->start - 1) &&
+               $prevloc->seq_id eq $loc->seq_id) {
                $prevloc->end($loc->end);
                $merging = 1;
            } else {
@@ -920,13 +862,13 @@ sub map {
                     -start    => $matches[0]->start,
                     -end      => $matches[0]->end,
                     -strand   => $matches[0]->strand,
-		    -verbose  => $self->verbose,);
+                    -verbose  => $self->verbose,);
            }
            $value = $newvalue;
        }
-   } 
-   elsif (ref $value eq "Bio::Coordinate::Result" && 
-	  $value->each_match == 1 ){
+   }
+   elsif (ref $value eq "Bio::Coordinate::Result" &&
+          $value->each_match == 1 ){
        $value = $value->match;
    }
 
@@ -950,7 +892,6 @@ sub direction {
    return $self->{'_direction'};
 }
 
-
 =head2 swap
 
  Title   : swap
@@ -975,7 +916,6 @@ sub swap {
    return 1;
 }
 
-
 =head2 to_string
 
  Title   : to_string
@@ -1027,7 +967,6 @@ sub to_string {
        $i++;
    }
 
-
    # gene-exon
    $mapper_str = 'gene-exon';
    $mapper = $self->_mapper_string2code($mapper_str);
@@ -1040,7 +979,6 @@ sub to_string {
        $i++;
    }
 
-
    # gene-cds
    $mapper_str = 'gene-cds';
    $mapper = $self->_mapper_string2code($mapper_str);
@@ -1059,15 +997,12 @@ sub to_string {
    printf "\n     %-12s (%s)\n", $mapper_str, $mapper ;
    printf "%9s%-12s\n", "", '"translate"';
 
-
    # propeptide-peptide
    $mapper_str = 'propeptide-peptide';
    $mapper = $self->_mapper_string2code($mapper_str);
    printf "\n     %-12s (%s)\n", $mapper_str, $mapper ;
    printf "%16s%s: %s\n", ' ', "peptide offset", $self->peptide_offset;
 
-
-
    print "\nin : ", $self->in, "\n";
    print "out: ", $self->out, "\n";
    my $dir;
@@ -1078,6 +1013,9 @@ sub to_string {
    1;
 }
 
+=head2 _mapper_code2string
+=cut
+
 sub _mapper_code2string {
     my ($self, $code) = @_;
     my ($a, $b) = $code =~ /(\d+)-(\d+)/;
@@ -1085,13 +1023,15 @@ sub _mapper_code2string {
 
 }
 
+=head2 _mapper_string2code
+=cut
+
 sub _mapper_string2code {
     my ($self, $string) =@_;
     my ($a, $b) = $string =~ /([^-]+)-(.*)/;
     return $COORDINATE_SYSTEMS{$a}. '-'.  $COORDINATE_SYSTEMS{$b};
 }
 
-
 =head2 _create_pair
 
  Title   : _create_pair
@@ -1116,30 +1056,28 @@ sub _create_pair {
 
    my $match1 = Bio::Location::Simple->new
        (-seq_id  => $in,
-	-start   => $offset+1,
-	-end     => $offset+$length, 
-	-strand  => 1,
-	-verbose => $self->verbose);
+        -start   => $offset+1,
+        -end     => $offset+$length,
+        -strand  => 1,
+        -verbose => $self->verbose);
 
    my $match2 = Bio::Location::Simple->new
        (-seq_id  => $out,
-	-start   => 1,
-	-end     => $length, 
-	-strand  => $strand,
-	-verbose => $self->verbose);
+        -start   => 1,
+        -end     => $length,
+        -strand  => $strand,
+        -verbose => $self->verbose);
 
    my $pair = Bio::Coordinate::ExtrapolatingPair->new
        (-in      => $match1,
         -out     => $match2,
         -strict  => $strict,
-	-verbose => $self->verbose,
+        -verbose => $self->verbose,
        );
 
    return $pair;
-
 }
 
-
 =head2 _translate
 
  Title   : _translate
@@ -1161,17 +1099,17 @@ sub _translate {
            ($value->isa('Bio::Location::Simple') || $value->isa('Bio::Location::SplitLocationI'));
 
    my $seqid = 'propeptide';
-   
+
    if ($value->isa("Bio::Location::SplitLocationI") ) {
        my $split = Bio::Location::Split->new(-seq_id=>$seqid);
        foreach my $loc ( $value->each_Location(1) ) {
            my $match = Bio::Location::Simple->new
-	       (-start   => int ($loc->start / 3 ) +1,
-		-end     => int ($loc->end / 3 ) +1,
-		-seq_id  => $seqid,
-		-strand  => 1,
-		-verbose => $self->verbose,
-		);
+               (-start   => int ($loc->start / 3 ) +1,
+                -end     => int ($loc->end / 3 ) +1,
+                -seq_id  => $seqid,
+                -strand  => 1,
+                -verbose => $self->verbose,
+                );
            $split->add_sub_Location($match);
        }
        return $split;
@@ -1181,11 +1119,14 @@ sub _translate {
                                         -end    => int($value->end / 3 )+1,
                                         -seq_id => $seqid,
                                         -strand => 1,
-					-verbose=> $self->verbose,
+                                        -verbose=> $self->verbose,
                                        );
    }
 }
 
+=head2 _frame
+=cut
+
 sub _frame {
    my ($self,$value) = @_;
 
@@ -1201,11 +1142,11 @@ sub _frame {
        foreach my $loc ( $value->each_Location(1) ) {
 
            my $match = Bio::Location::Simple->new
-	       (-start  => ($value->start-1) % 3 +1,
-		-end    => ($value->end-1) % 3 +1,
-		-seq_id => 'frame',
-		-strand => 1,
-		-verbose=> $self->verbose);
+               (-start  => ($value->start-1) % 3 +1,
+                -end    => ($value->end-1) % 3 +1,
+                -seq_id => 'frame',
+                -strand => 1,
+                -verbose=> $self->verbose);
            $split->add_sub_Location($match);
        }
        return $split;
@@ -1214,12 +1155,11 @@ sub _frame {
                                         -end     => ($value->end-1) % 3 +1,
                                         -seq_id  => 'frame',
                                         -strand  => 1,
-					-verbose => $self->verbose,
-					);
+                                        -verbose => $self->verbose,
+                                        );
    }
 }
 
-
 =head2 _reverse_translate
 
  Title   : _reverse_translate
@@ -1237,7 +1177,6 @@ sub _frame {
 sub _reverse_translate {
    my ($self,$value) = @_;
 
-
    $self->throw("Need to pass me a Bio::Location::Simple or ".
                 "Bio::Location::SplitLocationI, not [". ref($value). "]")
        unless defined $value &&
@@ -1250,12 +1189,12 @@ sub _reverse_translate {
        foreach my $loc ( $value->each_Location(1) ) {
 
            my $match = Bio::Location::Simple->new
-	       (-start   => $value->start * 3 - 2,
-		-end     => $value->end * 3,
-		-seq_id  => $seqid,
-		-strand  => 1,
-		-verbose => $self->verbose,
-		);
+               (-start   => $value->start * 3 - 2,
+                -end     => $value->end * 3,
+                -seq_id  => $seqid,
+                -strand  => 1,
+                -verbose => $self->verbose,
+                );
            $split->add_sub_Location($match);
        }
        return $split;
@@ -1265,12 +1204,11 @@ sub _reverse_translate {
                                         -end     => $value->end * 3,
                                         -seq_id  => $seqid,
                                         -strand  => 1,
-					-verbose => $self->verbose,
+                                        -verbose => $self->verbose,
                                        );
    }
 }
 
-
 =head2 _check_direction
 
  Title   : _check_direction
@@ -1297,7 +1235,6 @@ sub _check_direction {
    1;
 }
 
-
 =head2 _get_path
 
  Title   : _get_path
@@ -1335,8 +1272,8 @@ sub _get_path {
        my $mapper;
        my $prev_node = '';
        @mappers =
-	   map { $mapper = "$prev_node-$_"; $prev_node = $_; $mapper; }
-	       $self->{'_graph'}->shortest_path($start, $end);
+           map { $mapper = "$prev_node-$_"; $prev_node = $_; $mapper; }
+               $self->{'_graph'}->shortest_path($start, $end);
        shift @mappers;
 
        $self->{'_previous_path'} = "$start$end";
@@ -1346,6 +1283,4 @@ sub _get_path {
    $reverse ? return reverse @mappers : return @mappers;
 }
 
-
 1;
-
@@ -1,37 +1,31 @@
-#
-# bioperl module for Bio::Coordinate::Graph
-#
-# Please direct questions and support issues to <bioperl-l@bioperl.org> 
-#
-# Cared for by Heikki Lehvaslaiho <heikki-at-bioperl-dot-org>
-#
-# Copyright Heikki Lehvaslaiho
-#
-# You may distribute this module under the same terms as perl itself
-
-# POD documentation - main docs before the code
-
-=head1 NAME
+package Bio::Coordinate::Graph;
+use utf8;
+use strict;
+use warnings;
+use parent qw(Bio::Root::Root);
 
-Bio::Coordinate::Graph - Finds shortest path between nodes in a graph
+# ABSTRACT: Finds shortest path between nodes in a graph.
+# AUTHOR:   Heikki Lehvaslaiho <heikki@bioperl.org>
+# OWNER:    Heikki Lehvaslaiho
+# LICENSE:  Perl_5
 
 =head1 SYNOPSIS
 
   # get a hash of hashes representing the graph. E.g.:
   my $hash= {
-	     '1' => {
-		     '2' => 1
-		    },
-	     '2' => {
-		     '4' => 1,
-		     '3' => 1
-		    },
-	     '3' => undef,
-	     '4' => {
-		     '5' => 1
-		    },
-	     '5' => undef
-	    };
+             '1' => {
+                     '2' => 1
+                    },
+             '2' => {
+                     '4' => 1,
+                     '3' => 1
+                    },
+             '3' => undef,
+             '4' => {
+                     '5' => 1
+                    },
+             '5' => undef
+            };
 
   # create the object;
   my $graph = Bio::Coordinate::Graph->new(-graph => $hash);
@@ -42,7 +36,6 @@ Bio::Coordinate::Graph - Finds shortest path between nodes in a graph
   my @path = $graph->shortest_paths($a);
   print join (", ", @path), "\n";
 
-
 =head1 DESCRIPTION
 
 This class calculates the shortest path between input and output
@@ -71,28 +64,26 @@ account if needed at some later time.
 The graph needs to be primed using a hash of hashes where there is a
 key for each node. The second keys are the names of the downstream
 neighboring nodes and values are the weights for reaching them. Here
-is part of the gene coordiante system graph::
-
+is part of the gene coordiante system graph:
 
     $hash = {
-	     '6' => undef,
-	     '3' => {
-		     '6' => 1
-		    },
-	     '2' => {
-		     '6' => 1,
-		     '4' => 1,
-		     '3' => 1
-		    },
-	     '1' => {
-		     '2' => 1
-		    },
-	     '4' => {
-		     '5' => 1
-		    },
-	     '5' => undef
-	    };
-
+             '6' => undef,
+             '3' => {
+                     '6' => 1
+                    },
+             '2' => {
+                     '6' => 1,
+                     '4' => 1,
+                     '3' => 1
+                    },
+             '1' => {
+                     '2' => 1
+                    },
+             '4' => {
+                     '5' => 1
+                    },
+             '5' => undef
+            };
 
 Note that the names need to be positive integers. Root should be '1'
 and directness of the graph is taken advantage of to speed
@@ -102,69 +93,21 @@ number as name.
 An alternative (shorter) way of describing input is to use hash of
 arrays. See L<Bio::Coordinate::Graph::hash_of_arrays>.
 
-
-=head1 FEEDBACK
-
-=head2 Mailing Lists
-
-User feedback is an integral part of the evolution of this and other
-Bioperl modules. Send your comments and suggestions preferably to the
-Bioperl mailing lists  Your participation is much appreciated.
-
-  bioperl-l@bioperl.org                  - General discussion
-  http://bioperl.org/wiki/Mailing_lists  - About the mailing lists
-
-=head2 Support 
-
-Please direct usage questions or support issues to the mailing list:
-
-I<bioperl-l@bioperl.org>
-
-rather than to the module maintainer directly. Many experienced and 
-reponsive experts will be able look at the problem and quickly 
-address it. Please include a thorough description of the problem 
-with code and data examples if at all possible.
-
-=head2 Reporting Bugs
-
-report bugs to the Bioperl bug tracking system to help us keep track
-the bugs and their resolution.  Bug reports can be submitted via the
-web:
-
-  https://redmine.open-bio.org/projects/bioperl/
-
-=head1 AUTHOR - Heikki Lehvaslaiho
-
-Email:  heikki-at-bioperl-dot-org
-
-=head1 APPENDIX
-
-The rest of the documentation details each of the object
-methods. Internal methods are usually preceded with a _
-
 =cut
 
-
-# Let the code begin...
-
-package Bio::Coordinate::Graph;
-use strict;
-
-# Object preamble - inherits from Bio::Root::Root
-
-use base qw(Bio::Root::Root);
-
+=head2 new
+=cut
 
 sub new {
     my($class,@args) = @_;
     my $self = $class->SUPER::new(@args);
 
     my($graph, $hasharray) =
-	$self->_rearrange([qw(
+        $self->_rearrange([qw(
                               GRAPH
                               HASHARRAY
-			     )],
-			 @args);
+                             )],
+                         @args);
 
     $graph  && $self->graph($graph);
     $hasharray  && $self->hasharray($hasharray);
@@ -172,19 +115,14 @@ sub new {
     $self->{'_root'} = undef;
 
     return $self; # success - we hope!
-
 }
 
-=head2 Graph structure input methods
-
-=cut
-
 =head2 graph
 
  Title   : graph
  Usage   : $obj->graph($my_graph)
  Function: Read/write method for the graph structure
- Example : 
+ Example :
  Returns : hash of hashes grah structure
  Args    : reference to a hash of hashes
 
@@ -196,7 +134,7 @@ sub graph {
 
   if ($value) {
       $self->throw("Need a hash of hashes")
-	  unless  ref($value) eq 'HASH' ;
+          unless  ref($value) eq 'HASH' ;
       $self->{'_dag'} = $value;
 
       # empty the cache
@@ -208,7 +146,6 @@ sub graph {
 
 }
 
-
 =head2 hash_of_arrays
 
  Title   : hash_of_arrays
@@ -221,13 +158,13 @@ sub graph {
  Example : Here is an example of simple structure containing a graph.
 
            my $DAG = {
-	              6  => [],
-	              5  => [],
-	              4  => [5],
-	              3  => [6],
-	              2  => [3, 4, 6],
-	              1  => [2]
-	             };
+                      6  => [],
+                      5  => [],
+                      4  => [5],
+                      3  => [6],
+                      2  => [3, 4, 6],
+                      1  => [2]
+                     };
 
  Returns : hash of hashes graph structure
  Args    : reference to a hash of arrays
@@ -244,13 +181,13 @@ sub hash_of_arrays {
   if ($value) {
 
       $self->throw("Need a hash of hashes")
-	  unless  ref($value) eq 'HASH' ;
+          unless  ref($value) eq 'HASH' ;
 
       #copy the hash of arrays into a hash of hashes;
       my %hash;
       foreach my $start ( keys %{$value}){
-	  $hash{$start} = undef;
-	  map { $hash{$start}{$_} = 1 } @{$value->{$start}};
+          $hash{$start} = undef;
+          map { $hash{$start}{$_} = 1 } @{$value->{$start}};
       }
 
       $self->{'_dag'} = \%hash;
@@ -260,10 +197,6 @@ sub hash_of_arrays {
 
 }
 
-=head2 Methods for determining the shortest path in the graph
-
-=cut
-
 =head2 shortest_path
 
  Title   : shortest_path
@@ -272,34 +205,33 @@ sub hash_of_arrays {
            If the start node remains the same, the method is sometimes
            able to use cached results, otherwise it will recalculate
            the paths.
- Example : 
+ Example :
  Returns : array of node names, only the start node name if no path
  Args    : name of the start node
          : name of the end node
 
 =cut
 
-
 sub shortest_path {
     my ($self, $root, $end) = @_;
 
     $self->throw("Two arguments needed") unless @_ == 3;
     $self->throw("No node name [$root]")
-	unless exists $self->{'_dag'}->{$root};
+        unless exists $self->{'_dag'}->{$root};
     $self->throw("No node name [$end]")
-	unless exists $self->{'_dag'}->{$end};
+        unless exists $self->{'_dag'}->{$end};
 
     my @res;     # results
     my $reverse;
 
     if ($root > $end) {
-	($root, $end) = ($end, $root );
-	$reverse++;
+        ($root, $end) = ($end, $root );
+        $reverse++;
     }
 
     # try to use cached paths
     $self->dijkstra($root) unless
-	defined $self->{'_root'} and $self->{'_root'} eq $root;
+        defined $self->{'_root'} and $self->{'_root'} eq $root;
 
     return @res unless $self->{'_paths'} ;
 
@@ -307,16 +239,15 @@ sub shortest_path {
     my $node = $end;
     my $prev = $self->{'_paths'}->{$end}{'prev'};
     while ($prev) {
-	unshift @res, $node;
-	$node = $self->{'_paths'}->{$node}{'prev'};
-	$prev = $self->{'_paths'}->{$node}{'prev'};
+        unshift @res, $node;
+        $node = $self->{'_paths'}->{$node}{'prev'};
+        $prev = $self->{'_paths'}->{$node}{'prev'};
     }
     unshift @res, $node;
 
     $reverse ? return reverse @res : return @res;
 }
 
-
 =head2 dijkstra
 
  Title   : dijkstra
@@ -325,7 +256,7 @@ sub shortest_path {
            Returns or sets a list of mappers. The returned path
            description is always directed down from the root.
            Called from shortest_path().
- Example : 
+ Example :
  Returns : Reference to a hash of hashes representing a linked list
            which contains shortest path down to all nodes from the start
            node. E.g.:
@@ -345,14 +276,12 @@ sub shortest_path {
 
 =cut
 
-#' keep emacs happy
-
 sub dijkstra {
     my ($self,$root) = @_;
 
     $self->throw("I need the name of the root node input") unless $root;
     $self->throw("No node name [$root]")
-	unless exists $self->{'_dag'}->{$root};
+        unless exists $self->{'_dag'}->{$root};
 
     my %est = ();          # estimate hash
     my %res = ();          # result hash
@@ -363,47 +292,45 @@ sub dijkstra {
     $self->{'_root'} = $root;
 
     foreach my $node ( keys %{$self->{'_dag'}} ){
-	if ($node eq $root) {
-	    $est{$node}{'prev'} = undef;
-	    $est{$node}{'dist'} = 0;
-	} else {
-	    $est{$node}{'prev'} = undef;
-	    $est{$node}{'dist'} = $maxdist;
-	}
+        if ($node eq $root) {
+            $est{$node}{'prev'} = undef;
+            $est{$node}{'dist'} = 0;
+        } else {
+            $est{$node}{'prev'} = undef;
+            $est{$node}{'dist'} = $maxdist;
+        }
     }
 
     # remove nodes from %est until it is empty
     while (keys %est) {
 
-	#select the node closest to current one, or root node
-	my $min_node;
-	my $min = $maxdist;
-	foreach my $node (reverse sort keys %est) {
-	    if ( $est{$node}{'dist'} < $min ) {
-		$min = $est{$node}{'dist'};
-		$min_node = $node;
-	    }
-	}
-
-	# no more links between nodes
-	last unless ($min_node);
-
-	# move the node from %est into %res;
-	$res{$min_node} = delete $est{$min_node};
-
-	# recompute distances to the neighbours
-	my $dist = $res{$min_node}{'dist'};
-	foreach my $neighbour ( keys %{$self->{'_dag'}->{$min_node}} ){
-	    next unless $est{$neighbour}; # might not be there any more
-	    $est{$neighbour}{'prev'} = $min_node;
-	    $est{$neighbour}{'dist'} =
-		$dist + $self->{'_dag'}{$min_node}{$neighbour}
-		if $est{$neighbour}{'dist'} > $dist + 1 ;
-	}
+        #select the node closest to current one, or root node
+        my $min_node;
+        my $min = $maxdist;
+        foreach my $node (reverse sort keys %est) {
+            if ( $est{$node}{'dist'} < $min ) {
+                $min = $est{$node}{'dist'};
+                $min_node = $node;
+            }
+        }
+
+        # no more links between nodes
+        last unless ($min_node);
+
+        # move the node from %est into %res;
+        $res{$min_node} = delete $est{$min_node};
+
+        # recompute distances to the neighbours
+        my $dist = $res{$min_node}{'dist'};
+        foreach my $neighbour ( keys %{$self->{'_dag'}->{$min_node}} ){
+            next unless $est{$neighbour}; # might not be there any more
+            $est{$neighbour}{'prev'} = $min_node;
+            $est{$neighbour}{'dist'} =
+                $dist + $self->{'_dag'}{$min_node}{$neighbour}
+                if $est{$neighbour}{'dist'} > $dist + 1 ;
+        }
     }
     return $self->{'_paths'} = \%res;
 }
 
-
 1;
-
@@ -1,19 +1,13 @@
-#
-# bioperl module for Bio::Coordinate::MapperI
-#
-# Please direct questions and support issues to <bioperl-l@bioperl.org> 
-#
-# Cared for by Heikki Lehvaslaiho <heikki-at-bioperl-dot-org>
-#
-# Copyright Heikki Lehvaslaiho
-#
-# You may distribute this module under the same terms as perl itself
-
-# POD documentation - main docs before the code
-
-=head1 NAME
+package Bio::Coordinate::MapperI;
+use utf8;
+use strict;
+use warnings;
+use parent qw(Bio::Root::RootI);
 
-Bio::Coordinate::MapperI - Interface describing coordinate mappers
+# ABSTRACT: Interface describing coordinate mappers.
+# AUTHOR:   Heikki Lehvaslaiho <heikki@bioperl.org>
+# OWNER:    Heikki Lehvaslaiho
+# LICENSE:  Perl_5
 
 =head1 SYNOPSIS
 
@@ -24,59 +18,8 @@ Bio::Coordinate::MapperI - Interface describing coordinate mappers
 MapperI defines methods for classes capable for mapping locations
 between coordinate systems.
 
-=head1 FEEDBACK
-
-=head2 Mailing Lists
-
-User feedback is an integral part of the evolution of this and other
-Bioperl modules. Send your comments and suggestions preferably to the
-Bioperl mailing lists  Your participation is much appreciated.
-
-  bioperl-l@bioperl.org                  - General discussion
-  http://bioperl.org/wiki/Mailing_lists  - About the mailing lists
-
-=head2 Support 
-
-Please direct usage questions or support issues to the mailing list:
-
-I<bioperl-l@bioperl.org>
-
-rather than to the module maintainer directly. Many experienced and 
-reponsive experts will be able look at the problem and quickly 
-address it. Please include a thorough description of the problem 
-with code and data examples if at all possible.
-
-=head2 Reporting Bugs
-
-report bugs to the Bioperl bug tracking system to help us keep track
-the bugs and their resolution.  Bug reports can be submitted via the
-web:
-
-  https://redmine.open-bio.org/projects/bioperl/
-
-=head1 AUTHOR - Heikki Lehvaslaiho
-
-Email:  heikki-at-bioperl-dot-org
-
-=head1 APPENDIX
-
-The rest of the documentation details each of the object
-methods. Internal methods are usually preceded with a _
-
 =cut
 
-
-# Let the code begin...
-
-package Bio::Coordinate::MapperI;
-use strict;
-
-# Object preamble - inherits from Bio::Root::RootI
-
-use base qw(Bio::Root::RootI);
-
-
-
 =head2 in
 
  Title   : in
@@ -95,7 +38,6 @@ sub in {
 
 }
 
-
 =head2 out
 
  Title   : out
@@ -120,7 +62,7 @@ sub out {
  Function: Swap the direction of mapping: input <-> output)
  Example :
  Returns : 1
- Args    : 
+ Args    :
 
 =cut
 
@@ -148,7 +90,6 @@ sub test {
    $self->throw_not_implemented();
 }
 
-
 =head2 map
 
  Title   : map
@@ -190,4 +131,3 @@ sub return_match {
 }
 
 1;
-
@@ -1,34 +1,31 @@
-#
-# bioperl module for Bio::Coordinate::Pair
-#
-# Please direct questions and support issues to <bioperl-l@bioperl.org> 
-#
-# Cared for by Heikki Lehvaslaiho <heikki-at-bioperl-dot-org>
-#
-# Copyright Heikki Lehvaslaiho
-#
-# You may distribute this module under the same terms as perl itself
-
-# POD documentation - main docs before the code
-
-=head1 NAME
+package Bio::Coordinate::Pair;
+use utf8;
+use strict;
+use warnings;
+use Bio::Coordinate::Result;
+use Bio::Coordinate::Result::Match;
+use Bio::Coordinate::Result::Gap;
+use parent qw(Bio::Root::Root Bio::Coordinate::MapperI);
 
-Bio::Coordinate::Pair - Continuous match between two coordinate sets
+# ABSTRACT: Continuous match between two coordinate sets.
+# AUTHOR:   Heikki Lehvaslaiho <heikki@bioperl.org>
+# OWNER:    Heikki Lehvaslaiho
+# LICENSE:  Perl_5
 
 =head1 SYNOPSIS
 
   use Bio::Location::Simple;
   use Bio::Coordinate::Pair;
 
-  my $match1 = Bio::Location::Simple->new 
+  my $match1 = Bio::Location::Simple->new
       (-seq_id => 'propeptide', -start => 21, -end => 40, -strand=>1 );
   my $match2 = Bio::Location::Simple->new
       (-seq_id => 'peptide', -start => 1, -end => 20, -strand=>1 );
   my $pair = Bio::Coordinate::Pair->new(-in => $match1,
-  					-out => $match2
+                                        -out => $match2
                                         );
   # location to match
-  $pos = Bio::Location::Simple->new 
+  $pos = Bio::Location::Simple->new
       (-start => 25, -end => 25, -strand=> -1 );
 
   # results are in a Bio::Coordinate::Result
@@ -43,7 +40,6 @@ Bio::Coordinate::Pair - Continuous match between two coordinate sets
   $res->match->strand == -1;
   $res->match->seq_id eq 'peptide';
 
-
 =head1 DESCRIPTION
 
 This class represents a one continuous match between two coordinate
@@ -56,70 +52,20 @@ The map() method returns Bio::Coordinate::Results with
 Bio::Coordinate::Result::Gaps. The calling code have to deal (process
 or ignore) them.
 
-=head1 FEEDBACK
-
-=head2 Mailing Lists
-
-User feedback is an integral part of the evolution of this and other
-Bioperl modules. Send your comments and suggestions preferably to the
-Bioperl mailing lists  Your participation is much appreciated.
-
-  bioperl-l@bioperl.org                  - General discussion
-  http://bioperl.org/wiki/Mailing_lists  - About the mailing lists
-
-=head2 Support 
-
-Please direct usage questions or support issues to the mailing list:
-
-I<bioperl-l@bioperl.org>
-
-rather than to the module maintainer directly. Many experienced and 
-reponsive experts will be able look at the problem and quickly 
-address it. Please include a thorough description of the problem 
-with code and data examples if at all possible.
-
-=head2 Reporting Bugs
-
-report bugs to the Bioperl bug tracking system to help us keep track
-the bugs and their resolution.  Bug reports can be submitted via the
-web:
-
-  https://redmine.open-bio.org/projects/bioperl/
-
-=head1 AUTHOR - Heikki Lehvaslaiho
-
-Email:  heikki-at-bioperl-dot-org
-
-=head1 APPENDIX
-
-The rest of the documentation details each of the object
-methods. Internal methods are usually preceded with a _
-
 =cut
 
-
-# Let the code begin...
-
-package Bio::Coordinate::Pair;
-use strict;
-
-# Object preamble - inherits from Bio::Root::Root
-use Bio::Coordinate::Result;
-use Bio::Coordinate::Result::Match;
-use Bio::Coordinate::Result::Gap;
-
-use base qw(Bio::Root::Root Bio::Coordinate::MapperI);
-
+=head2 new
+=cut
 
 sub new {
     my($class,@args) = @_;
     my $self = $class->SUPER::new(@args);
 
     my($in, $out) =
-	$self->_rearrange([qw(IN
+        $self->_rearrange([qw(IN
                               OUT
-			     )],
-			 @args);
+                             )],
+                         @args);
 
     $in  && $self->in($in);
     $out  && $self->out($out);
@@ -141,13 +87,12 @@ sub in {
    my ($self,$value) = @_;
    if( defined $value) {
        $self->throw("Not a valid input Bio::Location [$value] ")
-	   unless $value->isa('Bio::LocationI');
+           unless $value->isa('Bio::LocationI');
        $self->{'_in'} = $value;
    }
    return $self->{'_in'};
 }
 
-
 =head2 out
 
  Title   : out
@@ -163,13 +108,12 @@ sub out {
    my ($self,$value) = @_;
    if( defined $value) {
        $self->throw("Not a valid output coordinate Bio::Location [$value] ")
-	   unless $value->isa('Bio::LocationI');
+           unless $value->isa('Bio::LocationI');
        $self->{'_out'} = $value;
    }
    return $self->{'_out'};
 }
 
-
 =head2 swap
 
  Title   : swap
@@ -177,7 +121,7 @@ sub out {
  Function: Swap the direction of mapping; input <-> output
  Example :
  Returns : 1
- Args    : 
+ Args    :
 
 =cut
 
@@ -228,7 +172,6 @@ sub test {
    return ($self->in->end - $self->in->start) == ($self->out->end - $self->out->start);
 }
 
-
 =head2 map
 
  Title   : map
@@ -253,7 +196,6 @@ sub map {
    $self->throw("Output coordinate system not set")
        unless $self->out;
 
-
    if ($value->isa("Bio::Location::SplitLocationI")) {
 
        my $result = Bio::Coordinate::Result->new();
@@ -267,7 +209,6 @@ sub map {
    }
 }
 
-
 =head2 _map
 
  Title   : _map
@@ -289,7 +230,7 @@ sub _map {
    my $offset = $self->in->start - $self->out->start;
    my $start  = $value->start - $offset;
    my $end    = $value->end - $offset;
-   
+
    my $match = Bio::Location::Simple->new;
    $match->location_type($value->location_type);
    $match->strand($self->strand);
@@ -303,15 +244,15 @@ sub _map {
        $result->seq_id($self->out->seq_id);
 
        if ($self->strand >= 0) {
-	   $match->start($start);
-	   $match->end($end);
+           $match->start($start);
+           $match->end($end);
        } else {
-	   $match->start($self->out->end - $end + $self->out->start);
-	   $match->end($self->out->end - $start + $self->out->start);
+           $match->start($self->out->end - $end + $self->out->start);
+           $match->end($self->out->end - $start + $self->out->start);
        }
        if ($value->strand) {
-	   $match->strand($match->strand * $value->strand);
-	   $result->strand($match->strand);
+           $match->strand($match->strand * $value->strand);
+           $result->strand($match->strand);
        }
        bless $match, 'Bio::Coordinate::Result::Match';
        $result->add_sub_Location($match);
@@ -320,9 +261,9 @@ sub _map {
    #       |-------------------------|
    #   |-|              or              |-|
    elsif ( ($end < $self->out->start or $start > $self->out->end ) or
-	   #insertions just outside the range need special settings
-	   ($value->location_type eq 'IN-BETWEEN' and 
-	    ($end = $self->out->start or $start = $self->out->end)))  {
+           #insertions just outside the range need special settings
+           ($value->location_type eq 'IN-BETWEEN' and
+            ($end = $self->out->start or $start = $self->out->end)))  {
 
        $match->seq_id($self->in->seq_id);
        $result->seq_id($self->in->seq_id);
@@ -340,8 +281,8 @@ sub _map {
 
        $result->seq_id($self->out->seq_id);
        if ($value->strand) {
-	   $match->strand($match->strand * $value->strand);
-	   $result->strand($match->strand);
+           $match->strand($match->strand * $value->strand);
+           $result->strand($match->strand);
        }
        my $gap = Bio::Location::Simple->new;
        $gap->start($value->start);
@@ -356,11 +297,11 @@ sub _map {
        $match->seq_id($self->out->seq_id);
 
        if ($self->strand >= 0) {
-	   $match->start($self->out->start);
-	   $match->end($end);
+           $match->start($self->out->start);
+           $match->end($end);
        } else {
-	   $match->start($self->out->end - $end + $self->out->start);
-	   $match->end($self->out->end);
+           $match->start($self->out->end - $end + $self->out->start);
+           $match->end($self->out->end);
        }
        bless $match, 'Bio::Coordinate::Result::Match';
        $result->add_sub_Location($match);
@@ -373,15 +314,15 @@ sub _map {
        $match->seq_id($self->out->seq_id);
        $result->seq_id($self->out->seq_id);
        if ($value->strand) {
-	   $match->strand($match->strand * $value->strand);
-	   $result->strand($match->strand);
+           $match->strand($match->strand * $value->strand);
+           $result->strand($match->strand);
        }
        if ($self->strand >= 0) {
-	   $match->start($start);
-	   $match->end($self->out->end);
+           $match->start($start);
+           $match->end($self->out->end);
        } else {
-	   $match->start($self->out->start);
-	   $match->end($self->out->end - $start + $self->out->start);
+           $match->start($self->out->start);
+           $match->end($self->out->end - $start + $self->out->start);
        }
        bless $match, 'Bio::Coordinate::Result::Match';
        $result->add_sub_Location($match);
@@ -402,8 +343,8 @@ sub _map {
 
        $result->seq_id($self->out->seq_id);
        if ($value->strand) {
-	   $match->strand($match->strand * $value->strand);
-	   $result->strand($match->strand);
+           $match->strand($match->strand * $value->strand);
+           $result->strand($match->strand);
        }
        # gap1
        my $gap1 = Bio::Location::Simple->new;
@@ -437,5 +378,4 @@ sub _map {
    return $result;
 }
 
-
 1;
@@ -1,20 +1,13 @@
-#
-# BioPerl module for Bio::Coordinate::Result::Gap
-#
-# Please direct questions and support issues to <bioperl-l@bioperl.org> 
-#
-# Cared for by Heikki Lehvaslaiho <heikki-at-bioperl-dot-org>
-#
-# Copywright Heikki Lehvaslaiho
-#
-# You may distribute this module under the same terms as perl itself
-#
-# POD documentation - main docs before the code
-#
-
-=head1 NAME
+package Bio::Coordinate::Result::Gap;
+use utf8;
+use strict;
+use warnings;
+use parent qw(Bio::Location::Simple Bio::Coordinate::ResultI);
 
-Bio::Coordinate::Result::Gap - Another name for Bio::Location::Simple
+# ABSTRACT: Another name for L<Bio::Location::Simple>.
+# AUTHOR:   Heikki Lehvaslaiho <heikki@bioperl.org>
+# OWNER:    Heikki Lehvaslaiho
+# LICENSE:  Perl_5
 
 =head1 SYNOPSIS
 
@@ -25,53 +18,6 @@ Bio::Coordinate::Result::Gap - Another name for Bio::Location::Simple
 =head1 DESCRIPTION
 
 This is a location object for coordinate mapping results.
-
-=head1 FEEDBACK
-
-=head2 Mailing Lists
-
-User feedback is an integral part of the evolution of this and other
-Bioperl modules. Send your comments and suggestions preferably to one
-of the Bioperl mailing lists.  Your participation is much appreciated.
-
-  bioperl-l@bioperl.org                  - General discussion
-  http://bioperl.org/wiki/Mailing_lists  - About the mailing lists
-
-=head2 Support 
-
-Please direct usage questions or support issues to the mailing list:
-
-I<bioperl-l@bioperl.org>
-
-rather than to the module maintainer directly. Many experienced and 
-reponsive experts will be able look at the problem and quickly 
-address it. Please include a thorough description of the problem 
-with code and data examples if at all possible.
-
-=head2 Reporting Bugs
-
-Report bugs to the Bioperl bug tracking system to help us keep track
-the bugs and their resolution.  Bug reports can be submitted via the
-web:
-
-  https://redmine.open-bio.org/projects/bioperl/
-
-=head1 AUTHOR - Heikki Lehvaslaiho
-
-Email heikki-at-bioperl-dot-org
-
-=head1 APPENDIX
-
-The rest of the documentation details each of the object
-methods. Internal methods are usually preceded with a _
-
 =cut
 
-package Bio::Coordinate::Result::Gap;
-use strict;
-
-
-use base qw(Bio::Location::Simple Bio::Coordinate::ResultI);
-
-
 1;
@@ -1,77 +1,26 @@
-#
-# BioPerl module for Bio::Coordinate::Result::Match
-#
-# Please direct questions and support issues to <bioperl-l@bioperl.org> 
-#
-# Cared for by Heikki Lehvaslaiho <heikki-at-bioperl-dot-org>
-#
-# Copywright Heikki Lehvaslaiho
-#
-# You may distribute this module under the same terms as perl itself
-#
-# POD documentation - main docs before the code
-#
-
-=head1 NAME
+package Bio::Coordinate::Result::Match;
+use utf8;
+use strict;
+use warnings;
+use parent qw(Bio::Location::Simple Bio::Coordinate::ResultI);
 
-Bio::Coordinate::Result::Match - Another name for Bio::Location::Simple
+# ABSTRACT: Another name for L<Bio::Location::Simple>.
+# AUTHOR:   Heikki Lehvaslaiho <heikki@bioperl.org>
+# OWNER:    Heikki Lehvaslaiho
+# LICENSE:  Perl_5
 
 =head1 SYNOPSIS
 
-  $loc = Bio::Coordinate::Result::Match->new(-start=>10,
-                                            -end=>30,
-                                            -strand=>+1);
+  $loc = Bio::Coordinate::Result::Match->new(
+      -start=>10,
+      -end=>30,
+      -strand=>+1
+  );
 
 =head1 DESCRIPTION
 
 This is a location class for coordinate mapping results.
 
-=head1 FEEDBACK
-
-=head2 Mailing Lists
-
-User feedback is an integral part of the evolution of this and other
-Bioperl modules. Send your comments and suggestions preferably to one
-of the Bioperl mailing lists.  Your participation is much appreciated.
-
-  bioperl-l@bioperl.org                  - General discussion
-  http://bioperl.org/wiki/Mailing_lists  - About the mailing lists
-
-=head2 Support 
-
-Please direct usage questions or support issues to the mailing list:
-
-I<bioperl-l@bioperl.org>
-
-rather than to the module maintainer directly. Many experienced and 
-reponsive experts will be able look at the problem and quickly 
-address it. Please include a thorough description of the problem 
-with code and data examples if at all possible.
-
-=head2 Reporting Bugs
-
-Report bugs to the Bioperl bug tracking system to help us keep track
-the bugs and their resolution.  Bug reports can be submitted via the
-web:
-
-  https://redmine.open-bio.org/projects/bioperl/
-
-=head1 AUTHOR - Heikki Lehvaslaiho
-
-Email heikki-at-bioperl-dot-org
-
-=head1 APPENDIX
-
-The rest of the documentation details each of the object
-methods. Internal methods are usually preceded with a _
-
 =cut
 
-package Bio::Coordinate::Result::Match;
-use strict;
-
-
-use base qw(Bio::Location::Simple Bio::Coordinate::ResultI);
-
-
 1;
@@ -1,19 +1,13 @@
-#
-# bioperl module for Bio::Coordinate::Result
-#
-# Please direct questions and support issues to <bioperl-l@bioperl.org> 
-#
-# Cared for by Heikki Lehvaslaiho <heikki-at-bioperl-dot-org>
-#
-# Copyright Heikki Lehvaslaiho
-#
-# You may distribute this module under the same terms as perl itself
-
-# POD documentation - main docs before the code
-
-=head1 NAME
+package Bio::Coordinate::Result;
+use utf8;
+use strict;
+use warnings;
+use parent qw(Bio::Location::Split Bio::Coordinate::ResultI);
 
-Bio::Coordinate::Result - Results from coordinate transformation
+# ABSTRACT: Results from coordinate transformation.
+# AUTHOR:   Heikki Lehvaslaiho <heikki@bioperl.org>
+# OWNER:    Heikki Lehvaslaiho
+# LICENSE:  Perl_5
 
 =head1 SYNOPSIS
 
@@ -32,66 +26,17 @@ L<Bio::Coordinate::Result::Gap>.
 If only one Match is returned, there is a convenience method of
 retrieving it or accessing its methods. Same holds true for a Gap.
 
-=head1 FEEDBACK
-
-=head2 Mailing Lists
-
-User feedback is an integral part of the evolution of this and other
-Bioperl modules. Send your comments and suggestions preferably to the
-Bioperl mailing lists  Your participation is much appreciated.
-
-  bioperl-l@bioperl.org                  - General discussion
-  http://bioperl.org/wiki/Mailing_lists  - About the mailing lists
-
-=head2 Support 
-
-Please direct usage questions or support issues to the mailing list:
-
-I<bioperl-l@bioperl.org>
-
-rather than to the module maintainer directly. Many experienced and 
-reponsive experts will be able look at the problem and quickly 
-address it. Please include a thorough description of the problem 
-with code and data examples if at all possible.
-
-=head2 Reporting Bugs
-
-report bugs to the Bioperl bug tracking system to help us keep track
-the bugs and their resolution.  Bug reports can be submitted via the
-web:
-
-  https://redmine.open-bio.org/projects/bioperl/
-
-=head1 AUTHOR - Heikki Lehvaslaiho
-
-Email:  heikki-at-bioperl-dot-org
-
-=head1 APPENDIX
-
-The rest of the documentation details each of the object
-methods. Internal methods are usually preceded with a _
-
 =cut
 
-
-# Let the code begin...
-
-package Bio::Coordinate::Result;
-use strict;
-
-
-use base qw(Bio::Location::Split Bio::Coordinate::ResultI);
-
-
 =head2 add_location
 
  Title   : add_sub_Location
  Usage   : $obj->add_sub_Location($variant)
- Function: 
+ Function:
 
            Pushes one Bio::LocationI into the list of variants.
 
- Example : 
+ Example :
  Returns : 1 when succeeds
  Args    : Location object
 
@@ -121,7 +66,7 @@ sub add_sub_Location {
  Title   : add_result
  Usage   : $obj->add_result($result)
  Function: Adds the contents of one Bio::Coordinate::Result
- Example : 
+ Example :
  Returns : 1 when succeeds
  Args    : Result object
 
@@ -148,7 +93,6 @@ sub add_result {
   Returns : seq_id
   Args    : [optional] seq_id value to set
 
-
 =cut
 
 sub seq_id {
@@ -156,24 +100,17 @@ sub seq_id {
 
     my @ls = $self->each_Location;
     if (@ls) {
-	return $ls[0]->seq_id;
+        return $ls[0]->seq_id;
     } else {
-	return;
+        return;
     }
 }
 
-
-=head2 Convenience methods
-
-These methods are shortcuts to Match and Gap locations.
-
-=cut
-
 =head2 each_gap
 
  Title   : each_gap
  Usage   : $obj->each_gap();
- Function: 
+ Function:
 
             Returns a list of Bio::Coordianate::Result::Gap objects.
 
@@ -193,12 +130,11 @@ sub each_gap {
 
 }
 
-
 =head2 each_match
 
  Title   : each_match
  Usage   : $obj->each_match();
- Function: 
+ Function:
 
             Returns a list of Bio::Coordinate::Result::Match objects.
 
@@ -224,7 +160,7 @@ sub each_match {
            $gstart = $obj->gap->start;
  Function: Read only method for retrieving or accessing the match object.
  Returns : one Bio::Coordinate::Result::Match
- Args    : 
+ Args    :
 
 =cut
 
@@ -247,7 +183,7 @@ sub match {
            $gstart = $obj->gap->start;
  Function: Read only method for retrieving or accessing the gap object.
  Returns : one Bio::Coordinate::Result::Gap
- Args    : 
+ Args    :
 
 =cut
 
@@ -263,14 +199,13 @@ sub gap {
    return $self->{'_gap'};
 }
 
-
 =head2 purge_gaps
 
  Title   : purge_gaps
  Usage   : $gap_count = $obj->purge_gaps;
  Function: remove all gaps from the Result
  Returns : count of removed gaps
- Args    : 
+ Args    :
 
 =cut
 
@@ -292,5 +227,4 @@ sub purge_gaps {
     return $count;
 }
 
-
 1;
@@ -1,19 +1,13 @@
-#
-# bioperl module for Bio::Coordinate::ResultI
-#
-# Please direct questions and support issues to <bioperl-l@bioperl.org> 
-#
-# Cared for by Heikki Lehvaslaiho <heikki-at-bioperl-dot-org>
-#
-# Copyright Heikki Lehvaslaiho
-#
-# You may distribute this module under the same terms as perl itself
-
-# POD documentation - main docs before the code
-
-=head1 NAME
+package Bio::Coordinate::ResultI;
+use utf8;
+use strict;
+use warnings;
+use parent qw(Bio::LocationI);
 
-Bio::Coordinate::ResultI - Interface to identify coordinate mapper results
+# ABSTRACT: Interface to identify coordinate mapper results.
+# AUTHOR:   Heikki Lehvaslaiho <heikki@bioperl.org>
+# OWNER:    Heikki Lehvaslaiho
+# LICENSE:  Perl_5
 
 =head1 SYNOPSIS
 
@@ -24,57 +18,6 @@ Bio::Coordinate::ResultI - Interface to identify coordinate mapper results
 ResultI identifies Bio::LocationIs returned by
 Bio::Coordinate::MapperI implementing classes from other locations.
 
-=head1 FEEDBACK
-
-=head2 Mailing Lists
-
-User feedback is an integral part of the evolution of this and other
-Bioperl modules. Send your comments and suggestions preferably to the
-Bioperl mailing lists  Your participation is much appreciated.
-
-  bioperl-l@bioperl.org                  - General discussion
-  http://bioperl.org/wiki/Mailing_lists  - About the mailing lists
-
-=head2 Support 
-
-Please direct usage questions or support issues to the mailing list:
-
-I<bioperl-l@bioperl.org>
-
-rather than to the module maintainer directly. Many experienced and 
-reponsive experts will be able look at the problem and quickly 
-address it. Please include a thorough description of the problem 
-with code and data examples if at all possible.
-
-=head2 Reporting Bugs
-
-report bugs to the Bioperl bug tracking system to help us keep track
-the bugs and their resolution.  Bug reports can be submitted via the
-web:
-
-  https://redmine.open-bio.org/projects/bioperl/
-
-=head1 AUTHOR - Heikki Lehvaslaiho
-
-Email:  heikki-at-bioperl-dot-org
-
-=head1 APPENDIX
-
-The rest of the documentation details each of the object
-methods. Internal methods are usually preceded with a _
-
 =cut
 
-
-# Let the code begin...
-
-package Bio::Coordinate::ResultI;
-use strict;
-
-# Object preamble
-
-use base qw(Bio::LocationI);
-
-
 1;
-
@@ -1,19 +1,18 @@
-#
-# BioPerl module for Bio::Coordinate::Utils
-#
-# Please direct questions and support issues to <bioperl-l@bioperl.org> 
-#
-# Cared for by Heikki Lehvaslaiho <heikki-at-bioperl-dot-org>
-#
-# Copyright Heikki Lehvaslaiho
-#
-# You may distribute this module under the same terms as perl itself
-
-# POD documentation - main docs before the code
-
-=head1 NAME
+package Bio::Coordinate::Utils;
+use utf8;
+use strict;
+use warnings;
+use Bio::Location::Simple;
+use Bio::Coordinate::Pair;
+use Bio::Coordinate::Collection;
+use parent qw(Bio::Root::Root);
 
-Bio::Coordinate::Utils - Additional methods to create Bio::Coordinate objects
+# ABSTRACT: Additional methods to create Bio::Coordinate objects.
+# AUTHOR:   Heikki Lehvaslaiho <heikki@bioperl.org>
+# AUTHOR:   Jason Stajich <jason@bioperl.org>
+# OWNER:    Heikki Lehvaslaiho
+# OWNER:    Jason Stajich
+# LICENSE:  Perl_5
 
 =head1 SYNOPSIS
 
@@ -24,11 +23,10 @@ Bio::Coordinate::Utils - Additional methods to create Bio::Coordinate objects
     $mapper = Bio::Coordinate::Utils->from_align($aln, 1);
 
     # Build a set of mappers which will map, for each sequence,
-    # that sequence position in the alignment (exon position to alignment 
-    # position) 
+    # that sequence position in the alignment (exon position to alignment
+    # position)
     my @mappers = Bio::Coordinate::Utils->from_seq_to_alignmentpos($aln);
 
-
 =head1 DESCRIPTION
 
 This class is a holder of methods that work on or create
@@ -39,63 +37,12 @@ are thinking of adding essential functions, it might be better to
 create your own sequence class.  See L<Bio::PrimarySeqI>,
 L<Bio::PrimarySeq>, and L<Bio::Seq> for more.
 
-=head1 FEEDBACK
-
-=head2 Mailing Lists
-
-User feedback is an integral part of the evolution of this and other
-Bioperl modules. Send your comments and suggestions preferably to one
-of the Bioperl mailing lists.  Your participation is much appreciated.
-
-  bioperl-l@bioperl.org                  - General discussion
-  http://bioperl.org/wiki/Mailing_lists  - About the mailing lists
-
-=head2 Support 
-
-Please direct usage questions or support issues to the mailing list:
-
-I<bioperl-l@bioperl.org>
-
-rather than to the module maintainer directly. Many experienced and 
-reponsive experts will be able look at the problem and quickly 
-address it. Please include a thorough description of the problem 
-with code and data examples if at all possible.
-
-=head2 Reporting Bugs
-
-Report bugs to the Bioperl bug tracking system to help us keep track
-the bugs and their resolution.  Bug reports can be submitted via the
-web:
-
-  https://redmine.open-bio.org/projects/bioperl/
-
-=head1 AUTHOR - Heikki Lehvaslaiho
-
-Email:  heikki-at-bioperl-dot-org
-
-Jason Stajich jason at bioperl.org
-
-=head1 APPENDIX
-
-The rest of the documentation details each of the object
-methods. Internal methods are usually preceded with a _
-
 =cut
 
+=head2 new
 
-# Let the code begin...
-
-
-package Bio::Coordinate::Utils;
-
-use Bio::Location::Simple;
-use Bio::Coordinate::Pair;
-use Bio::Coordinate::Collection;
-
-use strict;
-
-use base qw(Bio::Root::Root);
-# new inherited from Root
+new() inherited from Root
+=cut
 
 =head2 from_align
 
@@ -123,7 +70,7 @@ sub from_align {
 
    # default reference sequence to the first sequence
    $ref ||= 1;
-   
+
    my $collection = Bio::Coordinate::Collection->new(-return_match=>1);
 
    # this works only for pairs, so split the MSA
@@ -132,35 +79,35 @@ sub from_align {
    $aln->map_chars('\.','-');
    my $cs = $aln->gap_line;
    my $seq1 = $aln->get_seq_by_pos(1);
-   my $seq2 = $aln->get_seq_by_pos(2);   
+   my $seq2 = $aln->get_seq_by_pos(2);
    while ( $cs =~ /([^\-]+)/g) {
        # alignment coordinates
        my $lenmatch = length($1);
        my $start = pos($cs) - $lenmatch +1;
        my $end   = $start + $lenmatch -1;
        my $match1 = Bio::Location::Simple->new
-	   (-seq_id => $seq1->id,
-	    -start  => $seq1->location_from_column($start)->start,
-	    -end    => $seq1->location_from_column($end)->start,
-	    -strand => $seq1->strand );
+           (-seq_id => $seq1->id,
+            -start  => $seq1->location_from_column($start)->start,
+            -end    => $seq1->location_from_column($end)->start,
+            -strand => $seq1->strand );
 
        my $match2 = Bio::Location::Simple->new
-	   (-seq_id => $seq2->id,
-	    -start  => $seq2->location_from_column($start)->start,
-	    -end    => $seq2->location_from_column($end)->start,
-	    -strand => $seq2->strand );       
-       
+           (-seq_id => $seq2->id,
+            -start  => $seq2->location_from_column($start)->start,
+            -end    => $seq2->location_from_column($end)->start,
+            -strand => $seq2->strand );
+
        my $pair = Bio::Coordinate::Pair->new
-	   (-in  => $match1,
-	    -out => $match2
-	    );
+           (-in  => $match1,
+            -out => $match2
+            );
        unless( $pair->test ) {
-	   $self->warn(join("",
-			    "pair align did not pass test ($start..$end):\n",
-			    "\tm1=",$match1->to_FTstring(), " len=",
-			    $match1->length, 
-			    " m2=", $match2->to_FTstring()," len=", 
-			    $match2->length,"\n"));
+           $self->warn(join("",
+                            "pair align did not pass test ($start..$end):\n",
+                            "\tm1=",$match1->to_FTstring(), " len=",
+                            $match1->length,
+                            " m2=", $match2->to_FTstring()," len=",
+                            $match2->length,"\n"));
        }
        $collection->add_mapper($pair);
    }
@@ -178,66 +125,64 @@ sub from_align {
            The mapper will map the position of a sequence into that position
            in the alignment.
 
-           Will work on alignments of >= 2 sequences 
+           Will work on alignments of >= 2 sequences
  Returns : An array of Bio::Coordinate::MapperI
  Args    : Bio::Align::AlignI object
 
 =cut
 
-
 sub from_seq_to_alignmentpos {
     my ($self, $aln ) = @_;
 
     $aln->isa('Bio::Align::AlignI') ||
-	$self->throw('Not a Bio::Align::AlignI object but ['. ref($aln). ']');
+        $self->throw('Not a Bio::Align::AlignI object but ['. ref($aln). ']');
 
     # default reference sequence to the first sequence
     my @mappers;
     $aln->map_chars('\.','-');
-    for my $seq ( $aln->each_seq ) { 
-	my $collection = Bio::Coordinate::Collection->new(-return_match=>1);
-	my $cs = $seq->seq();
-	# do we change this over to use index and substr for speed?
-	while ( $cs =~ /([^\-]+)/g) {
-	    # alignment coordinates
-	    my $lenmatch = length($1);
-	    my $start = pos($cs) - $lenmatch +1;
-	    my $end   = $start + $lenmatch -1;
-
-	    my $match1 = Bio::Location::Simple->new
-		(-seq_id => $seq->id,
-		 -start  => $seq->location_from_column($start)->start,
-		 -end    => $seq->location_from_column($end)->start,
-		 -strand => $seq->strand );
-
-	    my $match2 = Bio::Location::Simple->new
-		(-seq_id => 'alignment',
-		 -start  => $start,
-		 -end    => $end,
-		 -strand => 0 );
-
-	    my $pair = Bio::Coordinate::Pair->new
-		(-in  => $match1,
-		 -out => $match2
-		 );
-	    unless ( $pair->test ) {
-		$self->warn(join("",
-				 "pair align did not pass test ($start..$end):\n",
-				 "\tm1=",$match1->to_FTstring(), " len=",
-				 $match1->length, 
-				 " m2=", $match2->to_FTstring()," len=", 
-				 $match2->length,"\n"));
-	    }
-	    $collection->add_mapper($pair);
-	}
-	if( $collection->mapper_count == 1) {
-	    push @mappers, ($collection->each_mapper)[0];
-	} else { 
-	    push @mappers, $collection;
-	}
+    for my $seq ( $aln->each_seq ) {
+        my $collection = Bio::Coordinate::Collection->new(-return_match=>1);
+        my $cs = $seq->seq();
+        # do we change this over to use index and substr for speed?
+        while ( $cs =~ /([^\-]+)/g) {
+            # alignment coordinates
+            my $lenmatch = length($1);
+            my $start = pos($cs) - $lenmatch +1;
+            my $end   = $start + $lenmatch -1;
+
+            my $match1 = Bio::Location::Simple->new
+                (-seq_id => $seq->id,
+                 -start  => $seq->location_from_column($start)->start,
+                 -end    => $seq->location_from_column($end)->start,
+                 -strand => $seq->strand );
+
+            my $match2 = Bio::Location::Simple->new
+                (-seq_id => 'alignment',
+                 -start  => $start,
+                 -end    => $end,
+                 -strand => 0 );
+
+            my $pair = Bio::Coordinate::Pair->new
+                (-in  => $match1,
+                 -out => $match2
+                 );
+            unless ( $pair->test ) {
+                $self->warn(join("",
+                                 "pair align did not pass test ($start..$end):\n",
+                                 "\tm1=",$match1->to_FTstring(), " len=",
+                                 $match1->length,
+                                 " m2=", $match2->to_FTstring()," len=",
+                                 $match2->length,"\n"));
+            }
+            $collection->add_mapper($pair);
+        }
+        if( $collection->mapper_count == 1) {
+            push @mappers, ($collection->each_mapper)[0];
+        } else {
+            push @mappers, $collection;
+        }
     }
     return @mappers;
 }
 
-
 1;
@@ -79,7 +79,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Ewan Birney
 
@@ -85,7 +85,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Lincoln Stein
 
@@ -431,14 +431,14 @@ sub postprocess_data {
   }
 
   elsif ($args{'type'} eq 'file') {
-    open (F,$args{'location'}) or $self->throw("Couldn't open $args{location}: $!");
+    open my $F, '<', $args{'location'} or $self->throw("Could not read file '$args{location}': $!");
     # this is dumb, but the error may be anywhere on the first three lines because the
     # CGI headers are sometimes printed out by the server...
-    my @data = grep {defined $_} (scalar <F>,scalar <F>,scalar <F>);
+    my @data = grep {defined $_} (scalar <$F>, scalar <$F>, scalar <$F>);
+    close $F;
     if (join('',@data) =~ /^ERROR (\d+) (.+)/m) {
       $self->throw("BioFetch Error $1: $2");
     }
-    close F;
   }
 
   else {
@@ -85,7 +85,7 @@ with code and data examples if at all possible.
 Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHORS
 
@@ -60,7 +60,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Heikki Lehvaslaiho
 
@@ -91,7 +91,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Heikki Lehvaslaiho
 
@@ -77,7 +77,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Brian Osborne
 
@@ -38,7 +38,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -62,7 +62,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Allen Day
 
@@ -45,7 +45,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 APPENDIX
 
@@ -59,7 +59,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 APPENDIX
 
@@ -52,7 +52,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Lincoln Stein
 
@@ -52,7 +52,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 SEE ALSO
 
@@ -52,7 +52,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Lincoln Stein
 
@@ -52,7 +52,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 SEE ALSO
 
@@ -59,7 +59,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via
 email or the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Lincoln Stein
 
@@ -187,7 +187,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Michele Clamp
 
@@ -436,7 +436,7 @@ sub get_stream_by_id {
 
     my $file = $self->{_file}{$fileid};
 
-    open( my $IN, "<$file" );
+    open my $IN, '<', $file or $self->throw("Could not read file '$file': $!");
 
     my $entry;
 
@@ -815,7 +815,7 @@ sub build_index {
 sub _index_file {
     my ( $self, $file ) = @_;
     my $v = $self->verbose;
-    open( my $FILE, "<", $file ) || $self->throw("Can't open file [$file]");
+    open my $FILE, '<', $file or $self->throw("Could not read file '$file': $!");
 
     my $recstart = 0;
     my $fileid   = $self->get_fileid_by_filename($file);
@@ -931,7 +931,7 @@ sub _index_file {
     $self->_add_id_position( $id, $pos, $fileid, $length, \%secondary_id );
     $count++;
 
-    close($FILE);
+    close $FILE;
     $count;
 }
 
@@ -954,9 +954,9 @@ sub write_primary_index {
 
     @ids = sort { $a cmp $b } @ids;
 
-    open( my $INDEX, ">" . $self->primary_index_file )
-      || $self->throw(
-        "Can't open primary index file [" . $self->primary_index_file . "]" );
+    open my $INDEX, '>', $self->primary_index_file
+      or $self->throw(
+        "Could not write primary index file '" . $self->primary_index_file . "': $!" );
 
     my $recordlength =
       $self->{_maxidlength} +
@@ -1075,7 +1075,7 @@ sub new_secondary_filehandle {
 
     my $secindex = File::Spec->catfile( $indexdir, "id_$name.index" );
 
-    open( my $fh, ">", $secindex ) || $self->throw($!);
+    open my $fh, '>', $secindex or $self->throw("Could not write file '$secindex': $!");
     return $fh;
 }
 
@@ -1103,7 +1103,7 @@ sub open_secondary_index {
             $self->throw("Index is not present for namespace [$name]\n");
         }
 
-        open( my $newfh, "<", $secindex ) || $self->throw($!);
+        open my $newfh, '<', $secindex or $self->throw("Could not read file '$secindex': $!");
         my $reclen = $self->read_header($newfh);
 
         $self->{_secondary_filehandle}{$name}  = $newfh;
@@ -1189,8 +1189,8 @@ sub make_config_file {
 
     my $configfile = $self->_config_file;
 
-    open( my $CON, ">", $configfile )
-      || $self->throw("Can't create config file [$configfile]");
+    open my $CON, '>', $configfile
+      or $self->throw("Could not write config file '$configfile': $!");
 
     # First line must be the type of index - in this case flat
     print $CON "index\tflat/1\n";
@@ -1205,8 +1205,6 @@ sub make_config_file {
 
         print $CON "fileid_$count\t$file\t$size\n";
 
-        my $fh;
-        open( $fh, "<", $file ) || $self->throw($!);
         $self->{_file}{$count}  = $file;
         $self->{_dbfile}{$file} = $count;
         $self->{_size}{$count}  = $size;
@@ -1244,7 +1242,7 @@ sub make_config_file {
         my $alpha    = $alphabet ? "/$alphabet" : '';
         print $CON "format\t" . "$format\n";
     }
-    close($CON);
+    close $CON;
 }
 
 =head2 read_config_file
@@ -1263,8 +1261,8 @@ sub read_config_file {
     my $configfile = $self->_config_file;
     return unless -e $configfile;
 
-    open( my $CON, "<", $configfile )
-      || $self->throw("Can't open configfile [$configfile]");
+    open my $CON, '<', $configfile
+      or $self->throw("Could not read config file '$configfile': $!");
 
     # First line must be type
     my $line = <$CON>;
@@ -1305,8 +1303,6 @@ sub read_config_file {
                       . "]" );
             }
 
-            my $fh;
-            open( $fh, "<", $filename ) || $self->throw($!);
             $self->{_file}{$fileid}     = $filename;
             $self->{_dbfile}{$filename} = $fileid;
             $self->{_size}{$fileid}     = $filesize;
@@ -1408,8 +1404,7 @@ sub get_filehandle_by_fileid {
         $self->throw("ERROR: undefined fileid in index [$fileid]");
     }
 
-    my $fh;
-    open( $fh, "<", $self->{_file}{$fileid} ) || $self->throw($!);
+    open my $fh, '<', $self->{_file}{$fileid} or $self->throw("Could not read file '$self->{_file}{$fileid}': $!");
     return $fh;
 }
 
@@ -1448,9 +1443,9 @@ sub primary_index_filehandle {
     my ($self) = @_;
 
     unless ( defined( $self->{'_primary_index_handle'} ) ) {
-        open( $self->{'_primary_index_handle'},
-            "<" . $self->primary_index_file )
-          || self->throw($@);
+        my $primary_file = $self->primary_index_file;
+        open $self->{'_primary_index_handle'}, '<', $primary_file
+          or self->throw("Could not read file '$primary_file': $!\n");
     }
     return $self->{'_primary_index_handle'};
 }
@@ -65,7 +65,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Lincoln Stein
 
@@ -387,7 +387,7 @@ sub write_config {
   $self->write_flag or $self->throw("cannot write configuration file because write_flag is not set");
   my $path = $self->_config_path;
 
-  open (my $F,">$path") or $self->throw("open error on $path: $!");
+  open my $F, '>', $path or $self->throw("Could not write file '$path': $!");
 
   my $index_type = $self->indexing_scheme;
   print $F "index\t$index_type\n";
@@ -466,7 +466,7 @@ sub _read_config {
   my $path = $self->_config_path;
   return unless -e $path;
 
-  open (my $F,$path) or $self->throw("open error on $path: $!");
+  open my $F, '<', $path or $self->throw("Could not read file '$path': $!");
   my %config;
   while (<$F>) {
     chomp;
@@ -246,7 +246,8 @@ sub _open_databases {
             : $create ? "+>"
             : "<";
 
-  open (my $F,$mode,$self->_notes_file) or $self->throw($self->_notes_file.": $!");
+  my $notes_file = $self->_notes_file;
+  open my $F, $mode, $notes_file or $self->throw("Could not open file '$notes_file': $!");
   $self->{notes} = $F;
 }
 
@@ -364,7 +365,7 @@ sub load_sequence {
   my $file = $self->_fasta_file;
   my $loaded = 0;
 
-  open (my $F,">>$file") or $self->throw("Couldn't open $file for writing: $!");
+  open my $F, '>>', $file or $self->throw("Could not append file '$file': $!");
 
   if (defined $id) {
     print $F ">$id\n";
@@ -490,8 +491,9 @@ sub finish_load {
 sub _touch_timestamp {
   my $self = shift;
   my $tsf = $self->_timestamp_file;
-  open (my $F,">$tsf") or $self->throw("Couldn't open $tsf: $!");
+  open my $F, '>', $tsf or $self->throw("Could not write file '$tsf': $!");
   print $F scalar(localtime);
+  close $F;
 }
 
 
@@ -1020,7 +1022,7 @@ sub new {
             : $write   ? "+>>"
             : "<";
 
-  open (my $F,$mode,$dbname) or $class->throw("$dbname: $!");
+  open my $F, $mode, $dbname or $class->throw("Could not open file '$dbname': $!");
   my $self = bless {
 		    fh        => $F,
 		    next_idx  => 0,
@@ -1838,10 +1838,10 @@ sub load_gff {
                                                    && tied *$file_or_directory;
 
   my $tied_stdin = tied(*STDIN);
-  open my $SAVEIN,"<&STDIN" unless $tied_stdin;
+  open my $SAVEIN, "<&STDIN" unless $tied_stdin;
   local @ARGV = $self->setup_argv($file_or_directory,'gff','gff3') or return;  # to play tricks with reader
   my $result = $self->do_load_gff('ARGV');
-  open STDIN,"<", $SAVEIN unless $tied_stdin;  # restore STDIN
+  open STDIN, '<', $SAVEIN unless $tied_stdin;  # restore STDIN
   return $result;
 }
 
@@ -1937,7 +1937,7 @@ sub load_fasta {
   open my $SAVEIN, "<&STDIN" unless $tied;
   local @ARGV = $self->setup_argv($file_or_directory,'fa','dna','fasta') or return;  # to play tricks with reader
   my $result = $self->load_sequence('ARGV');
-  open STDIN,"<", $SAVEIN unless $tied;  # restore STDIN
+  open STDIN, '<', $SAVEIN unless $tied;  # restore STDIN
   return $result;
 }
 
@@ -3894,4 +3894,3 @@ This library is free software; you can redistribute it and/or modify
 it under the same terms as Perl itself.
 
 =cut
-
@@ -147,7 +147,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Aaron Mackey, Jason Stajich
 
@@ -173,7 +173,7 @@ BEGIN {
     $DEFAULTMODE   = 'single';
     $DEFAULTFORMAT = 'gbwithparts';
     %PARAMSTRING = (
-			 'batch' => { 'db'     => 'nucleotide',
+		    'batch' => { 'db'     => 'nucleotide',
 				  'usehistory' => 'n',
 				  'tool'   => 'bioperl'},
 		     'query' => { 'usehistory' => 'y',
@@ -191,7 +191,7 @@ BEGIN {
 				   'usehistory' => 'n',
 				   'tool'   => 'bioperl',
 				   'retmode' => 'text'},
-			 'webenv' => {
+		      'webenv' => {
 				  'query_key'  => 'querykey',
 				  'WebEnv'  => 'cookie',
 				  'db'     => 'nucleotide',
@@ -76,7 +76,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Aaron Mackey, Jason Stajich
 
@@ -66,7 +66,7 @@ Report bugs to the Bioperl bug tracking system to
 help us keep track the bugs and their resolution.
 Bug reports can be submitted via the web.
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -58,7 +58,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Mark A. Jensen
 
@@ -62,7 +62,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Mark A. Jensen
 
@@ -71,7 +71,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Mark A. Jensen
 
@@ -364,16 +364,15 @@ sub postprocess_data {
 		last;
 	    };
 	    m/file/ && do {
-		local $/;
-		undef $/;
-		open (F, "<", $loc) or
+		local $/ = undef;
+		open my $F, '<', $loc or
 		    $self->throw(
-		    -class=>'Bio::Root::FileOpenException',
-		    -text=>"Error opening tempfile \"$loc\" for reading",
-		    -value=>$loc
+		    -class => 'Bio::Root::FileOpenException',
+		    -text  => "Error opening tempfile '$loc' for reading",
+		    -value => $!
 		    );
-		@data = split( /\n|\r/, <F>);
-		close(F);
+		@data = split( /\n|\r/, <$F>);
+		close $F;
 		last;
 	    };
 	    do {
@@ -407,11 +406,11 @@ sub postprocess_data {
 		last;
 	    };
 	    m/file/ && do {
-		open(F, ">", $loc) or $self->throw(-class=>'Bio::Root::FileOpenException',
-					     -text=>'Error opening tempfile \"$loc\" for writing',
-					     -value=>$loc);
-		print F join("", @flines);
-		close(F);
+		open my $F, '>', $loc or $self->throw(-class=>'Bio::Root::FileOpenException',
+					     -text=>"Error opening tempfile '$loc' for writing",
+					     -value=>$!);
+		print $F join("", @flines);
+		close $F;
 		last;
 	    };
 	    do {
@@ -494,8 +493,9 @@ sub get_seq_stream {
 	# this may get reset when requesting batch mode
 	($rformat,$ioformat) = $self->request_format();
 	if( $self->verbose > 0 ) {
-	    open(my $ERR, "<", $tmpfile);
+	    open my $ERR, '<', $tmpfile or $self->throw("Could not read file '$tmpfile': $!");
 	    while(<$ERR>) { $self->debug($_);}
+	    close $ERR;
 	}
 
 	return Bio::SeqIO->new('-verbose' => $self->verbose,
@@ -55,7 +55,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 APPENDIX
 
@@ -441,7 +441,7 @@ sub glob {
 sub index_dir {
     my ($self, $dir, $force_reindex) = @_;
     my @files = glob( File::Spec->catfile($dir, $self->{glob}) );
-    $self->throw("No suitable files found in $dir") if scalar @files == 0;
+    return if scalar @files == 0;
     $self->{index_name} ||= File::Spec->catfile($dir, 'directory.index');
     my $offsets = $self->_index_files(\@files, $force_reindex);
     return $offsets;
@@ -608,7 +608,13 @@ sub _index_files {
     my $index = $self->index_name;
 
     # If caller has requested reindexing, unlink the index file.
-    unlink $index if $force_reindex;
+    if ($force_reindex) {
+        # Tied-hash in Strawberry Perl creates "$file.index"
+        unlink $index if -e $index;
+        # Tied-hash in ActivePerl creates "$file.index.pag" and "$file.index.dir"
+        unlink "$index.dir" if -e "$index.dir";
+        unlink "$index.pag" if -e "$index.pag";
+    }
 
     # Get the modification time of the index
     my $indextime = (stat $index)[9] || 0;
@@ -1076,7 +1082,13 @@ sub DESTROY {
 
     if ( $self->{clean} || $self->{indexing} ) {
         # Indexing aborted or cleaning requested. Delete the index file.
-        unlink $self->{index_name};
+        my $index = $self->{index_name};
+
+        # Tied-hash in Strawberry Perl creates "$file.index"
+        unlink $index if -e $index;
+        # Tied-hash in ActivePerl creates "$file.index.pag" and "$file.index.dir"
+        unlink "$index.dir" if -e "$index.dir";
+        unlink "$index.pag" if -e "$index.pag";
     }
     return 1;
 }
@@ -1115,7 +1127,7 @@ sub TIEHANDLE {
 
 sub READLINE {
     my $self = shift;
-    return $self->next_seq;
+    return $self->next_seq || undef;
 }
 
 
@@ -78,7 +78,7 @@ Report bugs to the Bioperl bug tracking system to
 help us keep track the bugs and their resolution.
 Bug reports can be submitted via the web.
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR 
 
@@ -65,7 +65,7 @@ report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -273,12 +273,23 @@ sub result {
     # create a MeSH::Term object
     $_ = $self->{'_content'};
     $self->debug( substr($_, 0, 100) . "\n");
-    my ($id) = m|Unique ID</TH><TD>(.*?)</TD>|i;
-    my ($name) = m|MeSH Heading</TH><TD>([^<]+)|i;
-    my ($desc) = m|Scope Note</TH><TD>(.*?)</TD>|is;
+    my ($id)   = m|Unique \s+ ID </TH>
+                   <TD (?: \s+ [^>]+ )? >
+                   (.*?)                    # id
+                   </TD> |ix;
+    my ($name) = m|MeSH \s+ Heading </TH>
+                   <TD (?: \s+ [^>]+ )? >
+                   (.*?)                    # name
+                   </TD> |ix;
+    my ($desc) = m|Scope \s+ Note </TH>
+                   <TD (?: \s+ [^>]+ )? >
+                   (.*?)                    # desc
+                   </TD>|isx;
     $self->throw("No description returned: $_") unless defined $desc;
     $desc =~ s/<.*?>//sg;
-	$desc =~ s/\n/ /g;
+    $desc =~ s/(?:\r)?\n/ /g;
+    $desc =~ s/\( +/\(/g;
+    $desc =~ s/ {2,}/ /g;
 
     my $term = Bio::Phenotype::MeSH::Term->new(-id => $id,
                                                -name => $name,
@@ -286,7 +297,7 @@ sub result {
                                               );
     my ($trees) = $self->{'_content'} =~ /MeSH Tree Structures(.*)/s;
 
-    while (m|Entry Term</TH><TD>([^<]+)|ig) {
+    while (m|Entry Term</TH><TD(?: [^>]+)?>(.*?)</TD>|ig) {
         $term->add_synonym($1);
         $self->debug("Synonym: |$1|\n");
     }
@@ -68,7 +68,7 @@ Report bugs to the Bioperl bug tracking system to
 help us keep track the bugs and their resolution.
 Bug reports can be submitted via the web.
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -79,7 +79,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Lincoln Stein
 
@@ -100,8 +100,13 @@ use strict;
 use URI::Escape 'uri_unescape';
 use Bio::DB::NCBIHelper;
 
-use constant EPOST       => $Bio::DB::NCBIHelper::HOSTBASE . '/entrez/eutils/epost.fcgi';
-use constant ESEARCH     => $Bio::DB::NCBIHelper::HOSTBASE . '/entrez/eutils/esearch.fcgi';
+
+#use constant EPOST       => $Bio::DB::NCBIHelper::HOSTBASE . '/entrez/eutils/epost.fcgi';
+#use constant ESEARCH     => $Bio::DB::NCBIHelper::HOSTBASE . '/entrez/eutils/esearch.fcgi';
+# the reference to the our variable of the $Bio::DB::NCBIHelper::HOSTBASE doesn't seem to work in 
+# the constant definition in perl 5.10.1 or 5.16.3
+use constant EPOST       => '/entrez/eutils/epost.fcgi';
+use constant ESEARCH     => '/entrez/eutils/esearch.fcgi';
 use constant DEFAULT_DB  => 'protein';
 use constant MAXENTRY    => 100;
 
@@ -237,9 +242,9 @@ sub _request_parameters {
   my @params = map {eval("\$self->$_") ? ($_ => eval("\$self->$_")) : () } @ATTRIBUTES;
   push @params,('usehistory'=>'y','tool'=>'bioperl');
   $method = 'get';
-  $base   = ESEARCH;
+  
+  $base   = $Bio::DB::NCBIHelper::HOSTBASE.ESEARCH; # this seems to need to be dynamic
   push @params,('term'   => $self->query);
-
   # Providing 'retmax' limits queries to 500 sequences  ?? I don't think so LS
   push @params,('retmax' => $self->maxids || MAXENTRY);
 
@@ -179,7 +179,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Mark A. Jensen
 
@@ -405,12 +405,12 @@ sub help{
 
    my (@tbls, @flds, @als, @opts, $fh);
    if ($fname) {
-       open ($fh, ">", $fname) or $self->throw(-class=>'Bio::Root::IOException',
-                                               -text=>"Error opening help html file $fname for writing",
-                                               -value=>$!);
+       open $fh, '>', $fname or $self->throw(-class => 'Bio::Root::IOException',
+                                             -text  => "Error opening help html file $fname for writing",
+                                             -value => $!);
    }
    else {
-       open($fh, ">&1");
+       open $fh, ">&1";
    }
    @tbls = $schema->tables;
    @tbls = ('COMMAND', grep !/COMMAND/,@tbls);
@@ -1544,5 +1544,3 @@ sub _sorry{
 }
 
 1;
-
- 
@@ -63,7 +63,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Lincoln Stein
 
@@ -75,7 +75,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Lincoln Stein
 
@@ -47,7 +47,7 @@ with code and data examples if at all possible.
 Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution. Bug reports can be submitted via the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 APPENDIX
 
@@ -97,7 +97,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Heikki Lehvaslaiho
 
@@ -74,7 +74,7 @@ Report bugs to the Bioperl bug tracking system to
 help us keep track the bugs and their resolution.
 Bug reports can be submitted via the web.
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR 
 
@@ -56,7 +56,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 APPENDIX
 
@@ -130,7 +130,7 @@ sub _load_registry {
 
    my ($db,$hash) = ();
    for my $file (@ini_files) {
-      open my $FH,"$file";
+      open my $FH, '<', $file or $self->throw("Could not read file '$file': $!");
       while( <$FH> ) {
 			if (/^VERSION=([\d\.]+)/) {
 				if ($1 > $OBDA_SPEC_VERSION or !$1) {
@@ -284,7 +284,8 @@ sub _make_private_registry {
 	$self->throw("Could not make directory $HOME/$PRIVATE_DIR, " .
 					 "no $REGISTRY file available") if $@;
 
-	open(my $F,">$HOME/$PRIVATE_DIR/$REGISTRY");
+	open my $F, '>', "$HOME/$PRIVATE_DIR/$REGISTRY"
+	  or $self->throw("Could not write file '$HOME/$PRIVATE_DIR/$REGISTRY': $!");
 	print $F while (<$F>);
 	close $F;
 
@@ -160,6 +160,7 @@ use DBI;
 use Memoize;
 use Cwd 'abs_path';
 use Bio::DB::GFF::Util::Rearrange 'rearrange';
+use File::Copy;
 use File::Spec;
 use constant DEBUG=>0;
 
@@ -452,16 +453,16 @@ sub _finish_bulk_update {
     my $path = $self->dump_path($table);
     $fh->close;
     my $qualified_table = $self->_qualify($table);
-    system "cp $path $path.bak";
+    copy($path, "$path.bak");
     # Get stuff from file into STDIN so we don't have to be superuser
-    open FH, $path;
+    open my $FH, '<', $path or $self->throw("Could not read file '$path': $!");
     print STDERR "Loading file $path\n";
     $dbh->do("COPY $qualified_table FROM STDIN CSV QUOTE '''' DELIMITER '\t'") or $self->throw($dbh->errstr);
-    while (my $line = <FH>) {
+    while (my $line = <$FH>) {
       $dbh->pg_putline($line);
     }
     $dbh->pg_endcopy() or $self->throw($dbh->errstr);
-    close FH;
+    close $FH;
     #unlink $path;
   }
   delete $self->{bulk_update_in_progress};
@@ -299,14 +299,14 @@ END
 	  typelist => <<END,
 (
   id  integer primary key autoincrement,
-  tag text    not null
+  tag text    not null collate nocase
 );
 create index index_typelist on typelist (tag);
 END
 	  name => <<END,
 (
   id           integer not null,
-  name         text    not null,
+  name         text    not null collate nocase,
   display_name integer default 0
 );
 create index index_name_id on name(id);
@@ -317,7 +317,7 @@ END
 (
   id              integer not null,
   attribute_id    integer not null,
-  attribute_value text
+  attribute_value text collate nocase
 );
 create index index_attribute_id    on attribute(attribute_id);
 create index index_attribute_value on attribute(attribute_value);
@@ -427,7 +427,8 @@ sub _finish_bulk_update {
     my $fh = $self->dump_filehandle($table);
     my $path = $self->dump_path($table);
     $fh->close;
-    open($fh, $path);
+
+    open $fh, '<', $path or $self->throw("Could not read file '$path': $!");
     my $qualified_table = $self->_qualify($table);
 
     my $sth;
@@ -770,7 +771,7 @@ sub _name_sql {
   my $from  = "$name_table as n";
   my ($match,$string) = $self->_match_sql($name);
 
-  my $where = "n.id=$join AND lower(n.name) $match";
+  my $where = "n.id=$join AND n.name $match COLLATE NOCASE";
   $where   .= " AND n.display_name>0" unless $allow_aliases;
   return ($from,$where,'',$string);
 }
@@ -834,8 +835,8 @@ sub _match_sql {
     $match = "LIKE ?";
     $string  = $name;
   } else {
-    $match = "= lower(?)";
-    $string  = lc($name);
+    $match = "= ? COLLATE NOCASE";
+    $string  = $name;
   }
   return ($match,$string);
 }
@@ -887,7 +888,7 @@ sub _types_sql {
     }
 
     if (length $source_tag) {
-      push @matches,"lower(tl.tag)=lower(?)";
+      push @matches,"tl.tag=? COLLATE NOCASE";
       push @args,"$primary_tag:$source_tag";
     } else {
       push @matches,"tl.tag LIKE ?";
@@ -1058,7 +1059,7 @@ sub _genericid {
   my ($table,$namefield,$name,$add_if_missing) = @_;
   my $qualified_table = $self->_qualify($table);
   my $sth = $self->_prepare(<<END);
-SELECT id FROM $qualified_table WHERE lower($namefield)=lower(?)
+SELECT id FROM $qualified_table WHERE $namefield=? COLLATE NOCASE
 END
   $sth->execute($name) or die $sth->errstr;
   my ($id) = $sth->fetchrow_array;
@@ -1117,8 +1118,8 @@ sub _dump_update_name_index {
   my $dbh     = $self->dbh;
   my ($names,$aliases) = $self->feature_names($obj);
   # unlike DBI::mysql, don't quote, as quotes will be quoted when loaded
-  print $fh join("\t",$id,lc($_),1),"\n" foreach @$names;
-  print $fh join("\t",$id,lc($_),0),"\n" foreach @$aliases;
+  print $fh join("\t",$id,$_,1),"\n" foreach @$names;
+  print $fh join("\t",$id,$_,0),"\n" foreach @$aliases;
 }
 
 sub _update_name_index {
@@ -1132,8 +1133,8 @@ sub _update_name_index {
 
   my $sth = $self->_prepare("INSERT INTO $name (id,name,display_name) VALUES (?,?,?)");
 
-  $sth->execute($id,lc $_,1) or $self->throw($sth->errstr)   foreach @$names;
-  $sth->execute($id,lc $_,0) or $self->throw($sth->errstr) foreach @$aliases;
+  $sth->execute($id,$_,1) or $self->throw($sth->errstr)   foreach @$names;
+  $sth->execute($id,$_,0) or $self->throw($sth->errstr) foreach @$aliases;
   $sth->finish;
 }
 
@@ -369,7 +369,7 @@ sub auto_index_in_process {
     return unless -e $flag_file;
 
     # if flagfile exists, then check that PID still exists
-    open my $fh,$flag_file or die "Couldn't open $flag_file: $!";
+    open my $fh, '<', $flag_file or $self->throw("Could not read file '$flag_file': $!");
     my $pid = <$fh>;
     close $fh;
     return 1 if kill 0=>$pid;
@@ -393,7 +393,7 @@ sub flag_autoindexing {
     my $doit = shift;
     my $flag_file = $self->autoindex_flagfile;
     if ($doit) {
-	open my $fh,'>',$flag_file or die "Couldn't open $flag_file: $!";
+	open my $fh, '>', $flag_file or $self->throw("Could not write file '$flag_file': $!");
 	print $fh $$;
 	close $fh;
     } else {
@@ -673,7 +673,8 @@ sub open_notes_db {
 	                : $create ? "+>"
 	                : "<";
 
-    open (my $F,$mode,$self->_notes_path) or $self->throw($self->_notes_path.": $!");
+    my $notes_file = $self->_notes_path;
+    open my $F, $mode, $notes_file or $self->throw("Could not open file '$notes_file': $!");
     $self->notes_db($F);
 }
 
@@ -724,9 +725,9 @@ sub _delete_databases {
 sub _touch_timestamp {
   my $self = shift;
   my $tsf = $self->_mtime_path;
-  open (F,">$tsf") or $self->throw("Couldn't open $tsf: $!");
-  print F scalar(localtime);
-  close F;
+  open my $F, '>', $tsf or $self->throw("Could not write file '$tsf': $!");
+  print $F scalar(localtime);
+  close $F;
 }
 
 sub _store {
@@ -1597,11 +1597,6 @@ sub serializer {
     my $serializer = shift;
     eval "require $serializer; 1" or croak $@;
     $self->setting(serializer=>$serializer);
-    if ($serializer eq 'Storable') {
-      $Storable::forgive_me =1;
-      $Storable::Deparse = 1;
-      $Storable::Eval    = 1;
-    }
   }
   $d;
 }
@@ -2482,8 +2477,11 @@ sub freeze {
     my $d    = Data::Dumper->new([$obj]);
     $d->Terse(1);
     $d->Deepcopy(1);
+    $d->Deparse(1);
     $data = $d->Dump;
   } elsif ($serializer eq 'Storable') {
+    local $Storable::forgive_me = 1;
+    local $Storable::Deparse = 1;
     $data = Storable::nfreeze($obj);
   }
 
@@ -2553,6 +2551,8 @@ sub thaw_object {
   if ($serializer eq 'Data::Dumper') {
     $object = eval $obj;
   } elsif ($serializer eq 'Storable') {
+    local $Storable::forgive_me = 1;
+    local $Storable::Eval = 1;
     $object = Storable::thaw($obj);
   }
 
@@ -519,31 +519,35 @@ sub postprocess_data
 		$self->throw("Please provide the function name");
 	}
 
-	#set up verbosity level if need record in the log file
+    #set up verbosity level if need record in the log file
     my $log_msg = "Writing into '$LOGFILENAME' log file.\n";
     my $now = strftime("%a %b %e %H:%M:%S %Y", localtime);
     if ($lcontent eq "") {
         $self->debug($log_msg);
-        open (my $LOG, '>>', $LOGFILENAME);
+        open my $LOG, '>>', $LOGFILENAME or $self->throw("Could not append file '$LOGFILENAME': $!");
         print $LOG "$now		$funcname. No reply.\n";
+        close $LOG;
         return;
     }
     elsif ($lcontent =~ /HTTP::Request error/) {
         $self->debug($log_msg);
-        open (my $LOG, '>>', $LOGFILENAME);
+        open my $LOG, '>>', $LOGFILENAME or $self->throw("Could not append file '$LOGFILENAME': $!");
         print $LOG "$now		$funcname. Http::Request error problem.\n";
+        close $LOG;
         return;
     }
     elsif ($lcontent =~ /SEQHOUND_ERROR/) {
         $self->debug($log_msg);
-        open (my $LOG, '>>', $LOGFILENAME);
+        open my $LOG, '>>', $LOGFILENAME or $self->throw("Could not append file '$LOGFILENAME': $!");
         print $LOG "$now	$funcname error. SEQHOUND_ERROR found.\n";
+        close $LOG;
         return;
     }
     elsif ($lcontent =~ /SEQHOUND_NULL/) {
         $self->debug($log_msg);
-        open (my $LOG, '>>', $LOGFILENAME);
+        open my $LOG, '>>', $LOGFILENAME or $self->throw("Could not append file '$LOGFILENAME': $!");
         print $LOG "$now	$funcname Value not found in the database. SEQHOUND_NULL found.\n";
+        close $LOG;
         return;
     }
     else {
@@ -551,14 +555,16 @@ sub postprocess_data
         my @lines = split(/\n/, $lcontent, 2);
         if ($lines[1] =~ /^-1/) {
             $self->debug($log_msg);
-            open (my $LOG, '>>', $LOGFILENAME);
+            open my $LOG, '>>', $LOGFILENAME or $self->throw("Could not append file '$LOGFILENAME': $!");
             print $LOG "$now	$funcname Value not found in the database. -1 found.\n";
+            close $LOG;
             return;
         }
         elsif ($lines[1]  =~ /^0/) {
             $self->debug($log_msg);
-            open (my $LOG, '>>', $LOGFILENAME);
+            open my $LOG, '>>', $LOGFILENAME or $self->throw("Could not append file '$LOGFILENAME': $!");
             print $LOG "$now	$funcname failed.\n";
+            close $LOG;
             return;
         }
         else {
@@ -60,7 +60,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Ewan Birney
 
@@ -81,7 +81,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Brian Osborne
 
@@ -58,7 +58,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Brian Osborne
 
@@ -85,7 +85,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -84,7 +84,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Sendu Bala
 
@@ -785,56 +785,63 @@ sub _build_index {
     # don't strictly need it
     
     my $index_dir = $self->index_directory;
-    my $gene_index = "$index_dir/gene.dat.index";
+    my $gene_index      = "$index_dir/gene.dat.index";
     my $reference_index = "$index_dir/reference.dat.index";
-    my $matrix_index = "$index_dir/matrix.dat.index";
-    my $factor_index = "$index_dir/factor.dat.index";
-    my $fragment_index = "$index_dir/fragment.dat.index";
-    my $site_index = "$index_dir/site.dat.index";
+    my $matrix_index    = "$index_dir/matrix.dat.index";
+    my $factor_index    = "$index_dir/factor.dat.index";
+    my $fragment_index  = "$index_dir/fragment.dat.index";
+    my $site_index      = "$index_dir/site.dat.index";
     
     my $reference_dat = "$dat_dir/reference.dat";
     if (! -e $reference_index || $force) {
-        open(REF, $reference_dat) || $self->throw("Cannot open reference file '$reference_dat' for reading");
+        open my $REF, '<', $reference_dat or $self->throw("Could not read reference file '$reference_dat': $!");
         
         my %references;
         unlink $reference_index;
-        my $ref = tie(%references, 'DB_File', $reference_index, O_RDWR|O_CREAT, 0644, $DB_HASH) || $self->throw("Cannot open file '$reference_index': $!");	
+        my $ref = tie(%references, 'DB_File', $reference_index, O_RDWR|O_CREAT, 0644, $DB_HASH)
+            or $self->throw("CCould not open file '$reference_index': $!");
         
         my %pubmed;
         my $reference_pubmed = $reference_index.'.pubmed';
         unlink $reference_pubmed;
-        my $pub = tie(%pubmed, 'DB_File', $reference_pubmed, O_RDWR|O_CREAT, 0644, $DB_BTREE) || $self->throw("Cannot open file '$reference_pubmed': $!");
+        my $pub = tie(%pubmed, 'DB_File', $reference_pubmed, O_RDWR|O_CREAT, 0644, $DB_BTREE)
+            or $self->throw("Could not open file '$reference_pubmed': $!");
         
         my %gene;
         my $reference_gene = $gene_index.'.reference';
         unlink $reference_gene;
-        my $gene = tie(%gene, 'DB_File', $reference_gene, O_RDWR|O_CREAT, 0644, $DB_BTREE) || $self->throw("Cannot open file '$reference_gene': $!");
+        my $gene = tie(%gene, 'DB_File', $reference_gene, O_RDWR|O_CREAT, 0644, $DB_BTREE)
+            or $self->throw("Could not open file '$reference_gene': $!");
         
         my %site;
         my $reference_site = $site_index.'.reference';
         unlink $reference_site;
-        my $site = tie(%site, 'DB_File', $reference_site, O_RDWR|O_CREAT, 0644, $DB_BTREE) || $self->throw("Cannot open file '$reference_site': $!");
+        my $site = tie(%site, 'DB_File', $reference_site, O_RDWR|O_CREAT, 0644, $DB_BTREE)
+            or $self->throw("Could not open file '$reference_site': $!");
         
         my %fragment;
         my $reference_fragment = $fragment_index.'.reference';
         unlink $reference_fragment;
-        my $fragment = tie(%fragment, 'DB_File', $reference_fragment, O_RDWR|O_CREAT, 0644, $DB_BTREE) || $self->throw("Cannot open file '$reference_fragment': $!");
+        my $fragment = tie(%fragment, 'DB_File', $reference_fragment, O_RDWR|O_CREAT, 0644, $DB_BTREE)
+            or $self->throw("Could not open file '$reference_fragment': $!");
         
         my %factor;
         my $reference_factor = $factor_index.'.reference';
         unlink $reference_factor;
-        my $factor = tie(%factor, 'DB_File', $reference_factor, O_RDWR|O_CREAT, 0644, $DB_BTREE) || $self->throw("Cannot open file '$reference_factor': $!");
+        my $factor = tie(%factor, 'DB_File', $reference_factor, O_RDWR|O_CREAT, 0644, $DB_BTREE)
+            or $self->throw("Could not open file '$reference_factor': $!");
         
         my %matrix;
         my $reference_matrix = $matrix_index.'.reference';
         unlink $reference_matrix;
-        my $matrix = tie(%matrix, 'DB_File', $reference_matrix, O_RDWR|O_CREAT, 0644, $DB_BTREE) || $self->throw("Cannot open file '$reference_matrix': $!");
+        my $matrix = tie(%matrix, 'DB_File', $reference_matrix, O_RDWR|O_CREAT, 0644, $DB_BTREE)
+            or $self->throw("Could not open file '$reference_matrix': $!");
         
         # skip the first three header lines
-        <REF>; <REF>; <REF>;
+        <$REF>; <$REF>; <$REF>;
         
         my @data;
-        while (<REF>) {
+        while (<$REF>) {
             if (/^AC  (\S+)/) {
                 $data[0] = $1;
             }
@@ -870,12 +877,15 @@ sub _build_index {
                 # end of a record, store previous data and reset
                 
                 # accession = pubmed authors title location
-                $references{$data[0]} = join(SEPARATOR, ($data[1] || '', $data[2] || '', $data[3] || '', $data[4] || ''));
+                $references{$data[0]} = join(SEPARATOR, ($data[1] || '',
+                                                         $data[2] || '',
+                                                         $data[3] || '',
+                                                         $data[4] || ''));
                 
                 @data = ();
             }
         }
-        close(REF);
+        close $REF;
         
         $ref = $pub = $gene = $site = $fragment = $factor = $matrix = undef;
         untie %references;
@@ -889,52 +899,60 @@ sub _build_index {
     
     my $gene_dat = "$dat_dir/gene.dat";
     if (! -e $gene_index || $force) {
-        open(GEN, $gene_dat) || $self->throw("Cannot open gene file '$gene_dat' for reading");
+        open my $GEN, '<', $gene_dat or $self->throw("Could not read gene file '$gene_dat': $!");
         
         my %genes;
         unlink $gene_index;
-        my $gene = tie(%genes, 'DB_File', $gene_index, O_RDWR|O_CREAT, 0644, $DB_HASH) || $self->throw("Cannot open file '$gene_index': $!");	
+        my $gene = tie(%genes, 'DB_File', $gene_index, O_RDWR|O_CREAT, 0644, $DB_HASH)
+            or $self->throw("Could not open file '$gene_index': $!");
         
         my %id;
         my $gene_id = $gene_index.'.id';
         unlink $gene_id;
-        my $id = tie(%id, 'DB_File', $gene_id, O_RDWR|O_CREAT, 0644, $DB_BTREE) || $self->throw("Cannot open file '$gene_id': $!");
+        my $id = tie(%id, 'DB_File', $gene_id, O_RDWR|O_CREAT, 0644, $DB_BTREE)
+            or $self->throw("Could not open file '$gene_id': $!");
         
         my %name;
         my $gene_name = $gene_index.'.name';
         unlink $gene_name;
-        my $name = tie(%name, 'DB_File', $gene_name, O_RDWR|O_CREAT, 0644, $DB_BTREE) || $self->throw("Cannot open file '$gene_name': $!");
+        my $name = tie(%name, 'DB_File', $gene_name, O_RDWR|O_CREAT, 0644, $DB_BTREE)
+            or $self->throw("Could not open file '$gene_name': $!");
         
         my %species;
         my $gene_species = $gene_index.'.species';
         unlink $gene_species;
-        my $species = tie(%species, 'DB_File', $gene_species, O_RDWR|O_CREAT, 0644, $DB_BTREE) || $self->throw("Cannot open file '$gene_species': $!");
+        my $species = tie(%species, 'DB_File', $gene_species, O_RDWR|O_CREAT, 0644, $DB_BTREE)
+            or $self->throw("Could not open file '$gene_species': $!");
         
         my %site;
         my $gene_site = $site_index.'.gene';
         unlink $gene_site;
-        my $site = tie(%site, 'DB_File', $gene_site, O_RDWR|O_CREAT, 0644, $DB_BTREE) || $self->throw("Cannot open file '$gene_site': $!");
+        my $site = tie(%site, 'DB_File', $gene_site, O_RDWR|O_CREAT, 0644, $DB_BTREE)
+            or $self->throw("Could not open file '$gene_site': $!");
         
         my %factor;
         my $gene_factor = $factor_index.'.gene';
         unlink $gene_factor;
-        my $factor = tie(%factor, 'DB_File', $gene_factor, O_RDWR|O_CREAT, 0644, $DB_BTREE) || $self->throw("Cannot open file '$gene_factor': $!");
+        my $factor = tie(%factor, 'DB_File', $gene_factor, O_RDWR|O_CREAT, 0644, $DB_BTREE)
+            or $self->throw("Could not open file '$gene_factor': $!");
         
         my %fragment;
         my $gene_fragment = $fragment_index.'.gene';
         unlink $gene_fragment;
-        my $fragment = tie(%fragment, 'DB_File', $gene_fragment, O_RDWR|O_CREAT, 0644, $DB_BTREE) || $self->throw("Cannot open file '$gene_fragment': $!");
+        my $fragment = tie(%fragment, 'DB_File', $gene_fragment, O_RDWR|O_CREAT, 0644, $DB_BTREE)
+            or $self->throw("Could not open file '$gene_fragment': $!");
         
         my %reference;
         my $gene_reference = $reference_index.'.gene';
         unlink $gene_reference;
-        my $reference = tie(%reference, 'DB_File', $gene_reference, O_RDWR|O_CREAT, 0644, $DB_BTREE) || $self->throw("Cannot open file '$gene_reference': $!");
+        my $reference = tie(%reference, 'DB_File', $gene_reference, O_RDWR|O_CREAT, 0644, $DB_BTREE)
+            or $self->throw("Could not open file '$gene_reference': $!");
         
         # skip the first three header lines
-        <GEN>; <GEN>; <GEN>;
+        <$GEN>; <$GEN>; <$GEN>;
         
         my @data;
-        while (<GEN>) {
+        while (<$GEN>) {
             if (/^AC  (\S+)/) {
                 $data[0] = $1;
             }
@@ -976,12 +994,15 @@ sub _build_index {
                 # end of a record, store previous data and reset
                 
                 # accession = id name description species_tax_id_or_raw_string
-                $genes{$data[0]} = join(SEPARATOR, ($data[1] || '', $data[2] || '', $data[3] || '', $data[4] || ''));
+                $genes{$data[0]} = join(SEPARATOR, ($data[1] || '',
+                                                    $data[2] || '',
+                                                    $data[3] || '',
+                                                    $data[4] || ''));
                 
                 @data = ();
             }
         }
-        close(GEN);
+        close $GEN;
         
         $gene = $id = $name = $species = $site = $factor = $reference = undef;
         untie %genes;
@@ -995,52 +1016,60 @@ sub _build_index {
     
     my $site_dat = "$dat_dir/site.dat";
     if (! -e $site_index || $force) {
-        open(SIT, $site_dat) || $self->throw("Cannot open site file '$site_dat' for reading");
+        open my $SIT, '<', $site_dat or $self->throw("Could not read site file '$site_dat': $!");
         
         my %sites;
         unlink $site_index;
-        my $site = tie(%sites, 'DB_File', $site_index, O_RDWR|O_CREAT, 0644, $DB_HASH) || $self->throw("Cannot open file '$site_index': $!");
+        my $site = tie(%sites, 'DB_File', $site_index, O_RDWR|O_CREAT, 0644, $DB_HASH)
+            or $self->throw("Could not open file '$site_index': $!");
         
         my %id;
         my $site_id = $site_index.'.id';
         unlink $site_id;
-        my $id = tie(%id, 'DB_File', $site_id, O_RDWR|O_CREAT, 0644, $DB_BTREE) || $self->throw("Cannot open file '$site_id': $!");
+        my $id = tie(%id, 'DB_File', $site_id, O_RDWR|O_CREAT, 0644, $DB_BTREE)
+            or $self->throw("Could not open file '$site_id': $!");
         
         my %species;
         my $site_species = $site_index.'.species';
         unlink $site_species;
-        my $species = tie(%species, 'DB_File', $site_species, O_RDWR|O_CREAT, 0644, $DB_BTREE) || $self->throw("Cannot open file '$site_species': $!");
+        my $species = tie(%species, 'DB_File', $site_species, O_RDWR|O_CREAT, 0644, $DB_BTREE)
+            or $self->throw("Could not open file '$site_species': $!");
         
         my %qualities;
         my $site_qualities = $site_index.'.qual';
         unlink $site_qualities;
-        my $quality = tie(%qualities, 'DB_File', $site_qualities, O_RDWR|O_CREAT, 0644, $DB_HASH) || $self->throw("Cannot open file '$site_qualities': $!");
+        my $quality = tie(%qualities, 'DB_File', $site_qualities, O_RDWR|O_CREAT, 0644, $DB_HASH)
+            or $self->throw("Could not open file '$site_qualities': $!");
         
         my %gene;
         my $site_gene = $gene_index.'.site';
         unlink $site_gene;
-        my $gene = tie(%gene, 'DB_File', $site_gene, O_RDWR|O_CREAT, 0644, $DB_BTREE) || $self->throw("Cannot open file '$site_gene': $!");
+        my $gene = tie(%gene, 'DB_File', $site_gene, O_RDWR|O_CREAT, 0644, $DB_BTREE)
+            or $self->throw("Could not open file '$site_gene': $!");
         
         my %matrix;
         my $site_matrix = $matrix_index.'.site';
         unlink $site_matrix;
-        my $matrix = tie(%matrix, 'DB_File', $site_matrix, O_RDWR|O_CREAT, 0644, $DB_BTREE) || $self->throw("Cannot open file '$site_matrix': $!");
+        my $matrix = tie(%matrix, 'DB_File', $site_matrix, O_RDWR|O_CREAT, 0644, $DB_BTREE)
+            or $self->throw("Could not open file '$site_matrix': $!");
         
         my %factor;
         my $site_factor = $factor_index.'.site';
         unlink $site_factor;
-        my $factor = tie(%factor, 'DB_File', $site_factor, O_RDWR|O_CREAT, 0644, $DB_BTREE) || $self->throw("Cannot open file '$site_factor': $!");	
+        my $factor = tie(%factor, 'DB_File', $site_factor, O_RDWR|O_CREAT, 0644, $DB_BTREE)
+            or $self->throw("Could not open file '$site_factor': $!");
         
         my %reference;
         my $site_reference = $reference_index.'.site';
         unlink $site_reference;
-        my $reference = tie(%reference, 'DB_File', $site_reference, O_RDWR|O_CREAT, 0644, $DB_BTREE) || $self->throw("Cannot open file '$site_reference': $!");
+        my $reference = tie(%reference, 'DB_File', $site_reference, O_RDWR|O_CREAT, 0644, $DB_BTREE)
+            or $self->throw("Could not open file '$site_reference': $!");
         
         # skip the first three header lines
-        <SIT>; <SIT>; <SIT>;
+        <$SIT>; <$SIT>; <$SIT>;
         
         my @data;
-        while (<SIT>) {
+        while (<$SIT>) {
             if (/^AC  (\S+)/) {
                 $data[0] = $1;
             }
@@ -1101,12 +1130,19 @@ sub _build_index {
                 # end of a record, store previous data and reset
                 
                 # accession = id gene_id sequence relative_to first_position last_position species_tax_id_or_raw_string type
-                $sites{$data[0]} = join(SEPARATOR, ($data[1] || '', $data[2] || '', $data[3] || '', $data[4] || 'TSS', $data[5] || '', $data[6] || '', $data[7] || '', $data[8] || ''));
+                $sites{$data[0]} = join(SEPARATOR, ($data[1] || '',
+                                                    $data[2] || '',
+                                                    $data[3] || '',
+                                                    $data[4] || 'TSS',
+                                                    $data[5] || '',
+                                                    $data[6] || '',
+                                                    $data[7] || '',
+                                                    $data[8] || ''));
                 
                 @data = ();
             }
         }
-        close(SIT);
+        close $SIT;
         
         $site = $id = $species = $quality = $gene = $matrix = $factor = $reference = undef;
         untie %sites;
@@ -1121,44 +1157,50 @@ sub _build_index {
     
     my $matrix_dat = "$dat_dir/matrix.dat";
     if (! -e $matrix_index || $force) {
-        open(MAT, $matrix_dat) || $self->throw("Cannot open matrix file '$matrix_dat' for reading");
+        open my $MAT, '<', $matrix_dat or $self->throw("Could not read matrix file '$matrix_dat': $!");
         
         my %matrices;
         unlink $matrix_index;
-        my $matrix = tie(%matrices, 'DB_File', $matrix_index, O_RDWR|O_CREAT, 0644, $DB_HASH) || $self->throw("Cannot open file '$matrix_index': $!");	
+        my $matrix = tie(%matrices, 'DB_File', $matrix_index, O_RDWR|O_CREAT, 0644, $DB_HASH)
+            or $self->throw("Could not open file '$matrix_index': $!");
         
         my %id;
         my $matrix_id = $matrix_index.'.id';
         unlink $matrix_id;
-        my $id = tie(%id, 'DB_File', $matrix_id, O_RDWR|O_CREAT, 0644, $DB_BTREE) || $self->throw("Cannot open file '$matrix_id': $!");
+        my $id = tie(%id, 'DB_File', $matrix_id, O_RDWR|O_CREAT, 0644, $DB_BTREE)
+            or $self->throw("Could not open file '$matrix_id': $!");
         
         my %name;
         my $matrix_name = $matrix_index.'.name';
         unlink $matrix_name;
-        my $name = tie(%name, 'DB_File', $matrix_name, O_RDWR|O_CREAT, 0644, $DB_BTREE) || $self->throw("Cannot open file '$matrix_name': $!");
+        my $name = tie(%name, 'DB_File', $matrix_name, O_RDWR|O_CREAT, 0644, $DB_BTREE)
+            or $self->throw("Could not open file '$matrix_name': $!");
         
         my %site;
         my $matrix_site = $site_index.'.matrix';
         unlink $matrix_site;
-        my $site = tie(%site, 'DB_File', $matrix_site, O_RDWR|O_CREAT, 0644, $DB_BTREE) || $self->throw("Cannot open file '$matrix_site': $!");
+        my $site = tie(%site, 'DB_File', $matrix_site, O_RDWR|O_CREAT, 0644, $DB_BTREE)
+            or $self->throw("Could not open file '$matrix_site': $!");
         
         my %factor;
         my $matrix_factor = $factor_index.'.matrix';
         unlink $matrix_factor;
-        my $factor = tie(%factor, 'DB_File', $matrix_factor, O_RDWR|O_CREAT, 0644, $DB_BTREE) || $self->throw("Cannot open file '$matrix_factor': $!");
+        my $factor = tie(%factor, 'DB_File', $matrix_factor, O_RDWR|O_CREAT, 0644, $DB_BTREE)
+            or $self->throw("Could not open file '$matrix_factor': $!");
         
         my %reference;
         my $matrix_reference = $reference_index.'.matrix';
         unlink $matrix_reference;
-        my $reference = tie(%reference, 'DB_File', $matrix_reference, O_RDWR|O_CREAT, 0644, $DB_BTREE) || $self->throw("Cannot open file '$matrix_reference': $!");
+        my $reference = tie(%reference, 'DB_File', $matrix_reference, O_RDWR|O_CREAT, 0644, $DB_BTREE)
+            or $self->throw("Could not open file '$matrix_reference': $!");
         
         # skip the first three header lines
-        <MAT>; <MAT>; <MAT>;
+        <$MAT>; <$MAT>; <$MAT>;
         
         my @data;
         my @matrix_data;
         my @site_data;
-        while (<MAT>) {
+        while (<$MAT>) {
             if (/^AC  (\S+)/) {
                 $data[0] = $1;
             }
@@ -1228,12 +1270,17 @@ sub _build_index {
                 my $site_data = join(INTERNAL_SEPARATOR, @site_data) || '';
                 
                 # accession = id name description num_of_sites matrix_data site_data
-                $matrices{$data[0]} = join(SEPARATOR, ($data[1] || '', $data[2] || '', $data[3] || '', $data[4], $matrix_data, $site_data));
+                $matrices{$data[0]} = join(SEPARATOR, ($data[1] || '',
+                                                       $data[2] || '',
+                                                       $data[3] || '',
+                                                       $data[4],
+                                                       $matrix_data,
+                                                       $site_data));
                 
                 @data = @matrix_data = @site_data = ();
             }
         }
-        close(MAT);
+        close $MAT;
         
         $matrix = $id = $name = $site = $factor = $reference = undef;
         untie %matrices;
@@ -1246,63 +1293,73 @@ sub _build_index {
     
     my $factor_dat = "$dat_dir/factor.dat";
     if (! -e $factor_index || $force) {
-        open(FAC, $factor_dat) || $self->throw("Cannot open factor file '$factor_dat' for reading");
+        open my $FAC, '<', $factor_dat or $self->throw("Could not read factor file '$factor_dat': $!");
         
         my %factors;
         unlink $factor_index;
-        my $factor = tie(%factors, 'DB_File', $factor_index, O_RDWR|O_CREAT, 0644, $DB_HASH) || $self->throw("Cannot open file '$factor_index': $!");	
+        my $factor = tie(%factors, 'DB_File', $factor_index, O_RDWR|O_CREAT, 0644, $DB_HASH)
+            or $self->throw("Could not open file '$factor_index': $!");
         
         my %id;
         my $factor_id = $factor_index.'.id';
         unlink $factor_id;
-        my $id = tie(%id, 'DB_File', $factor_id, O_RDWR|O_CREAT, 0644, $DB_BTREE) || $self->throw("Cannot open file 'factor_id': $!");
+        my $id = tie(%id, 'DB_File', $factor_id, O_RDWR|O_CREAT, 0644, $DB_BTREE)
+            or $self->throw("Could not open file '$factor_id': $!");
         
         my %name;
         my $factor_name = $factor_index.'.name';
         unlink $factor_name;
-        my $name = tie(%name, 'DB_File', $factor_name, O_RDWR|O_CREAT, 0644, $DB_BTREE) || $self->throw("Cannot open file '$factor_name': $!");
+        my $name = tie(%name, 'DB_File', $factor_name, O_RDWR|O_CREAT, 0644, $DB_BTREE)
+            or $self->throw("Could not open file '$factor_name': $!");
         
         my %species;
         my $factor_species = $factor_index.'.species';
         unlink $factor_species;
-        my $species = tie(%species, 'DB_File', $factor_species, O_RDWR|O_CREAT, 0644, $DB_BTREE) || $self->throw("Cannot open file '$factor_species': $!");
+        my $species = tie(%species, 'DB_File', $factor_species, O_RDWR|O_CREAT, 0644, $DB_BTREE)
+            or $self->throw("Could not open file '$factor_species': $!");
         
         my %interactors;
         my $factor_interactors = $factor_index.'.interactors';
         unlink $factor_interactors;
-        my $interact = tie(%interactors, 'DB_File', $factor_interactors, O_RDWR|O_CREAT, 0644, $DB_BTREE) || $self->throw("Cannot open file '$factor_interactors': $!");
+        my $interact = tie(%interactors, 'DB_File', $factor_interactors, O_RDWR|O_CREAT, 0644, $DB_BTREE)
+            or $self->throw("Could not open file '$factor_interactors': $!");
         
         my %gene;
         my $factor_gene = $gene_index.'.factor';
         unlink $factor_gene;
-        my $gene = tie(%gene, 'DB_File', $factor_gene, O_RDWR|O_CREAT, 0644, $DB_BTREE) || $self->throw("Cannot open file '$factor_gene': $!");
+        my $gene = tie(%gene, 'DB_File', $factor_gene, O_RDWR|O_CREAT, 0644, $DB_BTREE)
+            or $self->throw("Could not open file '$factor_gene': $!");
         
         my %matrix;
         my $factor_matrix = $matrix_index.'.factor';
         unlink $factor_matrix;
-        my $matrix = tie(%matrix, 'DB_File', $factor_matrix, O_RDWR|O_CREAT, 0644, $DB_BTREE) || $self->throw("Cannot open file '$factor_matrix': $!");
+        my $matrix = tie(%matrix, 'DB_File', $factor_matrix, O_RDWR|O_CREAT, 0644, $DB_BTREE)
+            or $self->throw("Could not open file '$factor_matrix': $!");
         
         my %site;
         my $factor_site = $site_index.'.factor';
         unlink $factor_site;
-        my $site = tie(%site, 'DB_File', $factor_site, O_RDWR|O_CREAT, 0644, $DB_BTREE) || $self->throw("Cannot open file '$factor_site': $!");
+        my $site = tie(%site, 'DB_File', $factor_site, O_RDWR|O_CREAT, 0644, $DB_BTREE)
+            or $self->throw("Could not open file '$factor_site': $!");
         
         my %fragment;
         my $factor_fragment = $fragment_index.'.factor';
         unlink $factor_fragment;
-        my $fragment = tie(%fragment, 'DB_File', $factor_fragment, O_RDWR|O_CREAT, 0644, $DB_BTREE) || $self->throw("Cannot open file '$factor_fragment': $!");
+        my $fragment = tie(%fragment, 'DB_File', $factor_fragment, O_RDWR|O_CREAT, 0644, $DB_BTREE)
+            or $self->throw("Could not open file '$factor_fragment': $!");
         
         my %reference;
         my $factor_reference = $reference_index.'.factor';
         unlink $factor_reference;
-        my $reference = tie(%reference, 'DB_File', $factor_reference, O_RDWR|O_CREAT, 0644, $DB_BTREE) || $self->throw("Cannot open file '$factor_reference': $!");
+        my $reference = tie(%reference, 'DB_File', $factor_reference, O_RDWR|O_CREAT, 0644, $DB_BTREE)
+            or $self->throw("Could not open file '$factor_reference': $!");
         
         # skip the first three header lines
-        <FAC>; <FAC>; <FAC>;
+        <$FAC>; <$FAC>; <$FAC>;
         
         my @data;
         my $sequence = '';
-        while (<FAC>) {
+        while (<$FAC>) {
             if (/^AC  (\S+)/) {
                 $data[0] = $1;
             }
@@ -1350,13 +1407,16 @@ sub _build_index {
                 # end of a record, store previous data and reset
                 
                 # accession = id name species sequence
-                $factors{$data[0]} = join(SEPARATOR, ($data[1] || '', $data[2] || '', $data[3] || '', $sequence));
+                $factors{$data[0]} = join(SEPARATOR, ($data[1] || '',
+                                                      $data[2] || '',
+                                                      $data[3] || '',
+                                                      $sequence));
                 
                 @data = ();
                 $sequence = '';
             }
         }
-        close(FAC);
+        close $FAC;
         
         $factor = $id = $name = $species = $interact = $gene = $matrix = $site = $fragment = $reference = undef;
         untie %factors;
@@ -1373,46 +1433,53 @@ sub _build_index {
     
     my $fragment_dat = "$dat_dir/fragment.dat";
     if (! -e $fragment_index || $force) {
-        if (open(FRA, $fragment_dat)) {
+        if (open my $FRA, '<', $fragment_dat) {
             my %fragments;
             unlink $fragment_index;
-            my $fragment = tie(%fragments, 'DB_File', $fragment_index, O_RDWR|O_CREAT, 0644, $DB_HASH) || $self->throw("Cannot open file '$fragment_index': $!");
+            my $fragment = tie(%fragments, 'DB_File', $fragment_index, O_RDWR|O_CREAT, 0644, $DB_HASH)
+                or $self->throw("Could not open file '$fragment_index': $!");
             
             my %id;
             my $fragment_id = $fragment_index.'.id';
             unlink $fragment_id;
-            my $id = tie(%id, 'DB_File', $fragment_id, O_RDWR|O_CREAT, 0644, $DB_BTREE) || $self->throw("Cannot open file '$fragment_id': $!");
+            my $id = tie(%id, 'DB_File', $fragment_id, O_RDWR|O_CREAT, 0644, $DB_BTREE)
+                or $self->throw("Could not open file '$fragment_id': $!");
             
             my %qualities;
             my $fragment_qualities = $fragment_index.'.qual';
             unlink $fragment_qualities;
-            my $quality = tie(%qualities, 'DB_File', $fragment_qualities, O_RDWR|O_CREAT, 0644, $DB_HASH) || $self->throw("Cannot open file '$fragment_qualities': $!");
+            my $quality = tie(%qualities, 'DB_File', $fragment_qualities, O_RDWR|O_CREAT, 0644, $DB_HASH)
+                or $self->throw("Could not open file '$fragment_qualities': $!");
             
             my %species;
             my $fragment_species = $fragment_index.'.species';
             unlink $fragment_species;
-            my $species = tie(%species, 'DB_File', $fragment_species, O_RDWR|O_CREAT, 0644, $DB_BTREE) || $self->throw("Cannot open file '$fragment_species': $!");
+            my $species = tie(%species, 'DB_File', $fragment_species, O_RDWR|O_CREAT, 0644, $DB_BTREE)
+                or $self->throw("Could not open file '$fragment_species': $!");
             
             my %gene;
             my $fragment_gene = $gene_index.'.fragment';
             unlink $fragment_gene;
-            my $gene = tie(%gene, 'DB_File', $fragment_gene, O_RDWR|O_CREAT, 0644, $DB_BTREE) || $self->throw("Cannot open file '$fragment_gene': $!");
+            my $gene = tie(%gene, 'DB_File', $fragment_gene, O_RDWR|O_CREAT, 0644, $DB_BTREE)
+                or $self->throw("Could not open file '$fragment_gene': $!");
             
             my %factor;
             my $fragment_factor = $factor_index.'.fragment';
             unlink $fragment_factor;
-            my $factor = tie(%factor, 'DB_File', $fragment_factor, O_RDWR|O_CREAT, 0644, $DB_BTREE) || $self->throw("Cannot open file '$fragment_factor': $!");	
+            my $factor = tie(%factor, 'DB_File', $fragment_factor, O_RDWR|O_CREAT, 0644, $DB_BTREE)
+                or $self->throw("Could not open file '$fragment_factor': $!");
             
             my %reference;
             my $fragment_reference = $reference_index.'.fragment';
             unlink $fragment_reference;
-            my $reference = tie(%reference, 'DB_File', $fragment_reference, O_RDWR|O_CREAT, 0644, $DB_BTREE) || $self->throw("Cannot open file '$fragment_reference': $!");
+            my $reference = tie(%reference, 'DB_File', $fragment_reference, O_RDWR|O_CREAT, 0644, $DB_BTREE)
+                or $self->throw("Could not open file '$fragment_reference': $!");
             
             # skip the first three header lines
-            <FRA>; <FRA>; <FRA>;
+            <$FRA>; <$FRA>; <$FRA>;
             
             my @data;
-            while (<FRA>) {
+            while (<$FRA>) {
                 if (/^AC  (\S+)/) {
                     $data[0] = $1;
                 }
@@ -1457,12 +1524,17 @@ sub _build_index {
                     # end of a record, store previous data and reset
                     
                     # accession = id gene_id1 gene_id2 species_tax_id_or_raw_string sequence source
-                    $fragments{$data[0]} = join(SEPARATOR, ($data[1] || '', $data[2] || '', $data[3] || '', $data[4] || '', $data[5] || '', $data[6] || ''));
+                    $fragments{$data[0]} = join(SEPARATOR, ($data[1] || '',
+                                                            $data[2] || '',
+                                                            $data[3] || '',
+                                                            $data[4] || '',
+                                                            $data[5] || '',
+                                                            $data[6] || ''));
                     
                     @data = ();
                 }
             }
-            close(FRA);
+            close $FRA;
             
             $fragment = $id = $species = $quality = $gene = $factor = $reference = undef;
             untie %fragments;
@@ -1474,7 +1546,7 @@ sub _build_index {
             untie %reference;
         }
         else {
-            $self->warn("Cannot open fragment file '$fragment_dat' for reading, assuming you have an old version of Transfac Pro with no fragment.dat file.");
+            $self->warn("Could not read fragment file '$fragment_dat', assuming you have an old version of Transfac Pro with no fragment.dat file");
         }
     }
 }
@@ -1884,4 +1956,15 @@ sub _species_to_taxid {
     return $ncbi_taxid;
 }
 
+sub DESTROY {
+    my $self = shift;
+    # Destroy tied references to close filehandles
+    # and allow proper temporary files deletion
+    undef $self->{_tax_db}->{'_nodes'};
+    undef $self->{_tax_db}->{'_id2name'};
+    undef $self->{_tax_db}->{'_name2id'};
+    undef $self->{_tax_db}->{'_parent2children'};
+    undef $self->{_tax_db}->{'_parentbtree'};
+}
+
 1;
@@ -73,7 +73,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Sendu Bala
 
@@ -81,7 +81,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -472,7 +472,7 @@ sub get_taxonids {
         $DATA_CACHE->{name_to_id}->{$query} = [@data];
     }
     
-    wantarray() ? @data : shift @data;
+    return wantarray() ? @data : shift @data;
 }
 
 *get_taxonid = \&get_taxonids;
@@ -60,7 +60,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -362,8 +362,8 @@ sub _build_index {
     
     if (! -e $nodeindex || $force) {
         my (%parent2children,@nodes);
-        open(NODES,$nodesfile) || 
-            $self->throw("Cannot open node file '$nodesfile' for reading");
+        open my $NODES, '<', $nodesfile
+            or $self->throw("Could not read node file '$nodesfile': $!");
         
         unlink $nodeindex;
         unlink $parent2childindex;
@@ -372,7 +372,7 @@ sub _build_index {
         my $btree = tie( %parent2children, 'DB_File', $parent2childindex, O_RDWR|O_CREAT, 0644, $DB_BTREE) || 
             $self->throw("Cannot tie to file '$parent2childindex': $!");
         
-        while (<NODES>) {
+        while (<$NODES>) {
             next if /^$/;
             chomp;
             my ($taxid,$parent,$rank,$code,$divid,undef,$gen_code,undef,$mito) = split(/\t\|\t/,$_);
@@ -386,7 +386,7 @@ sub _build_index {
             $nodes[$taxid] = join(SEPARATOR, ($taxid,$parent,$rank,$code,$divid,$gen_code,$mito));
             $btree->put($parent,$taxid);
         }
-        close(NODES);
+        close $NODES;
         
         $nh = $btree = undef;
         untie @nodes ;
@@ -394,8 +394,8 @@ sub _build_index {
     }
     
     if ((! -e $name2idindex || -z $name2idindex) || (! -e $id2nameindex || -z $id2nameindex) || $force) { 
-        open(NAMES,$namesfile) || 
-            $self->throw("Cannot open names file '$namesfile' for reading");
+        open my $NAMES, '<', $namesfile
+            or $self->throw("Could not read names file '$namesfile': $!");
         
         unlink $name2idindex;
         unlink $id2nameindex;
@@ -405,7 +405,7 @@ sub _build_index {
         my $nameh = tie ( %name2id, 'DB_File', $name2idindex, O_RDWR|O_CREAT, 0644, $DB_HASH) || 
             $self->throw("Cannot tie to file '$name2idindex': $!");
         
-        while (<NAMES>) {
+        while (<$NAMES>) {
             next if /^$/;
             chomp; 
             my ($taxid, $name, $unique_name, $class) = split(/\t\|\t/,$_);
@@ -455,7 +455,7 @@ sub _build_index {
             }
             $id2name[$taxid] = join(SEPARATOR, @names);
         }
-        close(NAMES);
+        close $NAMES;
         
         $idh = $nameh = undef;
         untie( %name2id);
@@ -519,4 +519,19 @@ sub index_directory {
 }
 
 
+sub DESTROY {
+    my $self = shift;
+    # Destroy all filehandle references
+    # to be able to remove temporary files
+    undef $self->{_id2name};
+    undef $self->{_name2id};
+    undef $self->{_nodes};
+    undef $self->{_parent2children};
+    undef $self->{_parentbtree};
+    unlink catfile($self->{index_directory},'id2names');
+    unlink catfile($self->{index_directory},'names2id');
+    unlink catfile($self->{index_directory},'nodes');
+    unlink catfile($self->{index_directory},'parents');
+}
+
 1;
@@ -68,7 +68,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Florent Angly
 
@@ -123,7 +123,7 @@ sub _build_taxonomy {
 
    my $taxonomy = Bio::DB::Taxonomy::list->new();
 
-   open my $fh, '<', $taxofile or $self->throw("Could not read file $taxofile: $!");
+   open my $fh, '<', $taxofile or $self->throw("Could not read file '$taxofile': $!");
 
    # Will skip header line: prokMSA_id	taxonomy
    my $prev_taxo_string = 'taxonomy'; 
@@ -70,7 +70,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Sendu Bala
 
@@ -65,7 +65,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Florent Angly
 
@@ -124,7 +124,7 @@ sub _build_taxonomy {
    # One could open the file using Bio::SeqIO::fasta, but it is slower and we
    # only need the sequence descriptions
 
-   open my $in, '<', $taxofile or $self->throw("Could not read file '$taxofile': $!\n");
+   open my $in, '<', $taxofile or $self->throw("Could not read file '$taxofile': $!");
 
    # Populate taxonomy with taxonomy obtained from sequence description
    while (my $line = <$in>) {
@@ -57,7 +57,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -91,7 +91,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Ewan Birney
 
@@ -62,7 +62,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/           
+  https://github.com/bioperl/bioperl-live/issues           
 
 =head1 APPENDIX
 
@@ -64,7 +64,7 @@ Report bugs to the Bioperl bug tracking system to
 help us keep track the bugs and their resolution.
 Bug reports can be submitted via the web.
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -101,9 +101,9 @@ use base qw(Bio::DB::RandomAccessI);
 BEGIN {
 	$MODVERSION = '0.8';
 	%RETRIEVAL_TYPES = ('io_string' => 1,
-								 'tempfile'  => 1,
-								 'pipeline'  => 1,
-							 );
+			    'tempfile'  => 1,
+			    'pipeline'  => 1,
+			  );
 	$DEFAULT_RETRIEVAL_TYPE = 'pipeline';
 	$DEFAULTFORMAT = 'fasta';
 	$LAST_INVOCATION_TIME = 0;
@@ -164,6 +164,11 @@ sub get_Seq_by_id {
     }
     my @seqs;
     while( my $seq = $seqio->next_seq() ) { push @seqs, $seq; }
+
+    # Since $seqio will not be used anymore, explicitly close its filehandle
+    # or it will cause trouble later on cleanup
+    $seqio->close;
+
     $self->throw("id '$seqid' does not exist") unless @seqs;
     if( wantarray ) { return @seqs } else { return shift @seqs }
 }
@@ -444,7 +449,7 @@ sub get_seq_stream {
 	}
 	my $request = $self->get_request(%qualifiers);
 	$request->proxy_authorization_basic($self->authentication)
-	  if ( $self->authentication);
+	    if ( $self->authentication);
 	$self->debug("request is ". $request->as_string(). "\n");
 
 	# workaround for MSWin systems
@@ -462,15 +467,15 @@ sub get_seq_stream {
 		my ($result,$stream) = $self->_open_pipe();
 
 		if (defined $result) {
-			$DB::fork_TTY = File::Spec->devnull; # prevents complaints from debugge
+			$DB::fork_TTY = File::Spec->devnull; # prevents complaints from debugger
 			if (!$result) { # in child process
-			        $self->_stream_request($request,$stream);
-			        POSIX::_exit(0); #prevent END blocks from executing in this forked child
+			    $self->_stream_request($request,$stream);
+			    POSIX::_exit(0); #prevent END blocks from executing in this forked child
 			}
 			else {
 				return Bio::SeqIO->new('-verbose' => $self->verbose,
-											  '-format'  => $ioformat,
-											  '-fh'      => $stream);
+						       '-format'  => $ioformat,
+						       '-fh'      => $stream);
 			}
 		}
 		else {
@@ -487,12 +492,13 @@ sub get_seq_stream {
 			$self->throw("WebDBSeqI Error - check query sequences!\n");
 		}
 		$self->postprocess_data('type' => 'file',
-								'location' => $tmpfile);
+				        'location' => $tmpfile);
 		# this may get reset when requesting batch mode
 		($rformat,$ioformat) = $self->request_format();
 		if( $self->verbose > 0 ) {
-			open(my $ERR, "<", $tmpfile);
+			open my $ERR, '<', $tmpfile or $self->throw("Could not read file '$tmpfile': $!");
 			while(<$ERR>) { $self->debug($_);}
+			close $ERR;
 		}
 
 		return Bio::SeqIO->new('-verbose' => $self->verbose,
@@ -509,11 +515,11 @@ sub get_seq_stream {
 		}
 		($rformat,$ioformat) = $self->request_format();
 		$self->postprocess_data('type'=> 'string',
-										'location' => $content);
+				        'location' => $content);
 		$self->debug( "str is $$content\n");
 		return Bio::SeqIO->new('-verbose' => $self->verbose,
-									  '-format' => $ioformat,
-									  '-fh'   => new IO::String($$content));
+				       '-format' => $ioformat,
+				       '-fh'   => new IO::String($$content));
 	}
 
 	# if we got here, we don't know how to handle the retrieval type
@@ -1,7 +1,7 @@
 #
 # BioPerl module for Bio::DBLinkContainerI
 #
-# Please direct questions and support issues to <bioperl-l@bioperl.org> 
+# Please direct questions and support issues to <bioperl-l@bioperl.org>
 #
 # Cared for by Heikki Lehvaslaiho <heikki-at-bioperl-dot-org>
 #
@@ -49,15 +49,15 @@ of the Bioperl mailing lists.  Your participation is much appreciated.
   bioperl-l@bioperl.org                  - General discussion
   http://bioperl.org/wiki/Mailing_lists  - About the mailing lists
 
-=head2 Support 
+=head2 Support
 
 Please direct usage questions or support issues to the mailing list:
 
 I<bioperl-l@bioperl.org>
 
-rather than to the module maintainer directly. Many experienced and 
-reponsive experts will be able look at the problem and quickly 
-address it. Please include a thorough description of the problem 
+rather than to the module maintainer directly. Many experienced and
+reponsive experts will be able look at the problem and quickly
+address it. Please include a thorough description of the problem
 with code and data examples if at all possible.
 
 =head2 Reporting Bugs
@@ -66,7 +66,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Heikki Lehvaslaiho
 
@@ -107,7 +107,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Lincoln Stein
 
@@ -92,7 +92,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Lincoln Stein
 
@@ -96,7 +96,7 @@ with code and data examples if at all possible.
 Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Lincoln Stein
 
@@ -55,7 +55,7 @@ with code and data examples if at all possible.
 Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Ewan Birney
 
@@ -113,7 +113,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Shawn Hoon
 
@@ -54,7 +54,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -78,7 +78,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -54,7 +54,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -51,7 +51,7 @@ report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Heikki Lehvaslaiho
 
@@ -54,7 +54,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -67,7 +67,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Hilmar Lapp
 
@@ -70,7 +70,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Hilmar Lapp
 
@@ -59,7 +59,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -74,7 +74,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Hilmar Lapp
 
@@ -71,7 +71,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Hilmar Lapp
 
@@ -56,7 +56,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -80,7 +80,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Hilmar Lapp, Jason Stajich
 
@@ -69,7 +69,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Hilmar Lapp, Jason Stajich
 
@@ -64,7 +64,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -101,7 +101,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Hilmar Lapp
 
@@ -57,7 +57,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -62,7 +62,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -68,7 +68,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Hilmar Lapp
 
@@ -118,7 +118,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Chris Fields
 
@@ -55,7 +55,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Lincoln Stein
 
@@ -81,7 +81,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Ewan Birney
 
@@ -65,7 +65,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Ewan Birney, James Gilbert
 
@@ -701,9 +701,7 @@ sub _file_handle {
 		my @rec = $self->unpack_record($self->db->{"__FILE_$i"})
 		  or $self->throw("Can't get filename for index : $i");
 		my $file = $rec[0];
-#		my $fh = Symbol::gensym();
-#		open $fh, '<', $file or $self->throw("Can't read file '$file' : $!");
-		open my $fh, '<', $file or $self->throw("Can't read file '$file' : $!");
+		open my $fh, '<', $file or $self->throw("Could not read file '$file': $!");
 		$self->{'_filehandle'}[$i] = $fh; # Cache filehandle
 	}
 	return $self->{'_filehandle'}[$i];
@@ -839,8 +837,11 @@ sub count_records {
 =cut
 
 sub DESTROY {
-	my $self = shift;
-	untie($self->{'_DB'});
+    my $self = shift;
+    untie($self->{'_DB'});
+    # An additional undef was the only way to force
+    # the object to drop the open filehandles for ActivePerl
+    undef $self->{'_DB'};
 }
 
 1;
@@ -60,7 +60,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Ewan Birney
 
@@ -89,7 +89,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -211,7 +211,7 @@ sub _index_file {
 		          # of the last found record.
 	  );
 
-	open(my $BLAST, '<', $file) or $self->throw("cannot open file $file\n");
+	open my $BLAST, '<', $file or $self->throw("Could not read file '$file': $!");
 
 	my (@data, @records);
 	my $indexpoint = 0;
@@ -87,7 +87,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -189,7 +189,7 @@ sub _index_file {
 		 $i,    # Index-number of file being indexed
 	  ) = @_;
 
-	open(my $BLAST, '<', $file) or $self->throw("cannot open file $file\n");
+	open my $BLAST, '<', $file or $self->throw("Could not read file '$file': $!");
 	my $indexpoint = 0;
 	my $lastline = 0;
     my $last_query = '';
@@ -84,7 +84,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Ewan Birney
 
@@ -144,7 +144,7 @@ sub _index_file {
 
     $begin = 0;
 
-    open my $EMBL, '<', $file or $self->throw("Can't open file for read : $file");
+    open my $EMBL, '<', $file or $self->throw("Could not read file '$file': $!");
 
     # In Windows, text files have '\r\n' as line separator, but when reading in
     # text mode Perl will only show the '\n'. This means that for a line "ABC\r\n",
@@ -105,7 +105,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - James Gilbert
 
@@ -178,7 +178,7 @@ sub _index_file {
 
     my $id_parser = $self->id_parser;
 
-    open my $FASTA, '<', $file or $self->throw("Can't open file for read : $file");
+    open my $FASTA, '<', $file or $self->throw("Could not read file '$file': $!");
 
     # In Windows, text files have '\r\n' as line separator, but when reading in
     # text mode Perl will only show the '\n'. This means that for a line "ABC\r\n",
@@ -80,7 +80,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Tony Cox
 
@@ -156,7 +156,7 @@ sub _index_file {
 
     my $id_parser = $self->id_parser;
     my $c = 0;
-    open my $FASTQ, '<', $file or $self->throw("Can't open file for read : $file");
+    open my $FASTQ, '<', $file or $self->throw("Could not read file '$file': $!");
 
     # In Windows, text files have '\r\n' as line separator, but when reading in
     # text mode Perl will only show the '\n'. This means that for a line "ABC\r\n",
@@ -95,7 +95,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Ewan Birney
 
@@ -149,8 +149,7 @@ sub _index_file {
 
     my $id_parser = $self->id_parser;
 
-    open my $GENBANK, '<', $file or 
-	$self->throw("Can't open file for read : $file");
+    open my $GENBANK, '<', $file or $self->throw("Could not read file '$file': $!");
 
     my %done_ids;
 
@@ -101,7 +101,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Josh Lauricha
 
@@ -276,7 +276,7 @@ sub _index_file {
 	my($self, $file, $i) = @_;
 	my($begin);
 
-	open(my $HMMER, '<', $file) or $self->throw("cannot open file $file");
+	open my $HMMER, '<', $file or $self->throw("Could not read file '$file': $!");
 
 	my $id;
 	my $indexpoint = 0;
@@ -102,7 +102,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - James Gilbert, Mark Johnson
 
@@ -178,7 +178,7 @@ sub _index_file {
 
 	my $id_parser = $self->id_parser;
 
-	open my $QUAL, '<', $file or $self->throw("Can't open file for read : $file");
+	open my $QUAL, '<', $file or $self->throw("Could not read file '$file': $!");
 
 	# In Windows, text files have '\r\n' as line separator, but when reading in
 	# text mode Perl will only show the '\n'. This means that for a line "ABC\r\n",
@@ -89,7 +89,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Chris Fields
 
@@ -210,8 +210,7 @@ sub _index_file {
 
   my $id_parser = $self->id_parser;
 
-  open my $STOCKHOLM, '<', $file or 
-  $self->throw("Can't open file for read : $file");
+  open my $STOCKHOLM, '<', $file or $self->throw("Could not read file '$file': $!");
 
   my %done_ids;
     
@@ -78,7 +78,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/project/bioperl
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Ewan Birney
 
@@ -136,7 +136,7 @@ sub _index_file {
     $begin = 0;
     $end   = 0;
 
-    open my $SP, '<', $file or $self->throw("Can't open file for read : $file");
+    open my $SP, '<', $file or $self->throw("Could not read file '$file': $!");
 
     # In Windows, text files have '\r\n' as line separator, but when reading in
     # text mode Perl will only show the '\n'. This means that for a line "ABC\r\n",
@@ -96,7 +96,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Ewan Birney
 
@@ -149,7 +149,7 @@ sub _index_file {
 
 	my $id_parser = $self->id_parser;
 
-	open my $SWISSPROT,'<',$file or $self->throw("Can't read file: $file");
+	open my $SWISSPROT, '<', $file or $self->throw("Could not read file '$file': $!");
     
         my %done_ids;
 
@@ -57,7 +57,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Joseph A.L. Insana
 
@@ -873,12 +873,14 @@ sub _checkfeatureproximity {
 
 sub _get_alignment {
   my ($self,$seq1,$seq2)=@_;
+
+  my $null = ($^O =~ m/mswin/i) ? 'NUL' : '/dev/null';
   my $fastafile1="/tmp/tmpfastafile1";
   my $fastafile2="/tmp/tmpfastafile2";
   my $grepcut='egrep -v "[[:digit:]]|^ *$|sequences" | cut -c8-'; # grep/cut
-  my $alignprogram="/usr/local/etc/bioinfo/fasta2/align -s /usr/local/etc/bioinfo/fasta2/idnaa.mat $fastafile1 $fastafile2 2>/dev/null | $grepcut"; # ALIGN
-  open my $TMPFASTAFILE1,">$fastafile1" || croak "Cannot write into $fastafile1 for aa alignment";
-  open my $TMPFASTAFILE2,">$fastafile2" || croak "Cannot write into $fastafile1 for aa alignment";
+  my $alignprogram="/usr/local/etc/bioinfo/fasta2/align -s /usr/local/etc/bioinfo/fasta2/idnaa.mat $fastafile1 $fastafile2 2>$null | $grepcut"; # ALIGN
+  open my $TMPFASTAFILE1, '>', $fastafile1 or croak "Could not write file '$fastafile1' for aa alignment: $!";
+  open my $TMPFASTAFILE2, '>', $fastafile2 or croak "Could not write file '$fastafile2' for aa alignment: $!";
   print $TMPFASTAFILE1 ">firstseq\n$seq1\n";
   print $TMPFASTAFILE2 ">secondseq\n$seq2\n";
   close $TMPFASTAFILE1;
@@ -86,7 +86,7 @@ report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Heikki Lehvaslaiho
 
@@ -64,7 +64,7 @@ report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Heikki Lehvaslaiho & Joseph A.L. Insana
 
@@ -61,7 +61,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Joseph A.L. Insana
 
@@ -88,7 +88,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 APPENDIX
 
@@ -57,7 +57,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -59,7 +59,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Hilmar Lapp, Jason Stajich
 
@@ -64,7 +64,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Hilmar Lapp, Jason Stajich
 
@@ -63,7 +63,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -56,7 +56,7 @@ with code and data examples if at all possible.
 Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -57,7 +57,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Hilmar Lapp, Jason Stajich
 
@@ -65,7 +65,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Heikki Lehvaslaiho
 
@@ -76,7 +76,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -603,6 +603,80 @@ sub end_pos_type {
     return ( @locs ) ? $locs[0]->end_pos_type() : undef;    
 }
 
+=head2 length
+
+ Title   : length
+ Usage   : $len = $loc->length();
+ Function: get the length in the coordinate space this location spans
+ Example :
+ Returns : an integer
+ Args    : none
+
+=cut
+
+sub length {
+    my ($self) = @_;
+    my $length = 0;
+    # Mixed strand values means transplicing (where exons can even
+    # be in different chromosomes), so in that case only give the sum
+    # of the lengths of the individual segments
+    if (! defined $self->guide_strand) {
+        for my $loc ( $self->sub_Location(0) ) {
+            $length += abs($loc->end - $loc->start) + 1
+        }
+    }
+    else {
+        my @sublocs = $self->sub_Location(0);
+        my $start   = $sublocs[0]->start;
+        my $end     = $sublocs[-1]->end;
+
+        # If Start > ·End, its a possible case of cut by origin
+        # location in circular sequences (e.g "join(16..20,1..2)")
+        if ($start > $end) {
+            # Figure out which segments are located before
+            # and which are located after coordinate 1
+            # (END_SEQ - 1 - START_SEQ)
+            my @end_seq_segments;
+            my @start_seq_segments;
+            my $switch = 0;
+            foreach my $subloc (@sublocs) {
+                if ($switch == 0) {
+                    if ($subloc->start == 1) {
+                        $switch = 1;
+                        push @start_seq_segments, $subloc;
+                    }
+                    else {
+                        push @end_seq_segments, $subloc;
+                    }
+                }
+                else {
+                    push @start_seq_segments, $subloc;
+                }
+            }
+
+            # If its a cut by origin location, sum the whole length of each group
+            if (scalar @end_seq_segments > 0 and @start_seq_segments > 0) {
+                my $end_segments_length   = abs(  $end_seq_segments[0]->start
+                                                - $end_seq_segments[-1]->end)
+                                                + 1;
+                my $start_segments_length = abs(  $start_seq_segments[0]->start
+                                                - $start_seq_segments[-1]->end)
+                                                + 1;
+                $length = $end_segments_length + $start_segments_length;
+            }
+        }
+        else {
+            $length = $end - $start + 1;
+        }
+    }
+
+    # If for some reason nothing worked, fall back to previous behaviour
+    if ($length == 0) {
+        $length = abs($self->end - $self->start) + 1
+    }
+
+    return $length;
+}
 
 =head2 seq_id
 
@@ -60,7 +60,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -57,7 +57,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Hilmar Lapp, Jason Stajich
 
@@ -56,7 +56,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -62,7 +62,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Gaurav Gupta
 
@@ -75,7 +75,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Gaurav Gupta
 
@@ -62,7 +62,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Heikki Lehvaslaiho
 
@@ -53,7 +53,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Heikki Lehvaslaiho 
 
@@ -79,7 +79,7 @@ report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Heikki Lehvaslaiho
 
@@ -56,7 +56,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Sendu Bala
 
@@ -68,7 +68,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Gaurav Gupta
 
@@ -436,4 +436,4 @@ sub set_positions{
    }
 }
 
-1;
\ No newline at end of file
+1;
@@ -83,7 +83,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Sendu Bala
 
@@ -105,7 +105,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Sendu Bala
 
@@ -87,7 +87,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Sendu Bala
 
@@ -67,7 +67,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Sendu Bala
 
@@ -67,7 +67,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Chad Matsalla
 
@@ -59,7 +59,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Chad Matsalla
 
@@ -57,7 +57,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -71,7 +71,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Sendu Bala
 
@@ -57,7 +57,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -102,7 +102,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Chad Matsalla
 
@@ -55,7 +55,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -65,7 +65,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Chad Matsalla
 
@@ -73,7 +73,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Chad Matsalla
 
@@ -76,7 +76,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Chad Matsalla
 
@@ -96,7 +96,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Gaurav Gupta
 
@@ -1127,6 +1127,8 @@ sub _calc_markerposition {
 	@sortedctgmarker = sort { $a->{'contig'} <=> $b->{'contig'}
 				                  ||
 				  $b->{'start'}  <=> $a->{'start'}
+				                  ||
+				  $b->{'end'}    <=> $a->{'end'}
 			        } @ctgmarker;
 				
 	my $ctg = -1;
@@ -1155,7 +1157,7 @@ sub _calc_markerposition {
 		
 		$depth = $save_depth = 1;
 	    }
-	    elsif ($sortedctgmarker[$i] <= $y) {
+	    elsif ($sortedctgmarker[$i]->{'end'} <= $y) {
 		$stack[$depth++] = $sortedctgmarker[$i]->{'end'};
 		# MAX
 		if ($x < $sortedctgmarker[$i]->{'start'} ) {
@@ -1323,4 +1325,4 @@ sub _setContigRef {
     %{$self->{'_contigs'}} = %{$ref};
 }
 
-1;
\ No newline at end of file
+1;
@@ -73,7 +73,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -85,7 +85,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Sendu Bala
 
@@ -57,7 +57,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Sendu Bala
 
@@ -65,7 +65,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -60,7 +60,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Sendu Bala
 
@@ -96,7 +96,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Sendu Bala
 
@@ -81,7 +81,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Sendu Bala
 
@@ -58,7 +58,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Sendu Bala
 
@@ -71,7 +71,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -79,7 +79,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Sendu Bala
 
@@ -141,9 +141,9 @@ sub next_map{
 
     if ($map->core_exists()) {
         $corfile = substr($filename,0,length($filename)-3)."cor";
-        if (open(CORE,$corfile)) {
-            while(read(CORE,$BUFFER,2)) {
-                push(@cordata,unpack('n*', $BUFFER));
+        if (open my $CORE, '<', $corfile) {
+            while( read($CORE, $BUFFER, 2) ) {
+                push @cordata, unpack('n*', $BUFFER);
             }
         }
         else {
@@ -510,7 +510,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Gaurav Gupta
 
@@ -538,4 +538,4 @@ For more information on this project, please refer:
 The rest of the documentation details each of the object methods.
 Internal methods are usually preceded with a _
 
-=cut
\ No newline at end of file
+=cut
@@ -61,7 +61,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -59,7 +59,7 @@ with code and data examples if at all possible.
 Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -67,7 +67,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -57,7 +57,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Sendu Bala
 
@@ -54,7 +54,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -54,7 +54,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -58,7 +58,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -268,7 +268,7 @@ sub TIEHANDLE {
 
 sub READLINE {
   my $self = shift;
-  return $self->{'matrixio'}->next_tree() unless wantarray;
+  return $self->{'matrixio'}->next_tree() || undef unless wantarray;
   my (@list,$obj);
   push @list,$obj  while $obj = $self->{'treeio'}->next_tree();
   return @list;
@@ -55,7 +55,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 email or the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -59,7 +59,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Sendu Bala
 
@@ -46,7 +46,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Stefan Kirov
 
@@ -62,7 +62,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Stefan Kirov
 
@@ -41,7 +41,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Stefan Kirov
 
@@ -41,7 +41,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - James Thompson
 
@@ -40,7 +40,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Stefan Kirov
 
@@ -95,7 +95,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Stefan Kirov
 
@@ -67,7 +67,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head2 Description
 
@@ -60,7 +60,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Stefan Kirov
 
@@ -174,7 +174,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - James Thompson
 
@@ -88,7 +88,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - James Thompson
 
@@ -102,7 +102,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Stefan Kirov
 
@@ -41,7 +41,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Stefan Kirov
 
@@ -69,7 +69,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Stefan Kirov
 
@@ -107,7 +107,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Stefan Kirov
 
@@ -137,7 +137,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Stefan Kirov
 
@@ -96,7 +96,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Stefan Kirov
 
@@ -82,7 +82,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Shawn Hoon
 
@@ -52,7 +52,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -62,7 +62,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -60,7 +60,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Chase Miller
 
@@ -86,7 +86,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Chase Miller
 
@@ -63,7 +63,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Allen Day
 
@@ -77,7 +77,7 @@ with code and data examples if at all possible.
 Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -70,7 +70,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Peter Dimitrov
 
@@ -533,7 +533,7 @@ sub to_string {
         $s .= "-- Name:\n";
         $s .= $self->name() . "\n";
         $s .= "-- Definition:\n";
-        $s .= $self->definition() . "\n";
+        $s .= ( $self->definition() || '' ) . "\n";
         $s .= "-- Category:\n";
         if ( defined( $self->ontology() ) ) {
             $s .= $self->ontology()->name() . "\n";
@@ -51,7 +51,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -50,7 +50,7 @@ with code and data examples if at all possible.
 Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -91,7 +91,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Hilmar Lapp
 
@@ -76,7 +76,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Peter Dimitrov
 
@@ -69,7 +69,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 email or the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Hilmar Lapp
 
@@ -83,7 +83,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Hilmar Lapp
 
@@ -68,7 +68,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -68,7 +68,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Hilmar Lapp
 
@@ -80,7 +80,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -74,7 +74,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Hilmar Lapp
 
@@ -79,7 +79,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Peter Dimitrov
 
@@ -66,7 +66,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -97,7 +97,7 @@ report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -60,7 +60,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Peter Dimitrov
 
@@ -75,7 +75,7 @@ with code and data examples if at all possible.
 Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -74,7 +74,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Hilmar Lapp
 
@@ -73,7 +73,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -97,7 +97,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -61,7 +61,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Peter Dimitrov
 
@@ -66,7 +66,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Peter Dimitrov
 
@@ -77,7 +77,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -76,7 +76,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -63,7 +63,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -74,7 +74,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -75,7 +75,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -77,7 +77,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Hilmar Lapp
 
@@ -150,7 +150,7 @@ Report bugs to the Bioperl bug tracking system to
 help us keep track the bugs and their resolution.
 Bug reports can be submitted via the web.
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -95,7 +95,7 @@ with code and data examples if at all possible.
 Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution. Bug reports can be submitted via the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Ewan Birney
 
@@ -79,7 +79,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -74,7 +74,7 @@ report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -86,7 +86,7 @@ report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -77,7 +77,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -69,7 +69,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -66,7 +66,7 @@ report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -73,7 +73,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -149,7 +149,7 @@ report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -96,7 +96,7 @@ report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -96,7 +96,7 @@ report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -32,9 +32,9 @@ Bio::PhyloNetwork::GraphViz - Interface between PhyloNetwork and GraphViz
 
   print $gv->as_text;
 
-  open PS, "> net.ps";
-  print PS $gv->as_ps;
-  close PS;
+  open my $PS, '>', "net.ps" or die "Could not write file 'net.ps': $!\n";
+  print $PS $gv->as_ps;
+  close $PS;
 
 =head1 DESCRIPTION
 
@@ -62,7 +62,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -52,7 +52,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 email or the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -290,7 +290,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Pedro M. Gomez-Fabre
 
@@ -76,7 +76,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -62,7 +62,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Rich Dobson
 
@@ -65,7 +65,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Rich Dobson
 
@@ -60,7 +60,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -66,7 +66,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -333,7 +333,7 @@ sub TIEHANDLE {
 
 sub READLINE {
   my $self = shift;
-  return $self->{'processor'}->next_result() unless wantarray;
+  return $self->{'processor'}->next_result() || undef unless wantarray;
   my (@list, $obj);
   push @list, $obj while $obj = $self->{'processor'}->next_result();
   return @list;
@@ -55,7 +55,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -60,7 +60,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 email or the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -60,7 +60,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -64,7 +64,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 email or the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -54,7 +54,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -77,7 +77,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 email or the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -71,7 +71,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 email or the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -78,7 +78,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich, Matthew Hahn
 
@@ -69,7 +69,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 email or the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -145,7 +145,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich, Matthew Hahn
 
@@ -69,7 +69,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Pedro M. Gomez-Fabre
 
@@ -70,7 +70,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -108,7 +108,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Ewan Birney
 
@@ -470,13 +470,12 @@ sub subseq {
  Title   : length
  Usage   : $len = $seqobj->length();
  Function: Get the stored length of the sequence in number of symbols (bases
-           or amino acids).
+           or amino acids). In some circumstances, you can also set this attribute:
 
-           In some circumstances, you can also set this attribute:
-           1/ For empty sequences, you can set the length to anything you want:
+           1. For empty sequences, you can set the length to anything you want:
               my $seqobj = Bio::PrimarySeq->new( -length => 123 );
               my $len = $seqobj->len; # 123
-           2/ To save memory when using very long sequences, you can set the
+           2. To save memory when using very long sequences, you can set the
               length of the sequence to the length of the sequence (and nothing
               else):
               my $seqobj = Bio::PrimarySeq->new( -seq => 'ACGT...' ); # 1 Mbp sequence
@@ -497,8 +496,7 @@ sub length {
     if (defined $val) {
         my $len = $self->{'length'};
         if ($len && ($len != $val)) {
-            $self->throw("You're trying to lie about the length: ".
-                "is $len but you say ".$val);
+            $self->throw("Can not set the length to $val, current length value is $len");
         }
         $self->{'length'} = $val;
         $self->{'_freeze_length'} = undef;
@@ -105,7 +105,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Ewan Birney
 
@@ -110,7 +110,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Sendu Bala
 
@@ -293,7 +293,7 @@ sub chunk {
             else {
                 unless ($FORCE_TEMP_FILE) {
                     # treat a string as a filehandle
-                    open(my $fake_fh, "+<", \$thing); # requires perl 5.8
+                    open my $fake_fh, "+<", \$thing or $self->throw("Could not open file '$thing': $!"); # requires perl 5.8
                     $self->{_chunk} = Bio::Root::IO->new(-fh => $fake_fh);
                 }
                 else {
@@ -71,7 +71,7 @@ with code and data examples if at all possible.
 Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via  the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Heikki Lehvaslaiho
 
@@ -66,7 +66,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Heikki Lehvaslaiho
 
@@ -165,7 +165,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -73,7 +73,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -67,7 +67,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -232,7 +232,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -122,7 +122,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -52,7 +52,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -55,7 +55,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -54,7 +54,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -51,7 +51,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -52,7 +52,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -53,7 +53,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -91,7 +91,7 @@ report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -1,19 +1,11 @@
-#
-# BioPerl module for Bio::Root::Build
-#
-# Please direct questions and support issues to <bioperl-l@bioperl.org>
-#
-# Cared for by Sendu Bala <bix@sendu.me.uk>
-#
-# Copyright Sendu Bala
-#
-# You may distribute this module under the same terms as perl itself
-
-# POD documentation - main docs before the code
-
-=head1 NAME
+package Bio::Root::Build;
+use strict;
+use warnings;
 
-Bio::Root::Build - A common Module::Build subclass base for BioPerl distributions
+# ABSTRACT: a common Module::Build subclass base for BioPerl distributions
+# AUTHOR:   Sendu Bala <bix@sendu.me.uk>
+# OWNER:    Sendu Bala
+# LICENSE:  Perl_5
 
 =head1 SYNOPSIS
 
@@ -37,66 +29,26 @@ those for Module::Build, and so caused serious issues with newer versions
 automatic installation of prereq modules via CPAN were also removed as they do
 not work with more modern perl tools such as perlbrew and cpanm.
 
-=head1 FEEDBACK
-
-=head2 Mailing Lists
-
-User feedback is an integral part of the evolution of this and other
-Bioperl modules. Send your comments and suggestions preferably to
-the Bioperl mailing list.  Your participation is much appreciated.
-
-  bioperl-l@bioperl.org                  - General discussion
-  http://bioperl.org/wiki/Mailing_lists  - About the mailing lists
-
-=head2 Support
-
-Please direct usage questions or support issues to the mailing list:
-
-I<bioperl-l@bioperl.org>
-
-rather than to the module maintainer directly. Many experienced and
-reponsive experts will be able look at the problem and quickly
-address it. Please include a thorough description of the problem
-with code and data examples if at all possible.
-
-=head2 Reporting Bugs
-
-Report bugs to the Bioperl bug tracking system to help us keep track
-of the bugs and their resolution. Bug reports can be submitted via
-the web:
-
-  https://redmine.open-bio.org/projects/bioperl/
-
-=head1 AUTHOR - Sendu Bala
-
-Email bix@sendu.me.uk
-
-=head1 APPENDIX
-
-The rest of the documentation details each of the object methods.
-Internal methods are usually preceded with a _
-
 =cut
 
-package Bio::Root::Build;
-
 BEGIN {
     # we really need Module::Build to be installed
-    eval "use base Module::Build; 1" or die "This package requires Module::Build v0.2805 or greater to install itself.\n$@";
+    eval "use base 'Module::Build'; 1" or die "This package requires Module::Build v0.2805 or greater to install itself.\n$@";
 
     # ensure we'll be able to reload this module later by adding its path to inc
     use Cwd;
     use lib Cwd::cwd();
 }
 
-use strict;
-use warnings;
-
-our $VERSION = '1.006923'; # pre-1.7
+our $VERSION = '1.006924'; # pre-1.7
 our @extra_types = qw(options excludes_os feature_requires test); # test must always be last in the list!
 our $checking_types = "requires|conflicts|".join("|", @extra_types);
 
-# our modules are in Bio, not lib
+=head2 find_pm_files
+
+Our modules are in Bio, not lib
+=cut
+
 sub find_pm_files {
     my $self = shift;
     foreach my $pm (@{$self->rscan_dir('Bio', qr/\.pm$/)}) {
@@ -106,7 +58,11 @@ sub find_pm_files {
     $self->_find_file_by_type('pm', 'lib');
 }
 
-# ask what scripts to install (this method is unique to bioperl)
+=head2 choose_scripts
+
+Ask what scripts to install (this method is unique to bioperl)
+=cut
+
 sub choose_scripts {
     my $self = shift;
     my $accept = shift;
@@ -174,9 +130,13 @@ sub choose_scripts {
     print "\n";
 }
 
-# our version of script_files doesn't take args but just installs those scripts
-# requested by the user after choose_scripts() is called. If it wasn't called,
-# installs all scripts in scripts directory
+=head2 script_files
+
+Our version of script_files doesn't take args but just installs those scripts
+requested by the user after choose_scripts() is called. If it wasn't called,
+installs all scripts in scripts directory
+=cut
+
 sub script_files {
     my $self = shift;
 
@@ -280,7 +240,8 @@ sub script_files {
 #    my $self = shift;
 #
 #    open (my $olderr, ">&". fileno(STDERR));
-#    open(STDERR, "/dev/null");
+#    my $null = ($^O =~ m/mswin/i) ? 'NUL' : '/dev/null';
+#    open(STDERR, $null);
 #    my $return = $self->SUPER::check_installed_status(@_);
 #    open(STDERR, ">&". fileno($olderr));
 #    return $return;
@@ -542,7 +503,11 @@ sub script_files {
 #    return $self->{under_cpan};
 #}
 
-# overridden simply to not print the default answer if chosen by hitting return
+=head2 prompt
+
+Overridden simply to not print the default answer if chosen by hitting return
+=cut
+
 sub prompt {
     my $self = shift;
     my $mess = shift or die "prompt() called without a prompt message";
@@ -571,8 +536,12 @@ EOF
     return $ans;
 }
 
-# like the Module::Build version, except that we always get version from
-# dist_version
+=head2 find_dist_packages
+
+Like the Module::Build version, except that we always get version from
+dist_version
+=cut
+
 sub find_dist_packages {
     my $self = shift;
 
@@ -678,8 +647,10 @@ sub find_dist_packages {
     }
 
     # Stringify versions
-    for (grep exists $_->{version}, values %prime) {
-        $_->{version} = $_->{version}->stringify if ref($_->{version});
+    for my $key ( grep { exists $prime{$_}->{version} }
+                  keys %prime ) {
+        $prime{$key}->{version}
+            = $prime{$key}->{version}->stringify if ref($prime{$key}->{version});
     }
 
     return \%prime;
@@ -748,10 +719,10 @@ sub find_dist_packages {
 #        }
 #    }
 #
-#    foreach (qw(manifest_skip post_install_scripts)) {
-#        my $file = File::Spec->catfile($self->config_dir, $_);
-#        $ph->{$_} = Module::Build::Notes->new(file => $file);
-#        $ph->{$_}->restore if -e $file;
+#    foreach my $piece (qw(manifest_skip post_install_scripts)) {
+#        my $file = File::Spec->catfile($self->config_dir, $piece);
+#        $ph->{$piece} = Module::Build::Notes->new(file => $file);
+#        $ph->{$piece}->restore if -e $file;
 #    }
 #
 #    return $self;
@@ -775,7 +746,7 @@ sub find_dist_packages {
 #    my $filedir  = File::Basename::dirname($filename);
 #
 #    File::Path::mkpath($filedir);
-#    warn "Can't create directory $filedir: $!" unless -d $filedir;
+#    warn "Could not create directory '$filedir': $!\n" unless -d $filedir;
 #
 #    File::Copy::copy($self_filename, $filename);
 #    warn "Unable to copy 'Bio/Root/Build.pm' to '$filename'\n" unless -e $filename;
@@ -788,8 +759,11 @@ sub find_dist_packages {
 #    $self->{phash}{manifest_skip}->write(\%files);
 #}
 
-# we always generate a new MANIFEST instead of allowing existing files to remain
-# MANIFEST.SKIP is left alone
+=head2 ACTION_manifest
+
+We always generate a new MANIFEST instead of allowing existing files to remain
+MANIFEST.SKIP is left alone
+=cut
 
 sub ACTION_manifest {
     my ($self) = @_;
@@ -809,7 +783,7 @@ sub ACTION_manifest {
 #
 #    my @extra = keys %{$self->{phash}{manifest_skip}->read};
 #    if (@extra) {
-#        open(my $fh, '>>', 'MANIFEST.SKIP') or die "Could not open MANIFEST.SKIP file\n";
+#        open(my $fh, '>>', 'MANIFEST.SKIP') or die "Could not append MANIFEST.SKIP file\n";
 #        print $fh "\n# Avoid additional run-time generated things\n";
 #        foreach my $line (@extra) {
 #            print $fh $line, "\n";
@@ -818,13 +792,21 @@ sub ACTION_manifest {
 #    }
 #}
 
-# extended to run scripts post-installation
+
+=head2 ACTION_install
+
+Extended to run scripts post-installation
+=cut
+
 sub ACTION_install {
-  my ($self) = @_;
-  require ExtUtils::Install;
-  $self->depends_on('build');
-  ExtUtils::Install::install($self->install_map, !$self->quiet, 0, $self->{args}{uninst}||0);
-  #$self->run_post_install_scripts;
+    my ($self) = @_;
+    require ExtUtils::Install;
+    $self->depends_on('build');
+    ExtUtils::Install::install($self->install_map,
+                               !$self->quiet,
+                               0,
+                               $self->{args}{uninst} || 0);
+    #$self->run_post_install_scripts;
 }
 
 #sub add_post_install_script {
@@ -841,12 +823,15 @@ sub ACTION_install {
 #    }
 #}
 
-# for use with auto_features, which should require LWP::UserAgent as one of
-# its reqs
+=head2 test_internet
 
-# Note: as of 4-11-11, this is no longer called - if someone wants to run
-# network tests (off by default) w/o a network, then they are hanging themselves
-# by their own shoelaces.
+For use with auto_features, which should require LWP::UserAgent as one of
+its reqs
+
+Note: as of 4-11-11, this is no longer called - if someone wants to run
+network tests (off by default) w/o a network, then they are hanging themselves
+by their own shoelaces.
+=cut
 
 sub test_internet {
     eval {require LWP::UserAgent;};
@@ -865,7 +850,11 @@ sub test_internet {
     return;
 }
 
-# nice directory names for dist-related actions
+=head2 dist_dir
+
+Nice directory names for dist-related actions
+=cut
+
 sub dist_dir {
     my ($self) = @_;
     my $version = $self->dist_version;
@@ -918,8 +907,12 @@ sub dist_dir {
 #    #$self->add_to_manifest_skip('pod2htm*');
 #}
 
-# don't copy across man3 docs since they're of little use under Windows and
-# have bad filenames
+=head2 ACTION_ppmdist
+
+Don't copy across man3 docs since they're of little use under Windows and
+have bad filenames
+=cut
+
 sub ACTION_ppmdist {
     my $self = shift;
     my @types = $self->install_types(1);
@@ -927,8 +920,12 @@ sub ACTION_ppmdist {
     $self->install_types(0);
 }
 
-# when supplied a true value, pretends libdoc doesn't exist (preventing man3
-# installation for ppmdist). when supplied false, they exist again
+=head2 install_types
+
+When supplied a true value, pretends libdoc doesn't exist (preventing man3
+installation for ppmdist). when supplied false, they exist again
+=cut
+
 sub install_types {
     my ($self, $no_libdoc) = @_;
     $self->{no_libdoc} = $no_libdoc if defined $no_libdoc;
@@ -1071,9 +1068,13 @@ sub install_types {
 #    return $ppd_file;
 #}
 
-# we make all archive formats we want, not just .tar.gz
-# we also auto-run manifest action, since we always want to re-create
-# MANIFEST and MANIFEST.SKIP just-in-time
+=head2 ACTION_dist
+
+We make all archive formats we want, not just .tar.gz
+we also auto-run manifest action, since we always want to re-create
+MANIFEST and MANIFEST.SKIP just-in-time
+=cut
+
 sub ACTION_dist {
     my ($self) = @_;
 
@@ -1087,8 +1088,11 @@ sub ACTION_dist {
     $self->delete_filetree($dist_dir);
 }
 
+=head2 ACTION_clean
+
+Define custom clean/realclean actions to rearrange config file cleanup
+=cut
 
-# define custom clean/realclean actions to rearrange config file cleanup
 sub ACTION_clean {
     my ($self) = @_;
     $self->log_info("Cleaning up build files\n");
@@ -1099,6 +1103,11 @@ sub ACTION_clean {
     $self->delete_filetree($self->config_dir);
 }
 
+=head2 ACTION_realclean
+
+Define custom clean/realclean actions to rearrange config file cleanup
+=cut
+
 sub ACTION_realclean {
     my ($self) = @_;
     $self->depends_on('clean');
@@ -1110,7 +1119,11 @@ sub ACTION_realclean {
     }
 }
 
-# makes zip file for windows users and bzip2 files as well
+=head2 make_zip
+
+Makes zip file for windows users and bzip2 files as well
+=cut
+
 sub make_zip {
     my ($self, $dir, $file) = @_;
     $file ||= $dir;
@@ -1129,14 +1142,19 @@ sub make_zip {
     $self->do_system($self->split_like_shell("bzip2"), "-k", "$file.tar");
 }
 
-# a method that can be called in a Build.PL script to ask the user if they want
-# internet tests.
-# Should only be called if you have tested for yourself that
-# $build->feature('Network Tests') is true
+=head2 prompt_for_network
+
+A method that can be called in a Build.PL script to ask the user if they want
+internet tests.
+Should only be called if you have tested for yourself that
+$build->feature('Network Tests') is true
+=cut
+
 sub prompt_for_network {
     my ($self, $accept) = @_;
 
-    my $proceed = $accept ? 0 : $self->y_n("Do you want to run tests that require connection to servers across the internet\n(likely to cause some failures)? y/n", 'n');
+    my $proceed = $accept ? 0 : $self->y_n(  "Do you want to run tests that require connection to servers across the internet\n"
+                                           . "(likely to cause some failures)? y/n", 'n');
 
     if ($proceed) {
         $self->notes('network' => 1);
@@ -1153,41 +1171,53 @@ sub prompt_for_network {
     }
 }
 
-# override the build script warnings flag
+=head2 print_build_script
+
+Override the build script warnings flag
+=cut
+
 sub print_build_script {
-  my ($self, $fh) = @_;
+    my ($self, $fh) = @_;
+
+    my $build_package = $self->build_class;
 
-  my $build_package = $self->build_class;
+    my $closedata="";
 
-  my $closedata="";
+    my $config_requires;
+    if ( -f $self->metafile ) {
+        my $meta = eval { $self->read_metafile( $self->metafile ) };
+        $config_requires = $meta && $meta->{configure_requires}{'Module::Build'};
+    }
+    $config_requires ||= 0;
 
-  my $config_requires;
-  if ( -f $self->metafile ) {
-    my $meta = eval { $self->read_metafile( $self->metafile ) };
-    $config_requires = $meta && $meta->{configure_requires}{'Module::Build'};
-  }
-  $config_requires ||= 0;
+    my %q = map {$_, $self->$_()} qw(config_dir base_dir);
 
-  my %q = map {$_, $self->$_()} qw(config_dir base_dir);
+    $q{base_dir} = Win32::GetShortPathName($q{base_dir}) if $self->is_windowsish;
 
-  $q{base_dir} = Win32::GetShortPathName($q{base_dir}) if $self->is_windowsish;
+    $q{magic_numfile} = $self->config_file('magicnum');
 
-  $q{magic_numfile} = $self->config_file('magicnum');
+    my @myINC = $self->_added_to_INC;
+    @myINC = map { $_ = File::Spec->canonpath( $_ );
+                   $_ =~ s/([\\\'])/\\$1/g;
+                   $_;
+                  } @myINC;
+    # Remove duplicates
+    @myINC = sort {$a cmp $b}
+             keys %{ { map { $_ => 1 } @myINC } };
 
-  my @myINC = $self->_added_to_INC;
-  for (@myINC, values %q) {
-    $_ = File::Spec->canonpath( $_ );
-    s/([\\\'])/\\$1/g;
-  }
+    foreach my $key (keys %q) {
+        $q{$key} = File::Spec->canonpath( $q{$key} );
+        $q{$key} =~ s/([\\\'])/\\$1/g;
+    }
 
-  my $quoted_INC = join ",\n", map "     '$_'", @myINC;
-  my $shebang = $self->_startperl;
-  my $magic_number = $self->magic_number;
+    my $quoted_INC = join ",\n", map "         '$_'", @myINC;
+    my $shebang = $self->_startperl;
+    my $magic_number = $self->magic_number;
 
-  # unique to bioperl, shut off overly verbose warnings on windows, bug 3215
-  my $w = $^O =~ /win/i ? '# no warnings (win)' : '$^W = 1;  # Use warnings';
+    # unique to bioperl, shut off overly verbose warnings on windows, bug 3215
+    my $w = $^O =~ /win/i ? '# no warnings (win)' : '$^W = 1;  # Use warnings';
 
-  print $fh <<EOF;
+    print $fh <<EOF;
 $shebang
 
 use strict;
@@ -1196,33 +1226,32 @@ use File::Basename;
 use File::Spec;
 
 sub magic_number_matches {
-  return 0 unless -e '$q{magic_numfile}';
-  local *FH;
-  open FH, '$q{magic_numfile}' or return 0;
-  my \$filenum = <FH>;
-  close FH;
-  return \$filenum == $magic_number;
+    return 0 unless -e '$q{magic_numfile}';
+    open my \$FH, '<', '$q{magic_numfile}' or return 0;
+    my \$filenum = <\$FH>;
+    close \$FH;
+    return \$filenum == $magic_number;
 }
 
 my \$progname;
 my \$orig_dir;
 BEGIN {
-  $w
-  \$progname = basename(\$0);
-  \$orig_dir = Cwd::cwd();
-  my \$base_dir = '$q{base_dir}';
-  if (!magic_number_matches()) {
-    unless (chdir(\$base_dir)) {
-      die ("Couldn't chdir(\$base_dir), aborting\\n");
-    }
-    unless (magic_number_matches()) {
-      die ("Configuration seems to be out of date, please re-run 'perl Build.PL' again.\\n");
+    $w
+    \$progname = basename(\$0);
+    \$orig_dir = Cwd::cwd();
+    my \$base_dir = '$q{base_dir}';
+    if (!magic_number_matches()) {
+        unless (chdir(\$base_dir)) {
+            die ("Could not chdir '\$base_dir', aborting\\n");
+        }
+        unless (magic_number_matches()) {
+            die ("Configuration seems to be out of date, please re-run 'perl Build.PL' again.\\n");
+        }
     }
-  }
-  unshift \@INC,
-    (
+    unshift \@INC,
+        (
 $quoted_INC
-    );
+        );
 }
 
 close(*DATA) unless eof(*DATA); # ensure no open handles to this script
@@ -1234,15 +1263,13 @@ Module::Build->VERSION(q{$config_requires});
 \$^X = Module::Build->find_perl_interpreter;
 
 if (-e 'Build.PL' and not $build_package->up_to_date('Build.PL', \$progname)) {
-   warn "Warning: Build.PL has been altered.  You may need to run 'perl Build.PL' again.\\n";
+    warn "Warning: Build.PL has been altered.  You may need to run 'perl Build.PL' again.\\n";
 }
 
 # This should have just enough arguments to be able to bootstrap the rest.
-my \$build = $build_package->resume (
-  properties => {
-    config_dir => '$q{config_dir}',
-    orig_dir => \$orig_dir,
-  },
+my \$build =
+    $build_package->resume( properties => { config_dir => '$q{config_dir}',
+                                              orig_dir   => \$orig_dir, },
 );
 
 \$build->dispatch;
@@ -1,17 +1,10 @@
-#-----------------------------------------------------------------
-#
-# BioPerl module Bio::Root::Exception
-#
-# Please direct questions and support issues to <bioperl-l@bioperl.org> 
-#
-# Cared for by Steve Chervitz <sac@bioperl.org>
-#
-# You may distribute this module under the same terms as perl itself
-#-----------------------------------------------------------------
-
-=head1 NAME
+package Bio::Root::Exception;
+use strict;
 
-Bio::Root::Exception - Generic exception objects for Bioperl
+# ABSTRACT: generic exception objects for Bioperl
+# AUTHOR:   Steve Chervitz <sac@bioperl.org>
+# OWNER:    2001 Steve Chervitz
+# LICENSE:  Perl_5
 
 =head1 SYNOPSIS
 
@@ -24,17 +17,17 @@ Bio::Root::Exception - Generic exception objects for Bioperl
     $Error::Debug = 1;
 
     $file = shift;
-    open (IN, $file) ||
-	    throw Bio::Root::FileOpenException ( "Can't open file $file for reading", $!);
+    open my $IN, '<', $file
+        or Bio::Root::FileOpenException->throw("Could not read file '$file': $!");
 
 =head2 Throwing exceptions using L<Bioperl throw|Bio::Root::Root/throw>:
 
-     # Here we have an object that ISA Bio::Root::Root, so it inherits throw().
+    # Here we have an object that ISA Bio::Root::Root, so it inherits throw().
 
-     open (IN, $file) || 
-                $object->throw(-class => 'Bio::Root::FileOpenException',
-                               -text => "Can't open file $file for reading",
-                               -value => $!);
+    open my $IN, '<', $file
+        or $object->throw(-class => 'Bio::Root::FileOpenException',
+                          -text  => "Could not read file '$file'",
+                          -value => $!);
 
 =head2 Catching and handling exceptions using L<Error.pm try|Error/try>:
 
@@ -46,27 +39,28 @@ Bio::Root::Exception - Generic exception objects for Bioperl
     # Set Error::Debug to include stack trace data in the error messages
     $Error::Debug = 1;
 
-    $file = shift;
+    my $file = shift;
+    my $IN;
     try {
-        open (IN, $file) ||
-	    throw Bio::Root::FileOpenException ( "Can't open file $file for reading", $!);
+        open $IN, '<', $file
+            or Bio::Root::FileOpenException->throw("Could not read file '$file': $!");
     }
     catch Bio::Root::FileOpenException with {
         my $err = shift;
         print STDERR "Using default input file: $default_file\n";
-        open (IN, $default_file) || die "Can't open $default_file";
+        open $IN, '<', $default_file or die "Could not read file '$default_file': $!";
     }
     otherwise {
         my $err = shift;
-    	print STDERR "An unexpected exception occurred: \n$err";
+        print STDERR "An unexpected exception occurred: \n$err";
 
-	# By placing an the error object reference within double quotes,
-	# you're invoking its stringify() method.
+        # By placing an the error object reference within double quotes,
+        # you're invoking its stringify() method.
     }
    finally {
        # Any code that you want to execute regardless of whether or not
        # an exception occurred.
-   };  
+   };
    # the ending semicolon is essential!
 
 
@@ -79,27 +73,17 @@ Bio::Root::Exception - Generic exception objects for Bioperl
 =head2 Exceptions defined in L<Bio::Root::Exception>
 
 These are generic exceptions for typical problem situations that could arise
-in any module or script. 
-
-=over 8
-
-=item Bio::Root::Exception()
-
-=item Bio::Root::NotImplemented()
-
-=item Bio::Root::IOException()
-
-=item Bio::Root::FileOpenException()
-
-=item Bio::Root::SystemException()
-
-=item Bio::Root::BadParameter()
-
-=item Bio::Root::OutOfRange()
-
-=item Bio::Root::NoSuchThing()
-
-=back
+in any module or script.
+
+=for :list
+* C<Bio::Root::Exception()>
+* C<Bio::Root::NotImplemented()>
+* C<Bio::Root::IOException()>
+* C<Bio::Root::FileOpenException()>
+* C<Bio::Root::SystemException()>
+* C<Bio::Root::BadParameter()>
+* C<Bio::Root::OutOfRange()>
+* C<Bio::Root::NoSuchThing()>
 
 Using defined exception classes like these is a good idea because it
 indicates the basic nature of what went wrong in a convenient,
@@ -141,55 +125,32 @@ Error.pm is not available.
 =head2 Throwing exceptions within Bioperl modules
 
 Error.pm is not part of the Bioperl distibution, and may not be
-present within  any given perl installation. So, when you want to 
+present within  any given perl installation. So, when you want to
 throw an exception in a Bioperl module, the safe way to throw it
-is to use L<Bio::Root::Root/throw> which can use Error.pm 
+is to use L<Bio::Root::Root/throw> which can use Error.pm
 when it's available. See documentation in Bio::Root::Root for details.
 
 =head1 SEE ALSO
 
-See the C<examples/exceptions> directory of the Bioperl distribution for 
+See the C<examples/exceptions> directory of the Bioperl distribution for
 working demo code.
 
-L<Bio::Root::Root/throw> for information about throwing 
+L<Bio::Root::Root/throw> for information about throwing
 L<Bio::Root::Exception>-based exceptions.
 
 L<Error> (available from CPAN, author: GBARR)
 
-Error.pm is helping to guide the design of exception handling in Perl 6. 
-See these RFC's: 
+Error.pm is helping to guide the design of exception handling in Perl 6.
+See these RFC's:
 
-     http://dev.perl.org/rfc/63.pod 
+     http://dev.perl.org/rfc/63.pod
 
      http://dev.perl.org/rfc/88.pod
 
-
-=head1 AUTHOR 
-
-Steve Chervitz E<lt>sac@bioperl.orgE<gt>
-
-=head1 COPYRIGHT
-
-Copyright (c) 2001 Steve Chervitz. All Rights Reserved.
-
-This library is free software; you can redistribute it and/or modify
-it under the same terms as Perl itself.
-
-=head1 DISCLAIMER
-
-This software is provided "as is" without warranty of any kind.
-
 =head1 EXCEPTIONS
 
 =cut
 
-# Define some generic exceptions.'
-
-package Bio::Root::Exception;
-use Bio::Root::Version;
-
-use strict;
-
 my $debug = $Error::Debug;  # Prevents the "used only once" warning.
 my $DEFAULT_VALUE = "__DUMMY__";  # Permits eval{} based handlers to work
 
@@ -218,10 +179,10 @@ my $DEFAULT_VALUE = "__DUMMY__";  # Permits eval{} based handlers to work
      You can also specify plain arguments as ($message, $value)
      where $value is optional.
 
-     -value, if defined, must be non-zero and not an empty string 
-     in order for eval{}-based exception handlers to work. 
-     These require that if($@) evaluates to true, which will not 
-     be the case if the Error has no value (Error overloads 
+     -value, if defined, must be non-zero and not an empty string
+     in order for eval{}-based exception handlers to work.
+     These require that if($@) evaluates to true, which will not
+     be the case if the Error has no value (Error overloads
      numeric operations to the Error::value() method).
 
      It is OK to create Bio::Root::Exception objects without
@@ -236,7 +197,7 @@ my $DEFAULT_VALUE = "__DUMMY__";  # Permits eval{} based handlers to work
 =cut
 
 sub new {
-    my ($class, @args) = @_; 
+    my ($class, @args) = @_;
     my ($value, %params);
     if( @args % 2 == 0 && $args[0] =~ /^-/) {
         %params = @args;
@@ -252,7 +213,7 @@ sub new {
         $value = "An empty string (\"\")" if $value eq "";
     }
     else {
-	$value ||= $DEFAULT_VALUE;
+        $value ||= $DEFAULT_VALUE;
     }
     $params{-value} = $value;
 
@@ -262,8 +223,8 @@ sub new {
 
 =head2 pretty_format()
 
- Purpose : Get a nicely formatted string containing information about the 
-           exception. Format is similar to that produced by 
+ Purpose : Get a nicely formatted string containing information about the
+           exception. Format is similar to that produced by
            Bio::Root::Root::throw(), with the addition of the name of
            the exception class in the EXCEPTION line and some other
            data available via the Error object.
@@ -283,19 +244,25 @@ sub pretty_format {
 
     my $title = "------------- EXCEPTION: $class -------------";
     my $footer = "\n" . '-' x CORE::length($title);
-    my $out = "\n$title\n" .
-       "MSG: $msg\n". $value_string. $stack. $footer . "\n";
+    my $out = "\n$title\n"
+            . "MSG: $msg\n". $value_string. $stack. $footer . "\n";
     return $out;
 }
 
 
-# Reformatting of the stack performed by  _reformat_stacktrace:
-#   1. Shift the file:line data in line i to line i+1.
-#   2. change xxx::__ANON__() to "try{} block"
-#   3. skip the "require" and "Error::subs::try" stack entries (boring)
-# This means that the first line in the stack won't have any file:line data
-# But this isn't a big issue since it's for a Bio::Root::-based method 
-# that doesn't vary from exception to exception.
+=head2 _reformat_stacktrace
+
+Reformatting of the stack performed by  _reformat_stacktrace:
+for :list
+1. Shift the file:line data in line i to line i+1.
+2. change xxx::__ANON__() to "try{} block"
+3. skip the "require" and "Error::subs::try" stack entries (boring)
+
+This means that the first line in the stack won't have any file:line data
+But this isn't a big issue since it's for a Bio::Root::-based method
+that doesn't vary from exception to exception.
+
+=cut
 
 sub _reformat_stacktrace {
     my $self = shift;
@@ -339,8 +306,8 @@ sub _reformat_stacktrace {
 
 =head2 stringify()
 
- Purpose : Overrides Error::stringify() to call pretty_format(). 
-           This is called automatically when an exception object 
+ Purpose : Overrides Error::stringify() to call pretty_format().
+           This is called automatically when an exception object
            is placed between double quotes.
  Example : catch Bio::Root::Exception with {
               my $error = shift;
@@ -356,12 +323,12 @@ sub stringify {
     return $self->pretty_format( @args );
 }
 
-=head1 Subclasses of Bio::Root::Exception 
+=head1 Subclasses of Bio::Root::Exception
 
 =head2 L<Bio::Root::NotImplemented>
 
  Purpose : Indicates that a method has not been implemented.
- Example : throw Bio::Root::NotImplemented( 
+ Example : throw Bio::Root::NotImplemented(
                -text   => "Method \"foo\" not implemented in module FooBar.",
                -value  => "foo" );
 
@@ -374,9 +341,9 @@ sub stringify {
 =head2 L<Bio::Root::IOException>
 
  Purpose : Indicates that some input/output-related trouble has occurred.
- Example : throw Bio::Root::IOException( 
+ Example : throw Bio::Root::IOException(
                -text   => "Can't save data to file $file.",
-	       -value  => $! );
+               -value  => $! );
 
 =cut
 
@@ -388,9 +355,9 @@ sub stringify {
 =head2 L<Bio::Root::FileOpenException>
 
  Purpose : Indicates that a file could not be opened.
- Example : throw Bio::Root::FileOpenException( 
+ Example : throw Bio::Root::FileOpenException(
                -text   => "Can't open file $file for reading.",
-	       -value  => $! );
+               -value  => $! );
 
 =cut
 
@@ -402,9 +369,9 @@ sub stringify {
 =head2 L<Bio::Root::SystemException>
 
  Purpose : Indicates that a system call failed.
- Example : unlink($file) or throw Bio::Root::SystemException( 
+ Example : unlink($file) or throw Bio::Root::SystemException(
                -text   => "Can't unlink file $file.",
-	       -value  => $! );
+               -value  => $! );
 
 =cut
 
@@ -415,9 +382,9 @@ sub stringify {
 
 =head2 L<Bio::Root::BadParameter>
 
- Purpose : Indicates that one or more parameters supplied to a method 
+ Purpose : Indicates that one or more parameters supplied to a method
            are invalid, unspecified, or conflicting.
- Example : throw Bio::Root::BadParameter( 
+ Example : throw Bio::Root::BadParameter(
                -text   => "Required parameter \"-foo\" was not specified",
                -value  => "-foo" );
 
@@ -430,9 +397,9 @@ sub stringify {
 
 =head2 L<Bio::Root::OutOfRange>
 
- Purpose : Indicates that a specified (start,end) range or 
+ Purpose : Indicates that a specified (start,end) range or
            an index to an array is outside the permitted range.
- Example : throw Bio::Root::OutOfRange( 
+ Example : throw Bio::Root::OutOfRange(
                -text   => "Start coordinate ($start) cannot be less than zero.",
                -value  => $start  );
 
@@ -445,9 +412,9 @@ sub stringify {
 
 =head2 L<Bio::Root::NoSuchThing>
 
- Purpose : Indicates that a requested thing cannot be located 
+ Purpose : Indicates that a requested thing cannot be located
            and therefore could possibly be bogus.
- Example : throw Bio::Root::NoSuchThing( 
+ Example : throw Bio::Root::NoSuchThing(
                -text   => "Accession M000001 could not be found.",
                -value  => "M000001"  );
 
@@ -457,6 +424,4 @@ sub stringify {
 @Bio::Root::NoSuchThing::ISA = qw( Bio::Root::Exception );
 #---------------------------------------------------------
 
-
 1;
-
@@ -68,7 +68,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Lincoln Stein
 
@@ -1,26 +1,25 @@
-#
-# BioPerl module for Bio::Root::IO
-#
-# Please direct questions and support issues to <bioperl-l@bioperl.org>
-#
-# Cared for by Hilmar Lapp <hlapp@gmx.net>
-#
-# Copyright Hilmar Lapp
-#
-# You may distribute this module under the same terms as perl itself
+package Bio::Root::IO;
 
-# POD documentation - main docs before the code
+use strict;
+use Symbol;
+use IO::Handle;
+use File::Copy;
+use Fcntl;
+use base qw(Bio::Root::Root);
 
-=head1 NAME
+# ABSTRACT: module providing several methods often needed when dealing with file IO
+# AUTHOR:   Hilmar Lapp <hlapp@gmx.net>
+# OWNER:    Hilmar Lapp
+# LICENSE:  Perl_5
 
-Bio::Root::IO - module providing several methods often needed when dealing with file IO
+# CONTRIBUTOR: Mark A. Jensen <maj@fortinbras.us>
 
 =head1 SYNOPSIS
 
-    # utilize stream I/O in your module
+    # Use stream I/O in your module
     $self->{'io'} = Bio::Root::IO->new(-file => "myfile");
     $self->{'io'}->_print("some stuff");
-    $line = $self->{'io'}->_readline();
+    my $line = $self->{'io'}->_readline();
     $self->{'io'}->_pushback($line);
     $self->{'io'}->close();
 
@@ -62,72 +61,13 @@ filehandle with an object like an indexer where it is not proper to
 close the filehandle as it will continue to be reused until the end of the
 stream is reached.  In general you won't want to play with this flag.
 
-=head1 FEEDBACK
-
-=head2 Mailing Lists
-
-User feedback is an integral part of the evolution of this
-and other Bioperl modules. Send your comments and suggestions preferably
- to one of the Bioperl mailing lists.
-Your participation is much appreciated.
-
-  bioperl-l@bioperl.org                  - General discussion
-  http://bioperl.org/wiki/Mailing_lists  - About the mailing lists
-
-=head2 Support
-
-Please direct usage questions or support issues to the mailing list:
-
-I<bioperl-l@bioperl.org>
-
-rather than to the module maintainer directly. Many experienced and
-reponsive experts will be able look at the problem and quickly
-address it. Please include a thorough description of the problem
-with code and data examples if at all possible.
-
-=head2 Reporting Bugs
-
-Report bugs to the Bioperl bug tracking system to help us keep track
-the bugs and their resolution.  Bug reports can be submitted via the
-web:
-
-  https://redmine.open-bio.org/projects/bioperl/
-
-=head1 AUTHOR - Hilmar Lapp
-
-Email hlapp@gmx.net
-
-=head1 CONTRIBUTORS
-
-Mark A. Jensen ( maj -at- fortinbras -dot- us )
-
-=head1 APPENDIX
-
-The rest of the documentation details each of the object methods. Internal methods are usually preceded with a _
-
 =cut
 
-
-# Let the code begin...
-
-
-package Bio::Root::IO;
-
 our ($FILESPECLOADED,   $FILETEMPLOADED,
-    $FILEPATHLOADED,    $TEMPDIR,
-    $PATHSEP,           $ROOTDIR,
-    $OPENFLAGS,         $VERBOSE,
-    $ONMAC,             $HAS_LWP,
-    $HAS_EOL);
-
-use strict;
-
-use Symbol;
-use POSIX qw(dup);
-use IO::Handle;
-use Bio::Root::HTTPget;
-
-use base qw(Bio::Root::Root);
+     $FILEPATHLOADED,   $TEMPDIR,
+     $PATHSEP,          $ROOTDIR,
+     $OPENFLAGS,        $VERBOSE,
+     $ONMAC,            $HAS_EOL,       );
 
 my $TEMPCOUNTER;
 my $HAS_WIN32 = 0;
@@ -149,28 +89,17 @@ BEGIN {
         # do nothing
     }
 
-    eval {
-        require LWP::UserAgent;
-    };
-    if( $@ ) {
-        print STDERR "Cannot load LWP::UserAgent: $@" if( $VERBOSE > 0 );
-        $HAS_LWP = 0;
-    } else {
-        $HAS_LWP = 1;
-    }
-
     # If on Win32, attempt to find Win32 package
-
     if($^O =~ /mswin/i) {
-    eval {
-        require Win32;
-        $HAS_WIN32 = 1;
-    };
+        eval {
+            require Win32;
+            $HAS_WIN32 = 1;
+        };
     }
 
     # Try to provide a path separator. Why doesn't File::Spec export this,
     # or did I miss it?
-    if($^O =~ /mswin/i) {
+    if ($^O =~ /mswin/i) {
         $PATHSEP = "\\";
     } elsif($^O =~ /macos/i) {
         $PATHSEP = ":";
@@ -186,88 +115,79 @@ BEGIN {
         $FILETEMPLOADED = 1;
     };
     if( $@ ) {
-    if(! defined($TEMPDIR)) { # File::Spec failed
-        # determine tempdir
-        if (defined $ENV{'TEMPDIR'} && -d $ENV{'TEMPDIR'} ) {
-            $TEMPDIR = $ENV{'TEMPDIR'};
-        } elsif( defined $ENV{'TMPDIR'} && -d $ENV{'TMPDIR'} ) {
-            $TEMPDIR = $ENV{'TMPDIR'};
-        }
-        if($^O =~ /mswin/i) {
-            $TEMPDIR = 'C:\TEMP' unless $TEMPDIR;
-            $ROOTDIR = 'C:';
-        } elsif($^O =~ /macos/i) {
-            $TEMPDIR = "" unless $TEMPDIR; # what is a reasonable default on Macs?
-            $ROOTDIR = ""; # what is reasonable??
-        } else { # unix
-            $TEMPDIR = "/tmp" unless $TEMPDIR;
-            $ROOTDIR = "/";
+        if(! defined($TEMPDIR)) { # File::Spec failed
+            # determine tempdir
+            if (defined $ENV{'TEMPDIR'} && -d $ENV{'TEMPDIR'} ) {
+                $TEMPDIR = $ENV{'TEMPDIR'};
+            } elsif( defined $ENV{'TMPDIR'} && -d $ENV{'TMPDIR'} ) {
+                $TEMPDIR = $ENV{'TMPDIR'};
+            }
+            if($^O =~ /mswin/i) {
+                $TEMPDIR = 'C:\TEMP' unless $TEMPDIR;
+                $ROOTDIR = 'C:';
+            } elsif($^O =~ /macos/i) {
+                $TEMPDIR = "" unless $TEMPDIR; # what is a reasonable default on Macs?
+                $ROOTDIR = ""; # what is reasonable??
+            } else { # unix
+                $TEMPDIR = "/tmp" unless $TEMPDIR;
+                $ROOTDIR = "/";
+            }
+            if (!( -d $TEMPDIR && -w $TEMPDIR )) {
+                $TEMPDIR = '.'; # last resort
+            }
         }
-        if (!( -d $TEMPDIR && -w $TEMPDIR )) {
-            $TEMPDIR = '.'; # last resort
+        # File::Temp failed (alone, or File::Spec already failed)
+        # determine open flags for tempfile creation using Fcntl
+        $OPENFLAGS = O_CREAT | O_EXCL | O_RDWR;
+        for my $oflag (qw/FOLLOW BINARY LARGEFILE EXLOCK NOINHERIT TEMPORARY/){
+            my ($bit, $func) = (0, "Fcntl::O_" . $oflag);
+            no strict 'refs';
+            $OPENFLAGS |= $bit if eval { $bit = &$func(); 1 };
         }
     }
-    # File::Temp failed (alone, or File::Spec already failed)
-    #
-    # determine open flags for tempfile creation -- we'll have to do this
-    # ourselves
-    use Fcntl;
-    use Symbol;
-    $OPENFLAGS = O_CREAT | O_EXCL | O_RDWR;
-    for my $oflag (qw/FOLLOW BINARY LARGEFILE EXLOCK NOINHERIT TEMPORARY/){
-        my ($bit, $func) = (0, "Fcntl::O_" . $oflag);
-        no strict 'refs';
-        $OPENFLAGS |= $bit if eval { $bit = &$func(); 1 };
-    }
-    }
     $ONMAC = "\015" eq "\n";
 }
 
+
 =head2 new
 
  Title   : new
- Usage   :
- Function: Overridden here to automatically call _initialize_io().
- Example :
- Returns : new instance of this class
- Args    : named parameters
-
+ Usage   : my $io = Bio::Root::IO->new( -file => 'data.txt' );
+ Function: Create new class instance. It automatically calls C<_initialize_io>.
+ Args    : Same named parameters as C<_initialize_io>.
+ Returns : A Bio::Root::IO object
 
 =cut
 
 sub new {
     my ($caller, @args) = @_;
     my $self = $caller->SUPER::new(@args);
-
     $self->_initialize_io(@args);
     return $self;
 }
 
+
 =head2 _initialize_io
 
- Title   : initialize_io
- Usage   : $self->_initialize_io(@params);
+ Title   : _initialize_io
+ Usage   : $io->_initialize_io(@params);
  Function: Initializes filehandle and other properties from the parameters.
-
-           Currently recognizes the following named parameters:
-              -file     name of file to open
-              -string   a string that is to be converted to a filehandle
+ Args    : The following named parameters are currently recognized:
+              -file     name of file to read or write to
+              -fh       file handle to read or write to (mutually exclusive
+                        with -file and -string)
+              -input    name of file, or filehandle (GLOB or IO::Handle object)
+                        to read of write to
+              -string   string to read from (will be converted to filehandle)
               -url      name of URL to open
-              -input    name of file, or GLOB, or IO::Handle object
-              -fh       file handle (mutually exclusive with -file)
               -flush    boolean flag to autoflush after each write
               -noclose  boolean flag, when set to true will not close a
                         filehandle (must explicitly call close($io->_fh)
               -retries  number of times to try a web fetch before failure
-
-              -ua_parms hashref of key => value parameters to pass
-                        to LWP::UserAgent->new()
-                        (only meaningful with -url is set)
-                        A useful value might be, for example,
-                        { timeout => 60 } (ua default is 180 sec)
- Returns : TRUE
- Args    : named parameters
-
+              -ua_parms when using -url, hashref of key => value parameters
+                        to pass to LWP::UserAgent->new(). A useful value might
+                        be, for example, {timeout => 60 } (ua defaults to 180s)
+ Returns : True
 
 =cut
 
@@ -276,80 +196,78 @@ sub _initialize_io {
 
     $self->_register_for_cleanup(\&_io_cleanup);
 
-    my ($input, $noclose, $file, $fh, $string, $flush, $url,
-    $retries, $ua_parms) =
-    $self->_rearrange([qw(INPUT NOCLOSE FILE FH STRING FLUSH URL RETRIES UA_PARMS)],
-                      @args);
-
-    if($url){
-        $retries ||= 5;
-
-        if($HAS_LWP) { #use LWP::UserAgent
-            require LWP::UserAgent;
-            my $ua = LWP::UserAgent->new(%$ua_parms);
-            my $http_result;
-            my($handle,$tempfile) = $self->tempfile();
-            CORE::close($handle);
+    my ($input, $noclose, $file, $fh, $string,
+        $flush, $url, $retries, $ua_parms) =
+        $self->_rearrange([qw(INPUT NOCLOSE FILE FH STRING FLUSH URL RETRIES UA_PARMS)],
+                          @args);
 
+    my $mode;
 
-            for(my $try = 1 ; $try <= $retries ; $try++){
-                $http_result = $ua->get($url, ':content_file' => $tempfile);
-                $self->warn("[$try/$retries] tried to fetch $url, but server ".
-                            "threw ". $http_result->code . ".  retrying...")
-                            if !$http_result->is_success;
-                last if $http_result->is_success;
-            }
-            $self->throw("failed to fetch $url, server threw ".
-                         $http_result->code) if !$http_result->is_success;
-
-            $input = $tempfile;
-            $file  = $tempfile;
-        } else { #use Bio::Root::HTTPget
-            #$self->warn("no lwp");
+    if ($url) {
+        $retries ||= 5;
 
-            $fh = Bio::Root::HTTPget::getFH($url);
-        }
+        require LWP::UserAgent;
+        my $ua = LWP::UserAgent->new(%$ua_parms);
+        my $http_result;
+        my ($handle, $tempfile) = $self->tempfile();
+        CORE::close($handle);
+
+        for (my $try = 1 ; $try <= $retries ; $try++) {
+            $http_result = $ua->get($url, ':content_file' => $tempfile);
+            $self->warn("[$try/$retries] tried to fetch $url, but server ".
+                        "threw ". $http_result->code . ".  retrying...")
+              if !$http_result->is_success;
+            last if $http_result->is_success;
         }
+        $self->throw("Failed to fetch $url, server threw ".$http_result->code)
+          if !$http_result->is_success;
+
+        $file = $tempfile;
+        $mode = '>';
+    }
 
     delete $self->{'_readbuffer'};
     delete $self->{'_filehandle'};
     $self->noclose( $noclose) if defined $noclose;
     # determine whether the input is a file(name) or a stream
-    if($input) {
-        if(ref(\$input) eq "SCALAR") {
+    if ($input) {
+        if (ref(\$input) eq 'SCALAR') {
             # we assume that a scalar is a filename
-            if($file && ($file ne $input)) {
-            $self->throw("input file given twice: $file and $input disagree");
+            if ($file && ($file ne $input)) {
+                $self->throw("Input file given twice: '$file' and '$input' disagree");
             }
             $file = $input;
-        } elsif(ref($input) &&
-            ((ref($input) eq "GLOB") || $input->isa('IO::Handle'))) {
+        } elsif (ref($input) &&
+            ((ref($input) eq 'GLOB') || $input->isa('IO::Handle'))) {
             # input is a stream
             $fh = $input;
         } else {
             # let's be strict for now
-            $self->throw("unable to determine type of input $input: ".
-                 "not string and not GLOB");
+            $self->throw("Unable to determine type of input $input: ".
+                         "not string and not GLOB");
         }
     }
 
-    if(defined($file) && defined($fh)) {
+    if (defined($file) && defined($fh)) {
         $self->throw("Providing both a file and a filehandle for reading - ".
                      "only one please!");
     }
 
     if ($string) {
-        if(defined($file) || defined($fh)) {
-            $self->throw("File or filehandle provided with -string,".
-                         " please unset if you are using -string as a file");
+        if (defined($file) || defined($fh)) {
+            $self->throw("File or filehandle provided with -string, ".
+                         "please unset if you are using -string as a file");
         }
-        open($fh, "<", \$string)
+        open $fh, '<', \$string or $self->throw("Could not read string: $!");
     }
 
-    if(defined($file) && ($file ne '')) {
-        $fh = Symbol::gensym();
-        open ($fh,$file) || $self->throw("Could not open $file: $!");
+    if (defined($file) && ($file ne '')) {
         $self->file($file);
+        ($mode, $file) = $self->cleanfile;
+        $mode ||= '<';
+        my $action = ($mode =~ m/>/) ? 'write' : 'read';
+        $fh = Symbol::gensym();
+        open $fh, $mode, $file or $self->throw("Could not $action file '$file': $!");
     }
 
     if (defined $fh) {
@@ -357,17 +275,18 @@ sub _initialize_io {
         # a GLOB reference, as in: open(my $fh, "myfile");
         # an IO::Handle or IO::String object
         # the UNIVERSAL::can added to fix Bug2863
-        unless ( ( ref $fh && ( ref $fh eq 'GLOB' ) )
-                 || ( ref $fh && ( UNIVERSAL::can( $fh, 'can' )
-                    && ( $fh->isa('IO::Handle') || $fh->isa('IO::String') ) ) )
+        unless (   ( ref $fh and ( ref $fh eq 'GLOB' ) )
+                or ( ref $fh and ( UNIVERSAL::can( $fh, 'can' ) )
+                             and (   $fh->isa('IO::Handle')
+                                  or $fh->isa('IO::String') ) )
                ) {
-            $self->throw("file handle $fh doesn't appear to be a handle");
+            $self->throw("Object $fh does not appear to be a file handle");
         }
+        if ($HAS_EOL) {
+            binmode $fh, ':raw:eol(LF-Native)';
+        }
+        $self->_fh($fh); # if $fh not provided, defaults to STDIN and STDOUT
     }
-    if ($HAS_EOL) {
-        binmode $fh, ':raw:eol(LF-Native)';
-    }
-    $self->_fh($fh) if $fh; # if not provided, defaults to STDIN and STDOUT
 
     $self->_flush_on_write(defined $flush ? $flush : 1);
 
@@ -378,100 +297,132 @@ sub _initialize_io {
 =head2 _fh
 
  Title   : _fh
- Usage   : $obj->_fh($newval)
- Function: Get/set the file handle for the stream encapsulated.
- Example :
- Returns : value of _filehandle
- Args    : newvalue (optional)
+ Usage   : $io->_fh($newval);
+ Function: Get or set the file handle for the stream encapsulated.
+ Args    : Optional filehandle to use
+ Returns : Filehandle for the stream
 
 =cut
 
 sub _fh {
-    my ($obj, $value) = @_;
+    my ($self, $value) = @_;
     if ( defined $value) {
-    $obj->{'_filehandle'} = $value;
+        $self->{'_filehandle'} = $value;
     }
-    return $obj->{'_filehandle'};
+    return $self->{'_filehandle'};
 }
 
 
 =head2 mode
 
  Title   : mode
- Usage   : $obj->mode()
- Function:
- Example :
- Returns : mode of filehandle:
-           'r' for readable
-           'w' for writable
-           '?' if mode could not be determined
- Args    : -force (optional), see notes.
- Notes   : once mode() has been called, the filehandle's mode is cached
-           for further calls to mode().  to override this behavior so
-           that mode() re-checks the filehandle's mode, call with arg
-           -force
+ Usage   : $io->mode();
+           $io->mode(-force => 1);
+ Function: Determine if the object was opened for reading or writing
+ Args    : -force: Boolean. Once mode() has been called, the mode is cached for
+                   further calls to mode(). Use this argument to override this
+                   behavior and re-check the object's mode.
+ Returns : Mode of the object:
+            'r'  for readable
+            'w'  for writable
+            'rw' for readable and writable
+            '?'  if mode could not be determined (e.g. for a -url)
 
 =cut
 
 sub mode {
-    my ($obj, @arg) = @_;
-    my %param = @arg;
-    return $obj->{'_mode'} if defined $obj->{'_mode'} and !$param{-force};
-
-    # Previous system of:
-    #  my $iotest = new IO::Handle;
-    #  $iotest->fdopen( dup(fileno($fh)) , 'r' );
-    #  if ($iotest->error == 0) { ... }
-    # didn't actually seem to work under any platform, since there would no
-    # no error if the filehandle had been opened writable only. Couldn't be
+    my ($self, %arg) = @_;
+
+    # Method 1: IO::Handle::fdopen
+    #    my $iotest = new IO::Handle;
+    #    $iotest->fdopen( dup(fileno($fh)) , 'r' );
+    #    if ($iotest->error == 0) { ... }
+    # It did not actually seem to work under any platform, since there would no
+    # error if the filehandle had been opened writable only. It could not be
     # hacked around when dealing with unseekable (piped) filehandles.
-    #
-    # Just try and do a simple readline, turning io warnings off, instead:
-
-    my $fh = $obj->_fh || return '?';
 
-    no warnings "io"; # we expect a warning if this is writable only
-    my $line = <$fh>;
-    if (defined $line) {
-        $obj->_pushback($line);
-        $obj->{'_mode'} = 'r';
-    }
-    else {
-        $obj->{'_mode'} = 'w';
+    # Method 2: readline, a.k.a. the <> operator
+    #    no warnings "io";
+    #    my $line = <$fh>;
+    #    if (defined $line) {
+    #       $self->{'_mode'} = 'r';
+    #    ...
+    # It did not work well either because <> returns undef, i.e. querying the
+    # mode() after having read an entire file returned 'w'.
+
+    if ( $arg{-force} || not exists $self->{'_mode'} ) {
+        # Determine stream mode
+        my $mode;
+        my $fh = $self->_fh;
+        if (defined $fh) {
+            # Determine read/write status of filehandle
+            no warnings 'io';
+            if ( defined( read $fh, my $content, 0 ) ) {
+                # Successfully read 0 bytes
+                $mode = 'r'
+            }
+            if ( defined( syswrite $fh, '') ) {
+                # Successfully wrote 0 bytes
+                $mode ||= '';
+                $mode  .= 'w';
+            }
+        } else {
+           # Stream does not have a filehandle... cannot determine mode
+           $mode = '?';
+        }
+        # Save mode for future use
+        $self->{'_mode'} = $mode;
     }
-
-    return $obj->{'_mode'};
+    return $self->{'_mode'};
 }
 
 
 =head2 file
 
  Title   : file
- Usage   : $obj->file($newval)
- Function: Get/set the filename, if one has been designated.
- Example :
- Returns : value of file
- Args    : newvalue (optional)
+ Usage   : $io->file('>'.$file);
+           my $file = $io->file;
+ Function: Get or set the name of the file to read or write.
+ Args    : Optional file name (including its mode, e.g. '<' for reading or '>'
+           for writing)
+ Returns : A string representing the filename and its mode.
 
 =cut
 
 sub file {
-    my ($obj, $value) = @_;
+    my ($self, $value) = @_;
     if ( defined $value) {
-    $obj->{'_file'} = $value;
+        $self->{'_file'} = $value;
     }
-    return $obj->{'_file'};
+    return $self->{'_file'};
+}
+
+
+=head2 cleanfile
+
+ Title   : cleanfile
+ Usage   : my ($mode, $file) = $io->cleanfile;
+ Function: Get the name of the file to read or write, stripped of its mode
+           ('>', '<', '+>', '>>', etc).
+ Args    : None
+ Returns : In array context, an array of the mode and the clean filename.
+
+=cut
+
+sub cleanfile {
+    my ($self) = @_;
+    return ($self->{'_file'} =~ m/^ (\+?[><]{1,2})?\s*(.*) $/x);
 }
 
 
 =head2 format
 
  Title   : format
- Usage   : $self->format($newval)
+ Usage   : $io->format($newval)
  Function: Get the format of a Bio::Root::IO sequence file or filehandle. Every
            object inheriting Bio::Root::IO is guaranteed to have a format.
- Returns : format of the file or filehandle, e.g. fasta, fastq, genbank, embl.
- Args    : none
+ Args    : None
+ Returns : Format of the file or filehandle, e.g. fasta, fastq, genbank, embl.
 
 =cut
 
@@ -485,15 +436,15 @@ sub format {
 =head2 variant
 
  Title   : format
- Usage   : $self->format($newval)
+ Usage   : $io->format($newval)
  Function: Get the variant of a Bio::Root::IO sequence file or filehandle.
-           The format variant depends on the specific format used. Note that not
-           all formats have variants
- Returns : variant of the file or filehandle, e.g. sanger, solexa or illumina for
+           The format variant depends on the specific format used. Note that
+           not all formats have variants. Also, the Bio::Root::IO-implementing
+           modules that require access to variants need to define a global hash
+           that has the allowed variants as its keys.
+ Args    : None
+ Returns : Variant of the file or filehandle, e.g. sanger, solexa or illumina for
            the fastq format, or undef for formats that do not have variants.
- Args    : none
- Note    : The Bio::Root::IO-implementing modules that require access to variants
-           need to define a global hash that has the allowed variants as its keys.
 
 =cut
 
@@ -504,12 +455,12 @@ sub variant {
         my $var_name = '%'.ref($self).'::variant';
         my %ok_variants = eval $var_name; # e.g. %Bio::Assembly::IO::ace::variant
         if (scalar keys %ok_variants == 0) {
-            $self->throw('Cannot check for validity of variant because global '.
-                "variant $var_name is not set or is empty\n");
+            $self->throw("Could not validate variant because global variant ".
+                         "$var_name was not set or was empty\n");
         }
         if (not exists $ok_variants{$variant}) {
-            $self->throw($variant.' is not a valid variant of the '.$self->format.
-                ' format');
+            $self->throw("$variant is not a valid variant of the " .
+                         $self->format . ' format');
         }
         $self->{variant} = $variant;
     }
@@ -520,10 +471,10 @@ sub variant {
 =head2 _print
 
  Title   : _print
- Usage   : $obj->_print(@lines)
- Function:
- Example :
- Returns : 1 on success, undef on failure
+ Usage   : $io->_print(@lines)
+ Function: Print lines of text to the IO stream object.
+ Args    : List of strings to print
+ Returns : True on success, undef on failure
 
 =cut
 
@@ -537,12 +488,12 @@ sub _print {
 
 =head2 _insert
 
-    Title   : _insert
-    Usage   : $obj->_insert($string,1)
-    Function: Insert some text in a file at the given line number (1-based).
-    Returns : 1 on success
-    Args    : string to write in file
-              line number to insert the string at
+ Title   : _insert
+ Usage   : $io->_insert($string,1)
+ Function: Insert some text in a file at the given line number (1-based).
+ Args    : * string to write in file
+           * line number to insert the string at
+ Returns : True
 
 =cut
 
@@ -550,39 +501,49 @@ sub _insert {
     my ($self, $string, $line_num) = @_;
     # Line number check
     if ($line_num < 1) {
-        $self->throw("Cannot insert text at line $line_num because the minimum".
-            " line number possible is 1");
+        $self->throw("Could not insert text at line $line_num: the minimum ".
+                     "line number possible is 1.");
     }
     # File check
-    my $file = $self->file;
+    my ($mode, $file) = $self->cleanfile;
     if (not defined $file) {
-        $self->throw('Cannot insert a line in a IO object initialized with ".
-            "anything else than a file.');
+        $self->throw('Could not insert a line: IO object was initialized with '.
+                     'something else than a file.');
     }
-    $file =~ s/^\+?[><]?//; # transform '+>output.ace' into 'output.ace'
     # Everything that needs to be written is written before we read it
     $self->flush;
-    # Edit the file in place, line by line (no slurping)
-    {
-        local @ARGV = ($file);     # input file
-        #local $^I = '~';          # backup file extension, e.g. ~, .bak, .ori
-        local $^I = '';            # no backup file
-        while (<>) {
-            if ($. == $line_num) { # right line for new data
-                print $string.$_;
-            } else {
-                print;
-            }
+
+    # Edit the file line by line (no slurping)
+    $self->close;
+    my $temp_file;
+    my $number = 0;
+    while (-e "$file.$number.temp") {
+        $number++;
+    }
+    $temp_file = "$file.$number.temp";
+    copy($file, $temp_file);
+    open my $fh1, '<', $temp_file or $self->throw("Could not read temporary file '$temp_file': $!");
+    open my $fh2, '>', $file      or $self->throw("Could not write file '$file': $!");
+    while (my $line = <$fh1>) {
+        if ($. == $line_num) { # right line for new data
+            print $fh2 $string . $line;
+        }
+        else {
+            print $fh2 $line;
         }
     }
+    CORE::close $fh1;
+    CORE::close $fh2;
+    unlink $temp_file or $self->throw("Could not delete temporary file '$temp_file': $!");
+
     # Line number check (again)
     if ( $. > 0 && $line_num > $. ) {
-        $self->throw("Cannot insert text at line $line_num because there are ".
-            "only $. lines in file $file");
+        $self->throw("Could not insert text at line $line_num: there are only ".
+                     "$. lines in file '$file'");
     }
     # Re-open the file in append mode to be ready to add text at the end of it
     # when the next _print() statement comes
-    open my $new_fh, ">>$file" or $self->throw("Cannot append to file $file: $!");
+    open my $new_fh, '>>', $file or $self->throw("Could not append to file '$file': $!");
     $self->_fh($new_fh);
     # If file is empty and we're inserting at line 1, simply append text to file
     if ( $. == 0 && $line_num == 1 ) {
@@ -595,111 +556,122 @@ sub _insert {
 =head2 _readline
 
  Title   : _readline
- Usage   : $obj->_readline(%args)
- Function: Reads a line of input.
-
-           Note that this method implicitely uses the value of $/ that is
-           in effect when called.
-
-           Note also that the current implementation does not handle pushed
+ Usage   : local $Bio::Root::IO::HAS_EOL = 1;
+           my $io = Bio::Root::IO->new(-file => 'data.txt');
+           my $line = $io->_readline();
+           $io->close;
+ Function: Read a line of input and normalize all end of line characters.
+
+           End of line characters are typically "\n" on Linux platforms, "\r\n"
+           on Windows and "\r" on older Mac OS. By default, the _readline()
+           method uses the value of $/, Perl's input record separator, to
+           detect the end of each line. This means that you will not get the
+           expected lines if your input has Mac-formatted end of line characters.
+           Also, note that the current implementation does not handle pushed
            back input correctly unless the pushed back input ends with the
-           value of $/.
+           value of $/. For each line parsed, its line ending, e.g. "\r\n" is
+           converted to "\n", unless you provide the -raw argument.
+
+           Altogether it is easier to let the PerlIO::eol module automatically
+           detect the proper end of line character and normalize it to "\n". Do
+           so by setting $Bio::Root::IO::HAS_EOL to 1.
 
- Example :
- Args    : Accepts a hash of arguments, currently only -raw is recognized
-           passing (-raw => 1) prevents \r\n sequences from being changed
-           to \n.  The default value of -raw is undef, allowing \r\n to be
-           converted to \n.
- Returns :
+ Args    : -raw : Avoid converting end of line characters to "\n" This option
+                  has no effect when using $Bio::Root::IO::HAS_EOL = 1.
+ Returns : Line of input, or undef when there is nothing to read anymore
 
 =cut
 
 sub _readline {
-    my $self = shift;
-    my %param =@_;
+    my ($self, %param) = @_;
     my $fh = $self->_fh or return;
     my $line;
 
     # if the buffer been filled by _pushback then return the buffer
     # contents, rather than read from the filehandle
     if( @{$self->{'_readbuffer'} || [] } ) {
-    $line = shift @{$self->{'_readbuffer'}};
+        $line = shift @{$self->{'_readbuffer'}};
     } else {
-    $line = <$fh>;
+        $line = <$fh>;
     }
 
-    #don't strip line endings if -raw is specified
-    # $line =~ s/\r\n/\n/g if( (!$param{-raw}) && (defined $line) );
-    # Dave Howorth's fix
+    # Note: In Windows the "-raw" parameter has no effect, because Perl already discards
+    # the '\r' from the line when reading in text mode from the filehandle
+    # ($line = <$fh>), and put it back automatically when printing
     if( !$HAS_EOL && !$param{-raw} && (defined $line) ) {
-        $line =~ s/\015\012/\012/g; # Change all CR/LF pairs to LF
+        # don't strip line endings if -raw or $HAS_EOL is specified
+        $line =~ s/\015\012/\012/g;         # Change all CR/LF pairs to LF
         $line =~ tr/\015/\n/ unless $ONMAC; # Change all single CRs to NEWLINE
     }
     return $line;
 }
 
+
 =head2 _pushback
 
  Title   : _pushback
- Usage   : $obj->_pushback($newvalue)
- Function: puts a line previously read with _readline back into a buffer.
+ Usage   : $io->_pushback($newvalue)
+ Function: Puts a line previously read with _readline back into a buffer.
            buffer can hold as many lines as system memory permits.
- Example : $obj->_pushback($newvalue)
- Returns : none
+
+           Note that this is only supported for pushing back data ending with
+           the current, localized value of $/. Using this method to push
+           modified data back onto the buffer stack is not supported; see bug
+           843.
+
  Args    : newvalue
- Note    : This is only supported for pushing back data ending with the
-           current, localized value of $/. Using this method to push modified
-           data back onto the buffer stack is not supported; see bug 843.
+ Returns : True
 
 =cut
 
 # fix for bug 843, this reveals some unsupported behavior
 
 #sub _pushback {
-#    my ($obj, $value) = @_;
+#    my ($self, $value) = @_;
 #    if (index($value, $/) >= 0) {
-#        push @{$obj->{'_readbuffer'}}, $value;
+#        push @{$self->{'_readbuffer'}}, $value;
 #    } else {
-#        $obj->throw("Pushing modifed data back not supported: $value");
+#        $self->throw("Pushing modifed data back not supported: $value");
 #    }
 #}
 
 sub _pushback {
-    my ($obj, $value) = @_;
+    my ($self, $value) = @_;
     return unless $value;
-    unshift @{$obj->{'_readbuffer'}}, $value;
+    unshift @{$self->{'_readbuffer'}}, $value;
+    return 1;
 }
 
+
 =head2 close
 
  Title   : close
  Usage   : $io->close()
- Function: Closes the file handle associated with this IO instance.
-           Will not close the FH if  -noclose is specified
- Returns : none
- Args    : none
+ Function: Closes the file handle associated with this IO instance,
+           excepted if -noclose was specified.
+ Args    : None
+ Returns : True
 
 =cut
 
 sub close {
-   my ($self) = @_;
-
-   # don't close if we explicitly asked not to
-   return if $self->noclose;
-
-   if( defined( my $fh = $self->{'_filehandle'} )) {
-       $self->flush;
-       return if     ref $fh eq 'GLOB'
-         && (    \*STDOUT == $fh
-              || \*STDERR == $fh
-              || \*STDIN  == $fh
-                    );
-
-       # don't close IO::Strings
-       close $fh unless ref $fh && $fh->isa('IO::String');
-   }
-   $self->{'_filehandle'} = undef;
-   delete $self->{'_readbuffer'};
+    my ($self) = @_;
+
+    # do not close if we explicitly asked not to
+    return if $self->noclose;
+
+    if( defined( my $fh = $self->{'_filehandle'} )) {
+        $self->flush;
+        return if ref $fh eq 'GLOB' && (
+            \*STDOUT == $fh || \*STDERR == $fh || \*STDIN  == $fh
+        );
+
+        # don't close IO::Strings
+        CORE::close $fh unless ref $fh && $fh->isa('IO::String');
+    }
+    $self->{'_filehandle'} = undef;
+    delete $self->{'_readbuffer'};
+    return 1;
 }
 
 
@@ -708,80 +680,89 @@ sub close {
  Title   : flush
  Usage   : $io->flush()
  Function: Flushes the filehandle
- Returns : none
- Args    : none
+ Args    : None
+ Returns : True
 
 =cut
 
 sub flush {
-  my ($self) = shift;
-
-  if( !defined $self->{'_filehandle'} ) {
-    $self->throw("Attempting to call flush but no filehandle active");
-  }
-
-  if( ref($self->{'_filehandle'}) =~ /GLOB/ ) {
-    my $oldh = select($self->{'_filehandle'});
-    $| = 1;
-    select($oldh);
-  } else {
-    $self->{'_filehandle'}->flush();
-  }
+    my ($self) = shift;
+
+    if( !defined $self->{'_filehandle'} ) {
+        $self->throw("Flush failed: no filehandle was active");
+    }
+
+    if( ref($self->{'_filehandle'}) =~ /GLOB/ ) {
+        my $oldh = select($self->{'_filehandle'});
+        $| = 1;
+        select($oldh);
+    } else {
+        $self->{'_filehandle'}->flush();
+    }
+    return 1;
 }
 
+
 =head2 noclose
 
  Title   : noclose
- Usage   : $obj->noclose($newval)
- Function: Get/Set the NOCLOSE flag - setting this to true will
-           prevent a filehandle from being closed
-           when an object is cleaned up or explicitly closed
-           This is a bit of hack
- Returns : value of noclose (a scalar)
- Args    : on set, new value (a scalar or undef, optional)
-
+ Usage   : $io->noclose($newval)
+ Function: Get or set the NOCLOSE flag - setting this to true will prevent a
+           filehandle from being closed when an object is cleaned up or
+           explicitly closed.
+ Args    : Optional new value (a scalar or undef)
+ Returns : Value of noclose (a scalar)
 
 =cut
 
-sub noclose{
+sub noclose {
     my $self = shift;
-
     return $self->{'_noclose'} = shift if @_;
     return $self->{'_noclose'};
 }
 
+
+=head2 _io_cleanup
+
+=cut
+
 sub _io_cleanup {
     my ($self) = @_;
     $self->close();
     my $v = $self->verbose;
 
     # we are planning to cleanup temp files no matter what
-    if( exists($self->{'_rootio_tempfiles'}) &&
-    ref($self->{'_rootio_tempfiles'}) =~ /array/i &&
-    !$self->save_tempfiles) {
-    if( $v > 0 ) {
-        warn( "going to remove files ",
-          join(",",  @{$self->{'_rootio_tempfiles'}}), "\n");
-    }
-    unlink  (@{$self->{'_rootio_tempfiles'}} );
+    if (    exists($self->{'_rootio_tempfiles'})
+        and ref($self->{'_rootio_tempfiles'}) =~ /array/i
+        and not $self->save_tempfiles
+        ) {
+        if( $v > 0 ) {
+            warn( "going to remove files ",
+                  join(",",  @{$self->{'_rootio_tempfiles'}}),
+                  "\n");
+        }
+        unlink  (@{$self->{'_rootio_tempfiles'}} );
     }
     # cleanup if we are not using File::Temp
-    if( $self->{'_cleanuptempdir'} &&
-    exists($self->{'_rootio_tempdirs'}) &&
-    ref($self->{'_rootio_tempdirs'}) =~ /array/i &&
-    !$self->save_tempfiles) {
-    if( $v > 0 ) {
-        warn( "going to remove dirs ",
-          join(",",  @{$self->{'_rootio_tempdirs'}}), "\n");
-    }
-    $self->rmtree( $self->{'_rootio_tempdirs'});
+    if (    $self->{'_cleanuptempdir'}
+        and exists($self->{'_rootio_tempdirs'})
+        and ref($self->{'_rootio_tempdirs'}) =~ /array/i
+        and not $self->save_tempfiles
+        ) {
+        if( $v > 0 ) {
+            warn( "going to remove dirs ",
+                  join(",",  @{$self->{'_rootio_tempdirs'}}),
+                  "\n");
+        }
+        $self->rmtree( $self->{'_rootio_tempdirs'});
     }
 }
 
+
 =head2 exists_exe
 
  Title   : exists_exe
- Usage   : $exists = $obj->exists_exe('clustalw');
+ Usage   : $exists = $io->exists_exe('clustalw');
            $exists = Bio::Root::IO->exists_exe('clustalw')
            $exists = Bio::Root::IO::exists_exe('clustalw')
  Function: Determines whether the given executable exists either as file
@@ -789,9 +770,8 @@ sub _io_cleanup {
            to be installed.
            On Win32-based system, .exe is automatically appended to the program
            name unless the program name already ends in .exe.
- Example :
+ Args    : Name of the executable
  Returns : 1 if the given program is callable as an executable, and 0 otherwise
- Args    : the name of the executable
 
 =cut
 
@@ -808,7 +788,7 @@ sub exists_exe {
 
     # Not a full path, or does not exist. Let's see whether it's in the path.
     if($FILESPECLOADED) {
-        foreach my $dir (File::Spec->path()) {
+        for my $dir (File::Spec->path()) {
             my $f = Bio::Root::IO->catfile($dir, $exe);
             return $f if( -f $f && -x $f );
         }
@@ -816,96 +796,96 @@ sub exists_exe {
     return 0;
 }
 
+
 =head2 tempfile
 
  Title   : tempfile
  Usage   : my ($handle,$tempfile) = $io->tempfile();
- Function: Returns a temporary filename and a handle opened for writing and
-           and reading.
-
- Caveats : If you do not have File::Temp on your system you should avoid
-           specifying TEMPLATE and SUFFIX. (We don't want to recode
-           everything, okay?)
- Returns : a 2-element array, consisting of temporary handle and temporary
-           file name
- Args    : named parameters compatible with File::Temp: DIR (defaults to
+ Function: Create a temporary filename and a handle opened for reading and
+           writing.
+           Caveats: If you do not have File::Temp on your system you should
+           avoid specifying TEMPLATE and SUFFIX.
+ Args    : Named parameters compatible with File::Temp: DIR (defaults to
            $Bio::Root::IO::TEMPDIR), TEMPLATE, SUFFIX.
+ Returns : A 2-element array, consisting of temporary handle and temporary
+           file name.
 
 =cut
 
-#'
 sub tempfile {
     my ($self, @args) = @_;
     my ($tfh, $file);
     my %params = @args;
 
     # map between naming with and without dash
-    foreach my $key (keys(%params)) {
-    if( $key =~ /^-/  ) {
-        my $v = $params{$key};
-        delete $params{$key};
-        $params{uc(substr($key,1))} = $v;
-    } else {
-        # this is to upper case
-        my $v = $params{$key};
-        delete $params{$key};
-        $params{uc($key)} = $v;
-    }
+    for my $key (keys(%params)) {
+        if( $key =~ /^-/  ) {
+            my $v = $params{$key};
+            delete $params{$key};
+            $params{uc(substr($key,1))} = $v;
+        } else {
+            # this is to upper case
+            my $v = $params{$key};
+            delete $params{$key};
+            $params{uc($key)} = $v;
+        }
     }
     $params{'DIR'} = $TEMPDIR if(! exists($params{'DIR'}));
     unless (exists $params{'UNLINK'} &&
-        defined $params{'UNLINK'} &&
-        ! $params{'UNLINK'} ) {
-    $params{'UNLINK'} = 1;
-    } else { $params{'UNLINK'} = 0 }
-
-    if($FILETEMPLOADED) {
-    if(exists($params{'TEMPLATE'})) {
-        my $template = $params{'TEMPLATE'};
-        delete $params{'TEMPLATE'};
-        ($tfh, $file) = File::Temp::tempfile($template, %params);
-    } else {
-        ($tfh, $file) = File::Temp::tempfile(%params);
-    }
+            defined $params{'UNLINK'} &&
+            ! $params{'UNLINK'} ) {
+        $params{'UNLINK'} = 1;
     } else {
-    my $dir = $params{'DIR'};
-    $file = $self->catfile($dir,
-                   (exists($params{'TEMPLATE'}) ?
-                $params{'TEMPLATE'} :
-                sprintf( "%s.%s.%s",
-                     $ENV{USER} || 'unknown', $$,
-                     $TEMPCOUNTER++)));
-
-    # sneakiness for getting around long filenames on Win32?
-    if( $HAS_WIN32 ) {
-        $file = Win32::GetShortPathName($file);
+        $params{'UNLINK'} = 0;
     }
 
-    # Try to make sure this will be marked close-on-exec
-    # XXX: Win32 doesn't respect this, nor the proper fcntl,
-    #      but may have O_NOINHERIT. This may or may not be in Fcntl.
-    local $^F = 2;
-    # Store callers umask
-    my $umask = umask();
-    # Set a known umaskr
-    umask(066);
-    # Attempt to open the file
-    if ( sysopen($tfh, $file, $OPENFLAGS, 0600) ) {
-        # Reset umask
-        umask($umask);
+    if($FILETEMPLOADED) {
+        if(exists($params{'TEMPLATE'})) {
+            my $template = $params{'TEMPLATE'};
+            delete $params{'TEMPLATE'};
+            ($tfh, $file) = File::Temp::tempfile($template, %params);
+        } else {
+            ($tfh, $file) = File::Temp::tempfile(%params);
+        }
     } else {
-        $self->throw("Could not open tempfile $file: $!\n");
-    }
+        my $dir = $params{'DIR'};
+        $file = $self->catfile(
+            $dir,
+            (exists($params{'TEMPLATE'}) ?
+             $params{'TEMPLATE'} :
+             sprintf( "%s.%s.%s", $ENV{USER} || 'unknown', $$, $TEMPCOUNTER++))
+        );
+
+        # sneakiness for getting around long filenames on Win32?
+        if( $HAS_WIN32 ) {
+            $file = Win32::GetShortPathName($file);
+        }
+
+        # Try to make sure this will be marked close-on-exec
+        # XXX: Win32 doesn't respect this, nor the proper fcntl,
+        #      but may have O_NOINHERIT. This may or may not be in Fcntl.
+        local $^F = 2;
+        # Store callers umask
+        my $umask = umask();
+        # Set a known umaskr
+        umask(066);
+        # Attempt to open the file
+        if ( sysopen($tfh, $file, $OPENFLAGS, 0600) ) {
+            # Reset umask
+            umask($umask);
+        } else {
+            $self->throw("Could not write temporary file '$file': $!");
+        }
     }
 
     if(  $params{'UNLINK'} ) {
-    push @{$self->{'_rootio_tempfiles'}}, $file;
+        push @{$self->{'_rootio_tempfiles'}}, $file;
     }
 
-
     return wantarray ? ($tfh,$file) : $tfh;
 }
 
+
 =head2  tempdir
 
  Title   : tempdir
@@ -916,37 +896,39 @@ sub tempfile {
            temp directory. Use $Bio::Root::IO::TEMPDIR for that. Calling this
            method will in fact create a new directory.
 
- Returns : The name of a new temporary directory.
  Args    : args - ( key CLEANUP ) indicates whether or not to cleanup
            dir on object destruction, other keys as specified by File::Temp
+ Returns : The name of a new temporary directory.
 
 =cut
 
 sub tempdir {
-    my ( $self, @args ) = @_;
-    if($FILETEMPLOADED && File::Temp->can('tempdir') ) {
+    my ($self, @args) = @_;
+    if ($FILETEMPLOADED && File::Temp->can('tempdir')) {
         return File::Temp::tempdir(@args);
     }
 
     # we have to do this ourselves, not good
-    #
     # we are planning to cleanup temp files no matter what
     my %params = @args;
+    print "cleanup is " . $params{CLEANUP} . "\n";
     $self->{'_cleanuptempdir'} = ( defined $params{CLEANUP} &&
-                   $params{CLEANUP} == 1);
-    my $tdir = $self->catfile($TEMPDIR,
-                  sprintf("dir_%s-%s-%s",
-                      $ENV{USER} || 'unknown', $$,
-                      $TEMPCOUNTER++));
+                                   $params{CLEANUP} == 1);
+    my $tdir = $self->catfile( $TEMPDIR,
+                               sprintf("dir_%s-%s-%s",
+                                       $ENV{USER} || 'unknown',
+                                       $$,
+                                       $TEMPCOUNTER++));
     mkdir($tdir, 0755);
     push @{$self->{'_rootio_tempdirs'}}, $tdir;
     return $tdir;
 }
 
+
 =head2 catfile
 
  Title   : catfile
- Usage   : $path = Bio::Root::IO->catfile(@dirs,$filename);
+ Usage   : $path = Bio::Root::IO->catfile(@dirs, $filename);
  Function: Constructs a full pathname in a cross-platform safe way.
 
            If File::Spec exists on your system, this routine will merely
@@ -958,24 +940,25 @@ sub tempdir {
 
            You can call this method both as a class and an instance method.
 
- Returns : a string
  Args    : components of the pathname (directories and filename, NOT an
            extension)
+ Returns : a string
 
 =cut
 
 sub catfile {
     my ($self, @args) = @_;
 
-    return File::Spec->catfile(@args) if($FILESPECLOADED);
+    return File::Spec->catfile(@args) if $FILESPECLOADED;
     # this is clumsy and not very appealing, but how do we specify the
     # root directory?
     if($args[0] eq '/') {
-    $args[0] = $ROOTDIR;
+        $args[0] = $ROOTDIR;
     }
     return join($PATHSEP, @args);
 }
 
+
 =head2 rmtree
 
  Title   : rmtree
@@ -990,7 +973,6 @@ sub catfile {
 
            You can call this method both as a class and an instance method.
 
- Returns : number of files successfully deleted
  Args    : roots - rootdir to delete or reference to list of dirs
 
            verbose - a boolean value, which if TRUE will cause
@@ -1007,138 +989,139 @@ sub catfile {
                   future when a criterion for 'delete permission'
                   under OSs other than VMS is settled.  (defaults to
                   FALSE)
+ Returns : number of files successfully deleted
 
 =cut
 
 # taken straight from File::Path VERSION = "1.0403"
 sub rmtree {
-    my($self,$roots, $verbose, $safe) = @_;
-    if( $FILEPATHLOADED ) {
-    return File::Path::rmtree ($roots, $verbose, $safe);
+    my ($self, $roots, $verbose, $safe) = @_;
+    if ( $FILEPATHLOADED ) {
+        return File::Path::rmtree ($roots, $verbose, $safe);
     }
 
-    my $force_writable = ($^O eq 'os2' || $^O eq 'dos' || $^O eq 'MSWin32'
-               || $^O eq 'amigaos' || $^O eq 'cygwin');
+    my $force_writable = ($^O eq 'os2' || $^O eq 'dos' || $^O eq 'MSWin32' ||
+                          $^O eq 'amigaos' || $^O eq 'cygwin');
     my $Is_VMS = $^O eq 'VMS';
 
-    my(@files);
-    my($count) = 0;
+    my @files;
+    my $count = 0;
     $verbose ||= 0;
-    $safe ||= 0;
+    $safe    ||= 0;
     if ( defined($roots) && length($roots) ) {
-    $roots = [$roots] unless ref $roots;
+        $roots = [$roots] unless ref $roots;
     } else {
-    $self->warn("No root path(s) specified\n");
-    return 0;
+        $self->warn("No root path(s) specified\n");
+        return 0;
     }
 
-    my($root);
-    foreach $root (@{$roots}) {
-    $root =~ s#/\z##;
-    (undef, undef, my $rp) = lstat $root or next;
-    $rp &= 07777;   # don't forget setuid, setgid, sticky bits
-    if ( -d _ ) {
-        # notabene: 0777 is for making readable in the first place,
-        # it's also intended to change it to writable in case we have
-        # to recurse in which case we are better than rm -rf for
-        # subtrees with strange permissions
-        chmod(0777, ($Is_VMS ? VMS::Filespec::fileify($root) : $root))
-          or $self->warn("Can't make directory $root read+writable: $!")
-        unless $safe;
-        if (opendir(DIR, $root) ){
-        @files = readdir DIR;
-        closedir(DIR);
-        } else {
-            $self->warn( "Can't read $root: $!");
-        @files = ();
-        }
+    my $root;
+    for $root (@{$roots}) {
+        $root =~ s#/\z##;
+        (undef, undef, my $rp) = lstat $root or next;
+        $rp &= 07777;   # don't forget setuid, setgid, sticky bits
+        if ( -d _ ) {
+            # notabene: 0777 is for making readable in the first place,
+            # it's also intended to change it to writable in case we have
+            # to recurse in which case we are better than rm -rf for
+            # subtrees with strange permissions
+            chmod(0777, ($Is_VMS ? VMS::Filespec::fileify($root) : $root))
+              or $self->warn("Could not make directory '$root' read+writable: $!")
+            unless $safe;
+            if (opendir DIR, $root){
+                @files = readdir DIR;
+                closedir DIR;
+            } else {
+                $self->warn("Could not read directory '$root': $!");
+                @files = ();
+            }
 
-        # Deleting large numbers of files from VMS Files-11 filesystems
-        # is faster if done in reverse ASCIIbetical order
-        @files = reverse @files if $Is_VMS;
-        ($root = VMS::Filespec::unixify($root)) =~ s#\.dir\z## if $Is_VMS;
-        @files = map("$root/$_", grep $_!~/^\.{1,2}\z/s,@files);
-        $count += $self->rmtree([@files],$verbose,$safe);
-        if ($safe &&
-        ($Is_VMS ? !&VMS::Filespec::candelete($root) : !-w $root)) {
-        print "skipped $root\n" if $verbose;
-        next;
-        }
-        chmod 0777, $root
-          or $self->warn( "Can't make directory $root writable: $!")
-        if $force_writable;
-        print "rmdir $root\n" if $verbose;
-        if (rmdir $root) {
-        ++$count;
+            # Deleting large numbers of files from VMS Files-11 filesystems
+            # is faster if done in reverse ASCIIbetical order
+            @files = reverse @files if $Is_VMS;
+            ($root = VMS::Filespec::unixify($root)) =~ s#\.dir\z## if $Is_VMS;
+            @files = map("$root/$_", grep $_!~/^\.{1,2}\z/s,@files);
+            $count += $self->rmtree([@files],$verbose,$safe);
+            if ($safe &&
+              ($Is_VMS ? !&VMS::Filespec::candelete($root) : !-w $root)) {
+                print "skipped '$root'\n" if $verbose;
+                next;
+            }
+            chmod 0777, $root
+              or $self->warn("Could not make directory '$root' writable: $!")
+              if $force_writable;
+            print "rmdir '$root'\n" if $verbose;
+            if (rmdir $root) {
+                ++$count;
+            }
+            else {
+                $self->warn("Could not remove directory '$root': $!");
+                chmod($rp, ($Is_VMS ? VMS::Filespec::fileify($root) : $root))
+                  or $self->warn("and can't restore permissions to "
+                                 . sprintf("0%o",$rp) . "\n");
+            }
         }
         else {
-        $self->warn( "Can't remove directory $root: $!");
-        chmod($rp, ($Is_VMS ? VMS::Filespec::fileify($root) : $root))
-            or $self->warn("and can't restore permissions to "
-                    . sprintf("0%o",$rp) . "\n");
-        }
-    }
-    else {
-
-        if ($safe &&
-        ($Is_VMS ? !&VMS::Filespec::candelete($root)
-                 : !(-l $root || -w $root)))
-        {
-        print "skipped $root\n" if $verbose;
-        next;
-        }
-        chmod 0666, $root
-          or $self->warn( "Can't make file $root writable: $!")
-        if $force_writable;
-        warn "unlink $root\n" if $verbose;
-        # delete all versions under VMS
-        for (;;) {
-        unless (unlink $root) {
-            $self->warn( "Can't unlink file $root: $!");
-            if ($force_writable) {
-            chmod $rp, $root
-                or $self->warn("and can't restore permissions to "
-                        . sprintf("0%o",$rp) . "\n");
+            if (     $safe
+                and ($Is_VMS ? !&VMS::Filespec::candelete($root)
+                             : !(-l $root || -w $root))
+                ) {
+                print "skipped '$root'\n" if $verbose;
+                next;
+            }
+            chmod 0666, $root
+              or $self->warn( "Could not make file '$root' writable: $!")
+              if $force_writable;
+            warn "unlink '$root'\n" if $verbose;
+            # delete all versions under VMS
+            for (;;) {
+                unless (unlink $root) {
+                    $self->warn("Could not unlink file '$root': $!");
+                    if ($force_writable) {
+                        chmod $rp, $root
+                          or $self->warn("and can't restore permissions to "
+                                         . sprintf("0%o",$rp) . "\n");
+                    }
+                    last;
+                }
+                ++$count;
+                last unless $Is_VMS && lstat $root;
             }
-            last;
-        }
-        ++$count;
-        last unless $Is_VMS && lstat $root;
         }
     }
-    }
 
-    $count;
+    return $count;
 }
 
+
 =head2 _flush_on_write
 
  Title   : _flush_on_write
- Usage   : $obj->_flush_on_write($newval)
+ Usage   : $io->_flush_on_write($newval)
  Function: Boolean flag to indicate whether to flush
            the filehandle on writing when the end of
-           a component is finished (Sequences,Alignments,etc)
- Returns : value of _flush_on_write
- Args    : newvalue (optional)
-
+           a component is finished (Sequences, Alignments, etc)
+ Args    : Optional new value
+ Returns : Value of _flush_on_write
 
 =cut
 
 sub _flush_on_write {
-    my ($self,$value) = @_;
-    if( defined $value) {
-    $self->{'_flush_on_write'} = $value;
+    my ($self, $value) = @_;
+    if (defined $value) {
+        $self->{'_flush_on_write'} = $value;
     }
     return $self->{'_flush_on_write'};
 }
 
+
 =head2 save_tempfiles
 
  Title   : save_tempfiles
- Usage   : $obj->save_tempfiles(1)
+ Usage   : $io->save_tempfiles(1)
  Function: Boolean flag to indicate whether to retain tempfiles/tempdir
- Returns : Boolean value : 1 = save tempfiles/tempdirs, 0 = remove (default)
  Args    : Value evaluating to TRUE or FALSE
+ Returns : Boolean value : 1 = save tempfiles/tempdirs, 0 = remove (default)
 
 =cut
 
@@ -1151,4 +1134,5 @@ sub save_tempfiles {
     return $self->{save_tempfiles} || 0;
 }
 
+
 1;
@@ -1,11 +1,17 @@
 package Bio::Root::Root;
 use strict;
+use Bio::Root::IO;
 use Scalar::Util qw(blessed reftype);
+use base qw(Bio::Root::RootI);
 
-
-=head1 NAME
-
-Bio::Root::Root - Hash-based implementation of Bio::Root::RootI
+# ABSTRACT: hash-based implementation of L<Bio::Root::RootI>
+# AUTHOR:   Steve Chervitz <sac@bioperl.org>
+# AUTHOR:   Ewan Birney
+# AUTHOR:   Lincoln Stein
+# OWNER:    Steve Chervitz
+# OWNER:    Ewan Birney
+# OWNER:    Lincoln Stein
+# LICENSE:  Perl_5
 
 =head1 SYNOPSIS
 
@@ -110,10 +116,11 @@ for Error for more details.
 Here's an example. See the L<Bio::Root::Exception> module for
 other pre-defined exception types:
 
+   my $IN;
    try {
-    open( IN, $file) || $obj->throw( -class => 'Bio::Root::FileOpenException',
-                                     -text => "Cannot open file $file for reading",
-                                     -value => $!);
+    open $IN, '<', $file or $obj->throw( -class => 'Bio::Root::FileOpenException',
+                                         -text  => "Cannot read file '$file'",
+                                         -value => $!);
    }
    catch Bio::Root::BadParameter with {
        my $err = shift;   # get the Error object
@@ -132,61 +139,10 @@ other pre-defined exception types:
    };
    # the ending semicolon is essential!
 
-=head1 FEEDBACK
-
-=head2 Mailing Lists
-
-User feedback is an integral part of the evolution of this
-and other Bioperl modules. Send your comments and suggestions preferably
-to one of the Bioperl mailing lists.
-
-Your participation is much appreciated.
-
-  bioperl-l@bioperl.org                  - General discussion
-  http://bioperl.org/wiki/Mailing_lists  - About the mailing lists
-
-=head2 Support
-
-Please direct usage questions or support issues to the mailing list:
-
-I<bioperl-l@bioperl.org>
-
-rather than to the module maintainer directly. Many experienced and
-reponsive experts will be able look at the problem and quickly
-address it. Please include a thorough description of the problem
-with code and data examples if at all possible.
-
-=head2 Reporting Bugs
-
-Report bugs to the Bioperl bug tracking system to help us keep track
-the bugs and their resolution.  Bug reports can be submitted via the
-web:
-
-  https://redmine.open-bio.org/projects/bioperl/
-
-=head1 AUTHOR
-
-Functions originally from Steve Chervitz.
-Refactored by Ewan Birney.
-Re-refactored by Lincoln Stein.
-
-=head1 APPENDIX
-
-The rest of the documentation details each of the object
-methods. Internal methods are usually preceded with a _
-
 =cut
 
-#'
-
-use strict;
-use Bio::Root::IO;
-
-use base qw(Bio::Root::RootI);
-
 our ($DEBUG, $ID, $VERBOSITY, $ERRORLOADED, $CLONE_CLASS);
 
-
 BEGIN {
     $ID        = 'Bio::Root::Root';
     $DEBUG     = 0;
@@ -199,7 +155,7 @@ BEGIN {
     # when you don't want to use the Error module, even if it is installed.
     # Just put a INIT { $DONT_USE_ERROR = 1; } at the top of your script.
     if( not $main::DONT_USE_ERROR ) {
-        if ( eval "require Error"  ) {
+        if ( eval "require Error; 1;"  ) {
             import Error qw(:try);
             require Bio::Root::Exception;
             $ERRORLOADED = 1;
@@ -211,16 +167,19 @@ BEGIN {
     }
 
     # set up _dclone()
-    for my $class (qw(Clone::Fast Clone Storable)) {
+    for my $class (qw(Clone Storable)) {
         eval "require $class; 1;";
         if (!$@) {
             $CLONE_CLASS = $class;
-            if ($class eq 'Clone::Fast') {
-                *Bio::Root::Root::_dclone = sub {shift; return Clone::Fast::clone(shift)};
-            } elsif ($class eq 'Clone') {
+            if ($class eq 'Clone') {
                 *Bio::Root::Root::_dclone = sub {shift; return Clone::clone(shift)};
             } else {
-                *Bio::Root::Root::_dclone = sub {shift; return Storable::dclone(shift)};
+                *Bio::Root::Root::_dclone = sub {
+                    shift;
+                    local $Storable::Deparse = 1;
+                    local $Storable::Eval = 1;
+                    return Storable::dclone(shift);
+                };
             }
             last;
         }
@@ -238,7 +197,7 @@ BEGIN {
             } elsif ($reftype eq "HASH") {
                 $data = { map { $_ => $self->_dclone($orig->{$_}) } keys %$orig };
             } elsif ($reftype eq 'CODE') { # nothing, maybe shallow copy?
-                $self->throw("Code reference cloning not supported");
+                $self->throw("Code reference cloning not supported; install Clone or Storable from CPAN");
             } else { $self->throw("What type is $_?")}
             if ($class) {
                 bless $data, $class;
@@ -250,7 +209,6 @@ BEGIN {
     $main::DONT_USE_ERROR;  # so that perl -w won't warn "used only once"
 }
 
-
 =head2 new
 
  Purpose   : generic instantiation function can be overridden if
@@ -259,7 +217,7 @@ BEGIN {
 =cut
 
 sub new {
-    #my ($class, %param) = @_;
+#    my ($class, %param) = @_;
     my $class = shift;
     my $self = {};
     bless $self, ref($class) || $class;
@@ -329,7 +287,6 @@ sub clone {
     return $clone;
 }
 
-
 =head2 _dclone
 
  Title   : clone
@@ -349,7 +306,6 @@ sub clone {
 
 =cut
 
-
 =head2 verbose
 
  Title   : verbose
@@ -377,6 +333,9 @@ sub verbose {
     return $self->{'_root_verbose'};
 }
 
+=head2 _register_for_cleanup
+
+=cut
 
 sub _register_for_cleanup {
     my ($self,$method) = @_;
@@ -388,6 +347,9 @@ sub _register_for_cleanup {
     }
 }
 
+=head2 _unregister_for_cleanup
+
+=cut
 
 sub _unregister_for_cleanup {
     my ($self,$method) = @_;
@@ -395,7 +357,9 @@ sub _unregister_for_cleanup {
     $self->{'_root_cleanup_methods'} = \@methods;
 }
 
+=head2 _cleanup_methods
 
+=cut
 
 sub _cleanup_methods {
     my $self = shift;
@@ -404,7 +368,6 @@ sub _cleanup_methods {
     @$methods;
 }
 
-
 =head2 throw
 
  Title   : throw
@@ -498,7 +461,6 @@ sub throw {
     }
 }
 
-
 =head2 debug
 
  Title   : debug
@@ -511,6 +473,7 @@ sub throw {
 
 sub debug {
     my ($self, @msgs) = @_;
+
     # using CORE::warn doesn't give correct backtrace information; we want the
     # line from the previous call in the call stack, not this call (similar to
     # cluck).  For now, just add a stack trace dump and simple comment under the
@@ -524,7 +487,6 @@ sub debug {
     }
 }
 
-
 =head2 _load_module
 
  Title   : _load_module
@@ -563,6 +525,9 @@ sub _load_module {
     return 1;
 }
 
+=head2 DESTROY
+
+=cut
 
 sub DESTROY {
     my $self = shift;
@@ -573,4 +538,3 @@ sub DESTROY {
 }
 
 1;
-
@@ -1,29 +1,22 @@
-#
-# BioPerl module for Bio::Root::RootI
-#
-# Please direct questions and support issues to <bioperl-l@bioperl.org> 
-#
-# Cared for by Ewan Birney <birney@ebi.ac.uk>
-#
-# Copyright Ewan Birney
-#
-# You may distribute this module under the same terms as perl itself
-
-# POD documentation - main docs before the code
-# 
-# This was refactored to have chained calls to new instead
-# of chained calls to _initialize
-#
-# added debug and deprecated methods --Jason Stajich 2001-10-12
-# 
-
-=head1 NAME
-
-Bio::Root::RootI - Abstract interface to root object code
+package Bio::Root::RootI;
+use strict;
+use Carp 'confess','carp';
+
+# ABSTRACT: abstract interface to root object code
+# AUTHOR:   Steve Chervitz <sac@bioperl.org>
+# AUTHOR:   Ewan Birney <birney@ebi.ac.uk>
+# AUTHOR:   Lincoln Stein
+# OWNER:    Steve Chervitz
+# OWNER:    Ewan Birney
+# OWNER:    Lincoln Stein
+# LICENSE:  Perl_5
+
+# CONTRIBUTOR: Sendu Bala <bix@sendu.me.uk>
+# CONTRIBUTOR: Jason Stajich
 
 =head1 SYNOPSIS
 
-  # any bioperl or bioperl compliant object is a RootI 
+  # any bioperl or bioperl compliant object is a RootI
   # compliant object
 
   $obj->throw("This is an exception");
@@ -86,42 +79,27 @@ running C<perl -wc> on it). So it should be standard practice for a test
 of an implementation to check each method and verify that it doesn't
 throw a L<Bio::Exception::NotImplemented>.
 
-=head1 CONTACT
-
-Functions originally from Steve Chervitz. Refactored by Ewan
-Birney. Re-refactored by Lincoln Stein. Added to by Sendu Bala.
-
-=head1 APPENDIX
-
-The rest of the documentation details each of the object
-methods. Internal methods are usually preceded with a _
-
 =cut
 
-# Let the code begin...
-
-package Bio::Root::RootI;
-
 use vars qw($DEBUG $ID $VERBOSITY);
-use strict;
-use Carp 'confess','carp';
-
-use Bio::Root::Version;
-
-BEGIN { 
+BEGIN {
     $ID        = 'Bio::Root::RootI';
     $DEBUG     = 0;
     $VERBOSITY = 0;
 }
 
+=head2 new
+
+=cut
+
 sub new {
-  my $class = shift;
-  my @args = @_;
-  unless ( $ENV{'BIOPERLDEBUG'} ) {
-      carp("Use of new in Bio::Root::RootI is deprecated.  Please use Bio::Root::Root instead");
-  }
-  eval "require Bio::Root::Root";
-  return Bio::Root::Root->new(@args);
+    my $class = shift;
+    my @args = @_;
+    unless ( $ENV{'BIOPERLDEBUG'} ) {
+        carp("Use of new in Bio::Root::RootI is deprecated.  Please use Bio::Root::Root instead");
+    }
+    eval "require Bio::Root::Root";
+    return Bio::Root::Root->new(@args);
 }
 
 # for backwards compatibility
@@ -144,14 +122,14 @@ sub _initialize {
 =cut
 
 sub throw{
-   my ($self,$string) = @_;
-
-   my $std = $self->stack_trace_dump();
+    my ($self,$string) = @_;
 
-   my $out = "\n-------------------- EXCEPTION --------------------\n".
-       "MSG: ".$string."\n".$std."-------------------------------------------\n";
-   die $out;
+    my $std = $self->stack_trace_dump();
 
+    my $out = "\n-------------------- EXCEPTION --------------------\n"
+            . "MSG: " . $string . "\n"
+            . $std."-------------------------------------------\n";
+    die $out;
 }
 
 =head2 warn
@@ -159,7 +137,7 @@ sub throw{
  Title   : warn
  Usage   : $object->warn("Warning message");
  Function: Places a warning. What happens now is down to the
-           verbosity of the object  (value of $obj->verbose) 
+           verbosity of the object  (value of $obj->verbose)
             verbosity 0 or not set => small warning
             verbosity -1 => no warning
             verbosity 1 => warning with stack trace
@@ -171,12 +149,12 @@ sub throw{
 
 sub warn {
     my ($self,$string) = @_;
-    
+
     my $verbose = $self->verbose;
-    
+
     my $header = "\n--------------------- WARNING ---------------------\nMSG: ";
     my $footer =   "---------------------------------------------------\n";
-    
+
     if ($verbose >= 2) {
         $self->throw($string);
     }
@@ -186,8 +164,8 @@ sub warn {
     elsif ($verbose == 1) {
         CORE::warn $header, $string, "\n", $self->stack_trace_dump, $footer;
         return;
-    }    
-    
+    }
+
     CORE::warn $header, $string, "\n", $footer;
 }
 
@@ -205,36 +183,36 @@ sub warn {
  Args    : Message string to print to STDERR
            Version of BioPerl where use of the method results in an exception
  Notes   : The method can be called two ways, either by positional arguments:
-           
+
            $obj->deprecated('This module is deprecated', 1.006);
-           
+
            or by named arguments:
-           
+
            $obj->deprecated(
                 -message => 'use of the method foo() is deprecated, use bar() instead',
                 -version => 1.006  # throw if $VERSION is >= this version
                 );
 
            or timed to go off at a certain point:
-           
+
            $obj->deprecated(
                 -message => 'use of the method foo() is deprecated, use bar() instead',
                 -warn_version    => 1.006 # warn if $VERSION is >= this version
                 -throw_version   => 1.007 # throw if $VERSION is >= this version
                 );
-           
+
            Using the last two named argument versions is suggested and will
            likely be the only supported way of calling this method in the future
            Yes, we see the irony of deprecating that particular usage of
            deprecated().
-           
+
            The main difference between usage of the two named argument versions
            is that by designating a 'warn_version' one indicates the
            functionality is officially deprecated beginning in a future version
            of BioPerl (so warnings are issued only after that point), whereas
            setting either 'version' or 'throw_version' (synonyms) converts the
            deprecation warning to an exception.
-           
+
            For proper comparisons one must use a version in lines with the
            current versioning scheme for Perl and BioPerl, (i.e. where 1.006000
            indicates v1.6.0, 5.010000 for v5.10.0, etc.).
@@ -243,27 +221,43 @@ sub warn {
 
 sub deprecated{
     my ($self) = shift;
+
+    my $class = ref $self || $self;
+    my $class_version = do {
+        no strict 'refs';
+        ${"${class}::VERSION"}
+    };
+
+    if( $class_version && $class_version =~ /set by/ ) {
+        $class_version = 0.0001;
+    }
+
     my ($msg, $version, $warn_version, $throw_version) =
-        $self->_rearrange([qw(MESSAGE VERSION WARN_VERSION THROW_VERSION)], @_);    
-    $version ||= $throw_version;
-    for my $v ($warn_version, $version) {
-        next unless defined $v;
-        $self->throw('Version must be numerical, such as 1.006000 for v1.6.0, not '.
-                     $v) unless $v =~ /^\d+\.\d+$/;
+        $self->_rearrange([qw(MESSAGE VERSION WARN_VERSION THROW_VERSION)], @_);
+
+    $throw_version ||= $version;
+    $warn_version  ||= $class_version;
+
+    for my $v ( $warn_version, $throw_version) {
+        no warnings 'numeric';
+        $self->throw("Version must be numerical, such as 1.006000 for v1.6.0, not $v")
+            unless !defined $v || $v + 0 eq $v;
     }
-    return if ($warn_version && $Bio::Root::Version::VERSION < $warn_version);
+
     # below default insinuates we're deprecating a method and not a full module
     # but it's the most common use case
-    $msg ||= "Use of ".(caller(1))[3]."() is deprecated";
-    # delegate to either warn or throw based on whether a version is given
-    if ($version) {
-        $msg .= "\nTo be removed in $version";
-        if ($Bio::Root::Version::VERSION >= $version) {
-            $self->throw($msg)
-        } 
+    $msg ||= "Use of ".(caller(1))[3]."() is deprecated.";
+
+    if( $throw_version && $class_version && $class_version >= $throw_version ) {
+        $self->throw($msg)
+    }
+    elsif( $warn_version && $class_version && $class_version >= $warn_version ) {
+
+        $msg .= "\nTo be removed in $throw_version." if $throw_version;
+
+        # passing this on to warn() should deal properly with verbosity issues
+        $self->warn($msg);
     }
-    # passing this on to warn() should deal properly with verbosity issues
-    $self->warn($msg);
 }
 
 =head2 stack_trace_dump
@@ -272,31 +266,31 @@ sub deprecated{
  Usage   :
  Function:
  Example :
- Returns : 
+ Returns :
  Args    :
 
 
 =cut
 
 sub stack_trace_dump{
-   my ($self) = @_;
+    my ($self) = @_;
 
-   my @stack = $self->stack_trace();
+    my @stack = $self->stack_trace();
 
-   shift @stack;
-   shift @stack;
-   shift @stack;
+    shift @stack;
+    shift @stack;
+    shift @stack;
 
-   my $out;
-   my ($module,$function,$file,$position);
-   
+    my $out;
+    my ($module,$function,$file,$position);
 
-   foreach my $stack ( @stack) {
-       ($module,$file,$position,$function) = @{$stack};
-       $out .= "STACK $function $file:$position\n";
-   }
 
-   return $out;
+    foreach my $stack ( @stack) {
+        ($module,$file,$position,$function) = @{$stack};
+        $out .= "STACK $function $file:$position\n";
+    }
+
+    return $out;
 }
 
 
@@ -313,21 +307,21 @@ sub stack_trace_dump{
 =cut
 
 sub stack_trace{
-   my ($self) = @_;
-
-   my $i = 0;
-   my @out = ();
-   my $prev = [];
-   while( my @call = caller($i++)) {
-       # major annoyance that caller puts caller context as
-       # function name. Hence some monkeying around...
-       $prev->[3] = $call[3];
-       push(@out,$prev);
-       $prev = \@call;
-   }
-   $prev->[3] = 'toplevel';
-   push(@out,$prev);
-   return @out;
+    my ($self) = @_;
+
+    my $i = 0;
+    my @out = ();
+    my $prev = [];
+    while( my @call = caller($i++)) {
+        # major annoyance that caller puts caller context as
+        # function name. Hence some monkeying around...
+        $prev->[3] = $call[3];
+        push(@out,$prev);
+        $prev = \@call;
+    }
+    $prev->[3] = 'toplevel';
+    push(@out,$prev);
+    return @out;
 }
 
 
@@ -349,7 +343,7 @@ sub stack_trace{
            : @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 
+           :          (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
@@ -359,7 +353,7 @@ sub stack_trace{
            : then adapted for use in Bio::Root::Object.pm by Steve Chervitz,
            : then migrated into Bio::Root::RootI.pm by Ewan Birney.
  Comments  :
-           : Uppercase tags are the norm, 
+           : Uppercase tags are the norm,
            : (SAC)
            : This method may not be appropriate for method calls that are
            : within in an inner loop if efficiency is a concern.
@@ -369,12 +363,12 @@ sub stack_trace{
            :  @param = (-NAME=>'me', -COLOR=>'blue');
            :  @param = (-Name=>'me', -Color=>'blue');
            :  @param = ('me', 'blue');
-           : A leading hyphenated argument is used by this function to 
+           : A leading hyphenated argument is used by this function to
            : indicate that named parameters are being used.
            : Therefore, the ('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 
+           : 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'
            :
@@ -386,7 +380,7 @@ sub stack_trace{
            :
            : Personal note (SAC): I have found all uppercase tags to
            : be more manageable: it involves less single-quoting,
-           : the key names stand out better, and there are no method naming 
+           : the key names stand out better, and there are no method naming
            : conflicts.
            : The drawbacks are that it's not as easy to type as lowercase,
            : and lots of uppercase can be hard to read.
@@ -402,17 +396,16 @@ sub stack_trace{
 =cut
 
 sub _rearrange {
-    shift; #discard self
-    my $order = shift;
+    my ($self, $order, @args) = @_;
 
-    return @_ unless $_[0] && $_[0] =~ /^\-/;
+    return @args unless $args[0] && $args[0] =~ /^\-/;
 
-    push @_, undef unless $#_ % 2;
+    push @args, undef unless $#args % 2;
 
     my %param;
-    for( my $i = 0; $i < @_; $i += 2 ) {
-        (my $key = $_[$i]) =~ tr/a-z\055/A-Z/d; #deletes all dashes!
-        $param{$key} = $_[$i+1];
+    for( my $i = 0; $i < @args; $i += 2 ) {
+        (my $key = $args[$i]) =~ tr/a-z\055/A-Z/d; #deletes all dashes!
+        $param{$key} = $args[$i+1];
     }
     return @param{map uc, @$order};
 }
@@ -498,7 +491,7 @@ sub _rearrange {
 sub _set_from_args {
     my ($self, $args, @own_args) = @_;
     $self->throw("a hash/array ref of arguments must be supplied") unless ref($args);
-    
+
     my ($methods, $force, $create, $code, $case);
     if (@own_args) {
         ($methods, $force, $create, $code, $case) =
@@ -511,7 +504,7 @@ sub _set_from_args {
     my $default_code = 'my $self = shift;
                         if (@_) { $self->{\'_\'.$method} = shift }
                         return $self->{\'_\'.$method};';
-    
+
     my %method_names = ();
     my %syns = ();
     if ($methods) {
@@ -526,7 +519,7 @@ sub _set_from_args {
         }
         %method_names = map { $case ? $_ : lc($_) => $_ } @names;
     }
-    
+
     # deal with hyphens
     my %orig_args = ref($args) eq 'HASH' ? %{$args} : @{$args};
     my %args;
@@ -535,33 +528,33 @@ sub _set_from_args {
         $method =~ s/-/_/g;
         $args{$method} = $value;
     }
-    
+
     # create non-existing methods on request
     if ($create) {
         unless ($methods) {
             %syns = map { $_ => $case ? $_ : lc($_) } keys %args;
         }
-        
+
         foreach my $method (keys %syns) {
             $self->can($method) && next;
-            
+
             my $string = $code || $default_code;
             if (ref($code) && ref($code) eq 'HASH') {
                 $string = $code->{$method} || $default_code;
             }
-            
+
             my $sub = eval "sub { $string }";
             $self->throw("Compilation error for $method : $@") if $@;
-            
+
             no strict 'refs';
             *{ref($self).'::'.$method} = $sub;
         }
     }
-    
+
     # create synonyms of existing methods
     while (my ($method, $syn_ref) = each %syns) {
         my $method_ref = $self->can($method) || next;
-        
+
         foreach my $syn (@{ ref($syn_ref) ? $syn_ref : [$syn_ref] }) {
             next if $syn eq $method;
             $method_names{$case ? $syn : lc($syn)} = $syn;
@@ -570,7 +563,7 @@ sub _set_from_args {
             *{ref($self).'::'.$syn} = $method_ref;
         }
     }
-    
+
     # set values for methods
     while (my ($method, $value) = each %args) {
         $method = $method_names{$case ? $method : lc($method)} || ($methods ? next : $method);
@@ -579,11 +572,16 @@ sub _set_from_args {
     }
 }
 
+
+=head2 _rearrange_old
+
+=cut
+
 #----------------'
 sub _rearrange_old {
 #----------------
     my($self,$order,@param) = @_;
-    
+
     # JGRG -- This is wrong, because we don't want
     # to assign empty string to anything, and this
     # code is actually returning an array 1 less
@@ -592,13 +590,13 @@ sub _rearrange_old {
     ## If there are no parameters, we simply wish to return
     ## an empty array which is the size of the @{$order} array.
     #return ('') x $#{$order} unless @param;
-    
+
     # ...all we need to do is return an empty array:
     # return unless @param;
-    
+
     # 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. 
+    # can just return them.
 
     # The mod test fixes bug where a single string parameter beginning with '-' gets lost.
     # This tends to happen in error messages such as: $obj->throw("-id not defined")
@@ -615,18 +613,18 @@ sub _rearrange_old {
         $param[$i]=~s/^\-//;
         $param[$i]=~tr/a-z/A-Z/;
     }
-    
+
     # Now we'll convert the @params variable into an associative array.
     # local($^W) = 0;  # prevent "odd number of elements" warning with -w.
     my(%param) = @param;
-    
+
     # my(@return_array);
-    
+
     # 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.
     # my($key);
-    
+
     #foreach (@{$order}) {
     # my($value) = $param{$key};
     # delete $param{$key};
@@ -634,7 +632,7 @@ sub _rearrange_old {
     #}
 
     return @param{@{$order}};
-    
+
 #    print "\n_rearrange() after processing:\n";
 #    my $i; for ($i=0;$i<@return_array;$i++) { printf "%20s => %s\n", ${$order}[$i], $return_array[$i]; } <STDIN>;
 
@@ -648,7 +646,7 @@ sub _rearrange_old {
  Function: Register a method to be called at DESTROY time. This is useful
            and sometimes essential in the case of multiple inheritance for
            classes coming second in the sequence of inheritance.
- Returns : 
+ Returns :
  Args    : a code reference
 
 The code reference will be invoked with the object as the first
@@ -658,8 +656,8 @@ cleanup methods.
 =cut
 
 sub _register_for_cleanup {
-  my ($self,$method) = @_;
-   $self->throw_not_implemented();
+    my ($self,$method) = @_;
+    $self->throw_not_implemented();
 }
 
 =head2 _unregister_for_cleanup
@@ -675,8 +673,8 @@ sub _register_for_cleanup {
 =cut
 
 sub _unregister_for_cleanup {
-  my ($self,$method) = @_;
-   $self->throw_not_implemented();
+    my ($self,$method) = @_;
+    $self->throw_not_implemented();
 }
 
 =head2 _cleanup_methods
@@ -690,22 +688,22 @@ sub _unregister_for_cleanup {
 =cut
 
 sub _cleanup_methods {
-  my $self = shift;
-  unless ( $ENV{'BIOPERLDEBUG'} || $self->verbose  > 0 ) {
-      carp("Use of Bio::Root::RootI is deprecated.  Please use Bio::Root::Root instead");
-  }
-  return;
+    my $self = shift;
+    unless ( $ENV{'BIOPERLDEBUG'} || $self->verbose  > 0 ) {
+        carp("Use of Bio::Root::RootI is deprecated.  Please use Bio::Root::Root instead");
+    }
+    return;
 }
 
 =head2 throw_not_implemented
 
  Purpose : Throws a Bio::Root::NotImplemented exception.
-           Intended for use in the method definitions of 
+           Intended for use in the method definitions of
            abstract interface modules where methods are defined
            but are intended to be overridden by subclasses.
  Usage   : $object->throw_not_implemented();
- Example : sub method_foo { 
-             $self = shift; 
+ Example : sub method_foo {
+             $self = shift;
              $self->throw_not_implemented();
            }
  Returns : n/a
@@ -717,7 +715,7 @@ sub _cleanup_methods {
              - the name of the implementing class
 
            If this object has a throw() method, $self->throw will be used.
-           If the object doesn't have a throw() method, 
+           If the object doesn't have a throw() method,
            Carp::confess() will be used.
 
 
@@ -756,12 +754,12 @@ sub throw_not_implemented {
 =head2 warn_not_implemented
 
  Purpose : Generates a warning that a method has not been implemented.
-           Intended for use in the method definitions of 
+           Intended for use in the method definitions of
            abstract interface modules where methods are defined
            but are intended to be overridden by subclasses.
            Generally, throw_not_implemented() should be used,
            but warn_not_implemented() may be used if the method isn't
-           considered essential and convenient no-op behavior can be 
+           considered essential and convenient no-op behavior can be
            provided within the interface.
  Usage   : $object->warn_not_implemented( method-name-string );
  Example : $self->warn_not_implemented( "get_foobar" );
@@ -785,7 +783,11 @@ sub warn_not_implemented {
     }
 }
 
-# Unify 'not implemented' message. -Juguang
+=head2 _not_implemented_msg
+
+Unify 'not implemented' message. -Juguang
+=cut
+
 sub _not_implemented_msg {
     my $self = shift;
     my $package = ref $self;
@@ -1,19 +1,14 @@
-#
-# BioPerl module for Bio::Root::Storable
-#
-# Please direct questions and support issues to <bioperl-l@bioperl.org> 
-#
-# Cared for by Will Spooner <whs@sanger.ac.uk>
-#
-# Copyright Will Spooner <whs@sanger.ac.uk>
-#
-# You may distribute this module under the same terms as perl itself
-
-# POD documentation - main docs before the code
-
-=head1 NAME
+package Bio::Root::Storable;
+use strict;
+use Bio::Root::IO;
+use Data::Dumper qw( Dumper );
+use File::Spec;
+use base qw(Bio::Root::Root);
 
-Bio::Root::Storable - object serialisation methods
+# ABSTRACT: object serialisation methods
+# AUTHOR:   Will Spooner <whs@sanger.ac.uk>
+# OWNER:    Will Spooner
+# LICENSE:  Perl_5
 
 =head1 SYNOPSIS
 
@@ -51,67 +46,15 @@ Perl Data::Dumper module) is used instead.
 ASCII storage can be enabled by default by setting the value of
 $Bio::Root::Storable::BINARY to false.
 
-
-
-=head1 FEEDBACK
-
-=head2 Mailing Lists
-
-User feedback is an integral part of the evolution of this and other
-Bioperl modules. Send your comments and suggestions preferably to one
-of the Bioperl mailing lists.  Your participation is much appreciated.
-
-  bioperl-l@bio.perl.org
-
-=head2 Support 
-
-Please direct usage questions or support issues to the mailing list:
-
-I<bioperl-l@bioperl.org>
-
-rather than to the module maintainer directly. Many experienced and 
-reponsive experts will be able look at the problem and quickly 
-address it. Please include a thorough description of the problem 
-with code and data examples if at all possible.
-
-=head2 Reporting Bugs
-
-Report bugs to the Bioperl bug tracking system to help us keep track
-the bugs and their resolution. Bug reports can be submitted via the
-web:
-
-  https://redmine.open-bio.org/projects/bioperl/
-
-=head1 AUTHOR - Will Spooner
-
-Email whs@sanger.ac.uk
-
-
-=head1 APPENDIX
-
-The rest of the documentation details each of the object methods.
-Internal methods are usually preceded with a _
-
 =cut
 
-
-# Let the code begin...
-package Bio::Root::Storable;
-
-use strict;
-use Data::Dumper qw( Dumper );
-
-use File::Spec;
-use Bio::Root::IO;
-
 use vars qw( $BINARY );
-use base qw(Bio::Root::Root);
 
 BEGIN{
-  if( eval "require Storable" ){
-    Storable->import( 'freeze', 'thaw' );
-    $BINARY = 1;
-  }
+    if( eval "require Storable" ){
+        Storable->import( 'freeze', 'thaw' );
+        $BINARY = 1;
+    }
 }
 
 #----------------------------------------------------------------------
@@ -123,17 +66,17 @@ BEGIN{
               -suffix   => tmpfile suffix,
   Function  : Builds a new Bio::Root::Storable inhereting object
   Returntype: Bio::Root::Storable inhereting object
-  Exceptions: 
-  Caller    : 
+  Exceptions:
+  Caller    :
   Example   : $storable = Bio::Root::Storable->new()
 
 =cut
 
 sub new {
-  my ($caller, @args) = @_;
-  my $self = $caller->SUPER::new(@args);
-  $self->_initialise_storable;
-  return $self;
+    my ($caller, @args) = @_;
+    my $self = $caller->SUPER::new(@args);
+    $self->_initialise_storable;
+    return $self;
 }
 
 #----------------------------------------------------------------------
@@ -143,20 +86,20 @@ sub new {
   Arg [1]   : See 'new' method
   Function  : Initialises storable-specific attributes
   Returntype: boolean
-  Exceptions: 
-  Caller    : 
-  Example   : 
+  Exceptions:
+  Caller    :
+  Example   :
 
 =cut
 
 sub _initialise_storable {
-  my $self = shift;
-  my( $workdir, $template, $suffix ) =
-    $self->_rearrange([qw(WORKDIR TEMPLATE SUFFIX)], @_ );
-  $workdir  && $self->workdir ( $workdir );
-  $template && $self->template( $template );
-  $suffix   && $self->suffix  ( $suffix   );
-  return 1;
+    my $self = shift;
+    my( $workdir, $template, $suffix ) =
+        $self->_rearrange([qw(WORKDIR TEMPLATE SUFFIX)], @_ );
+    $workdir  && $self->workdir ( $workdir );
+    $template && $self->template( $template );
+    $suffix   && $self->suffix  ( $suffix   );
+    return 1;
 }
 
 
@@ -170,37 +113,37 @@ sub _initialise_storable {
               Should not normaly use as a setter - let Root::IO
               do this for you.
   Returntype: string
-  Exceptions: 
+  Exceptions:
   Caller    : Bio::Root::Storable->store
   Example   : my $statefile = $obj->statefile();
 
 =cut
 
 sub statefile{
+    my $key = '_statefile';
+    my $self  = shift;
+
+    if( @_ ){ $self->{$key} = shift }
+
+    if( ! $self->{$key} ){ # Create a new statefile
+        my $workdir  = $self->workdir;
+        my $template = $self->template;
+        my $suffix   = $self->suffix;
+
+        # TODO: add cleanup and unlink methods. For now, we'll keep the
+        # statefile hanging around.
+        my @args = ( CLEANUP=>0, UNLINK=>0 );
+        if( $template ){ push( @args, 'TEMPLATE' => $template )};
+        if( $workdir  ){ push( @args, 'DIR'      => $workdir  )};
+        if( $suffix   ){ push( @args, 'SUFFIX'   => $suffix   )};
+        my( $fh, $file ) = Bio::Root::IO->new->tempfile( @args );
+        # If filehandle is not stored, don't leave it open
+        $fh->close;
+
+        $self->{$key} = $file;
+    }
 
-  my $key = '_statefile';
-  my $self  = shift;
-
-  if( @_ ){ $self->{$key} = shift }
-
-  if( ! $self->{$key} ){ # Create a new statefile
-
-    my $workdir  = $self->workdir;
-    my $template = $self->template;
-    my $suffix   = $self->suffix;
-
-    # TODO: add cleanup and unlink methods. For now, we'll keep the
-    # statefile hanging around.
-    my @args = ( CLEANUP=>0, UNLINK=>0 );
-    if( $template ){ push( @args, 'TEMPLATE' => $template )};
-    if( $workdir  ){ push( @args, 'DIR'      => $workdir  )};
-    if( $suffix   ){ push( @args, 'SUFFIX'   => $suffix   )};
-    my( $fh, $file ) = Bio::Root::IO->new->tempfile( @args );
-
-    $self->{$key} = $file;
-  }
-
-  return $self->{$key};
+    return $self->{$key};
 }
 
 #----------------------------------------------------------------------
@@ -210,23 +153,23 @@ sub statefile{
   Arg [1]   : string (optional) (TODO - convert to array for x-platform)
   Function  : Accessor for the statefile directory. Defaults to File::Spec->tmpdir
   Returntype: string
-  Exceptions: 
-  Caller    : 
+  Exceptions:
+  Caller    :
   Example   : $obj->workdir('/tmp/foo');
 
 =cut
 
 sub workdir {
-  my $key = '_workdir';
-  my $self = shift;
-  if( @_ ){
-    my $caller = join( ', ', (caller(0))[1..2] );
-    $self->{$key} && $self->debug("Overwriting workdir: probably bad!");
-    $self->{$key} = shift
-  }
-#  $self->{$key} ||= $Bio::Root::IO::TEMPDIR;
-  $self->{$key} ||= File::Spec->tmpdir();
-  return $self->{$key};
+    my $key = '_workdir';
+    my $self = shift;
+    if( @_ ){
+        my $caller = join( ', ', (caller(0))[1..2] );
+        $self->{$key} && $self->debug("Overwriting workdir: probably bad!");
+        $self->{$key} = shift
+    }
+    #$self->{$key} ||= $Bio::Root::IO::TEMPDIR;
+    $self->{$key} ||= File::Spec->tmpdir();
+    return $self->{$key};
 }
 
 #----------------------------------------------------------------------
@@ -236,18 +179,18 @@ sub workdir {
   Arg [1]   : string (optional)
   Function  : Accessor for the statefile template. Defaults to XXXXXXXX
   Returntype: string
-  Exceptions: 
-  Caller    : 
+  Exceptions:
+  Caller    :
   Example   : $obj->workdir('RES_XXXXXXXX');
 
 =cut
 
 sub template {
-  my $key = '_template';
-  my $self = shift;
-  if( @_ ){ $self->{$key} = shift }
-  $self->{$key} ||= 'XXXXXXXX';
-  return $self->{$key};
+    my $key = '_template';
+    my $self = shift;
+    if( @_ ){ $self->{$key} = shift }
+    $self->{$key} ||= 'XXXXXXXX';
+    return $self->{$key};
 }
 
 #----------------------------------------------------------------------
@@ -257,17 +200,17 @@ sub template {
   Arg [1]   : string (optional)
   Function  : Accessor for the statefile template.
   Returntype: string
-  Exceptions: 
-  Caller    : 
+  Exceptions:
+  Caller    :
   Example   : $obj->suffix('.state');
 
 =cut
 
 sub suffix {
-  my $key = '_suffix';
-  my $self = shift;
-  if( @_ ){ $self->{$key} = shift }
-  return $self->{$key};
+    my $key = '_suffix';
+    my $self = shift;
+    if( @_ ){ $self->{$key} = shift }
+    return $self->{$key};
 }
 
 #----------------------------------------------------------------------
@@ -280,25 +223,26 @@ sub suffix {
               The skeleton can be repopulated by calling 'retrieve'. This
               will be a clone of the original object.
   Returntype: Bio::Root::Storable inhereting object
-  Exceptions: 
-  Caller    : 
-  Example   : my $skel = $obj->new_retrievable(); # skeleton 
+  Exceptions:
+  Caller    :
+  Example   : my $skel = $obj->new_retrievable(); # skeleton
               $skel->retrieve();                  # clone
 
 =cut
 
 sub new_retrievable{
-   my $self = shift;
-   my @args = @_;
-
-   $self->_initialise_storable( @args );
-
-   if( $self->retrievable ){ return $self->clone } # Clone retrievable
-   return bless( { _statefile   => $self->store(@args),
-		   _workdir     => $self->workdir,
-		   _suffix      => $self->suffix,
-		   _template    => $self->template,
-		   _retrievable => 1 }, ref( $self ) );
+    my $self = shift;
+    my @args = @_;
+
+    $self->_initialise_storable( @args );
+
+    if( $self->retrievable ){ return $self->clone } # Clone retrievable
+    return bless( { _statefile   => $self->store(@args),
+                    _workdir     => $self->workdir,
+                    _suffix      => $self->suffix,
+                    _template    => $self->template,
+                    _retrievable => 1 },
+                 ref( $self ) );
 }
 
 #----------------------------------------------------------------------
@@ -309,16 +253,16 @@ sub new_retrievable{
   Function  : Reports whether the object is in 'skeleton' state, and the
               'retrieve' method can be called.
   Returntype: boolean
-  Exceptions: 
-  Caller    : 
+  Exceptions:
+  Caller    :
   Example   : if( $obj->retrievable ){ $obj->retrieve }
 
 =cut
 
 sub retrievable {
-   my $self = shift;
-   if( @_ ){ $self->{_retrievable} = shift }
-   return $self->{_retrievable};
+    my $self = shift;
+    if( @_ ){ $self->{_retrievable} = shift }
+    return $self->{_retrievable};
 }
 
 #----------------------------------------------------------------------
@@ -329,15 +273,15 @@ sub retrievable {
   Function  : Accessor for token attribute
   Returntype: string. Whatever retrieve needs to retrieve.
               This base implementation returns the statefile
-  Exceptions: 
-  Caller    : 
+  Exceptions:
+  Caller    :
   Example   : my $token = $obj->token();
 
 =cut
 
 sub token{
-  my $self = shift;
-  return $self->statefile;
+    my $self = shift;
+    return $self->statefile;
 }
 
 
@@ -351,20 +295,22 @@ sub token{
               saved to.
   Returntype: string
 
-  Exceptions: 
-  Caller    : 
+  Exceptions:
+  Caller    :
   Example   : my $token = $obj->store();
 
 =cut
 
 sub store{
-  my $self = shift;
-  my $statefile = $self->statefile;
-  my $store_obj = $self->serialise;
-  my $io = Bio::Root::IO->new( ">$statefile" );
-  $io->_print( $store_obj );
-  $self->debug( "STORING $self to $statefile\n" );
-  return $statefile;
+    my $self = shift;
+    my $statefile = $self->statefile;
+    my $store_obj = $self->serialise;
+    my $io = Bio::Root::IO->new( ">$statefile" );
+    $io->_print( $store_obj );
+    $self->debug( "STORING $self to $statefile\n" );
+    # If filehandle is not stored, don't leave it open
+    $io->close;
+    return $statefile;
 }
 
 #----------------------------------------------------------------------
@@ -379,70 +325,70 @@ sub store{
               Attributes are examined for other storable objects. If these
               are found they are serialised separately using 'new_retrievable'
   Returntype: string
-  Exceptions: 
-  Caller    : 
+  Exceptions:
+  Caller    :
   Example   : my $serialised = $obj->serialise();
 
 =cut
 
 sub serialise{
-  my $self = shift;
-
-  # Create a new object of same class that is going to be serialised
-  my $store_obj = bless( {}, ref( $self ) );
-
-  my %retargs = ( -workdir =>$self->workdir,
-		  -suffix  =>$self->suffix,
-		  -template=>$self->template );
-  # Assume that other storable bio objects held by this object are
-  # only 1-deep.
-
-  foreach my $key( keys( %$self ) ){
-    if( $key =~ /^__/ ){ next } # Ignore keys starting with '__'
-    my $value = $self->{$key};
-
-    # Scalar value
-    if( ! ref( $value ) ){
-      $store_obj->{$key} = $value;
+    my $self = shift;
+
+    # Create a new object of same class that is going to be serialised
+    my $store_obj = bless( {}, ref( $self ) );
+
+    my %retargs = ( -workdir =>$self->workdir,
+                    -suffix  =>$self->suffix,
+                    -template=>$self->template );
+    # Assume that other storable bio objects held by this object are
+    # only 1-deep.
+
+    foreach my $key( keys( %$self ) ){
+        if( $key =~ /^__/ ){ next } # Ignore keys starting with '__'
+        my $value = $self->{$key};
+
+        # Scalar value
+        if( ! ref( $value ) ){
+            $store_obj->{$key} = $value;
+        }
+
+        # Bio::Root::Storable obj: save placeholder
+        elsif( ref($value) =~ /^Bio::/ and $value->isa('Bio::Root::Storable') ){
+            # Bio::Root::Storable
+            $store_obj->{$key} = $value->new_retrievable( %retargs );
+            next;
+        }
+
+        # Arrayref value. Look for Bio::Root::Storable objs
+        elsif( ref( $value ) eq 'ARRAY' ){
+            my @ary;
+            foreach my $val( @$value ){
+                if( ref($val) =~ /^Bio::/ and $val->isa('Bio::Root::Storable') ){
+                    push(  @ary, $val->new_retrievable( %retargs ) );
+                }
+                else{ push(  @ary, $val ) }
+            }
+            $store_obj->{$key} = \@ary;
+        }
+
+        # Hashref value. Look for Bio::Root::Storable objs
+        elsif( ref( $value ) eq 'HASH' ){
+            my %hash;
+            foreach my $k2( keys %$value ){
+                my $val = $value->{$k2};
+                if( ref($val) =~ /^Bio::/ and $val->isa('Bio::Root::Storable') ){
+                    $hash{$k2} = $val->new_retrievable( %retargs );
+                }
+                else{ $hash{$k2} = $val }
+            }
+            $store_obj->{$key} = \%hash;
+        }
+
+        # Unknown, just add to the store object regardless
+        else{ $store_obj->{$key} = $value }
     }
-
-    # Bio::Root::Storable obj: save placeholder
-    elsif( ref($value) =~ /^Bio::/ and $value->isa('Bio::Root::Storable') ){
-      # Bio::Root::Storable
-      $store_obj->{$key} = $value->new_retrievable( %retargs );
-      next;
-    }
-
-    # Arrayref value. Look for Bio::Root::Storable objs
-    elsif( ref( $value ) eq 'ARRAY' ){
-      my @ary;
-      foreach my $val( @$value ){
-	if( ref($val) =~ /^Bio::/ and $val->isa('Bio::Root::Storable') ){
-	  push(  @ary, $val->new_retrievable( %retargs ) );
-	}
-	else{ push(  @ary, $val ) }
-      }
-      $store_obj->{$key} = \@ary;
-    }
-
-    # Hashref value. Look for Bio::Root::Storable objs
-    elsif( ref( $value ) eq 'HASH' ){
-      my %hash;
-      foreach my $k2( keys %$value ){
-	my $val = $value->{$k2};
-	if( ref($val) =~ /^Bio::/ and $val->isa('Bio::Root::Storable') ){
-	  $hash{$k2} = $val->new_retrievable( %retargs );
-	}
-	else{ $hash{$k2} = $val }
-      }
-      $store_obj->{$key} = \%hash;
-    }
-
-    # Unknown, just add to the store object regardless
-    else{ $store_obj->{$key} = $value }
-  }
-  $store_obj->retrievable(0); # Once deserialised, obj not retrievable
-  return $self->_freeze( $store_obj );
+    $store_obj->retrievable(0); # Once deserialised, obj not retrievable
+    return $self->_freeze( $store_obj );
 }
 
 
@@ -455,62 +401,69 @@ sub serialise{
               Note that the retrieved object will be blessed into its original
               class, and not the
   Returntype: Bio::Root::Storable inhereting object
-  Exceptions: 
-  Caller    : 
+  Exceptions:
+  Caller    :
   Example   : my $obj = Bio::Root::Storable->retrieve( $token );
 
 =cut
 
 sub retrieve{
-  my( $caller, $statefile ) = @_;
-
-  my $self = {};
-  my $class = ref( $caller ) || $caller;
-
-  # Is this a call on a retrievable object?
-  if( ref( $caller ) and
-      $caller->retrievable ){
-    $self = $caller;
-    $statefile = $self->statefile;
-  }
-  bless( $self, $class );
-
-  # Recover serialised object
-  if( ! -f $statefile ){
-    $self->throw( "Token $statefile is not found" );
-  }
-  my $io = Bio::Root::IO->new( $statefile );
-  local $/ = undef();
-  my $state_str = $io->_readline('-raw'=>1);
-
-  # Dynamic-load modules required by stored object
-  my $stored_obj;
-  my $success;
-  for( my $i=0; $i<10; $i++ ){
-    eval{ $stored_obj = $self->_thaw( $state_str ) };
-    if( ! $@ ){ $success=1; last }
-    my $package;
-    if( $@ =~ /Cannot restore overloading(.*)/i ){
-      my $postmatch = $1; #'
-      if( $postmatch =~ /\(package +([\w\:]+)\)/ ) {
-        $package = $1;
-      }
+    my( $caller, $statefile ) = @_;
+
+    my $self = {};
+    my $class = ref( $caller ) || $caller;
+
+    # Is this a call on a retrievable object?
+    if (    ref( $caller )
+        and $caller->retrievable
+        ){
+        $self = $caller;
+        $statefile = $self->statefile;
     }
-    if( $package ){
-      eval "require $package"; $self->throw($@) if $@;
+    bless( $self, $class );
+
+    # Recover serialised object
+    if( ! -f $statefile ){
+        $self->throw( "Token $statefile is not found" );
     }
-    else{ $self->throw($@) }
-  }
-  if( ! $success ){ $self->throw("maximum number of requires exceeded" ) }
-
-  if( ! ref( $stored_obj ) ){
-    $self->throw( "Token $statefile returned no data" );
-  }
-  map{ $self->{$_} = $stored_obj->{$_} } keys %$stored_obj; # Copy hasheys
-  $self->retrievable(0);
-
-  # Maintain class of stored obj
-  return $self;
+    my $io = Bio::Root::IO->new( $statefile );
+    local $/ = undef;
+    my $state_str = $io->_readline('-raw'=>1);
+    # If filehandle is not stored, don't leave it open
+    $io->close;
+
+    # Dynamic-load modules required by stored object
+    my $stored_obj;
+    my $success;
+    for( my $i=0; $i<10; $i++ ){
+        eval{ $stored_obj = $self->_thaw( $state_str ) };
+        if( ! $@ ){
+            $success = 1;
+            last;
+        }
+        my $package;
+        if( $@ =~ /Cannot restore overloading(.*)/i ){
+            my $postmatch = $1; #'
+            if( $postmatch =~ /\(package +([\w\:]+)\)/ ) {
+                $package = $1;
+            }
+        }
+        if( $package ){
+            eval "require $package";
+            $self->throw($@) if $@;
+        }
+        else{ $self->throw($@) }
+    }
+    if( ! $success ){ $self->throw("maximum number of requires exceeded" ) }
+
+    if( ! ref( $stored_obj ) ){
+        $self->throw( "Token $statefile returned no data" );
+    }
+    map{ $self->{$_} = $stored_obj->{$_} } keys %$stored_obj; # Copy hasheys
+    $self->retrievable(0);
+
+    # Maintain class of stored obj
+    return $self;
 }
 
 #----------------------------------------------------------------------
@@ -521,16 +474,16 @@ sub retrieve{
   Arg [1]   : none
   Function  : Returns a clone of the calling object
   Returntype: Bio::Root::Storable inhereting object
-  Exceptions: 
-  Caller    : 
+  Exceptions:
+  Caller    :
   Example   : my $clone = $obj->clone();
 
 =cut
 
 sub clone {
-  my $self = shift;
-  my $frozen = $self->_freeze( $self );
-  return $self->_thaw( $frozen );
+    my $self = shift;
+    my $frozen = $self->_freeze( $self );
+    return $self->_thaw( $frozen );
 }
 
 
@@ -542,18 +495,18 @@ sub clone {
   Arg [1]   : none
   Function  : Clears the stored object from disk
   Returntype: boolean
-  Exceptions: 
-  Caller    : 
+  Exceptions:
+  Caller    :
   Example   : $obj->remove();
 
 =cut
 
 sub remove {
-  my $self = shift;
-  if( -e $self->statefile ){
-    unlink( $self->statefile );
-  }
-  return 1;
+    my $self = shift;
+    if( -e $self->statefile ){
+        unlink( $self->statefile );
+    }
+    return 1;
 }
 
 #----------------------------------------------------------------------
@@ -564,23 +517,23 @@ sub remove {
   Function  : Converts whatever is in the the arg into a string.
               Uses either Storable::freeze or Data::Dumper::Dump
               depending on the value of $Bio::Root::BINARY
-  Returntype: 
-  Exceptions: 
-  Caller    : 
-  Example   : 
+  Returntype:
+  Exceptions:
+  Caller    :
+  Example   :
 
 =cut
 
 sub _freeze {
-  my $self = shift;
-  my $data = shift;
-  if( $BINARY ){
-    return freeze( $data );
-  }
-  else{
-    $Data::Dumper::Purity = 1;
-    return Data::Dumper->Dump( [\$data],["*code"] );
-  }
+    my $self = shift;
+    my $data = shift;
+    if( $BINARY ){
+        return freeze( $data );
+    }
+    else{
+        $Data::Dumper::Purity = 1;
+        return Data::Dumper->Dump( [\$data],["*code"] );
+    }
 }
 
 #----------------------------------------------------------------------
@@ -591,33 +544,31 @@ sub _freeze {
   Function  : Converts the string into a perl 'whatever'.
               Uses either Storable::thaw or eval depending on the
               value of $Bio::Root::BINARY.
-              Note; the string arg should have been created with 
+              Note; the string arg should have been created with
               the _freeze method, or strange things may occur!
   Returntype: variable
-  Exceptions: 
-  Caller    : 
-  Example   : 
+  Exceptions:
+  Caller    :
+  Example   :
 
 =cut
 
 sub _thaw {
-  my $self = shift;
-  my $data = shift;
-  if( $BINARY ){ return thaw( $data ) }
-  else{ 
-    my $code; 
-    $code = eval( $data ) ;
-    if($@) {
-      $self->throw( "eval: $@" );
-    }   
-    ref( $code ) eq 'REF' || 
-      $self->throw( "Serialised string was not a scalar ref" );
-    return $$code;
-  }
+    my $self = shift;
+    my $data = shift;
+    if( $BINARY ){
+        return thaw( $data )
+    }
+    else{
+        my $code;
+        $code = eval( $data ) ;
+        if($@) {
+            $self->throw( "eval: $@" );
+        }
+        ref( $code ) eq 'REF'
+            or $self->throw( "Serialised string was not a scalar ref" );
+        return $$code;
+    }
 }
 
-
-
-
-#----------------------------------------------------------------------
 1;
@@ -1,19 +1,23 @@
-#
-# BioPerl module for Bio::Root::Test
-#
-# Please direct questions and support issues to <bioperl-l@bioperl.org>
-#
-# Cared for by Sendu Bala <bix@sendu.me.uk>
-#
-# Copyright Sendu Bala
-#
-# You may distribute this module under the same terms as perl itself
+package Bio::Root::Test;
+use strict;
+use warnings;
+# According to Ovid, 'use base' can override signal handling, so use
+# old-fashioned way. This should be a Test::Builder::Module subclass
+# for consistency (as are any Test modules)
+use Test::Most;
+use Test::Builder;
+use Test::Builder::Module;
+use File::Temp qw(tempdir);
+use File::Spec;
 
-# POD documentation - main docs before the code
+our @ISA = qw(Test::Builder::Module);
 
-=head1 NAME
+# ABSTRACT: a common base for all Bioperl test scripts
+# AUTHOR:   Sendu Bala <bix@sendu.me.uk>
+# OWNER:    Sendu Bala
+# LICENSE:  Perl_5
 
-Bio::Root::Test - A common base for all Bioperl test scripts.
+# CONTRIBUTOR: Chris Fields <cjfields@bioperl.org>
 
 =head1 SYNOPSIS
 
@@ -77,67 +81,8 @@ test_debug().
 Finally, it presents a consistent way of getting the path to input and output
 files. See test_input_file(), test_output_file() and test_output_dir().
 
-=head1 FEEDBACK
-
-=head2 Mailing Lists
-
-User feedback is an integral part of the evolution of this and other
-Bioperl modules. Send your comments and suggestions preferably to
-the Bioperl mailing list.  Your participation is much appreciated.
-
-  bioperl-l@bioperl.org                  - General discussion
-  http://bioperl.org/wiki/Mailing_lists  - About the mailing lists
-
-=head2 Support
-
-Please direct usage questions or support issues to the mailing list:
-
-I<bioperl-l@bioperl.org>
-
-rather than to the module maintainer directly. Many experienced and
-reponsive experts will be able look at the problem and quickly
-address it. Please include a thorough description of the problem
-with code and data examples if at all possible.
-
-=head2 Reporting Bugs
-
-Report bugs to the Bioperl bug tracking system to help us keep track
-of the bugs and their resolution. Bug reports can be submitted via
-the web:
-
-  https://redmine.open-bio.org/projects/bioperl/
-
-=head1 AUTHOR - Sendu Bala
-
-Email bix@sendu.me.uk
-
-=head1 CONTRIBUTORS
-
-Chris Fields  cjfields at bioperl dot org
-
-=head1 APPENDIX
-
-The rest of the documentation details each of the object methods.
-Internal methods are usually preceded with a _
-
 =cut
 
-package Bio::Root::Test;
-
-use strict;
-use warnings;
-
-# According to Ovid, 'use base' can override signal handling, so use
-# old-fashioned way. This should be a Test::Builder::Module subclass
-# for consistency (as are any Test modules)
-use Test::Most;
-use Test::Builder;
-use Test::Builder::Module;
-use File::Temp qw(tempdir);
-use File::Spec;
-
-our @ISA = qw(Test::Builder::Module);
-
 # TODO: Evil magic ahead; can we clean this up?
 
 {
@@ -162,16 +107,17 @@ our @ISA = qw(Test::Builder::Module);
     }
 
     sub Test::Warn::_diag_found_warning {
-        foreach (@_) {
-            if (ref($_) eq 'HASH') {
-                ${$_}{carped} ? $Tester->diag("found carped warning: ${$_}{carped}")
-                              : (${$_}{Bioperl} ? $Tester->diag("found Bioperl warning: ${$_}{Bioperl}")
-                                 : $Tester->diag("found warning: ${$_}{warn}"));
+        my @warns = @_;
+        foreach my $warn (@warns) {
+            if (ref($warn) eq 'HASH') {
+                   ${$warn}{carped}  ? $Tester->diag("found carped warning: ${$warn}{carped}")
+                : (${$warn}{Bioperl} ? $Tester->diag("found Bioperl warning: ${$warn}{Bioperl}")
+                : $Tester->diag("found warning: ${$warn}{warn}"));
             } else {
-                $Tester->diag( "found warning: $_" );
+                $Tester->diag( "found warning: $warn" );
             }
         }
-        $Tester->diag( "didn't find a warning" ) unless @_;
+        $Tester->diag( "didn't find a warning" ) unless @warns;
     }
 
     sub Test::Warn::_cmp_got_to_exp_warning {
@@ -258,7 +204,7 @@ sub test_begin {
             eval "plan skip_all => '$skip_all';";
         }
         elsif (defined $tests && $tests == 0) {
-            eval "plan skip_all => 'All tests are being skipped, probably because the module(s) being tested here are now deprecated';";
+            eval "plan skip_all => 'These modules are now probably deprecated';";
         }
         elsif ($tests) {
             eval "plan tests => $tests;";
@@ -398,9 +344,7 @@ sub test_input_file {
 =cut
 
 sub test_network {
-    require Module::Build;
-    my $build = Module::Build->current();
-    return $build->notes('network');
+    return $ENV{AUTHOR_TESTING} || $ENV{RELEASE_TESTING};
 }
 
 =head2 test_email
@@ -414,10 +358,7 @@ sub test_network {
 =cut
 
 sub test_email {
-    require Module::Build;
-    my $build = Module::Build->current();
-    # this should not be settable unless the network tests work
-    return $build->notes('email');
+    return $ENV{AUTHOR_TESTING} || $ENV{RELEASE_TESTING};
 }
 
 =head2 test_debug
@@ -455,7 +396,11 @@ sub float_is ($$;$) {
     }
 }
 
-# decide if should skip and generate skip message
+=head2 _skip
+
+Decide if should skip and generate skip message
+=cut
+
 sub _skip {
     my %args = @_;
 
@@ -531,8 +476,8 @@ sub _skip {
     }
 
     if ($req_exe) {
-        eval {$req_exe->executable};
-        if ($@) {
+        my $eval = eval {$req_exe->executable};
+        if ($@ or not defined $eval) {
             my $msg = 'Required executable for '.ref($req_exe).' is not present';
             diag($msg);
             return ($msg, $tests, $framework);
@@ -548,6 +493,10 @@ sub _skip {
     return ('', $tests, $framework);
 }
 
+=head2 _check_module
+
+=cut
+
 sub _check_module {
     my $mod = shift;
 
@@ -560,12 +509,12 @@ sub _check_module {
     eval "require $mod;";
 
     if ($@) {
-	if ($@ =~ /Can't locate/) {
-	    return "The optional module $mod (or dependencies thereof) was not installed";
-	}
-	else {
-	    return "The optional module $mod generated the following error: \n$@";
-	}
+        if ($@ =~ /Can't locate/) {
+            return "The optional module $mod (or dependencies thereof) was not installed";
+        }
+        else {
+            return "The optional module $mod generated the following error: \n$@";
+        }
     }
     elsif ($desired_version) {
         no strict 'refs';
@@ -1,10 +1,13 @@
-package	Bio::Root::Utilities;
+package Bio::Root::Utilities;
 use strict;
+use Bio::Root::IO;
+use Bio::Root::Exception;
+use base qw(Bio::Root::Root Exporter);
 
-
-=head1 NAME
-
-Bio::Root::Utilities - General-purpose utility module
+# ABSTRACT: general-purpose utility module
+# AUTHOR:   Steve Chervitz <sac@bioperl.org>
+# OWNER:    1996-2007 Steve Chervitz
+# LICENSE:  Perl_5
 
 =head1 SYNOPSIS
 
@@ -56,88 +59,30 @@ Follow the installation instructions included in the README file.
 
 =head1 DEPENDENCIES
 
-Inherits from L<Bio::Root::Root>, and uses L<Bio::Root::IO> 
+Inherits from L<Bio::Root::Root>, and uses L<Bio::Root::IO>
 and L<Bio::Root::Exception>.
 
-Relies on external executables for file compression/uncompression 
-and sending mail. No paths to these are hard coded but are located 
+Relies on external executables for file compression/uncompression
+and sending mail. No paths to these are hard coded but are located
 as needed.
 
 =head1 SEE ALSO
 
   http://bioperl.org  - Bioperl Project Homepage
 
-=head1 FEEDBACK
-
-=head2 Mailing Lists
-
-User feedback is an integral part of the evolution of this and other Bioperl modules.
-Send your comments and suggestions preferably to one of the Bioperl mailing lists.
-Your participation is much appreciated.
-
-  bioperl-l@bioperl.org                  - General discussion
-  http://bioperl.org/wiki/Mailing_lists  - About the mailing lists
-
-=head2 Support 
-
-Please direct usage questions or support issues to the mailing list:
-
-I<bioperl-l@bioperl.org>
-
-rather than to the module maintainer directly. Many experienced and 
-reponsive experts will be able look at the problem and quickly 
-address it. Please include a thorough description of the problem 
-with code and data examples if at all possible.
-
-=head2 Reporting Bugs
-
-Report bugs to the Bioperl bug tracking system to help us keep track
-the bugs and their resolution. Bug reports can be submitted via the
-web:
-
-  https://redmine.open-bio.org/projects/bioperl/
-
-=head1 AUTHOR
-
-Steve Chervitz E<lt>sac@bioperl.orgE<gt>
-
-See L<the FEEDBACK section | FEEDBACK> for where to send bug reports and comments.
-
-
 =head1 ACKNOWLEDGEMENTS
 
 This module was originally developed under the auspices of the
 Saccharomyces Genome Database: http://www.yeastgenome.org/
 
-=head1 COPYRIGHT
-
-Copyright (c) 1996-2007 Steve Chervitz. All Rights Reserved.
-This module is free software; you can redistribute it and/or
-modify it under the same terms as Perl itself.
-
 =cut
 
-=head1 APPENDIX
-
-Methods beginning with a leading underscore are considered private
-and are intended for internal use by this module. They are
-B<not> considered part of the public interface and are described here
-for documentation purposes only.
-
-=cut
-
-# Let the code begin...
-
-use Bio::Root::IO;
-use Bio::Root::Exception;
-
 use vars qw(@EXPORT_OK %EXPORT_TAGS);
-use base qw(Bio::Root::Root Exporter);
 @EXPORT_OK   = qw($Util);
 %EXPORT_TAGS = ( obj => [qw($Util)],
-		   std => [qw($Util)],);
+                 std => [qw($Util)],);
 
-use vars qw($ID $Util $GNU_PATH $TIMEOUT_SECS 
+use vars qw($ID $Util $GNU_PATH $TIMEOUT_SECS
             @COMPRESSION_UTILS @UNCOMPRESSION_UTILS
             $DEFAULT_NEWLINE $NEWLINE $AUTHORITY
             @MONTHS @DAYS $BASE_YEAR $DEFAULT_CENTURY
@@ -156,7 +101,7 @@ $DEFAULT_CENTURY = $BASE_YEAR + 100;
 # The first executable in this list to be found in the current PATH will be used,
 # unless overridden in the call to that function. See docs for details.
 @COMPRESSION_UTILS = qw(gzip bzip2 zip compress);
-@UNCOMPRESSION_UTILS = qw(gunzip bunzip2 unzip uncompress);
+@UNCOMPRESSION_UTILS = qw(gunzip gzip bunzip2 unzip uncompress);
 
 # Default person to receive feedback from users and possibly automatic error messages.
 $AUTHORITY = '';
@@ -186,7 +131,7 @@ $Util = Bio::Root::Root->new();
  Purpose   : -- Get a string containing the formated date or time
            :    taken when this routine is invoked.
            : -- Provides a way to avoid using `date`.
-	   : -- Provides an interface to localtime().
+           : -- Provides an interface to localtime().
            : -- Interconverts some date formats.
            :
            : (For additional functionality, use Date::Manip or
@@ -205,7 +150,7 @@ $Util = Bio::Root::Root->new();
            :   'ymd'         = 96may3
            :   'md'          = may3
            :   'year'        = 1996
-           :   'hms'         = 23:01:59  # when not converting a format, 'hms' can be 
+           :   'hms'         = 23:01:59  # when not converting a format, 'hms' can be
            :                             # tacked on to any of the above options
            :                             # to add the time stamp: eg 'dmyhms'
            :   'full' | 'unix' = UNIX-style date: Tue May  5 22:00:00 1998
@@ -214,7 +159,7 @@ $Util = Bio::Root::Root->new();
            : FMT  = yyyy-mm-dd | yyyy-dd-mm | yyyy-mmm-dd |
            :        mdy | ymd | md | d-m-y | hms | hm
            :        ('hms' may be appended to any of these to
-	   :        add a time stamp)
+           :        add a time stamp)
            :
            : DATE = String containing date to be converted.
            :        Acceptable input formats:
@@ -249,19 +194,19 @@ sub date_format {
     # Load a supplied date for conversion:
     if(defined($date) && ($date =~ /[\D-]+/)) {
         $converting = 1;
-	if( $date =~ m{/}) {
-	    ($mon,$mday,$year) = split(m{/}, $date);
-	} elsif($date =~ /(\d{4})-(\d{1,2})-(\d{1,2})/) {
-	    ($year,$mon,$mday) = ($1, $2, $3);
-	} elsif($date =~ /(\d{4})-(\w{3,})-(\d{1,2})/) {
-	    ($year,$mon,$mday) = ($1, $2, $3);
-	    $mon = $self->month2num($2);
-	} else {
-	    print STDERR "\n*** Unsupported input date format: $date\n";
-	}
-	if(length($year) == 4) { 
+        if( $date =~ m{/}) {
+            ($mon,$mday,$year) = split(m{/}, $date);
+        } elsif($date =~ /(\d{4})-(\d{1,2})-(\d{1,2})/) {
+            ($year,$mon,$mday) = ($1, $2, $3);
+        } elsif($date =~ /(\d{4})-(\w{3,})-(\d{1,2})/) {
+            ($year,$mon,$mday) = ($1, $2, $3);
+            $mon = $self->month2num($2);
+        } else {
+            print STDERR "\n*** Unsupported input date format: $date\n";
+        }
+        if(length($year) == 4) {
             $fullYear = $year;
-            $year = substr $year, 2; 
+            $year = substr $year, 2;
         } else {
             # Heuristics to guess what century was intended when a 2-digit year is given
             # If number is over 50, assume it's for prev century; under 50 = default century.
@@ -272,11 +217,11 @@ sub date_format {
                 $fullYear = $DEFAULT_CENTURY + $year;
             }
         }
-	$mon -= 1;
+        $mon -= 1;
     } else {
-	($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = @date =
-	    localtime(($date ? $date : time()));
-	return @date if $option =~ /list/i;
+        ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = @date =
+            localtime(($date ? $date : time()));
+        return @date if $option =~ /list/i;
         $fullYear = $BASE_YEAR+$year;
     }
     $month_txt = $MONTHS[$mon];
@@ -286,36 +231,36 @@ sub date_format {
 #    print "sec: $sec, min: $min, hour: $hour, month: $mon, m-day: $mday, year: $year\nwday: $wday, yday: $yday, dst: $isdst";<STDIN>;
 
     if( $option =~ /yyyy-mm-dd/i ) {
-	$date = sprintf "%4d-%02d-%02d",$fullYear,$month_num,$mday;
+        $date = sprintf "%4d-%02d-%02d",$fullYear,$month_num,$mday;
     } elsif( $option =~ /yyyy-dd-mm/i ) {
-	$date = sprintf "%4d-%02d-%02d",$fullYear,$mday,$month_num;
+        $date = sprintf "%4d-%02d-%02d",$fullYear,$mday,$month_num;
     } elsif( $option =~ /yyyy-mmm-dd/i ) {
-	$date = sprintf "%4d-%3s-%02d",$fullYear,$month_txt,$mday;
+        $date = sprintf "%4d-%3s-%02d",$fullYear,$month_txt,$mday;
     } elsif( $option =~ /full|unix/i ) {
-	$date = sprintf "%3s %3s %2d %02d:%02d:%02d %d",$day_txt, $month_txt, $mday, $hour, $min, $sec, $fullYear;
+        $date = sprintf "%3s %3s %2d %02d:%02d:%02d %d",$day_txt, $month_txt, $mday, $hour, $min, $sec, $fullYear;
     } elsif( $option =~ /mdy/i ) {
-	$date = "$month_txt $mday, $fullYear";
+        $date = "$month_txt $mday, $fullYear";
     } elsif( $option =~ /ymd/i ) {
-	$date = $year."\l$month_txt$mday";
+        $date = $year."\l$month_txt$mday";
     } elsif( $option =~ /dmy/i ) {
-	$date = $mday."\l$month_txt$year";
+        $date = $mday."\l$month_txt$year";
     } elsif( $option =~ /md/i ) {
-	$date = "\l$month_txt$mday";
+        $date = "\l$month_txt$mday";
     } elsif( $option =~ /d-m-y/i ) {
-	$date = "$mday-$month_txt-$fullYear";
+        $date = "$mday-$month_txt-$fullYear";
     } elsif( $option =~ /d m y/i ) {
-	$date = "$mday $month_txt $fullYear";
+        $date = "$mday $month_txt $fullYear";
     } elsif( $option =~ /year/i ) {
-	$date = $fullYear;
+        $date = $fullYear;
     } elsif( $option =~ /dmy/i ) {
-	$date = $mday.'-'.$month_txt.'-'.$fullYear;
+        $date = $mday.'-'.$month_txt.'-'.$fullYear;
     } elsif($option and $option !~ /hms/i) {
-	print STDERR "\n*** Unrecognized date format request: $option\n";
+        print STDERR "\n*** Unrecognized date format request: $option\n";
     }
 
     if( $option =~ /hms/i and not $converting) {
-	$date .= " $hour:$min:$sec" if $date;
-	$date ||= "$hour:$min:$sec";
+        $date .= " $hour:$min:$sec" if $date;
+        $date ||= "$hour:$min:$sec";
     }
 
     return $date || join(" ", @date);
@@ -337,13 +282,12 @@ sub date_format {
 #--------------'
 sub month2num {
 #--------------
-
     my ($self, $str) = @_;
 
     # Get string in proper format for conversion.
     $str = substr($str, 0, 3);
-    for(0..$#MONTHS) {
-	return $_+1 if $str =~ /$MONTHS[$_]/i;
+    for my $month (0..$#MONTHS) {
+        return $month+1 if $str =~ /$MONTHS[$month]/i;
     }
     $self->throw("Invalid month name: $str");
 }
@@ -390,17 +334,17 @@ sub num2month {
            :            gzip, which is the default)
            :   -OUTFILE => String (name of the output compressed file, full path).
            :   -EXE  => Name of executable for compression utility to use.
-           :            Will supercede those in @COMPRESSION_UTILS defined by 
+           :            Will supercede those in @COMPRESSION_UTILS defined by
            :            this module. If the absolute path to the executable is not provided,
            :            it will be searched in the PATH env variable.
  Throws    : Exception if file cannot be compressed.
            : If user is not owner of the file, generates a warning and compresses to
-           : a tmp file. To avoid this warning, use the -o file test operator 
+           : a tmp file. To avoid this warning, use the -o file test operator
            : and call this function with -TMP=>1.
- Comments  : Attempts to compress using utilities defined in the @COMPRESSION_UTILS 
-           : defined by this module, in the order defined. The first utility that is 
+ Comments  : Attempts to compress using utilities defined in the @COMPRESSION_UTILS
+           : defined by this module, in the order defined. The first utility that is
            : found to be executable will be used. Any utility defined in optional -EXE param
-           : will be tested for executability first. 
+           : will be tested for executability first.
            : To minimize security risks, the -EXE parameter value is untained using
            : the untaint() method of this module (in 'relaxed' mode to permit path separators).
 
@@ -451,14 +395,19 @@ sub compress {
             $compressed .= '.tmp.bioperl.gz';
         }
 
+        # Use double quotes if executable path have empty spaces
+        if ($exe =~ m/ /) {
+            $exe = "\"$exe\"";
+        }
+
         if ($exe =~ /gzip|bzip2|compress/) {
             @cmd = ("$exe -f < \"$fileName\" > \"$compressed\"");
         } elsif ($exe eq 'zip') {
             @cmd = ("$exe -r \"$fileName.zip\" \"$fileName\"");
         }
-	not $tmp and
-	    $self->warn("Not owner of file $fileName. Compressing to temp file $compressed.");
-	$tmp = 1;
+        not $tmp and
+            $self->warn("Not owner of file $fileName. Compressing to temp file $compressed.");
+        $tmp = 1;
     } else {
         # Need to compute the compressed name based on exe since we're returning it.
         $compressed = $fileName;
@@ -509,17 +458,17 @@ sub compress {
            :            gzip, which is the default)
            :   -OUTFILE => String (name of the output uncompressed file, full path).
            :   -EXE  => Name of executable for uncompression utility to use.
-           :            Will supercede those in @UNCOMPRESSION_UTILS defined by 
+           :            Will supercede those in @UNCOMPRESSION_UTILS defined by
            :            this module. If the absolute path to the executable is not provided,
            :            it will be searched in the PATH env variable.
  Throws    : Exception if file cannot be uncompressed.
            : If user is not owner of the file, generates a warning and uncompresses to
-           : a tmp file. To avoid this warning, use the -o file test operator 
+           : a tmp file. To avoid this warning, use the -o file test operator
            : and call this function with -TMP=>1.
- Comments  : Attempts to uncompress using utilities defined in the @UNCOMPRESSION_UTILS 
-           : defined by this module, in the order defined. The first utility that is 
+ Comments  : Attempts to uncompress using utilities defined in the @UNCOMPRESSION_UTILS
+           : defined by this module, in the order defined. The first utility that is
            : found to be executable will be used. Any utility defined in optional -EXE param
-           : will be tested for executability first. 
+           : will be tested for executability first.
            : To minimize security risks, the -EXE parameter value is untained using
            : the untaint() method of this module (in 'relaxed' mode to permit path separators).
 
@@ -572,17 +521,26 @@ sub uncompress {
             $uncompressed .= '.tmp.bioperl';
         }
 
+        # Use double quotes if executable path have empty spaces
+        if ($exe =~ m/ /) {
+            $exe = "\"$exe\"";
+        }
+
         if ($exe =~ /gunzip|bunzip2|uncompress/) {
             @cmd = ("$exe -f < \"$fileName\" > \"$uncompressed\"");
+        } elsif ($exe =~ /gzip/) {
+            @cmd = ("$exe -df < \"$fileName\" > \"$uncompressed\"");
         } elsif ($exe eq 'unzip') {
             @cmd = ("$exe -p \"$fileName\" > \"$uncompressed\"");
         }
-	not $tmp and
-	    $self->warn("Not owner of file $fileName. Uncompressing to temp file $uncompressed.");
-	$tmp = 1;
+        not $tmp and
+            $self->warn("Not owner of file $fileName. Uncompressing to temp file $uncompressed.");
+        $tmp = 1;
     } else {
         if ($exe =~ /gunzip|bunzip2|uncompress/) {
             @cmd = ($exe, '-f', $fileName);
+        } elsif ($exe =~ /gzip/) {
+            @cmd = ($exe, '-df', $fileName);
         } elsif ($exe eq 'zip') {
             @cmd = ($exe, $fileName);
         }
@@ -663,14 +621,14 @@ sub untaint {
     }
 
     if( $relax ) {
-	$value =~ /([-\w.\', ()\/=%:^<>*]+)/;
-	$untainted = $1
+        $value =~ /([-\w.\', ()\/=%:^<>*]+)/;
+        $untainted = $1
 #    } elsif( $relax == 2 ) {  # Could have several degrees of relax.
-#	$value =~ /([-\w.\', ()\/=%:^<>*]+)/;
-#	$untainted = $1
+#        $value =~ /([-\w.\', ()\/=%:^<>*]+)/;
+#        $untainted = $1
     } else {
-	$value =~ /([-\w.\', ()]+)/;
-	$untainted = $1
+        $value =~ /([-\w.\', ()]+)/;
+        $untainted = $1
     }
 
     $self->debug("UNTAINTED: $untainted\n");
@@ -694,13 +652,18 @@ sub untaint {
 sub mean_stdev {
 #---------------
     my ($self, @data) = @_;
-    return (undef,undef) if not @data; # case of empty @data list
+    return (undef, undef) if not @data; # case of empty @data list
     my $mean = 0;
     my $N = 0;
-    foreach (@data) { $mean += $_; $N++ }
+    foreach my $num (@data) {
+        $mean += $num;
+        $N++
+    }
     $mean /= $N;
     my $sum_diff_sqd = 0;
-    foreach (@data) { $sum_diff_sqd += ($mean - $_) * ($mean - $_); }
+    foreach my $num (@data) {
+        $sum_diff_sqd += ($mean - $num) * ($mean - $num);
+    }
     # if only one element in @data list, unbiased stdev is undefined
     my $stdev = $N <= 1 ? undef : sqrt( $sum_diff_sqd / ($N-1) );
     return ($mean, $stdev);
@@ -749,35 +712,38 @@ sub count_files {
     $$href{-T_FILE_NAMES} = [];
     $$href{-B_FILE_NAMES} = [];
     $$href{-DIR_NAMES} = [];
-    while( <$PIPE> ) {
-	chomp();
-	$$href{-TOTAL}++;
-	if( -T $dir.$_ ) {
-	    $$href{-NUM_TEXT_FILES}++; push @{$$href{-T_FILE_NAMES}}, $_; }
-	if( -B $dir.$_ and not -d $dir.$_) {
-	    $$href{-NUM_BINARY_FILES}++; push @{$$href{-B_FILE_NAMES}}, $_; }
-	if( -d $dir.$_ ) {
-	    $$href{-NUM_DIRS}++; push @{$$href{-DIR_NAMES}}, $_; }
+    while( my $line = <$PIPE> ) {
+        chomp();
+        $$href{-TOTAL}++;
+        if( -T $dir.$line ) {
+            $$href{-NUM_TEXT_FILES}++;
+            push @{$$href{-T_FILE_NAMES}}, $line; }
+        if( -B $dir.$line and not -d $dir.$line) {
+            $$href{-NUM_BINARY_FILES}++;
+            push @{$$href{-B_FILE_NAMES}}, $line; }
+        if( -d $dir.$line ) {
+            $$href{-NUM_DIRS}++;
+            push @{$$href{-DIR_NAMES}}, $line; }
     }
     close $PIPE;
 
     if( $print) {
-	printf( "\n%4d %s\n", $$href{-TOTAL}, "total files+dirs in $dir");
-	printf( "%4d %s\n", $$href{-NUM_TEXT_FILES}, "text files");
-	printf( "%4d %s\n", $$href{-NUM_BINARY_FILES}, "binary files");
-	printf( "%4d %s\n", $$href{-NUM_DIRS}, "directories");
+        printf( "\n%4d %s\n", $$href{-TOTAL},            "total files+dirs in $dir");
+        printf( "%4d %s\n",   $$href{-NUM_TEXT_FILES},   "text files");
+        printf( "%4d %s\n",   $$href{-NUM_BINARY_FILES}, "binary files");
+        printf( "%4d %s\n",   $$href{-NUM_DIRS},         "directories");
     }
 }
 
 
-#=head2 file_info
-#
-# Title   : file_info
-# Purpose : Obtains a variety of date for a given file.
-#	  : Provides an interface to Perl's stat().
-# Status  : Under development. Not ready. Don't use!
-#
-#=cut
+=head2 file_info
+
+ Title   : file_info
+ Purpose : Obtains a variety of date for a given file.
+         : Provides an interface to Perl's stat().
+ Status  : Under development. Not ready. Don't use!
+
+=cut
 
 #--------------
 sub file_info {
@@ -791,33 +757,39 @@ sub file_info {
        $atime, $mtime, $ctime, $blksize, $blocks) = stat $file;
 
     if($get =~ /date/i) {
-	## I can  get the elapsed time since the file was modified but
-	## it's not so straightforward to get the date in a nice format...
+        ## I can  get the elapsed time since the file was modified but
+        ## it's not so straightforward to get the date in a nice format...
         ## Think about using a standard CPAN module for this, like
         ## Date::Manip or Date::DateCalc.
 
-	my $date = $mtime;
-	my $elsec = time - $mtime;
-	printf "\nFile age: %.0f sec %.0f hrs %.0f days", $elsec, $elsec/3600, $elsec/(3600*24);<STDIN>;
-	my $days = sprintf "%.0f", $elsec/(3600*24);
+        my $date = $mtime;
+        my $elsec = time - $mtime;
+        printf "\nFile age: %.0f sec %.0f hrs %.0f days", $elsec, $elsec/3600, $elsec/(3600*24);<STDIN>;
+        my $days = sprintf "%.0f", $elsec/(3600*24);
     } elsif($get eq 'all') {
-	return stat $file;
+        return stat $file;
     }
 }
 
+=head2 delete
+
+ Title   : delete
+ Purpose :
+
+=cut
 
 #------------
 sub delete {
 #------------
-  my $self = shift;
-  my $fileName = shift;
-  if(not -e $fileName) {
-    $self->throw("Can't delete file $fileName: Does not exist.");
-  } elsif(not -o $fileName) {
-    $self->throw("Can't delete file $fileName: Not owner.");
-  }
-  my $ulval = unlink($fileName) > 0 or
-    $self->throw("Failed to delete file $fileName: $!");
+    my $self = shift;
+    my $fileName = shift;
+    if(not -e $fileName) {
+        $self->throw("Could not delete file '$fileName': Does not exist.");
+    } elsif(not -o $fileName) {
+        $self->throw("Could not delete file '$fileName': Not owner.");
+    }
+    my $ulval = unlink($fileName) > 0
+        or $self->throw("Failed to delete file '$fileName': $!");
 }
 
 
@@ -854,55 +826,55 @@ sub create_filehandle {
 #---------------------
     my($self, @param) = @_;
     my($client, $file, $handle) =
-	$self->_rearrange([qw( CLIENT FILE HANDLE )], @param);
+        $self->_rearrange([qw( CLIENT FILE HANDLE )], @param);
 
     if(not ref $client) {  $client = $self; }
     $file ||= $handle;
     if( $client->can('file')) {
-	$file = $client->file($file);
+        $file = $client->file($file);
     }
 
     my $FH;
     my ($handle_ref);
 
     if($handle_ref = ref($file)) {
-      if($handle_ref eq 'FileHandle') {
-	$FH = $file;
-	$client->{'_input_type'} = "FileHandle";
-      } elsif($handle_ref eq 'GLOB') {
-	$FH = $file;
-	$client->{'_input_type'} = "Glob";
-      } else {
-        $self->throw(-class=>'Bio::Root::IOException',
-                     -text =>"Can't read from $file: Not a FileHandle or GLOB ref.");
-      }
-      $self->verbose > 0 and printf STDERR "$ID: reading data from FileHandle\n";
+        if($handle_ref eq 'FileHandle') {
+            $FH = $file;
+            $client->{'_input_type'} = "FileHandle";
+        } elsif($handle_ref eq 'GLOB') {
+            $FH = $file;
+            $client->{'_input_type'} = "Glob";
+        } else {
+            $self->throw(-class => 'Bio::Root::IOException',
+                         -text  => "Could not read file '$file': Not a FileHandle or GLOB ref.");
+        }
+        $self->verbose > 0 and printf STDERR "$ID: reading data from FileHandle\n";
 
     } elsif($file) {
-      $client->{'_input_type'} = "FileHandle for $file";
+        $client->{'_input_type'} = "FileHandle for $file";
 
-      # Use gzip -cd to access compressed data.
-      if( -B $file ) {
-	$client->{'_input_type'} .= " (compressed)";
-        my $gzip = $self->find_exe('gzip');
-	$file = "$gzip -cd $file |"
-      }
+        # Use gzip -cd to access compressed data.
+        if( -B $file ) {
+            $client->{'_input_type'} .= " (compressed)";
+            my $gzip = $self->find_exe('gzip');
+            $file = "$gzip -cd $file |"
+        }
 
-      require FileHandle;
-      $FH = FileHandle->new();
-      open ($FH, $file) || $self->throw(-class=>'Bio::Root::FileOpenException',
-                                        -text =>"Can't access data file: $file: $!");
-      $self->verbose > 0 and printf STDERR "$ID: reading data from file $file\n";
+        require FileHandle;
+        $FH = FileHandle->new();
+        open ($FH, $file) || $self->throw(-class=>'Bio::Root::FileOpenException',
+                                          -text =>"Could not access data file '$file': $!");
+        $self->verbose > 0 and printf STDERR "$ID: reading data from file '$file'\n";
 
     } else {
-      # Read from STDIN.
-      $FH = \*STDIN;
-      $self->verbose > 0 and printf STDERR "$ID: reading data from STDIN\n";
-      $client->{'_input_type'} = "STDIN";
+        # Read from STDIN.
+        $FH = \*STDIN;
+        $self->verbose > 0 and printf STDERR "$ID: reading data from STDIN\n";
+        $client->{'_input_type'} = "STDIN";
     }
 
     return $FH;
-  }
+}
 
 =head2 get_newline
 
@@ -927,24 +899,24 @@ sub get_newline {
     return $NEWLINE if defined $NEWLINE;
 
     my($client ) =
-	$self->_rearrange([qw( CLIENT )], @param);
+        $self->_rearrange([qw( CLIENT )], @param);
 
     my $FH = $self->create_filehandle(@param);
 
     if(not ref $client) {  $client = $self;   }
 
     if($client->{'_input_type'} =~ /STDIN|Glob|compressed/) {
-      # Can't taste from STDIN since we can't seek 0 on it.
-      # Are other non special Glob refs seek-able?
-      # Attempt to guess newline based on platform.
-      # Not robust since we could be reading Unix files on a Mac, e.g.
-      if(defined $ENV{'MACPERL'}) {
-	$NEWLINE = "\015";  # \r
-      } else {
-	$NEWLINE = "\012";  # \n
-      }
+        # Can't taste from STDIN since we can't seek 0 on it.
+        # Are other non special Glob refs seek-able?
+        # Attempt to guess newline based on platform.
+        # Not robust since we could be reading Unix files on a Mac, e.g.
+        if(defined $ENV{'MACPERL'}) {
+            $NEWLINE = "\015";  # \r
+        } else {
+            $NEWLINE = "\012";  # \n
+        }
     } else {
-      $NEWLINE = $self->taste_file($FH);
+        $NEWLINE = $self->taste_file($FH);
     }
 
     close ($FH) unless ($client->{'_input_type'} eq 'STDIN' ||
@@ -954,7 +926,7 @@ sub get_newline {
     delete $client->{'_input_type'};
 
     return $NEWLINE || $DEFAULT_NEWLINE;
-  }
+}
 
 
 =head2 taste_file
@@ -980,80 +952,81 @@ See Also : L<get_newline()|get_newline>
 #---------------
 sub taste_file {
 #---------------
-  my ($self, $FH) = @_;
-  my $BUFSIZ = 256;   # Number of bytes read from the file handle.
-  my ($buffer, $octal, $str, $irs, $i);
-
-  ref($FH) eq 'FileHandle' or $self->throw("Can't taste file: not a FileHandle ref");
-
-  $buffer = '';
-
-  # this is a quick hack to check for availability of alarm(); just copied
-  # from Bio/Root/IOManager.pm HL 02/19/01
-  my $alarm_available = 1;
-  eval {
-      alarm(0);
-  };
-  if($@) {
-      # alarm() not available (ActiveState perl for win32 doesn't have it.
-      # See jitterbug PR#98)
-      $alarm_available = 0;
-  }
-  $SIG{ALRM} = sub { die "Timed out!"; };
-  my $result;
-  eval {
-    $alarm_available && alarm( $TIMEOUT_SECS );
-    $result = read($FH, $buffer, $BUFSIZ); # read the $BUFSIZ characters of file
-    $alarm_available && alarm(0);
-  };
-  if($@ =~ /Timed out!/) {
-    $self->throw("Timed out while waiting for input.",
-		 "Timeout period = $TIMEOUT_SECS seconds.\nFor longer time before timing out, edit \$TIMEOUT_SECS in Bio::Root::Utilities.pm.");
-
-  } elsif(not $result) {
-    my $err = $@;
-    $self->throw("read taste failed to read from FileHandle.", $err);
-
-  } elsif($@ =~ /\S/) {
-    my $err = $@;
-    $self->throw("Unexpected error during read: $err");
-  }
-
-  seek($FH, 0, 0) or $self->throw("seek failed to seek 0 on FileHandle.");
-
-  my @chars = split(//, $buffer);
-  my $flavor;
-
-  for ($i = 0; $i <$BUFSIZ; $i++) {
-    if (($chars[$i] eq "\012")) {
-      unless ($chars[$i-1] eq "\015") {
-	$flavor='Unix';
-	$octal = "\012";
-	$str = '\n';
-	$irs = "^J";
-	last;
-      }
-    } elsif (($chars[$i] eq "\015") && ($chars[$i+1] eq "\012")) {
-      $flavor='DOS';
-      $octal = "\015\012";
-      $str = '\r\n';
-      $irs = "^M^J";
-      last;
-    } elsif (($chars[$i] eq "\015")) {
-      $flavor='Mac';
-      $octal = "\015";
-      $str = '\r';
-      $irs = "^M";
-      last;
+    my ($self, $FH) = @_;
+    my $BUFSIZ = 256;   # Number of bytes read from the file handle.
+    my ($buffer, $octal, $str, $irs, $i);
+
+    ref($FH) eq 'FileHandle' or $self->throw("Can't taste file: not a FileHandle ref");
+
+    $buffer = '';
+
+    # this is a quick hack to check for availability of alarm(); just copied
+    # from Bio/Root/IOManager.pm HL 02/19/01
+    my $alarm_available = 1;
+    eval {
+        alarm(0);
+    };
+    if($@) {
+        # alarm() not available (ActiveState perl for win32 doesn't have it.
+        # See jitterbug PR#98)
+        $alarm_available = 0;
+    }
+    $SIG{ALRM} = sub { die "Timed out!"; };
+    my $result;
+    eval {
+        $alarm_available && alarm( $TIMEOUT_SECS );
+        $result = read($FH, $buffer, $BUFSIZ); # read the $BUFSIZ characters of file
+        $alarm_available && alarm(0);
+    };
+    if($@ =~ /Timed out!/) {
+        $self->throw( "Timed out while waiting for input.",
+                      "Timeout period = $TIMEOUT_SECS seconds.\n"
+                     ."For longer time before timing out, edit \$TIMEOUT_SECS in Bio::Root::Utilities.pm.");
+
+    } elsif(not $result) {
+        my $err = $@;
+        $self->throw("read taste failed to read from FileHandle.", $err);
+
+    } elsif($@ =~ /\S/) {
+        my $err = $@;
+        $self->throw("Unexpected error during read: $err");
+    }
+
+    seek($FH, 0, 0) or $self->throw("seek failed to seek 0 on FileHandle.");
+
+    my @chars = split(//, $buffer);
+    my $flavor;
+
+    for ($i = 0; $i <$BUFSIZ; $i++) {
+        if (($chars[$i] eq "\012")) {
+            unless ($chars[$i-1] eq "\015") {
+                $flavor='Unix';
+                $octal = "\012";
+                $str = '\n';
+                $irs = "^J";
+                last;
+            }
+        } elsif (($chars[$i] eq "\015") && ($chars[$i+1] eq "\012")) {
+            $flavor='DOS';
+            $octal = "\015\012";
+            $str = '\r\n';
+            $irs = "^M^J";
+            last;
+        } elsif (($chars[$i] eq "\015")) {
+            $flavor='Mac';
+            $octal = "\015";
+            $str = '\r';
+            $irs = "^M";
+            last;
+        }
     }
-  }
-  if (not $octal) {
-    $self->warn("Could not determine newline char. Using '\012'");
-    $octal = "\012";
-  } else {
-#    print STDERR "FLAVOR=$flavor, NEWLINE CHAR = $irs\n";
-  }
-  return($octal);
+    if (not $octal) {
+        $self->warn("Could not determine newline char. Using '\012'");
+        $octal = "\012";
+    } else {
+        #print STDERR "FLAVOR=$flavor, NEWLINE CHAR = $irs\n";
+    }
+    return($octal);
 }
 
 =head2 file_flavor
@@ -1084,7 +1057,7 @@ sub file_flavor {
                  "\015"     =>'mac (\r or 015 or ^M)'
                 );
 
-    -f $file or $self->throw("Can't determine flavor: arg '$file' is either non existant or is not a file.\n");
+    -f $file or $self->throw("Could not determine flavor: arg '$file' is either non existant or is not a file.\n");
     my $octal = $self->get_newline($file);
     my $flavor = $flavors{$octal} || "unknown";
     return $flavor;
@@ -1104,8 +1077,9 @@ See Also  : L<send_mail()|send_mail>
 
 =cut
 
+#---------------
 sub mail_authority {
-
+#---------------
     my( $self, $message ) = @_;
     my $script = $self->untaint($0,1);
 
@@ -1127,8 +1101,9 @@ See Also  : L<mail_authority()|mail_authority>
 
 =cut
 
+#-------------
 sub authority {
-
+#-------------
     my( $self, $email ) = @_;
     $self->{'_auth_email'} = $email if defined $email;
     return $self->{'_auth_email'};
@@ -1163,14 +1138,14 @@ See Also  : L<mail_authority()|mail_authority>
 =cut
 
 
-#-------------'
+#-------------
 sub send_mail {
 #-------------
     my( $self, @param) = @_;
     my($recipient,$subj,$message,$cc) = $self->_rearrange([qw(TO SUBJ MSG CC)],@param);
 
     $self->throw("Invalid or missing e-mail address: $recipient")
-	if not $recipient =~ /\S+\@\S+/;
+        if not $recipient =~ /\S+\@\S+/;
 
     $subj ||= 'empty subject'; $message ||= '';
 
@@ -1231,14 +1206,26 @@ See Also   :
 
 =cut
 
+#------------
 sub find_exe {
+#------------
     my ($self, $name) = @_;
-    my @bindirs = split (':', $ENV{'PATH'});
+    my @bindirs;
+    if ($^O =~ m/mswin/i) {
+        @bindirs = split ';', $ENV{'PATH'};
+        # Add usual executable extension if missing or -x won't work
+        $name.= '.exe' if ($name !~ m/\.exe$/i);
+    }
+    else {
+        @bindirs = split ':', $ENV{'PATH'};
+    }
     my $exe = $name;
     unless (-x $exe) {
         undef $exe;
         my @exes;
         foreach my $d (@bindirs) {
+            # Note: Windows also understand '/' as folder separator,
+            # so there is no need to use a conditional with '\'
             push(@exes, "$d/$name") if -x "$d/$name";
         }
         if (scalar @exes) {
@@ -1310,6 +1297,14 @@ sub request_data {
     $data;
 }
 
+=head2 quit_reply
+
+ Title   : quit_reply
+ Usage   :
+ Purpose :
+
+=cut
+
 sub quit_reply {
 # Not much used since you can use request_data()
 # and test for an empty string.
@@ -1335,16 +1330,12 @@ sub verify_version {
     my $reqVersion  = shift;
 
     $] < $reqVersion and do {
-	printf STDERR ( "\a\n%s %0.3f.\n", "** Sorry. This Perl script requires at least version", $reqVersion);
-	printf STDERR ( "%s %0.3f %s\n\n", "You are running Perl version", $], "Please update your Perl!\n\n" );
-	exit(1);
+        printf STDERR ( "\a\n%s %0.3f.\n", "** Sorry. This Perl script requires at least version", $reqVersion);
+        printf STDERR ( "%s %0.3f %s\n\n", "You are running Perl version", $], "Please update your Perl!\n\n" );
+        exit(1);
     }
 }
 
-
 1;
 
-
 __END__
-
-
@@ -1,19 +1,10 @@
-#
-# BioPerl module for Bio::Root::Version
-#
-# Please direct questions and support issues to <bioperl-l@bioperl.org> 
-#
-# Cared for by Aaron Mackey <amackey@virginia.edu>
-#
-# Copyright Aaron Mackey
-#
-# You may distribute this module under the same terms as perl itself
-
-# POD documentation - main docs before the code
-
-=head1 NAME
+package Bio::Root::Version;
+use strict;
 
-Bio::Root::Version - provide global, distribution-level versioning
+# ABSTRACT: provide global, distribution-level versioning
+# AUTHOR:   Aaron Mackey <amackey@virginia.edu>
+# OWNER:    Aaron Mackey
+# LICENSE:  Perl_5
 
 =head1 SYNOPSIS
 
@@ -48,56 +39,9 @@ Bio::Root::RootI itself uses this module, so any module that directly
 (or indirectly) uses Bio::Root::RootI will get a global $VERSION
 variable set if it's not already.
 
-
-=head1 FEEDBACK
-
-=head2 Mailing Lists
-
-User feedback is an integral part of the evolution of this and other
-Bioperl modules. Send your comments and suggestions preferably to one
-of the Bioperl mailing lists.  Your participation is much appreciated.
-
-  bioperl-l@bioperl.org                  - General discussion
-  http://bioperl.org/wiki/Mailing_lists  - About the mailing lists
-
-=head2 Support 
-
-Please direct usage questions or support issues to the mailing list:
-
-I<bioperl-l@bioperl.org>
-
-rather than to the module maintainer directly. Many experienced and 
-reponsive experts will be able look at the problem and quickly 
-address it. Please include a thorough description of the problem 
-with code and data examples if at all possible.
-
-=head2 Reporting Bugs
-
-Report bugs to the Bioperl bug tracking system to help us keep track
-the bugs and their resolution.  Bug reports can be submitted via the
-web:
-
-  https://redmine.open-bio.org/projects/bioperl/
-
-=head1 AUTHOR - Aaron Mackey
-
-Email amackey@virginia.edu
-
-=head1 APPENDIX
-
-The rest of the documentation details each of the object
-methods. Internal methods are usually preceded with a _
-
 =cut
 
-
-# Let the code begin...
-
-
-package Bio::Root::Version;
-use strict;
-
-our $VERSION = '1.006923'; # pre-1.7
+our $VERSION = '1.006924'; # pre-1.7
 $VERSION = eval $VERSION;
 
 sub import {
@@ -106,10 +50,11 @@ sub import {
     my $pkg = caller($i);
     no strict 'refs';
     while ($pkg) {
-	if ($pkg =~ m/^Bio::/o &&
-	    not defined ${$pkg . "::VERSION"}) {
-	    ${$pkg . "::VERSION"} = $VERSION;
-	}
+        if (    $pkg =~ m/^Bio::/o
+            and not defined ${$pkg . "::VERSION"}
+            ) {
+            ${$pkg . "::VERSION"} = $VERSION;
+        }
         $pkg = caller(++$i);
     }
 }
@@ -58,7 +58,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Chad Matsalla
 
@@ -64,7 +64,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/           
+  https://github.com/bioperl/bioperl-live/issues           
 
 =head1 AUTHOR 
 
@@ -62,7 +62,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/           
+  https://github.com/bioperl/bioperl-live/issues           
 
 =head1 AUTHOR 
 
@@ -53,7 +53,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Chad Matsalla
 
@@ -110,7 +110,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -66,7 +66,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Sendu Bala
 
@@ -61,7 +61,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -93,7 +93,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich and Steve Chervitz
 
@@ -473,6 +473,60 @@ sub homology_string{
     return $previous;
 }
 
+=head2 consensus_string
+
+ Title   : consensus_string
+ Usage   : my $cs_string = $hsp->consensus_string;
+ Function: Retrieves the consensus structure line for this HSP as a string (HMMER).
+         : If the model had any consensus structure or reference line annotation
+         : that it inherited from a multiple alignment (#=GC SS cons,
+         : #=GC RF annotation in Stockholm files), that information is shown
+         : as CS or RF annotation line.
+ Returns : string
+ Args    : [optional] string to set for consensus structure
+
+=cut
+
+sub consensus_string {
+    my ($self,$value) = @_;
+    my $previous = $self->{CS_SEQ};
+    if( defined $value || ! defined $previous ) {
+        $value = $previous = '' unless defined $value;
+        $self->{CS_SEQ} = $value;
+        # do some housekeeping so we know when to
+        # re-run _calculate_seq_positions
+        $self->{'_sequenceschanged'} = 1;
+    }
+    return $previous;
+}
+
+=head2 posterior_string
+
+ Title   : posterior_string
+ Usage   : my $pp_string = $hsp->posterior_string;
+ Function: Retrieves the posterior probability line for this HSP as a string (HMMer3).
+         : The posterior probability is the string of symbols at the bottom
+         : of the alignment indicating the expected accuracy of each aligned residue.
+         : A 0 means 0-5%, 1 means 5-15%, and so on; 9 means 85-95%,
+         : and a * means 95-100% posterior probability.
+ Returns : string
+ Args    : [optional] string to set for posterior probability
+
+=cut
+
+sub posterior_string {
+    my ($self,$value) = @_;
+    my $previous = $self->{PP_SEQ};
+    if( defined $value || ! defined $previous ) {
+        $value = $previous = '' unless defined $value;
+        $self->{PP_SEQ} = $value;
+        # do some housekeeping so we know when to
+        # re-run _calculate_seq_positions
+        $self->{'_sequenceschanged'} = 1;
+    }
+    return $previous;
+}
+
 =head2 length
 
  Title    : length
@@ -1668,7 +1722,7 @@ sub _pre_frac {
 # before calling gaps()
 # This relies first on passed parameters (parser-dependent), then on gaps
 # calculated by seq_inds() (if set), then falls back to directly checking
-# for '-' as a last resort  
+# for '-' or '.' as a last resort
 
 sub _pre_gaps {
     my $self = shift;
@@ -1682,14 +1736,18 @@ sub _pre_gaps {
     if( defined $query_gaps ) {
         $self->gaps('query', $query_gaps);
     } elsif( defined $query_seq ) {
-        my $qg = (defined $self->{'_query_offset'}) ? $self->seq_inds('query','gaps') : scalar( $query_seq =~ tr/\-//);
+        my $qg = (defined $self->{'_query_offset'}) ? $self->seq_inds('query','gaps')
+               : ($self->algorithm eq 'ERPIN')      ? scalar( $hit_seq =~ tr/\-//)
+               :  scalar( $query_seq =~ tr/\-\.// ); # HMMER3 and Infernal uses '.' and '-'
         my $offset = $self->{'_query_offset'} || 1;
         $self->gaps('query', $qg/$offset);
     }
     if( defined $hit_gaps ) {
         $self->gaps('hit', $hit_gaps);
     } elsif( defined $hit_seq ) {
-        my $hg = (defined $self->{'_sbjct_offset'}) ? $self->seq_inds('hit','gaps') : scalar( $hit_seq =~ tr/\-//);
+        my $hg = (defined $self->{'_sbjct_offset'}) ? $self->seq_inds('hit','gaps')
+               : ($self->algorithm eq 'ERPIN')      ? scalar( $hit_seq =~ tr/\-//)
+               :  scalar( $hit_seq =~ tr/\-\.// ); # HMMER3 and Infernal uses '.' and '-'
         my $offset = $self->{'_sbjct_offset'} || 1;
         $self->gaps('hit', $hg/$offset);
     }
@@ -52,7 +52,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -58,7 +58,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -93,7 +93,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Steve Chervitz, Jason Stajich
 
@@ -67,7 +67,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Sendu Bala
 
@@ -57,7 +57,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Chris Fields
 
@@ -51,7 +51,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -111,7 +111,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -97,7 +97,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Sendu Bala
 
@@ -56,7 +56,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -62,7 +62,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich and Steve Chervitz
 
@@ -66,7 +66,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Sendu Bala
 
@@ -65,7 +65,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Aaron Mackey
 
@@ -72,7 +72,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich and Steve Chervitz
 
@@ -751,7 +751,6 @@ sub logical_length {
     } else {
         # Otherwise, return logical query length
         $length = $self->query_length();
-        $self->throw("Must have defined query_len") unless ( $length );
     }
 
     $logical = Bio::Search::SearchUtils::logical_length($algo, $seqType, $length);
@@ -1259,7 +1258,8 @@ sub frac_conserved {
            : across all HSPs (not including intervals between non-overlapping
            : HSPs).
  Example   : $frac_alnq = $hit_object->frac_aligned_query();
- Returns   : Float (2-decimal precision, e.g., 0.75).
+ Returns   : Float (2-decimal precision, e.g., 0.75),
+           : or undef if query length is unknown to avoid division by 0.
  Argument  : n/a
  Throws    : n/a
  Comments  : If you need data for each HSP, use hsps() and then interate
@@ -1282,8 +1282,9 @@ sub frac_aligned_query {
 
     Bio::Search::SearchUtils::tile_hsps($self) unless $self->tiled_hsps;
 
-    sprintf( "%.2f", $self->length_aln('query') /
-             $self->logical_length('query'));
+    my $qry_len = $self->logical_length('query');
+    return undef if $qry_len == 0; # Avoid division by 0 crash
+    sprintf( "%.2f", $self->length_aln('query') / $qry_len);
 }
 
 
@@ -1295,7 +1296,8 @@ sub frac_aligned_query {
            : across all HSPs (not including intervals between non-overlapping
            : HSPs).
  Example   : $frac_alnq = $hit_object->frac_aligned_hit();
- Returns   : Float (2-decimal precision, e.g., 0.75).
+ Returns   : Float (2-decimal precision, e.g., 0.75),
+           : or undef if hit length is unknown to avoid division by 0.
  Argument  : n/a
  Throws    : n/a
  Comments  : If you need data for each HSP, use hsps() and then interate
@@ -1318,7 +1320,9 @@ sub frac_aligned_hit {
 
     Bio::Search::SearchUtils::tile_hsps($self) unless $self->tiled_hsps;
 
-    sprintf( "%.2f", $self->length_aln('sbjct') / $self->logical_length('sbjct'));
+    my $sbjct_len = $self->logical_length('sbjct');
+    return undef if $sbjct_len == 0; # Avoid division by 0 crash
+    sprintf( "%.2f", $self->length_aln('sbjct') / $sbjct_len);
 }
 
 
@@ -1681,10 +1685,13 @@ sub tiled_hsps {
 =cut
 
 sub query_length {
-    my $self = shift;
-
-    return $self->{'_query_length'} = shift if @_;
-    return $self->{'_query_length'};
+    my ($self,$value) = @_;
+    my $previous = $self->{'_query_length'};
+    if( defined $value || ! defined $previous ) {
+        $value = $previous = 0 unless defined $value;
+        $self->{'_query_length'} = $value;
+    }
+    return $previous;
 }
 
 =head2 ncbi_gi
@@ -56,7 +56,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -57,7 +57,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -83,7 +83,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Aaron Mackey, Steve Chervitz
 
@@ -67,7 +67,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Sendu Bala
 
@@ -74,7 +74,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Chris Fields
 
@@ -172,7 +172,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-    https://redmine.open-bio.org/projects/bioperl/
+    https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -89,7 +89,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Sendu Bala
 
@@ -52,7 +52,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Thomas Sharpton
 
@@ -84,7 +84,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Steve Chervitz
 
@@ -217,7 +217,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR 
 
@@ -52,7 +52,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Aaron Mackey
 
@@ -59,7 +59,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Sendu Bala
 
@@ -71,7 +71,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Steve Chervitz
 
@@ -72,7 +72,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Shin Leong
 
@@ -113,7 +113,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich and Steve Chervitz
 
@@ -65,7 +65,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -60,7 +60,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Sendu Bala
 
@@ -85,7 +85,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR Sendu Bala
 
@@ -57,7 +57,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -88,7 +88,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR 
 
@@ -57,7 +57,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -52,7 +52,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Thomas Sharpton
 
@@ -56,7 +56,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Chad Matsalla
 
@@ -152,7 +152,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Mark A. Jensen
 
@@ -78,7 +78,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Mark A. Jensen
 
@@ -96,7 +96,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 APPENDIX
 
@@ -56,7 +56,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -72,7 +72,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -2,7 +2,7 @@
 #
 # BioPerl module for Bio::SearchIO::IteratedSearchResultEventBuilder
 #
-# Please direct questions and support issues to <bioperl-l@bioperl.org> 
+# Please direct questions and support issues to <bioperl-l@bioperl.org>
 #
 # Cared for by Steve Chervitz <sac@bioperl.org> and Jason Stajich <jason@bioperl.org>
 #
@@ -39,15 +39,15 @@ the Bioperl mailing list.  Your participation is much appreciated.
   bioperl-l@bioperl.org                  - General discussion
   http://bioperl.org/wiki/Mailing_lists  - About the mailing lists
 
-=head2 Support 
+=head2 Support
 
 Please direct usage questions or support issues to the mailing list:
 
 I<bioperl-l@bioperl.org>
 
-rather than to the module maintainer directly. Many experienced and 
-reponsive experts will be able look at the problem and quickly 
-address it. Please include a thorough description of the problem 
+rather than to the module maintainer directly. Many experienced and
+reponsive experts will be able look at the problem and quickly
+address it. Please include a thorough description of the problem
 with code and data examples if at all possible.
 
 =head2 Reporting Bugs
@@ -56,7 +56,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Steve Chervitz
 
@@ -81,9 +81,6 @@ Internal methods are usually preceded with a _
 
 
 package Bio::SearchIO::IteratedSearchResultEventBuilder;
-use vars qw(%KNOWNEVENTS             $DEFAULT_INCLUSION_THRESHOLD
-            $MAX_HSP_OVERLAP
-);
 
 use strict;
 
@@ -91,19 +88,11 @@ use Bio::Factory::ObjectFactory;
 
 use base qw(Bio::SearchIO::SearchResultEventBuilder);
 
-# e-value threshold for inclusion in the PSI-BLAST score matrix model (blastpgp)
-# NOTE: Executing `blastpgp -` incorrectly reports that the default is 0.005.
-#       (version 2.2.2 [Jan-08-2002])
-$DEFAULT_INCLUSION_THRESHOLD = 0.001;
-
-
-$MAX_HSP_OVERLAP  = 2;  # Used when tiling multiple HSPs.
-
 =head2 new
 
  Title   : new
  Usage   : my $obj = Bio::SearchIO::IteratedSearchResultEventBuilder->new();
- Function: Builds a new Bio::SearchIO::IteratedSearchResultEventBuilder object 
+ Function: Builds a new Bio::SearchIO::IteratedSearchResultEventBuilder object
  Returns : Bio::SearchIO::IteratedSearchResultEventBuilder
  Args    : -hsp_factory    => Bio::Factory::ObjectFactoryI
            -hit_factory    => Bio::Factory::ObjectFactoryI
@@ -120,67 +109,44 @@ $MAX_HSP_OVERLAP  = 2;  # Used when tiling multiple HSPs.
            -hit_filter  => reference to a function to be used for
                            filtering hits based on arbitrary criteria.
 
-
 See L<Bio::SearchIO::SearchResultEventBuilder> for more information
 
 =cut
 
-sub new { 
+sub new {
     my ($class,@args) = @_;
     my $self = $class->SUPER::new(@args);
-    my ($hitF, $resultF, $hspF, $iterationF) =
-        $self->_rearrange([qw(
-                              HIT_FACTORY
-                              RESULT_FACTORY
-			      HSP_FACTORY
+    my ($resultF, $iterationF, $hitF,  $hspF) =
+        $self->_rearrange([qw(RESULT_FACTORY
                               ITERATION_FACTORY
-                             )],@args);
-
+                              HIT_FACTORY
+                              HSP_FACTORY)],@args);
     $self->_init_parse_params(@args);
 
     # Note that we need to override the setting of result and factories here
     # so that we can set different default factories than are set by the super class.
-    $self->register_factory('result', $resultF || 
+    $self->register_factory('result', $resultF ||
                             Bio::Factory::ObjectFactory->new(
-                                 -type      => 'Bio::Search::Result::BlastResult',
-                                 -interface => 'Bio::Search::Result::ResultI'));
+                                -type      => 'Bio::Search::Result::BlastResult',
+                                -interface => 'Bio::Search::Result::ResultI'));
 
-    $self->register_factory('hit', $hitF || 
+    $self->register_factory('hit', $hitF ||
                             Bio::Factory::ObjectFactory->new(
-                                 -type      => 'Bio::Search::Hit::BlastHit',
-                                 -interface => 'Bio::Search::Hit::HitI'));
+                                -type      => 'Bio::Search::Hit::BlastHit',
+                                -interface => 'Bio::Search::Hit::HitI'));
 
-    $self->register_factory('hsp', $hspF || 
+    $self->register_factory('hsp', $hspF ||
                             Bio::Factory::ObjectFactory->new(
-                                 -type      => 'Bio::Search::HSP::GenericHSP',
-                                 -interface => 'Bio::Search::HSP::HSPI'));
+                                -type      => 'Bio::Search::HSP::GenericHSP',
+                                -interface => 'Bio::Search::HSP::HSPI'));
 
     # TODO: Change this to BlastIteration (maybe)
-    $self->register_factory('iteration', $iterationF || 
+    $self->register_factory('iteration', $iterationF ||
                             Bio::Factory::ObjectFactory->new(
-                                 -type      => 'Bio::Search::Iteration::GenericIteration',
-                                 -interface => 'Bio::Search::Iteration::IterationI'));
-    return $self;
-}
-
-
-#Initializes parameters used during parsing of Blast reports.
-sub _init_parse_params {
-
-    my ($self, @args) = @_;
-    # -FILT_FUNC has been replaced by -HIT_FILTER.
-    # Leaving -FILT_FUNC in place for backward compatibility
-    my($ithresh, $signif, $score, $bits, $hit_filter, $filt_func) =
-           $self->_rearrange([qw(INCLUSION_THRESHOLD
-                                 SIGNIF SCORE BITS HIT_FILTER FILT_FUNC
-                                )], @args);
+                                -type      => 'Bio::Search::Iteration::GenericIteration',
+                                -interface => 'Bio::Search::Iteration::IterationI'));
 
-    $self->inclusion_threshold( defined($ithresh) ? $ithresh : $DEFAULT_INCLUSION_THRESHOLD);
-    my $hit_filt = $hit_filter || $filt_func;
-    defined $hit_filter && $self->hit_filter($hit_filt);
-    defined $signif     && $self->max_significance($signif);
-    defined $score      && $self->min_score($score);
-    defined $bits       && $self->min_bits($bits);
+    return $self;
 }
 
 =head2 will_handle
@@ -191,14 +157,13 @@ sub _init_parse_params {
  Returns : boolean
  Args    : event type name
 
-
 =cut
 
 sub will_handle{
    my ($self,$type) = @_;
    # these are the events we recognize
-   return ( $type eq 'hsp' || $type eq 'hit' || $type eq 'result' || $type eq 'iteration' ||
-            $type eq 'newhits' || $type eq 'oldhits' );
+   return (   $type eq 'hsp' || $type eq 'hit' || $type eq 'result'
+           || $type eq 'iteration' || $type eq 'newhits' || $type eq 'oldhits' );
 }
 
 =head2 SAX methods
@@ -210,7 +175,7 @@ sub will_handle{
  Title   : start_result
  Usage   : $handler->start_result($resulttype)
  Function: Begins a result event cycle
- Returns : none 
+ Returns : none
  Args    : Type of Report
 
 =cut
@@ -226,75 +191,88 @@ sub start_result {
    return;
 }
 
-=head2 end_result
+=head2 start_iteration
 
- Title   : end_result
- Usage   : my @results = $parser->end_result
- Function: Finishes a result handler cycle 
- Returns : A Bio::Search::Result::ResultI
- Args    : none
+ Title   : start_iteration
+ Usage   : $handler->start_iteration()
+ Function: Starts an Iteration event cycle
+ Returns : none
+ Args    : type of event and associated hashref
 
 =cut
 
-sub end_result {
-    my ($self,$type,$data) = @_;
-    #print STDERR "ISREB: end_result\n";
-    ## How is runid getting set? Purpose?
-    if( defined $data->{'runid'} &&
-        $data->{'runid'} !~ /^\s+$/ ) {        
-
-        if( $data->{'runid'} !~ /^lcl\|/) { 
-            $data->{"RESULT-query_name"}= $data->{'runid'};
-        } else { 
-            ($data->{"RESULT-query_name"},$data->{"RESULT-query_description"}) = 
-                split(/\s+/,$data->{"RESULT-query_description"},2);
-        }
-        
-        if( my @a = split(/\|/,$data->{'RESULT-query_name'}) ) {
-            my $acc = pop @a ; # this is for accession |1234|gb|AAABB1.1|AAABB1
-            # this is for |123|gb|ABC1.1|
-            $acc = pop @a if( ! defined $acc || $acc =~ /^\s+$/);
-            $data->{"RESULT-query_accession"}= $acc;
-        }
-        delete $data->{'runid'};
-    }
-    my %args = map { my $v = $data->{$_}; s/RESULT//; ($_ => $v); } 
-               grep { /^RESULT/ } keys %{$data};
-    
-    $args{'-algorithm'} =  uc( $args{'-algorithm_name'} || 
-                               $data->{'RESULT-algorithm_name'} || $type);
-
-    $args{'-iterations'} = $self->{'_iterations'};
-
-    my $result = $self->factory('result')->create_object(%args);
-    $result->hit_factory($self->factory('hit'));
-    $self->{'_iterations'} = [];
-    return $result;
+sub start_iteration {
+    my ($self,$type) = @_;
+
+    #print STDERR "ISREB: start_iteration()\n";
+    $self->{'_iteration_count'}++;
+
+    # Reset arrays for the various classes of hits.
+#    $self->{'_newhits_unclassified'}     = [];
+    $self->{'_newhits_below'}        = [];
+    $self->{'_newhits_not_below'}    = [];
+    $self->{'_oldhits_below'}        = [];
+    $self->{'_oldhits_newly_below'}  = [];
+    $self->{'_oldhits_not_below'}    = [];
+    $self->{'_hitcount'} = 0;
+    return;
 }
 
 
+=head2 end_iteration
+
+ Title   : end_iteration
+ Usage   : $handler->end_iteration()
+ Function: Ends an Iteration event cycle
+ Returns : Bio::Search::Iteration object
+ Args    : type of event and associated hashref
+
+=cut
+
+sub end_iteration {
+    my ($self,$type,$data) = @_;
+
+    # print STDERR "ISREB: end_iteration()\n";
+
+    my %args = map { my $v = $data->{$_}; s/ITERATION//; ($_ => $v); }
+    grep { /^ITERATION/ } keys %{$data};
+
+    $args{'-number'} = $self->{'_iteration_count'};
+    $args{'-oldhits_below'} = $self->{'_oldhits_below'};
+    $args{'-oldhits_newly_below'} = $self->{'_oldhits_newly_below'};
+    $args{'-oldhits_not_below'} = $self->{'_oldhits_not_below'};
+    $args{'-newhits_below'} = $self->{'_newhits_below'};
+    $args{'-newhits_not_below'} = $self->{'_newhits_not_below'};
+    $args{'-hit_factory'} = $self->factory('hit');
+
+    my $it = $self->factory('iteration')->create_object(%args);
+    push @{$self->{'_iterations'}}, $it;
+    return $it;
+}
+
 # Title   : _add_hit (private function for internal use only)
 # Purpose : Applies hit filtering and calls _store_hit if it passes filtering.
-# Argument: Bio::Search::Hit::HitI object 
+# Argument: Bio::Search::Hit::HitI object
 
 sub _add_hit {
     my ($self, $hit) = @_;
-	
-    my $hit_name = uc($hit->{-name});
+
+    my $hit_name   = uc($hit->{-name});
     my $hit_signif = $hit->{-significance};
-    my $ithresh = $self->{'_inclusion_threshold'};
-	
+    my $ithresh    = $self->{'_inclusion_threshold'};
+
     # Test significance using custom function (if supplied)
     my $add_hit = 1;
-	
+
     my $hit_filter = $self->{'_hit_filter'};
-	
+
     if($hit_filter) {
         # since &hit_filter is out of our control and would expect a HitI object,
         # we're forced to make one for it
         $hit = $self->factory('hit')->create_object(%{$hit});
         $add_hit = 0 unless &$hit_filter($hit);
-    } else {
+    }
+    else {
         if($self->{'_confirm_significance'}) {
             $add_hit = 0 unless $hit_signif <= $self->{'_max_significance'};
         }
@@ -307,16 +285,16 @@ sub _add_hit {
             $add_hit = 0 unless $hit_bits >= $self->{'_min_bits'};
         }
     }
-	
+
     $add_hit && $self->_store_hit($hit, $hit_name, $hit_signif);
-    # Building hit lookup hashes for determining if the hit is old/new and 
+    # Building hit lookup hashes for determining if the hit is old/new and
     # above/below threshold.
     $self->{'_old_hit_names'}->{$hit_name}++;
     $self->{'_hit_names_below'}->{$hit_name}++ if $hit_signif <= $ithresh;
 }
 
 # Title   : _store_hit (private function for internal use only)
-# Purpose : Collects hit objects into defined sets that are useful for 
+# Purpose : Collects hit objects into defined sets that are useful for
 #           analyzing PSI-blast results.
 #           These are ultimately added to the iteration object in end_iteration().
 #
@@ -325,15 +303,15 @@ sub _add_hit {
 #   Secondary split = below vs. above threshold
 #   1. Has this hit occurred in a previous iteration?
 #   1.1. If yes, was it below threshold?
-#   1.1.1. If yes, ---> [oldhits_below] 
+#   1.1.1. If yes, ---> [oldhits_below]
 #   1.1.2. If no, is it now below threshold?
-#   1.1.2.1. If yes, ---> [oldhits_newly_below] 
-#   1.1.2.2. If no, ---> [oldhits_not_below] 
+#   1.1.2.1. If yes, ---> [oldhits_newly_below]
+#   1.1.2.2. If no, ---> [oldhits_not_below]
 #   1.2. If no, is it below threshold?
-#   1.2.1. If yes, ---> [newhits_below] 
-#   1.2.2. If no, ---> [newhits_not_below] 
-#   1.2.3. If don't know (no inclusion threshold data), ---> [newhits_unclassified] 
-#   Note: As long as there's a default inclusion threshold, 
+#   1.2.1. If yes, ---> [newhits_below]
+#   1.2.2. If no, ---> [newhits_not_below]
+#   1.2.3. If don't know (no inclusion threshold data), ---> [newhits_unclassified]
+#   Note: As long as there's a default inclusion threshold,
 #         there won't be an unclassified set.
 #
 # For the first iteration, it might be nice to detect non-PSI blast reports
@@ -342,18 +320,17 @@ sub _add_hit {
 # for non-PSI blast reports since they'll get flattened out in the
 # result and iteration search objects.
 
-
 sub _store_hit {
     my ($self, $hit, $hit_name, $hit_signif) = @_;
 
     my $ithresh = $self->{'_inclusion_threshold'};
-    
+
     # This is the assumption leading to Bug 1986. The assumption here is that
     # the hit name is unique (and thus new), therefore any subsequent encounters
     # with a hit containing the same name are filed as old hits. This isn't
     # always true (see the bug report for a few examples). Adding an explicit
     # check for the presence of iterations, adding to new hits otherwise.
-    
+
     if (exists $self->{'_old_hit_names'}->{$hit_name}
         && scalar @{$self->{_iterations}}) {
         if (exists $self->{'_hit_names_below'}->{$hit_name}) {
@@ -373,210 +350,4 @@ sub _store_hit {
     $self->{'_hitcount'}++;
 }
 
-=head2 start_iteration
-
- Title   : start_iteration
- Usage   : $handler->start_iteration()
- Function: Starts an Iteration event cycle
- Returns : none
- Args    : type of event and associated hashref
-
-=cut
-
-sub start_iteration {
-    my ($self,$type) = @_;
-
-    #print STDERR "ISREB: start_iteration()\n";
-    $self->{'_iteration_count'}++;
-
-    # Reset arrays for the various classes of hits.
-#    $self->{'_newhits_unclassified'}     = [];
-    $self->{'_newhits_below'}        = [];
-    $self->{'_newhits_not_below'}    = [];
-    $self->{'_oldhits_below'}        = [];
-    $self->{'_oldhits_newly_below'}  = [];
-    $self->{'_oldhits_not_below'}    = [];
-    $self->{'_hitcount'} = 0;
-    return;
-}
-
-
-=head2 end_iteration
-
- Title   : end_iteration
- Usage   : $handler->end_iteration()
- Function: Ends an Iteration event cycle
- Returns : Bio::Search::Iteration object
- Args    : type of event and associated hashref
-
-
-=cut
-
-sub end_iteration {
-    my ($self,$type,$data) = @_;   
-
-    # print STDERR "ISREB: end_iteration()\n";
-
-    my %args = map { my $v = $data->{$_}; s/ITERATION//; ($_ => $v); } 
-    grep { /^ITERATION/ } keys %{$data};
-
-    $args{'-number'} = $self->{'_iteration_count'};
-    $args{'-oldhits_below'} = $self->{'_oldhits_below'};
-    $args{'-oldhits_newly_below'} = $self->{'_oldhits_newly_below'};
-    $args{'-oldhits_not_below'} = $self->{'_oldhits_not_below'};
-    $args{'-newhits_below'} = $self->{'_newhits_below'};
-    $args{'-newhits_not_below'} = $self->{'_newhits_not_below'};
-    $args{'-hit_factory'} = $self->factory('hit');
-
-    my $it = $self->factory('iteration')->create_object(%args);
-    push @{$self->{'_iterations'}}, $it;
-    return $it;
-}
-
-=head2 max_significance
-
- Usage     : $obj->max_significance();
- Purpose   : Set/Get the P or Expect value used as significance screening cutoff.
-             This is the value of the -signif parameter supplied to new().
-             Hits with P or E-value above this are skipped.
- Returns   : Scientific notation number with this format: 1.0e-05.
- Argument  : Number (sci notation, float, integer) (when setting)
- Throws    : Bio::Root::BadParameter exception if the supplied argument is
-           : not a valid number.
- Comments  : Screening of significant hits uses the data provided on the
-           : description line. For NCBI BLAST1 and WU-BLAST, this data 
-           : is P-value. for NCBI BLAST2 it is an Expect value.
-
-=cut
-
-sub max_significance {
-    my $self = shift;
-    if (@_) {
-        my $sig = shift;
-        if( $sig =~ /[^\d.e-]/ or $sig <= 0) {
-            $self->throw(-class => 'Bio::Root::BadParameter',
-                         -text => "Invalid significance value: $sig\n".
-                         "Must be a number greater than zero.",
-                         -value=>$sig);
-        }
-        $self->{'_confirm_significance'} = 1;
-        $self->{'_max_significance'} = $sig;
-    }
-    sprintf "%.1e", $self->{'_max_significance'};
-}
-
-
-=head2 signif
-
-Synonym for L<max_significance()|max_significance>
-
-=cut
-
-sub signif { shift->max_significance }
-
-=head2 min_score
-
- Usage     : $obj->min_score();
- Purpose   : Gets the Blast score used as screening cutoff.
-             This is the value of the -score parameter supplied to new().
-             Hits with scores below this are skipped.
- Returns   : Integer (or undef if not set)
- Argument  : Integer (when setting)
- Throws    : Bio::Root::BadParameter exception if the supplied argument is
-           : not a valid number.
- Comments  : Screening of significant hits uses the data provided on the
-           : description line. 
-
-=cut
-
-sub min_score {
-    my $self = shift;
-    if (@_) {
-        my $score = shift;
-        if( $score =~ /[^\de+]/ or $score <= 0) {
-            $self->throw(-class => 'Bio::Root::BadParameter',
-                         -text => "Invalid score value: $score\n".
-                                  "Must be an integer greater than zero.",
-                        -value => $score);
-        }
-        $self->{'_confirm_score'} = 1;
-        $self->{'_min_score'} = $score;
-    }
-    return $self->{'_min_score'};
-}
-
-
-=head2 min_bits
-
- Usage     : $obj->min_bits();
- Purpose   : Gets the Blast bit score used as screening cutoff.
-             This is the value of the -bits parameter supplied to new().
-             Hits with bits score below this are skipped.
- Returns   : Integer (or undef if not set)
- Argument  : Integer (when setting)
- Throws    : Bio::Root::BadParameter exception if the supplied argument is
-           : not a valid number.
- Comments  : Screening of significant hits uses the data provided on the
-           : description line. 
-
-=cut
-
-sub min_bits {
-    my $self = shift;
-    if (@_) {
-        my $bits = shift;
-        if( $bits =~ /[^\de+]/ or $bits <= 0) {
-            $self->throw(-class => 'Bio::Root::BadParameter',
-                         -text => "Invalid bits value: $bits\n".
-                                  "Must be an integer greater than zero.",
-                        -value => $bits);
-        }
-        $self->{'_confirm_bits'} = 1;
-        $self->{'_min_bits'} = $bits;
-    }
-    return $self->{'_min_bits'};
-}
-
-
-=head2 hit_filter
-
- Usage     : $obj->hit_filter();
- Purpose   : Set/Get a function reference used for filtering out hits.
-             This is the value of the -hit_filter parameter supplied to new().
-             Hits that fail to pass the filter are skipped.
- Returns   : Function ref (or undef if not set)
- Argument  : Function ref (when setting)
- Throws    : Bio::Root::BadParameter exception if the supplied argument is
-           : not a function reference.
-
-=cut
-
-sub hit_filter {
-    my $self = shift;
-    if (@_) {
-        my $func = shift;
-        if(not ref $func eq 'CODE') {
-            $self->throw(-class=>'Bio::Root::BadParameter',
-                         -text=>"Not a function reference: $func\n".
-                                "The -hit_filter parameter must be function reference.",
-                         -value=> $func);
-        }
-        $self->{'_hit_filter'} = $func;
-    }
-    return $self->{'_hit_filter'};
-}
-
-=head2 inclusion_threshold
-
-See L<Bio::SearchIO::blast::inclusion_threshold>.
-
-=cut
-
-sub inclusion_threshold {
-    my $self = shift;
-    return $self->{'_inclusion_threshold'} = shift if @_;
-    return $self->{'_inclusion_threshold'};
-}
-
-
 1;
@@ -1,7 +1,7 @@
 #
 # BioPerl module for Bio::SearchIO::SearchResultEventBuilder
 #
-# Please direct questions and support issues to <bioperl-l@bioperl.org> 
+# Please direct questions and support issues to <bioperl-l@bioperl.org>
 #
 # Cared for by Jason Stajich <jason@bioperl.org>
 #
@@ -36,15 +36,15 @@ the Bioperl mailing list.  Your participation is much appreciated.
   bioperl-l@bioperl.org                  - General discussion
   http://bioperl.org/wiki/Mailing_lists  - About the mailing lists
 
-=head2 Support 
+=head2 Support
 
 Please direct usage questions or support issues to the mailing list:
 
 I<bioperl-l@bioperl.org>
 
-rather than to the module maintainer directly. Many experienced and 
-reponsive experts will be able look at the problem and quickly 
-address it. Please include a thorough description of the problem 
+rather than to the module maintainer directly. Many experienced and
+reponsive experts will be able look at the problem and quickly
+address it. Please include a thorough description of the problem
 with code and data examples if at all possible.
 
 =head2 Reporting Bugs
@@ -53,7 +53,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -75,52 +75,93 @@ Internal methods are usually preceded with a _
 
 
 package Bio::SearchIO::SearchResultEventBuilder;
-use vars qw(%KNOWNEVENTS);
+
 use strict;
 
 use Bio::Factory::ObjectFactory;
 
 use base qw(Bio::Root::Root Bio::SearchIO::EventHandlerI);
 
+use vars qw($DEFAULT_INCLUSION_THRESHOLD
+            $MAX_HSP_OVERLAP
+);
+
+# e-value threshold for inclusion in the PSI-BLAST score matrix model (blastpgp)
+# NOTE: Executing `blastpgp -` incorrectly reports that the default is 0.005.
+#       (version 2.2.2 [Jan-08-2002])
+$DEFAULT_INCLUSION_THRESHOLD = 0.001;
+
+$MAX_HSP_OVERLAP  = 2;  # Used when tiling multiple HSPs.
+
 =head2 new
 
  Title   : new
  Usage   : my $obj = Bio::SearchIO::SearchResultEventBuilder->new();
- Function: Builds a new Bio::SearchIO::SearchResultEventBuilder object 
+ Function: Builds a new Bio::SearchIO::SearchResultEventBuilder object
  Returns : Bio::SearchIO::SearchResultEventBuilder
  Args    : -hsp_factory    => Bio::Factory::ObjectFactoryI
            -hit_factory    => Bio::Factory::ObjectFactoryI
            -result_factory => Bio::Factory::ObjectFactoryI
+           -inclusion_threshold => e-value threshold for inclusion in the
+                                   PSI-BLAST score matrix model (blastpgp)
+           -signif      => float or scientific notation number to be used
+                           as a P- or Expect value cutoff
+           -score       => integer or scientific notation number to be used
+                           as a blast score value cutoff
+           -bits        => integer or scientific notation number to be used
+                           as a bit score value cutoff
+           -hit_filter  => reference to a function to be used for
+                           filtering hits based on arbitrary criteria.
 
 See L<Bio::Factory::ObjectFactoryI> for more information
 
 =cut
 
-sub new { 
+sub new {
     my ($class,@args) = @_;
     my $self = $class->SUPER::new(@args);
-    my ($hspF,$hitF,$resultF) = $self->_rearrange([qw(HSP_FACTORY
-                                                      HIT_FACTORY
-                                                      RESULT_FACTORY)],@args);
-    $self->register_factory('hsp', $hspF || 
+    my ($resultF, $hitF, $hspF) =
+        $self->_rearrange([qw(RESULT_FACTORY
+                              HIT_FACTORY
+                              HSP_FACTORY)],@args);
+    $self->_init_parse_params(@args);
+
+    $self->register_factory('result', $resultF ||
                             Bio::Factory::ObjectFactory->new(
-                                     -type      => 'Bio::Search::HSP::GenericHSP',
-                                     -interface => 'Bio::Search::HSP::HSPI'));
+                                -type      => 'Bio::Search::Result::GenericResult',
+                                -interface => 'Bio::Search::Result::ResultI'));
 
     $self->register_factory('hit', $hitF ||
                             Bio::Factory::ObjectFactory->new(
-                                      -type      => 'Bio::Search::Hit::GenericHit',
-                                      -interface => 'Bio::Search::Hit::HitI'));
+                                -type      => 'Bio::Search::Hit::GenericHit',
+                                -interface => 'Bio::Search::Hit::HitI'));
 
-    $self->register_factory('result', $resultF ||
+    $self->register_factory('hsp', $hspF ||
                             Bio::Factory::ObjectFactory->new(
-                                      -type      => 'Bio::Search::Result::GenericResult',
-                                      -interface => 'Bio::Search::Result::ResultI'));
+                                -type      => 'Bio::Search::HSP::GenericHSP',
+                                -interface => 'Bio::Search::HSP::HSPI'));
 
     return $self;
 }
 
-# new comes from the superclass
+# Initializes parameters used during parsing of reports.
+sub _init_parse_params {
+
+    my ($self, @args) = @_;
+    # -FILT_FUNC has been replaced by -HIT_FILTER.
+    # Leaving -FILT_FUNC in place for backward compatibility
+    my($ithresh, $signif, $score, $bits, $hit_filter, $filt_func) =
+           $self->_rearrange([qw(INCLUSION_THRESHOLD SIGNIF SCORE BITS
+                                 HIT_FILTER FILT_FUNC
+                                )], @args);
+
+    $self->inclusion_threshold( defined($ithresh) ? $ithresh : $DEFAULT_INCLUSION_THRESHOLD);
+    my $hit_filt = $hit_filter || $filt_func;
+    defined $hit_filter && $self->hit_filter($hit_filt);
+    defined $signif     && $self->max_significance($signif);
+    defined $score      && $self->min_score($score);
+    defined $bits       && $self->min_bits($bits);
+}
 
 =head2 will_handle
 
@@ -130,7 +171,6 @@ sub new {
  Returns : boolean
  Args    : event type name
 
-
 =cut
 
 sub will_handle{
@@ -148,7 +188,7 @@ sub will_handle{
  Title   : start_result
  Usage   : $handler->start_result($resulttype)
  Function: Begins a result event cycle
- Returns : none 
+ Returns : none
  Args    : Type of Report
 
 =cut
@@ -156,7 +196,7 @@ sub will_handle{
 sub start_result {
    my ($self,$type) = @_;
    $self->{'_resulttype'} = $type;
-   $self->{'_hits'} = [];   
+   $self->{'_hits'} = [];
    $self->{'_hsps'} = [];
    $self->{'_hitcount'} = 0;
    return;
@@ -166,7 +206,7 @@ sub start_result {
 
  Title   : end_result
  Usage   : my @results = $parser->end_result
- Function: Finishes a result handler cycle 
+ Function: Finishes a result handler cycle
  Returns : A Bio::Search::Result::ResultI
  Args    : none
 
@@ -176,19 +216,19 @@ sub start_result {
 # so keep that in mind when debugging
 
 sub end_result {
-    my ($self,$type,$data) = @_;    
+    my ($self,$type,$data) = @_;
 
     if( defined $data->{'runid'} &&
-        $data->{'runid'} !~ /^\s+$/ ) {        
+        $data->{'runid'} !~ /^\s+$/ ) {
 
-        if( $data->{'runid'} !~ /^lcl\|/) { 
-            $data->{"RESULT-query_name"}= $data->{'runid'};
-        } else { 
+        if( $data->{'runid'} !~ /^lcl\|/) {
+            $data->{"RESULT-query_name"} = $data->{'runid'};
+        } else {
             ($data->{"RESULT-query_name"},
-	     $data->{"RESULT-query_description"}) = 
-		 split(/\s+/,$data->{"RESULT-query_description"},2);
+             $data->{"RESULT-query_description"}) =
+                split(/\s+/,$data->{"RESULT-query_description"},2);
         }
-        
+
         if( my @a = split(/\|/,$data->{'RESULT-query_name'}) ) {
             my $acc = pop @a ; # this is for accession |1234|gb|AAABB1.1|AAABB1
             # this is for |123|gb|ABC1.1|
@@ -197,15 +237,23 @@ sub end_result {
         }
         delete $data->{'runid'};
     }
-    my %args = map { my $v = $data->{$_}; s/RESULT//; ($_ => $v); } 
+    my %args = map { my $v = $data->{$_}; s/RESULT//; ($_ => $v); }
                grep { /^RESULT/ } keys %{$data};
-    
-    $args{'-algorithm'} =  uc( $args{'-algorithm_name'} || 
-                               $data->{'RESULT-algorithm_name'} || $type);
-    $args{'-hits'}      =  $self->{'_hits'};
+
+    $args{'-algorithm'} =  uc(   $args{'-algorithm_name'}
+                              || $data->{'RESULT-algorithm_name'}
+                              || $type);
+    ($self->isa('Bio::SearchIO::IteratedSearchResultEventBuilder')) ?
+          ( $args{'-iterations'} = $self->{'_iterations'} )
+        : ( $args{'-hits'}       = $self->{'_hits'} );
+
     my $result = $self->factory('result')->create_object(%args);
     $result->hit_factory($self->factory('hit'));
-    $self->{'_hits'} = [];
+
+    ($self->isa('Bio::SearchIO::IteratedSearchResultEventBuilder')) ?
+          ( $self->{'_iterations'} = [] )
+        : ( $self->{'_hits'}       = [] );
+
     return $result;
 }
 
@@ -215,7 +263,7 @@ sub end_result {
  Usage   : $handler->start_hsp($name,$data)
  Function: Begins processing a HSP event
  Returns : none
- Args    : type of element 
+ Args    : type of element
            associated data (hashref)
 
 =cut
@@ -240,16 +288,16 @@ sub end_hsp {
     my ($self,$type,$data) = @_;
 
     if( defined $data->{'runid'} &&
-        $data->{'runid'} !~ /^\s+$/ ) {        
+        $data->{'runid'} !~ /^\s+$/ ) {
 
-        if( $data->{'runid'} !~ /^lcl\|/) { 
+        if( $data->{'runid'} !~ /^lcl\|/) {
             $data->{"RESULT-query_name"}= $data->{'runid'};
-        } else { 
+        } else {
             ($data->{"RESULT-query_name"},
-	     $data->{"RESULT-query_description"}) = 
-		 split(/\s+/,$data->{"RESULT-query_description"},2);
+             $data->{"RESULT-query_description"}) =
+                 split(/\s+/,$data->{"RESULT-query_description"},2);
         }
-        
+
         if( my @a = split(/\|/,$data->{'RESULT-query_name'}) ) {
             my $acc = pop @a ; # this is for accession |1234|gb|AAABB1.1|AAABB1
             # this is for |123|gb|ABC1.1|
@@ -262,27 +310,27 @@ sub end_hsp {
     # this code is to deal with the fact that Blast XML data
     # always has start < end and one has to infer strandedness
     # from the frame which is a problem for the Search::HSP object
-    # which expect to be able to infer strand from the order of 
+    # which expect to be able to infer strand from the order of
     # of the begin/end of the query and hit coordinates
     if( defined $data->{'HSP-query_frame'} && # this is here to protect from undefs
-        (( $data->{'HSP-query_frame'} < 0 && 
-           $data->{'HSP-query_start'} < $data->{'HSP-query_end'} ) ||       
-         $data->{'HSP-query_frame'} > 0 && 
-         ( $data->{'HSP-query_start'} > $data->{'HSP-query_end'} ) ) 
+        (( $data->{'HSP-query_frame'} < 0 &&
+           $data->{'HSP-query_start'} < $data->{'HSP-query_end'} ) ||
+         $data->{'HSP-query_frame'} > 0 &&
+         ( $data->{'HSP-query_start'} > $data->{'HSP-query_end'} ) )
         )
-    { 
+    {
         # swap
         ($data->{'HSP-query_start'},
          $data->{'HSP-query_end'}) = ($data->{'HSP-query_end'},
                                       $data->{'HSP-query_start'});
-    } 
+    }
     if( defined $data->{'HSP-hit_frame'} && # this is here to protect from undefs
-        ((defined $data->{'HSP-hit_frame'} && $data->{'HSP-hit_frame'} < 0 && 
-          $data->{'HSP-hit_start'} < $data->{'HSP-hit_end'} ) ||       
-         defined $data->{'HSP-hit_frame'} && $data->{'HSP-hit_frame'} > 0 && 
+        ((defined $data->{'HSP-hit_frame'} && $data->{'HSP-hit_frame'} < 0 &&
+          $data->{'HSP-hit_start'} < $data->{'HSP-hit_end'} ) ||
+         defined $data->{'HSP-hit_frame'} && $data->{'HSP-hit_frame'} > 0 &&
          ( $data->{'HSP-hit_start'} > $data->{'HSP-hit_end'} ) )
-        ) 
-    { 
+        )
+    {
         # swap
         ($data->{'HSP-hit_start'},
          $data->{'HSP-hit_end'}) = ($data->{'HSP-hit_end'},
@@ -292,34 +340,50 @@ sub end_hsp {
     $data->{'HSP-hit_frame'} ||= 0;
     # handle Blast 2.1.2 which did not support data member: hsp_align-len
     $data->{'HSP-query_length'} ||= $data->{'RESULT-query_length'};
-    $data->{'HSP-query_length'} ||= length ($data->{'HSP-query_seq'} || '');
     $data->{'HSP-hit_length'}   ||= $data->{'HIT-length'};
-    $data->{'HSP-hit_length'}   ||= length ($data->{'HSP-hit_seq'} || '');
-    
+
+    # If undefined lengths, calculate from alignment without gaps and separators
+    if (not defined $data->{'HSP-query_length'}) {
+        if (my $hsp_qry_seq = $data->{'HSP-query_seq'}) {
+            $hsp_qry_seq =~ s/[-\.]//g;
+            $data->{'HSP-query_length'} = length $hsp_qry_seq;
+        }
+        else {
+            $data->{'HSP-query_length'} = 0;
+        }
+    }
+    if (not defined $data->{'HSP-hit_length'}) {
+        if (my $hsp_hit_seq = $data->{'HSP-hit_seq'}) {
+            $hsp_hit_seq =~ s/[-\.]//g;
+            $data->{'HSP-hit_length'} = length $hsp_hit_seq;
+        }
+        else {
+            $data->{'HSP-hit_length'} = 0;
+        }
+    }
     $data->{'HSP-hsp_length'}   ||= length ($data->{'HSP-homology_seq'} || '');
-    
-    my %args = map { my $v = $data->{$_}; s/HSP//; ($_ => $v) } 
+
+    my %args = map { my $v = $data->{$_}; s/HSP//; ($_ => $v) }
                grep { /^HSP/ } keys %{$data};
-    
-    $args{'-algorithm'} =  uc( $args{'-algorithm_name'} || 
+
+    $args{'-algorithm'} =  uc( $args{'-algorithm_name'} ||
                                $data->{'RESULT-algorithm_name'} || $type);
     # copy this over from result
     $args{'-query_name'} = $data->{'RESULT-query_name'};
     $args{'-hit_name'} = $data->{'HIT-name'};
     my ($rank) = scalar @{$self->{'_hsps'} || []} + 1;
     $args{'-rank'} = $rank;
-    
+
     $args{'-hit_desc'} = $data->{'HIT-description'};
     $args{'-query_desc'} = $data->{'RESULT-query_description'};
-    
+
     my $bits = $args{'-bits'};
     my $hsp = \%args;
     push @{$self->{'_hsps'}}, $hsp;
-    
+
     return $hsp;
 }
 
-
 =head2 start_hit
 
  Title   : start_hit
@@ -328,7 +392,6 @@ sub end_hsp {
  Returns : none
  Args    : type of event and associated hashref
 
-
 =cut
 
 sub start_hit{
@@ -337,7 +400,6 @@ sub start_hit{
     return;
 }
 
-
 =head2 end_hit
 
  Title   : end_hit
@@ -346,7 +408,6 @@ sub start_hit{
  Returns : Bio::Search::Hit::HitI object
  Args    : type of event and associated hashref
 
-
 =cut
 
 sub end_hit{
@@ -366,13 +427,13 @@ sub end_hit{
     if(exists $args{'-name'} && $args{'-name'} =~ /BL_ORD_ID/ ) {
         ($args{'-name'}, $args{'-description'}) = split(/\s+/,$args{'-description'},2);
     }
-    $args{'-algorithm'} =  uc( $args{'-algorithm_name'} || 
+    $args{'-algorithm'} =  uc( $args{'-algorithm_name'} ||
                                $data->{'RESULT-algorithm_name'} || $type);
     $args{'-hsps'}      = $self->{'_hsps'};
     $args{'-query_len'} =  $data->{'RESULT-query_length'};
     $args{'-rank'}      = $self->{'_hitcount'} + 1;
     unless( defined $args{'-significance'} ) {
-        if( defined $args{'-hsps'} && 
+        if( defined $args{'-hsps'} &&
             $args{'-hsps'}->[0] ) {
             # use pvalue if present (WU-BLAST), otherwise evalue (NCBI BLAST)
             $args{'-significance'} = $args{'-hsps'}->[0]->{'-pvalue'} || $args{'-hsps'}->[0]->{'-evalue'};
@@ -385,10 +446,39 @@ sub end_hit{
     return $hit;
 }
 
-# TODO: Optionally impose hit filtering here
+# Title   : _add_hit (private function for internal use only)
+# Purpose : Applies hit filtering and store it if it passes filtering.
+# Argument: Bio::Search::Hit::HitI object
+
 sub _add_hit {
     my ($self, $hit) = @_;
-    push @{$self->{'_hits'}}, $hit;
+    my $hit_signif   = $hit->{-significance};
+
+    # Test significance using custom function (if supplied)
+    my $add_hit = 1;
+
+    my $hit_filter = $self->{'_hit_filter'};
+    if($hit_filter) {
+        # since &hit_filter is out of our control and would expect a HitI object,
+        # we're forced to make one for it
+        $hit     = $self->factory('hit')->create_object(%{$hit});
+        $add_hit = 0 unless &$hit_filter($hit);
+    }
+    else {
+        if($self->{'_confirm_significance'}) {
+            $add_hit = 0 unless $hit_signif <= $self->{'_max_significance'};
+        }
+        if($self->{'_confirm_score'}) {
+            my $hit_score = $hit->{-score} || $hit->{-hsps}->[0]->{-score};
+            $add_hit = 0 unless $hit_score >= $self->{'_min_score'};
+        }
+        if($self->{'_confirm_bits'}) {
+            my $hit_bits = $hit->{-bits} || $hit->{-hsps}->[0]->{-bits} || 0;
+            $add_hit = 0 unless $hit_bits >= $self->{'_min_bits'};
+        }
+    }
+
+    $add_hit && push @{$self->{'_hits'}}, $hit;;
     $self->{'_hitcount'} = scalar @{$self->{'_hits'}};
 }
 
@@ -411,20 +501,19 @@ See L<Bio::Factory::ObjectFactoryI> for more information
 
 sub register_factory{
    my ($self, $type,$f) = @_;
-   if( ! defined $f || ! ref($f) || 
-       ! $f->isa('Bio::Factory::ObjectFactoryI') ) { 
+   if( ! defined $f || ! ref($f) ||
+       ! $f->isa('Bio::Factory::ObjectFactoryI') ) {
        $self->throw("Cannot set factory to value $f".ref($f)."\n");
    }
    $self->{'_factories'}->{lc($type)} = $f;
 }
 
-
 =head2 factory
 
  Title   : factory
  Usage   : my $f = $handler->factory('TYPE');
  Function: Retrieves the associated factory for requested 'TYPE'
- Returns : a Bio::Factory::ObjectFactoryI 
+ Returns : a Bio::Factory::ObjectFactoryI
  Throws  : Bio::Root::BadParameter if none registered for the supplied type
  Args    : name of factory class to retrieve
 
@@ -434,7 +523,7 @@ See L<Bio::Factory::ObjectFactoryI> for more information
 
 sub factory{
    my ($self,$type) = @_;
-   return $self->{'_factories'}->{lc($type)} || 
+   return $self->{'_factories'}->{lc($type)} ||
        $self->throw(-class=>'Bio::Root::BadParameter',
                     -text=>"No factory registered for $type");
 }
@@ -451,4 +540,135 @@ sub inclusion_threshold {
     return $self->{'_inclusion_threshold'};
 }
 
+=head2 max_significance
+
+ Usage     : $obj->max_significance();
+ Purpose   : Set/Get the P or Expect value used as significance screening cutoff.
+             This is the value of the -signif parameter supplied to new().
+             Hits with P or E-value at HIT level above this are skipped.
+ Returns   : Scientific notation number with this format: 1.0e-05.
+ Argument  : Number (sci notation, float, integer) (when setting)
+ Throws    : Bio::Root::BadParameter exception if the supplied argument is
+           : not a valid number.
+ Comments  : Screening of significant hits uses the data provided on the
+           : description line. For NCBI BLAST1 and WU-BLAST, this data
+           : is P-value. for NCBI BLAST2 it is an Expect value.
+
+=cut
+
+sub max_significance {
+    my $self = shift;
+    if (@_) {
+        my $sig = shift;
+        if( $sig =~ /[^\d.e-]/ or $sig <= 0) {
+            $self->throw(-class => 'Bio::Root::BadParameter',
+                         -text  => "Invalid significance value: $sig\n"
+                                 . "Must be a number greater than zero.",
+                         -value => $sig);
+        }
+        $self->{'_confirm_significance'} = 1;
+        $self->{'_max_significance'}     = $sig;
+    }
+    sprintf "%.1e", $self->{'_max_significance'};
+}
+
+
+=head2 signif
+
+Synonym for L<max_significance()|max_significance>
+
+=cut
+
+sub signif { shift->max_significance }
+
+=head2 min_score
+
+ Usage     : $obj->min_score();
+ Purpose   : Gets the Blast score used as screening cutoff.
+             This is the value of the -score parameter supplied to new().
+             Hits with scores at HIT level below this are skipped.
+ Returns   : Integer (or undef if not set)
+ Argument  : Integer (when setting)
+ Throws    : Bio::Root::BadParameter exception if the supplied argument is
+           : not a valid number.
+ Comments  : Screening of significant hits uses the data provided on the
+           : description line.
+
+=cut
+
+sub min_score {
+    my $self = shift;
+    if (@_) {
+        my $score = shift;
+        if( $score =~ /[^\de+]/ or $score <= 0) {
+            $self->throw(-class => 'Bio::Root::BadParameter',
+                         -text  => "Invalid score value: $score\n"
+                                 . "Must be an integer greater than zero.",
+                        -value  => $score);
+        }
+        $self->{'_confirm_score'} = 1;
+        $self->{'_min_score'}     = $score;
+    }
+    return $self->{'_min_score'};
+}
+
+=head2 min_bits
+
+ Usage     : $obj->min_bits();
+ Purpose   : Gets the Blast bit score used as screening cutoff.
+             This is the value of the -bits parameter supplied to new().
+             Hits with bits score at HIT level below this are skipped.
+ Returns   : Integer (or undef if not set)
+ Argument  : Integer (when setting)
+ Throws    : Bio::Root::BadParameter exception if the supplied argument is
+           : not a valid number.
+ Comments  : Screening of significant hits uses the data provided on the
+           : description line.
+
+=cut
+
+sub min_bits {
+    my $self = shift;
+    if (@_) {
+        my $bits = shift;
+        if( $bits =~ /[^\de+]/ or $bits <= 0) {
+            $self->throw(-class => 'Bio::Root::BadParameter',
+                         -text  => "Invalid bits value: $bits\n"
+                                 . "Must be an integer greater than zero.",
+                        -value  => $bits);
+        }
+        $self->{'_confirm_bits'} = 1;
+        $self->{'_min_bits'}     = $bits;
+    }
+    return $self->{'_min_bits'};
+}
+
+=head2 hit_filter
+
+ Usage     : $obj->hit_filter();
+ Purpose   : Set/Get a function reference used for filtering out hits.
+             This is the value of the -hit_filter parameter supplied to new().
+             Hits that fail to pass the filter at HIT level are skipped.
+ Returns   : Function ref (or undef if not set)
+ Argument  : Function ref (when setting)
+ Throws    : Bio::Root::BadParameter exception if the supplied argument is
+           : not a function reference.
+
+=cut
+
+sub hit_filter {
+    my $self = shift;
+    if (@_) {
+        my $func = shift;
+        if(not ref $func eq 'CODE') {
+            $self->throw(-class => 'Bio::Root::BadParameter',
+                         -text  => "Not a function reference: $func\n"
+                                 . "The -hit_filter parameter must be function reference.",
+                         -value => $func);
+        }
+        $self->{'_hit_filter'} = $func;
+    }
+    return $self->{'_hit_filter'};
+}
+
 1;
@@ -58,7 +58,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -67,7 +67,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 APPENDIX
 
@@ -142,7 +142,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/           
+  https://github.com/bioperl/bioperl-live/issues           
 
 =head1 AUTHOR 
 
@@ -85,7 +85,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -154,7 +154,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR 
 
@@ -111,7 +111,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/           
+  https://github.com/bioperl/bioperl-live/issues           
 
 =head1 AUTHOR 
 
@@ -107,7 +107,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -64,7 +64,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich, Chris Fields
 
@@ -64,7 +64,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich, Chris Fields
 
@@ -64,7 +64,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -120,7 +120,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -804,7 +804,7 @@ sub next_result {
         }
 
         # move inside of a hit
-        elsif (/^>\s*(\S+)\s*(.*)?/) {
+        elsif (/^(?:Subject=|>)\s*(\S+)\s*(.*)?/) {
             chomp;
 
             $self->debug("blast.pm: Hit: $1\n");
@@ -874,7 +874,9 @@ sub next_result {
                     if ($restofline !~ /\s$/) { # bug #3235
                         s/^\s(?!\s)/\x01/; #new line to concatenate desc lines with <soh>
                     }
-                    $restofline .= $_;
+                    $restofline .= ($restofline =~ /\w$/ && $_ =~ /^\w/) ? " $_" : $_;
+                    $restofline =~ s/\s+/ /g; # this catches the newline as well
+                    $restofline =~ s/^ | $//g;
                 }
             }
             $restofline =~ s/\s+/ /g;
@@ -1292,7 +1294,14 @@ sub next_result {
                 }
             );
             while ( defined( $_ = $self->_readline ) ) {
-                if (
+                # If Lambda/Kappa/Entropy numbers appear first at this point,
+                # pushback and add the header line to process it correctly
+                if (/^\s+[\d+\.]+\s+[\d+\.]+\s+[\d+\.]/ and $last eq '') {
+                    $self->_pushback($_);
+                    $self->_pushback("Lambda     K      H\n");
+                    next;
+                }
+                elsif (
                     /^((?:\S+)?BLAST[NPX]?)\s+(.+)$/i  # NCBI BLAST, PSIBLAST
                                                       # RPSBLAST, MEGABLAST
                     || /^(P?GENEWISE|HFRAME|SWN|TSWN)\s+(.+)/i    #Paracel BTK
@@ -67,7 +67,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Sendu Bala
 
@@ -58,7 +58,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -121,7 +121,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -406,6 +406,7 @@ XML_END
 
     #chop up XML into edible bits for the parser
     while( defined( my $line = <$fh>) ) {
+        next if $line =~ /^\s*$/;
         next if $line =~ m{^\s*</BlastOutput_iterations>}xmso || $line =~ m{^</BlastOutput>}xmso;
         if( $line =~ m{^RPS-BLAST}i ) {
             $self->{'_type'} = 'RPS-BLAST';
@@ -67,7 +67,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Shin Leong
 
@@ -53,7 +53,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Chris Fields
 
@@ -97,7 +97,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -65,7 +65,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich, Aaron Mackey, William Pearson
 
@@ -100,7 +100,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - George Hartzell
 
@@ -64,7 +64,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Kai Blin
 
@@ -64,7 +64,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -113,6 +113,7 @@ BEGIN {
         'Hsp_hitgaps'     => 'HSP-hit_gaps',
         'Hsp_querygaps'   => 'HSP-query_gaps',
         'Hsp_qseq'        => 'HSP-query_seq',
+        'Hsp_csline'      => 'HSP-cs_seq',
         'Hsp_hseq'        => 'HSP-hit_seq',
         'Hsp_midline'     => 'HSP-homology_seq',
         'Hsp_align-len'   => 'HSP-hsp_length',
@@ -161,6 +162,7 @@ sub next_result {
     local ($_);
     while ( defined( $_ = $self->_readline ) ) {
         my $lineorig = $_;
+
         chomp;
         if (/^HMMER\s+(\S+)\s+\((.+)\)/o) {
             my ( $prog, $version ) = split;
@@ -216,7 +218,7 @@ sub next_result {
                 }
             );
         }
-        elsif (s/^Query(\s+(sequence|HMM))?(?:\s+\d+)?:\s+//o) {
+        elsif (s/^Query(?:\s+(?:sequence|HMM))?(?:\s+\d+)?:\s+//o) {
             if ( !$seentop ) {
 
                 # we're in a multi-query report
@@ -241,505 +243,200 @@ sub next_result {
                     'Name' => 'HMMER_query-acc',
                     'Data' => $_
                 }
-            );
-        }
-        elsif (s/^Description:\s+//o) {
-            s/\s+$//;
-            $self->element(
-                {
-                    'Name' => 'HMMER_querydesc',
-                    'Data' => $_
-                }
-            );
-        }
-        elsif ( defined $self->{'_reporttype'}
-            && $self->{'_reporttype'} eq 'HMMSEARCH' )
-        {
-
-            # PROCESS HMMSEARCH RESULTS HERE
-            if (/^Scores for complete sequences/o) {
-                while ( defined( $_ = $self->_readline ) ) {
-                    last if (/^\s+$/);
-                    next if ( /^Sequence\s+Description/o || /^\-\-\-/o );
-                    my @line = split;
-                    my ( $name, $n, $evalue, $score ) =
-                      ( shift @line, pop @line, pop @line, pop @line );
-                    my $desc = join( ' ', @line );
-                    push @hitinfo, [ $name, $desc, $evalue, $score ];
-                    $hitinfo{$name} = $#hitinfo;
-                }
-            }
-            elsif (/^Parsed for domains:/o) {
-                @hspinfo = ();
-
-                while ( defined( $_ = $self->_readline ) ) {
-                    last if (/^\s+$/);
-                    if (m!^//!) {
-                        $self->_pushback($_);
-                        last;
-                    }
-                    next if ( /^(Model|Sequence)\s+Domain/ || /^\-\-\-/ );
-
-                    chomp;
-                    if (
-                        my ( $n, $domainnum, $domainct, @vals ) = (
-                            m!^(\S+)\s+      # host name
-			(\d+)/(\d+)\s+   # num/num (ie 1 of 2) 
-			(\d+)\s+(\d+).+? # sequence start and end
-			(\d+)\s+(\d+)\s+ # hmm start and end
-			\S+\s+           # []
-			(\S+)\s+         # score
-			(\S+)            # evalue
-			\s*$!ox
-                        )
-                      )
-                    {
-
-                        # array lookup so that we can get rid of things
-                        # when they've been processed
-                        my $info = $hitinfo[ $hitinfo{$n} ];
-                        if ( !defined $info ) {
-                            $self->warn(
-"Incomplete Sequence information, can't find $n hitinfo says $hitinfo{$n}"
-                            );
-                            next;
-                        }
-                        push @hspinfo, [ $n, @vals ];
-                    }
-                }
-            }
-            elsif (/^Alignments of top/o) {
-                my ( $prelength, $lastdomain, $count, $width );
-                $count = 0;
-                my %domaincounter;
-                my $second_tier = 0;
-                while ( defined( $_ = $self->_readline ) ) {
-                    next if ( /^Align/o
-                        || /^\s+RF\s+[x\s]+$/o );
-                    if ( /^Histogram/o || m!^//!o ) {
-                        if ( $self->in_element('hsp') ) {
-                            $self->end_element( { 'Name' => 'Hsp' } );
-                        }
-                        if ( $self->within_element('hit') ) {
-                            $self->end_element( { 'Name' => 'Hit' } );
-                        }
-                        last;
-                    }
-                    chomp;
-
-                    if (
-                        m/^\s*(.+):\s+domain\s+(\d+)\s+of\s+(\d+)\,\s+
-                        from\s+(\d+)\s+to\s+(\d+)/x
-                      )
-                    {
-                        my ( $name, $domainct, $domaintotal, $from, $to ) =
-                          ( $1, $2, $3, $4, $5 );
-                        $domaincounter{$name}++;
-                        if ( $self->within_element('hit') ) {
-                            if ( $self->within_element('hsp') ) {
-                                $self->end_element( { 'Name' => 'Hsp' } );
-                            }
-                            $self->end_element( { 'Name' => 'Hit' } );
-                        }
-
-                        $self->start_element( { 'Name' => 'Hit' } );
-                        my $info = [
-                            @{
-                                $hitinfo[ $hitinfo{$name} ] || $self->throw(
-"Could not find hit info for $name: Insure that your database contains only unique sequence names"
-                                )
-                              }
-                        ];
-                        if ( $info->[0] ne $name ) {
-                            $self->throw(
-"Somehow the Model table order does not match the order in the domains (got "
-                                  . $info->[0]
-                                  . ", expected $name)" );
-                        }
-                        $self->element(
-                            {
-                                'Name' => 'Hit_id',
-                                'Data' => shift @{$info}
-                            }
-                        );
-                        $self->element(
-                            {
-                                'Name' => 'Hit_desc',
-                                'Data' => shift @{$info}
-                            }
-                        );
-                        $self->element(
-                            {
-                                'Name' => 'Hit_signif',
-                                'Data' => shift @{$info}
-                            }
-                        );
-                        $self->element(
-                            {
-                                'Name' => 'Hit_score',
-                                'Data' => shift @{$info}
-                            }
-                        );
-
-                        $self->start_element( { 'Name' => 'Hsp' } );
-                        $self->element(
-                            {
-                                'Name' => 'Hsp_identity',
-                                'Data' => 0
-                            }
-                        );
-                        $self->element(
-                            {
-                                'Name' => 'Hsp_positive',
-                                'Data' => 0
-                            }
-                        );
-                        my $HSPinfo = shift @hspinfo;
-                        my $id      = shift @$HSPinfo;
-
-                        if ( $id ne $name ) {
-                            $self->throw(
-"Somehow the domain list details do not match the table (got $id, expected $name)"
-                            );
-                        }
-                        if ( $domaincounter{$name} == $domaintotal ) {
-                            $hitinfo[ $hitinfo{$name} ] = undef;
-                        }
-                        $self->element(
-                            {
-                                'Name' => 'Hsp_hit-from',
-                                'Data' => shift @$HSPinfo
-                            }
-                        );
-                        $self->element(
-                            {
-                                'Name' => 'Hsp_hit-to',
-                                'Data' => shift @$HSPinfo
-                            }
-                        );
-                        $self->element(
-                            {
-                                'Name' => 'Hsp_query-from',
-                                'Data' => shift @$HSPinfo
-                            }
-                        );
-                        $self->element(
-                            {
-                                'Name' => 'Hsp_query-to',
-                                'Data' => shift @$HSPinfo
-                            }
-                        );
-                        $self->element(
-                            {
-                                'Name' => 'Hsp_score',
-                                'Data' => shift @$HSPinfo
-                            }
-                        );
-                        $self->element(
-                            {
-                                'Name' => 'Hsp_evalue',
-                                'Data' => shift @$HSPinfo
-                            }
-                        );
-                        $lastdomain = $name;
-                    }
-                    else {
-
-                        # Might want to change this so that it
-                        # accumulates all the of the alignment lines into
-                        # three array slots and then tests for the
-                        # end of the line
-                        if (/^(\s+\*\-\>)(\S+)/o) {    # start of domain
-                            $prelength = CORE::length($1);
-                            $width     = 0;
-
-                            # deal with fact that start en stop is on same line
-                            my $data = $2;
-                            if ($data =~ s/\<\-?\*?\s*$//)
-                            {
-                                $width = CORE::length($data);
-                            }
- 
-                            $self->element(
-                                {
-                                    'Name' => 'Hsp_qseq',
-                                    'Data' => $data
-                                }
-                            );
-                            $count       = 0;
-                            $second_tier = 0;
-                        }
-                        elsif (/^(\s+)(\S+)\<\-\*\s*$/o) {    #end of domain
-                            $self->element(
-                                {
-                                    'Name' => 'Hsp_qseq',
-                                    'Data' => $2
-                                }
-                            );
-                            $width = CORE::length($2);
-                            $count = 0;
-                        }
-                        elsif (( $count != 1 && /^\s+$/o )
-                            || CORE::length($_) == 0
-                            || /^\s+\-?\*\s*$/ )
-                        {
-                            next;
-                        }
-                        elsif ( $count == 0 ) {
-                            $prelength -= 3 unless ( $second_tier++ );
-                            unless ( defined $prelength ) {
-
-                                # $self->warn("prelength not set");
-                                next;
-                            }
-                            $self->element(
-                                {
-                                    'Name' => 'Hsp_qseq',
-                                    'Data' => substr( $_, $prelength )
-                                }
-                            );
-                        }
-                        elsif ( $count == 1 ) {
-                            if ( !defined $prelength ) {
-                                $self->warn("prelength not set");
-                            }
-                            if ($width) {
-                                $self->element(
-                                    {
-                                        'Name' => 'Hsp_midline',
-                                        'Data' =>
-                                          substr( $_, $prelength, $width )
-                                    }
-                                );
-                            }
-                            else {
-                                $self->element(
-                                    {
-                                        'Name' => 'Hsp_midline',
-                                        'Data' => substr( $_, $prelength )
-                                    }
-                                );
-                            }
-                        }
-                        elsif ( $count == 2 ) {
-                            if (/^\s+(\S+)\s+(\d+|\-)\s+(\S*)\s+(\d+|\-)/o) {
-                                $self->element(
-                                    {
-                                        'Name' => 'Hsp_hseq',
-                                        'Data' => $3
-                                    }
-                                );
-                            }
-                            else {
-                                $self->warn("unrecognized line: $_\n");
-                            }
-                        }
-                        $count = 0 if $count++ >= 2;
-                    }
-                }
-            }
-            elsif ( /^Histogram/o || m!^//!o ) {
-                while ( my $HSPinfo = shift @hspinfo ) {
-                    my $id   = shift @$HSPinfo;
-                    my $info = [ @{ $hitinfo[ $hitinfo{$id} ] } ];
-                    next unless defined $info;
-                    $self->start_element( { 'Name' => 'Hit' } );
-                    $self->element(
-                        {
-                            'Name' => 'Hit_id',
-                            'Data' => shift @{$info}
-                        }
-                    );
-                    $self->element(
-                        {
-                            'Name' => 'Hit_desc',
-                            'Data' => shift @{$info}
-                        }
-                    );
-                    $self->element(
-                        {
-                            'Name' => 'Hit_signif',
-                            'Data' => shift @{$info}
-                        }
-                    );
-                    $self->element(
-                        {
-                            'Name' => 'Hit_score',
-                            'Data' => shift @{$info}
-                        }
-                    );
-                    $self->start_element( { 'Name' => 'Hsp' } );
-                    $self->element(
-                        {
-                            'Name' => 'Hsp_query-from',
-                            'Data' => shift @$HSPinfo
-                        }
-                    );
-                    $self->element(
-                        {
-                            'Name' => 'Hsp_query-to',
-                            'Data' => shift @$HSPinfo
-                        }
-                    );
-                    $self->element(
-                        {
-                            'Name' => 'Hsp_hit-from',
-                            'Data' => shift @$HSPinfo
-                        }
-                    );
-                    $self->element(
-                        {
-                            'Name' => 'Hsp_hit-to',
-                            'Data' => shift @$HSPinfo
-                        }
-                    );
-                    $self->element(
-                        {
-                            'Name' => 'Hsp_score',
-                            'Data' => shift @$HSPinfo
-                        }
-                    );
-                    $self->element(
-                        {
-                            'Name' => 'Hsp_evalue',
-                            'Data' => shift @$HSPinfo
-                        }
-                    );
-                    $self->element(
-                        {
-                            'Name' => 'Hsp_identity',
-                            'Data' => 0
-                        }
-                    );
-                    $self->element(
-                        {
-                            'Name' => 'Hsp_positive',
-                            'Data' => 0
-                        }
-                    );
-                    $self->element(
-                        {
-                            'Name' => 'Hsp_positive',
-                            'Data' => 0
-                        }
-                    );
-                    $self->end_element( { 'Name' => 'Hsp' } );
-                    $self->end_element( { 'Name' => 'Hit' } );
-                }
-                @hitinfo = ();
-                %hitinfo = ();
-                last;
-            }
+            );
+        }
+        elsif (s/^Description:\s+//o) {
+            s/\s+$//;
+            $self->element(
+                {
+                    'Name' => 'HMMER_querydesc',
+                    'Data' => $_
+                }
+            );
         }
-        elsif ( defined $self->{'_reporttype'}
-            && $self->{'_reporttype'} eq 'HMMPFAM' )
-        {
-            # process HMMPFAM results here
-            if (/^Scores for sequence family/o) {
+        elsif (   defined $self->{'_reporttype'}
+              && (   $self->{'_reporttype'} eq 'HMMSEARCH'
+                  || $self->{'_reporttype'} eq 'HMMPFAM' )
+              ) {
+            # PROCESS RESULTS HERE
+            if (/^Scores for (?:complete sequences|sequence family)/o) {
                 while ( defined( $_ = $self->_readline ) ) {
                     last if (/^\s+$/);
-                    next if ( /^Model\s+Description/o || /^\-\-\-/o );
+                    next if (   /^Model\s+Description/o
+                             || /^Sequence\s+Description/o
+                             || /^\-\-\-/o );
+
                     chomp;
                     my @line = split;
-                    my ( $model, $n, $evalue, $score ) =
+                    my ( $name, $domaintotal, $evalue, $score ) =
                       ( shift @line, pop @line, pop @line, pop @line );
                     my $desc = join( ' ', @line );
-                    push @hitinfo, [ $model, $desc, $score, $evalue, $n ];
-                    $hitinfo{$model} = $#hitinfo;
+                    push @hitinfo, [ $name, $desc, $score, $evalue, $domaintotal ];
+                    $hitinfo{$name} = $#hitinfo;
                 }
             }
             elsif (/^Parsed for domains:/o) {
                 @hspinfo = ();
+
                 while ( defined( $_ = $self->_readline ) ) {
                     last if (/^\s+$/);
                     if (m!^//!) {
                         $self->_pushback($_);
                         last;
                     }
-                    next if ( /^Model\s+Domain/o || /^\-\-\-/o );
+                    next if ( /^(?:Model|Sequence)\s+Domain/ || /^\-\-\-/ );
+
                     chomp;
                     if (
-                        my ( $n, $domainnum, $domainct, @vals ) = (
-                            m!^(\S+)\s+         # domain name
-                            (\d+)/(\d+)\s+      # domain num out of num
-                            (\d+)\s+(\d+).+?    # seq start, end
-                            (\d+)\s+(\d+)\s+    # hmm start, end
-                            \S+\s+              # []
-                            (\S+)\s+            # score       
-                            (\S+)               # evalue
-                            \s*$!ox
-                        )
-                      )
-                    {
-                        my $hindex = $hitinfo{$n};
+                        my ( $name, $domainct, $domaintotal,
+                             $seq_start, $seq_end, $seq_cov,
+                             $hmm_start, $hmm_end, $hmm_cov,
+                             $score, $evalue ) = (
+                                m!^(\S+)\s+          # domain name
+                                   (\d+)/(\d+)\s+    # domain num out of num
+                                   (\d+)\s+(\d+)\s+  # seq start, end
+                                   (\S+)\s+          # seq coverage
+                                   (\d+)\s+(\d+)\s+  # hmm start, end
+                                   (\S+)\s+          # hmm coverage
+                                   (\S+)\s+          # score
+                                   (\S+)             # evalue
+                                    \s*$!ox
+                            )
+                        ) {
+                        my $hindex = $hitinfo{$name};
                         if ( !defined $hindex ) {
                             push @hitinfo,
-                              [ $n, '', $vals[5], $vals[6], $domainct ];
-                            $hitinfo{$n} = $#hitinfo;
+                              [ $name, '', $score, $evalue, $domaintotal ];
+                            $hitinfo{$name} = $#hitinfo;
                             $hindex = $#hitinfo;
                         }
+
                         my $info = $hitinfo[$hindex];
                         if ( !defined $info ) {
-                            $self->warn(
-"incomplete Domain information, can't find $n hitinfo says $hitinfo{$n}"
-                            );
+                            if ($self->{'_reporttype'} eq 'HMMSEARCH') {
+                                $self->warn(
+                                    "Incomplete Sequence information, can't find $name hitinfo says $hitinfo{$name}"
+                                );
+                            }
+                            elsif ($self->{'_reporttype'} eq 'HMMPFAM') {
+                                $self->warn(
+                                    "Incomplete Domain information, can't find $name hitinfo says $hitinfo{$name}"
+                                );
+                            }
                             next;
                         }
-                        push @hspinfo, [ $n, @vals ];
+
+                        # Try to get HMM and Sequence lengths from the alignment information
+                        if ($self->{'_reporttype'} eq 'HMMSEARCH') {
+                            # For Hmmsearch, if seq coverage ends in ']' it means that the alignment
+                            # runs until the end. In that case add the END coordinate to @hitinfo
+                            # to use it as Hit Length
+                            if (    $seq_cov =~ m/\]$/
+                                and scalar @{ $hitinfo[$hindex] } == 5
+                                ) {
+                                push @{ $hitinfo[$hindex] }, $seq_end ;
+                            }
+                            # For Hmmsearch, if hmm coverage ends in ']', it means that the alignment
+                            # runs until the end. In that case use the END coordinate as Query Length
+                            if (    $hmm_cov =~ m/\]$/
+                                and not exists $self->{_values}->{'RESULT-query_length'}
+                                ) {
+                                $self->element(
+                                    {   'Name' => 'HMMER_query-len',
+                                        'Data' => $hmm_end
+                                    }
+                                );
+                            }
+                        }
+                        elsif ($self->{'_reporttype'} eq 'HMMPFAM') {
+                            # For Hmmpfam, if hmm coverage ends in ']' it means that the alignment
+                            # runs until the end. In that case add the END coordinate to @hitinfo
+                            # to use it as Hit Length
+                            if (    $hmm_cov =~ m/\]$/
+                                and scalar @{ $hitinfo[$hindex] } == 5
+                                ) {
+                                push @{ $hitinfo[$hindex] }, $hmm_end ;
+                            }
+                            # For Hmmpfam, if seq coverage ends in ']', it means that the alignment
+                            # runs until the end. In that case use the END coordinate as Query Length
+                            if (    $seq_cov =~ m/\]$/
+                                and not exists $self->{_values}->{'RESULT-query_length'}
+                                ) {
+                                $self->element(
+                                    {   'Name' => 'HMMER_query-len',
+                                        'Data' => $seq_end
+                                    }
+                                );
+                            }
+                        }
+
+                        my @vals = ($seq_start, $seq_end,
+                                    $hmm_start, $hmm_end,
+                                    $score,     $evalue);
+                        push @hspinfo, [ $name, @vals ];
                     }
                 }
             }
             elsif (/^Alignments of top/o) {
-                my ( $prelength, $lastdomain, $count, $width );
+                my ( $prelength, $count, $width );
                 $count = 0;
+                my %domaincounter;
                 my $second_tier = 0;
+                my $csline      = '';
+
                 while ( defined( $_ = $self->_readline ) ) {
-                    next
-                      if (
-                        /^Align/o
-                        || ( $count != 1
-                            && /^\s+RF\s+[x\s]+$/o )
-                      );
-                    # fix for bug 2632
-                    next if ($_ =~ m/^\s+CS\s+/o && $count == 0);
-                    if ( /^Histogram/o || m!^//!o || /^Query sequence/o ) {
+                    next if ( /^Align/o );
+
+                    if (   m/^Histogram/o
+                        || m!^//!o
+                        || m/^Query(?:\s+(?:sequence|HMM))?(?:\s+\d+)?:/o
+                        ) {
                         if ( $self->in_element('hsp') ) {
                             $self->end_element( { 'Name' => 'Hsp' } );
                         }
-                        if ( $self->in_element('hit') ) {
+                        if ( $self->within_element('hit') ) {
                             $self->end_element( { 'Name' => 'Hit' } );
                         }
                         $self->_pushback($_);
                         last;
                     }
-                    chomp;
-                    if (m/(\S+):.*from\s+(\d+)\s+to\s+(\d+)/o) {
-                        my ( $name, $from, $to ) = ( $1, $2, $3 );
 
+                    chomp;
+                    if (
+                        my ( $name, $domainct, $domaintotal,
+                             $from, $to ) = (
+                                m/^\s*(.+):
+                                   \s+ domain \s+ (\d+) \s+ of \s+ (\d+) ,
+                                   \s+ from   \s+ (\d+) \s+ to \s+ (\d+)/x
+                            )
+                        ) {
+                        $domaincounter{$name}++;
                         if ( $self->within_element('hit') ) {
-                            if ( $self->in_element('hsp') ) {
+                            if ( $self->within_element('hsp') ) {
                                 $self->end_element( { 'Name' => 'Hsp' } );
                             }
                             $self->end_element( { 'Name' => 'Hit' } );
                         }
+
                         my $info = [ @{ $hitinfo[ $hitinfo{$name} ] } ];
-                        if ( !defined $info
-                            || $info->[0] ne $name )
-                        {
+                        if (   !defined $info
+                            || $info->[0] ne $name
+                            ) {
                             $self->warn(
-"Somehow the Model table order does not match the order in the domains (got "
-                                  . $info->[0]
-                                  . ", expected $name). We're back loading this from the alignment information instead"
+                                  "Somehow the Model table order does not match the order in the domains (got "
+                                .  $info->[0]
+                                . ", expected $name). We're back loading this from the alignment information instead"
                             );
                             $info = [
                                 $name, '',
-                                /score\s+([^,\s]+),\s+E\s+=\s+(\S+)/ox
+                                /score \s+ ([^,\s]+), \s+E\s+=\s+ (\S+)/ox,
+                                $domaintotal
                             ];
                             push @hitinfo, $info;
                             $hitinfo{$name} = $#hitinfo;
                         }
-                        $self->start_element( { 'Name' => 'Hit' } );
 
+                        $self->start_element( { 'Name' => 'Hit' } );
                         $self->element(
                             {
                                 'Name' => 'Hit_id',
@@ -764,52 +461,79 @@ sub next_result {
                                 'Data' => shift @{$info}
                             }
                         );
+                        my $dom_total = shift @{$info};
+                        if (my $hit_end = shift @{$info}) {
+                            $self->element(
+                                {
+                                    'Name' => 'Hit_len',
+                                    'Data' => $hit_end
+                                }
+                            );
+                        }
 
                         $self->start_element( { 'Name' => 'Hsp' } );
-                        $self->element(
-                            {
-                                'Name' => 'Hsp_identity',
-                                'Data' => 0
-                            }
-                        );                     
-                        $self->element(
-                            {
-                                'Name' => 'Hsp_positive',
-                                'Data' => 0
-                            }
-                        );
                         my $HSPinfo = shift @hspinfo;
                         my $id      = shift @$HSPinfo;
 
                         if ( $id ne $name ) {
                             $self->throw(
-"Somehow the domain list details do not match the table (got $id, expected $name)"
+                                  "Somehow the domain list details do not match "
+                                . "the table (got $id, expected $name)"
+                            );
+                        }
+
+                        if ($self->{'_reporttype'} eq 'HMMSEARCH') {
+                            $self->element(
+                                {
+                                    'Name' => 'Hsp_hit-from',
+                                    'Data' => shift @$HSPinfo
+                                }
+                            );
+                            $self->element(
+                                {
+                                    'Name' => 'Hsp_hit-to',
+                                    'Data' => shift @$HSPinfo
+                                }
+                            );
+                            $self->element(
+                                {
+                                    'Name' => 'Hsp_query-from',
+                                    'Data' => shift @$HSPinfo
+                                }
+                            );
+                            $self->element(
+                                {
+                                    'Name' => 'Hsp_query-to',
+                                    'Data' => shift @$HSPinfo
+                                }
+                            );
+                        }
+                        elsif ($self->{'_reporttype'} eq 'HMMPFAM') {
+                            $self->element(
+                                {
+                                    'Name' => 'Hsp_query-from',
+                                    'Data' => shift @$HSPinfo
+                                }
+                            );
+                            $self->element(
+                                {
+                                    'Name' => 'Hsp_query-to',
+                                    'Data' => shift @$HSPinfo
+                                }
+                            );
+                            $self->element(
+                                {
+                                    'Name' => 'Hsp_hit-from',
+                                    'Data' => shift @$HSPinfo
+                                }
+                            );
+                            $self->element(
+                                {
+                                    'Name' => 'Hsp_hit-to',
+                                    'Data' => shift @$HSPinfo
+                                }
                             );
                         }
-                        $self->element(
-                            {
-                                'Name' => 'Hsp_query-from',
-                                'Data' => shift @$HSPinfo
-                            }
-                        );
-                        $self->element(
-                            {
-                                'Name' => 'Hsp_query-to',
-                                'Data' => shift @$HSPinfo
-                            }
-                        );
-                        $self->element(
-                            {
-                                'Name' => 'Hsp_hit-from',
-                                'Data' => shift @$HSPinfo
-                            }
-                        );
-                        $self->element(
-                            {
-                                'Name' => 'Hsp_hit-to',
-                                'Data' => shift @$HSPinfo
-                            }
-                        );
                         $self->element(
                             {
                                 'Name' => 'Hsp_score',
@@ -822,49 +546,80 @@ sub next_result {
                                 'Data' => shift @$HSPinfo
                             }
                         );
-                        $lastdomain = $name;
+
+                        if ( $domaincounter{$name} == $domaintotal ) {
+                            $hitinfo[ $hitinfo{$name} ] = undef;
+                        }
                     }
                     else {
-                        if (/^(\s+\*\-\>)(\S+)/o) {
 
+                        # Might want to change this so that it
+                        # accumulates all the of the alignment lines into
+                        # three array slots and then tests for the
+                        # end of the line
+                        if ($_ =~ m/^\s+(?:CS|RF)\s+/o && $count == 0) {
+                            # Buffer the CS line now and process it later at
+                            # midline point, where $prelength and width will be known
+                            $csline = $_;
+                            next;
+                        }
+                        elsif (/^(\s+ \*->) (\S+)/ox) {
                             # start of domain
                             $prelength = CORE::length($1);
                             $width     = 0;
 
-                            # deal with fact that start en stop is on same line
+                            # deal with fact that start and stop is on same line
                             my $data = $2;
-                            if ($data =~ s/\<\-?\*?\s*$//)
+                            if ($data =~ s/<-?\*?\s*$//)
                             {
-                              $width = CORE::length($data);
+                                $width = CORE::length($data);
                             }
  
-                            $self->element(
-                                {
-                                    'Name' => 'Hsp_hseq',
-                                    'Data' => $data
-                                }
-                            );
+                            if ($self->{'_reporttype'} eq 'HMMSEARCH') {
+                                $self->element(
+                                    {
+                                        'Name' => 'Hsp_qseq',
+                                        'Data' => $data
+                                    }
+                                );
+                            }
+                            elsif ($self->{'_reporttype'} eq 'HMMPFAM') {
+                                $self->element(
+                                    {
+                                        'Name' => 'Hsp_hseq',
+                                        'Data' => $data
+                                    }
+                                );
+                            }
                             $count       = 0;
                             $second_tier = 0;
-
                         }
-                        elsif (/^(\s+)(\S+)\<\-?\*?\s*$/o) {
-
-                            #end of domain
+                        elsif (/^(\s+) (\S+) <-?\*? \s*$/ox) {
+                            # end of domain
                             $prelength -= 3 unless ( $second_tier++ );
-                            $self->element(
-                                {
-                                    'Name' => 'Hsp_hseq',
-                                    'Data' => $2
-                                }
-                            );
+                            if ($self->{'_reporttype'} eq 'HMMSEARCH') {
+                                $self->element(
+                                    {
+                                        'Name' => 'Hsp_qseq',
+                                        'Data' => $2
+                                    }
+                                );
+                            }
+                            elsif ($self->{'_reporttype'} eq 'HMMPFAM') {
+                                $self->element(
+                                    {
+                                        'Name' => 'Hsp_hseq',
+                                        'Data' => $2
+                                    }
+                                );
+                            }
                             $width = CORE::length($2);
                             $count = 0;
                         }
-                        elsif (CORE::length($_) == 0
-                            || ( $count != 1 && /^\s+$/o )
-                            || /^\s+\-?\*\s*$/
-                            || /^\s+\S+\s+\-\s+\-\s*$/ )
+                        elsif ( ( $count != 1 && /^\s+$/o )
+                               || CORE::length($_) == 0
+                               || /^\s+\-?\*\s*$/
+                               || /^\s+\S+\s+\-\s+\-\s*$/ )
                         {
                             next;
                         }
@@ -875,12 +630,22 @@ sub next_result {
                                 # $self->warn("prelength not set");
                                 next;
                             }
-                            $self->element(
-                                {
-                                    'Name' => 'Hsp_hseq',
-                                    'Data' => substr( $_, $prelength )
-                                }
-                            );
+                            if ($self->{'_reporttype'} eq 'HMMSEARCH') {
+                                $self->element(
+                                    {
+                                        'Name' => 'Hsp_qseq',
+                                        'Data' => substr( $_, $prelength )
+                                    }
+                                );
+                            }
+                            elsif ($self->{'_reporttype'} eq 'HMMPFAM') {
+                                $self->element(
+                                    {
+                                        'Name' => 'Hsp_hseq',
+                                        'Data' => substr( $_, $prelength )
+                                    }
+                                );
+                            }
                         }
                         elsif ( $count == 1 ) {
                             if ( !defined $prelength ) {
@@ -890,10 +655,19 @@ sub next_result {
                                 $self->element(
                                     {
                                         'Name' => 'Hsp_midline',
-                                        'Data' =>
-                                          substr( $_, $prelength, $width )
+                                        'Data' => substr( $_, $prelength, $width )
                                     }
                                 );
+                                if ($csline ne '') {
+                                    $self->element(
+                                        {
+                                            'Name' => 'Hsp_csline',
+                                            'Data' => substr( $csline, $prelength, $width )
+
+                                        }
+                                    );
+                                    $csline = '';
+                                }
                             }
                             else {
                                 $self->element(
@@ -902,22 +676,38 @@ sub next_result {
                                         'Data' => substr( $_, $prelength )
                                     }
                                 );
+                                if ($csline ne '') {
+                                    $self->element(
+                                        {
+                                            'Name' => 'Hsp_csline',
+                                            'Data' => substr( $csline, $prelength )
+                                        }
+                                    );
+                                    $csline = '';
+                                }
                             }
                         }
                         elsif ( $count == 2 ) {
-                            if (   /^\s+(\S+)\s+(\d+)\s+(\S+)\s+(\d+)/o
-                                || /^\s+(\S+)\s+(\-)\s+(\S*)\s+(\-)/o )
-                            {
-                                $self->element(
-                                    {
-                                        'Name' => 'Hsp_qseq',
-                                        'Data' => $3
-                                    }
-                                );
+                            if (   /^\s+(\S+)\s+(\d+|\-)\s+(\S*)\s+(\d+|\-)/o) {
+                                if ($self->{'_reporttype'} eq 'HMMSEARCH') {
+                                    $self->element(
+                                        {
+                                            'Name' => 'Hsp_hseq',
+                                            'Data' => $3
+                                        }
+                                    );
+                                }
+                                elsif ($self->{'_reporttype'} eq 'HMMPFAM') {
+                                    $self->element(
+                                        {
+                                            'Name' => 'Hsp_qseq',
+                                            'Data' => $3
+                                        }
+                                    );
+                                }
                             }
                             else {
-                                $self->throw(
-                                    "unrecognized line ($count): $_\n");
+                                $self->warn("unrecognized line ($count): $_\n");
                             }
                         }
                         $count = 0 if $count++ >= 2;
@@ -925,11 +715,15 @@ sub next_result {
                 }
             }
             elsif ( /^Histogram/o || m!^//!o ) {
+                my %domaincounter;
 
                 while ( my $HSPinfo = shift @hspinfo ) {
                     my $id   = shift @$HSPinfo;
+                    $domaincounter{$id}++;
+
                     my $info = [ @{ $hitinfo[ $hitinfo{$id} ] } ];
                     next unless defined $info;
+
                     $self->start_element( { 'Name' => 'Hit' } );
                     $self->element(
                         {
@@ -945,38 +739,50 @@ sub next_result {
                     );
                     $self->element(
                         {
-                            'Name' => 'Hit_signif',
+                            'Name' => 'Hit_score',
                             'Data' => shift @{$info}
                         }
                     );
                     $self->element(
                         {
-                            'Name' => 'Hit_score',
+                            'Name' => 'Hit_signif',
                             'Data' => shift @{$info}
                         }
                     );
+                    my $domaintotal = shift @{$info};
+                    if (my $hit_end = shift @{$info}) {
+                        $self->element(
+                            {
+                                'Name' => 'Hit_len',
+                                'Data' => $hit_end
+                            }
+                        );
+                    }
+
+                    # Histogram is exclusive of Hmmsearch, not found in Hmmpfam,
+                    # so just use Hmmsearch start/end order (first hit, then query)
                     $self->start_element( { 'Name' => 'Hsp' } );
                     $self->element(
                         {
-                            'Name' => 'Hsp_query-from',
+                            'Name' => 'Hsp_hit-from',
                             'Data' => shift @$HSPinfo
                         }
-                    );                    
+                    );
                     $self->element(
                         {
-                            'Name' => 'Hsp_query-to',
+                            'Name' => 'Hsp_hit-to',
                             'Data' => shift @$HSPinfo
                         }
                     );
                     $self->element(
                         {
-                            'Name' => 'Hsp_hit-from',
+                            'Name' => 'Hsp_query-from',
                             'Data' => shift @$HSPinfo
                         }
                     );
                     $self->element(
                         {
-                            'Name' => 'Hsp_hit-to',
+                            'Name' => 'Hsp_query-to',
                             'Data' => shift @$HSPinfo
                         }
                     );
@@ -992,26 +798,12 @@ sub next_result {
                             'Data' => shift @$HSPinfo
                         }
                     );
-                    $self->element(
-                        {
-                            'Name' => 'Hsp_identity',
-                            'Data' => 0
-                        }
-                    );
-                    $self->element(
-                        {
-                            'Name' => 'Hsp_positive',
-                            'Data' => 0
-                        }
-                    );
-                    $self->element(
-                        {
-                            'Name' => 'Hsp_positive',
-                            'Data' => 0
-                        }
-                    );
                     $self->end_element( { 'Name' => 'Hsp' } );
                     $self->end_element( { 'Name' => 'Hit' } );
+
+                    if ( $domaincounter{$id} == $domaintotal ) {
+                        $hitinfo[ $hitinfo{$id} ] = undef;
+                    }
                 }
                 @hitinfo = ();
                 %hitinfo = ();
@@ -1086,7 +878,7 @@ sub end_element {
     # Hsp are sort of weird, in that they end when another
     # object begins so have to detect this in end_element for now
     if ( $nm eq 'Hsp' ) {
-        foreach (qw(Hsp_qseq Hsp_midline Hsp_hseq)) {
+        foreach (qw(Hsp_csline Hsp_qseq Hsp_midline Hsp_hseq)) {
             my $data = $self->{'_last_hspdata'}->{$_};
             if ($data && $_ eq 'Hsp_hseq') {
                 # replace hmm '.' gap symbol by '-'
@@ -1098,6 +890,43 @@ sub end_element {
                     'Data' => $data
                 }
             );
+            # Since HMMER doesn't print some data explicitly,
+            # calculate it from the homology line (midline)
+            if ($_ eq 'Hsp_midline') {
+                if ($data) {
+                    my $length    = length $data;
+                    my $identical = ($data =~ tr/a-zA-Z//);
+                    my $positive  = ($data =~ tr/+//) + $identical;
+                    $self->element(
+                        {
+                            'Name' => 'Hsp_align-len',
+                            'Data' => $length
+                        }
+                    );
+                    $self->element(
+                        {   'Name' => 'Hsp_identity',
+                            'Data' => $identical
+                        }
+                    );
+                    $self->element(
+                        {   'Name' => 'Hsp_positive',
+                            'Data' => $positive
+                        }
+                    );
+                }
+                else {
+                    $self->element(
+                        {   'Name' => 'Hsp_identity',
+                            'Data' => 0
+                        }
+                    );
+                    $self->element(
+                        {   'Name' => 'Hsp_positive',
+                            'Data' => 0
+                        }
+                    );
+                }
+            }
         }
         $self->{'_last_hspdata'} = {};
     }
@@ -1108,6 +937,12 @@ sub end_element {
                 $self->{'_values'} );
         }
         my $lastelem = shift @{ $self->{'_elements'} };
+
+        # Flush corresponding values from the {_values} buffer
+        my $name = uc $type;
+        foreach my $key (keys %{ $self->{_values} }) {
+            delete $self->{_values}->{$key} if ($key =~ m/^$name-/);
+        }
     }
     elsif ( $MAPPING{$nm} ) {
         if ( ref( $MAPPING{$nm} ) =~ /hash/i ) {
@@ -1161,7 +996,7 @@ sub characters {
     my ( $self, $data ) = @_;
 
     if (   $self->in_element('hsp')
-        && $data->{'Name'} =~ /Hsp\_(qseq|hseq|midline)/o
+        && $data->{'Name'} =~ /Hsp\_(?:qseq|hseq|csline|midline)/o
         && defined $data->{'Data'} )
     {
         $self->{'_last_hspdata'}->{ $data->{'Name'} } .= $data->{'Data'};
@@ -67,7 +67,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Thomas Sharpton
 
@@ -124,8 +124,10 @@ BEGIN {
         'Hsp_hitgaps'      => 'HSP-hit_gaps',
         'Hsp_querygaps'    => 'HSP-query_gaps',
         'Hsp_qseq'         => 'HSP-query_seq',
+        'Hsp_csline'       => 'HSP-cs_seq',
         'Hsp_hseq'         => 'HSP-hit_seq',
         'Hsp_midline'      => 'HSP-homology_seq',
+        'Hsp_pline'        => 'HSP-pp_seq',
         'Hsp_align-len'    => 'HSP-hsp_length',
         'Hsp_query-frame'  => 'HSP-query_frame',
         'Hsp_hit-frame'    => 'HSP-hit_frame',
@@ -161,8 +163,6 @@ BEGIN {
 
 sub next_result {
     my ($self) = @_;
-    my $seentop = 0;    # Placeholder for when we deal with multi-query reports
-    my $reporttype;
     my ( $last, @hit_list, @hsp_list, %hspinfo, %hitinfo, %domaincounter );
     local $/ = "\n";
     local $_;
@@ -182,6 +182,8 @@ sub next_result {
         $self->_pushback($_);
     }
 
+    my $hit_counter = 0; # helper variable for non-unique hit IDs
+
     # Regex goes here for HMMER3
     # Start with hmmsearch processing
     while ( defined( $_ = $self->_readline ) ) {
@@ -216,7 +218,7 @@ sub next_result {
         }
 
         # Get the query info
-        elsif ( $_ =~ /^\#\squery \w+ file\:\s+(\S+)/ ) {
+        elsif ( $_ =~ /^\#\squery (?:\w+ )?file\:\s+(\S+)/ ) {
             if (   $self->{'_reporttype'} eq 'HMMSEARCH'
                 || $self->{'_reporttype'} eq 'NHMMER' )
             {
@@ -267,8 +269,63 @@ sub next_result {
 
         # Get query data
         elsif ( $_ =~ s/^Query:\s+// ) {
+            # For  multi-query reports
+            if (    (   not exists $self->{_values}->{"RESULT-algorithm_name"}
+                     or not exists $self->{_values}->{"RESULT-algorithm_version"}
+                     )
+                and exists $self->{_hmmidline}
+                ) {
+                my ($version, $versiondate) = $self->{_hmmidline} =~ m/^\#\sHMMER\s+(\S+)\s+\((.+)\)/;
+                $self->element(
+                    {   'Name' => 'HMMER_program',
+                        'Data' => $self->{_reporttype}
+                    }
+                );
+                $self->element(
+                    {   'Name' => 'HMMER_version',
+                        'Data' => $version
+                    }
+                );
+            }
+            if (    (   not exists $self->{_values}->{"RESULT-hmm_name"}
+                     or not exists $self->{_values}->{"RESULT-sequence_file"}
+                     )
+                and (   exists $self->{_hmmfileline}
+                     or exists $self->{_hmmseqline}
+                     )
+                ) {
+                if (   $self->{'_reporttype'} eq 'HMMSEARCH'
+                    or $self->{'_reporttype'} eq 'NHMMER'
+                    ) {
+                    my ($qry_file)    = $self->{_hmmfileline} =~ m/^\#\squery (?:\w+ )?file\:\s+(\S+)/;
+                    my ($target_file) = $self->{_hmmseqline}  =~ m/^\#\starget\s\S+\sdatabase\:\s+(\S+)/;
+                    $self->element(
+                        {   'Name' => 'HMMER_hmm',
+                            'Data' => $qry_file
+                        }
+                    );
+                    $self->element(
+                        {   'Name' => 'HMMER_seqfile',
+                            'Data' => $target_file
+                        }
+                    );
+                }
+                elsif ( $self->{'_reporttype'} eq 'HMMSCAN' ) {
+                    my ($qry_file)    = $self->{_hmmseqline}  =~ m/^\#\squery \w+ file\:\s+(\S+)/;
+                    my ($target_file) = $self->{_hmmfileline} =~ m/^\#\starget\s\S+\sdatabase\:\s+(\S+)/;
+                    $self->element(
+                        {   'Name' => 'HMMER_seqfile',
+                            'Data' => $qry_file
+                        }
+                    );
+                    $self->element(
+                        {   'Name' => 'HMMER_hmm',
+                            'Data' => $target_file
+                        }
+                    );
+                }
+            }
 
-            # TO DO: code to deal with multi-query report
             unless (s/\s+\[[L|M]\=(\d+)\]$//) {
                 warn "Error parsing length for query, offending line $_\n";
                 exit(0);
@@ -326,9 +383,16 @@ sub next_result {
                         $self->_pushback($_);
                         last;
                     }
+                    elsif (   $_ =~ m/^\s+E-value\s+score/
+                           || $_ =~ m/\-\-\-/
+                           || $_ =~ m/^$/
+                        )
+                    {
+                        next;
+                    }
 
                     # Grab table data
-                    next if ( m/\-\-\-/ || m/^\s+E-value\s+score/ || m/^$/ );
+                    $hit_counter++;
                     my ($eval_full,  $score_full, $bias_full, $eval_best,
                         $score_best, $bias_best,  $exp,       $n,
                         $hitid,      $desc,       @hitline
@@ -345,19 +409,17 @@ sub next_result {
                     $hitid      = shift @hitline;
                     $desc       = join " ", @hitline;
 
-                    if ( !defined($desc) ) {
-                        $desc = "";
-                    }
+                    $desc = '' if ( !defined($desc) );
+
                     push @hit_list,
                         [ $hitid, $desc, $eval_full, $score_full ];
-                    $hitinfo{$hitid} = $#hit_list;
+                    $hitinfo{"$hitid.$hit_counter"} = $#hit_list;
                 }
             }
 
             # nhmmer
-            if ( /Scores for complete hits/ ) {
+            elsif ( /Scores for complete hits/ ) {
                 while ( defined( $_ = $self->_readline ) ) {
-
                     if (   /inclusion threshold/
                         || /Annotation for each hit/
                         || /\[No hits detected/
@@ -366,9 +428,16 @@ sub next_result {
                         $self->_pushback($_);
                         last;
                     }
+                    elsif (   $_ =~ m/^\s+E-value\s+score/
+                           || $_ =~ m/\-\-\-/
+                           || $_ =~ m/^$/
+                        )
+                    {
+                        next;
+                    }
 
                     # Grab table data
-                    next if ( /\-\-\-/ || /^\s+E-value\s+score/ || /^$/ );
+                    $hit_counter++;
                     my ($eval,  $score, $bias, $hitid,
                         $start, $end,   $desc, @hitline
                     );
@@ -384,13 +453,11 @@ sub next_result {
                     $desc = '' if ( !defined($desc) );
 
                     push @hit_list, [ $hitid, $desc, $eval, $score ];
-                    $hitinfo{$hitid} = $#hit_list;
+                    $hitinfo{"$hitid.$hit_counter"} = $#hit_list;
                 }
             }
 
             # Complete sequence table data below inclusion threshold
-            # not currently fully implemented -
-            # Should all these lines simply be skipped?
             elsif ( /inclusion threshold/ ) {
                 while ( defined( $_ = $self->_readline ) ) {
                     if (   /Domain( and alignment)? annotation for each/
@@ -401,7 +468,15 @@ sub next_result {
                         $self->_pushback($_);
                         last;
                     }
-                    next if ( $_ =~ m/^$/ );
+                    elsif (   $_ =~ m/inclusion threshold/
+                           || $_ =~ m/^$/
+                        )
+                    {
+                        next;
+                    }
+
+                    # Grab table data
+                    $hit_counter++;
                     my ($eval_full,  $score_full, $bias_full, $eval_best,
                         $score_best, $bias_best,  $exp,       $n,
                         $hitid,      $desc,       @hitline
@@ -418,99 +493,163 @@ sub next_result {
                     $hitid      = shift @hitline;
                     $desc       = join " ", @hitline;
 
-                    $hitinfo{$hitid} = "below_inclusion" if defined $hitid;
+                    $desc = '' if ( !defined($desc) );
+
+                    push @hit_list,
+                        [ $hitid, $desc, $eval_full, $score_full ];
+                    $hitinfo{"$hitid.$hit_counter"} = $#hit_list;
                 }
             }
 
-            # Domain annotation for each sequence table data, hmmscan
-            elsif ( /Domain( and alignment)? annotation for each/ ) {
+            # Domain annotation for each sequence table data,
+            # for hmmscan, hmmsearch & nhmmer
+            elsif (   /Domain( and alignment)? annotation for each/
+                   or /Annotation for each hit\s+\(and alignments\)/
+                   ) {
                 @hsp_list = ();    # Here for multi-query reports
                 my $name;
+                my $annot_counter = 0;
 
                 while ( defined( $_ = $self->_readline ) ) {
-                    if (   /Internal pipeline statistics/
-                        || /\[No targets detected/ )
+                    if (   /\[No targets detected/
+                        || /Internal pipeline statistics/ )
                     {
                         $self->_pushback($_);
                         last;
                     }
-                    if ( $_ =~ m/^\>\>\s(.*?)\s+/ ) {
-                        $name = $1;
 
-                        # Skip hits below inclusion threshold
-                        next if ( $hitinfo{$name} eq "below_inclusion" );
-                        $domaincounter{$name} = 0;
+                    if ( $_ =~ m/^\>\>\s(\S*)\s+(.*)/ ) {
+                        $name    = $1;
+                        my $desc = $2;
+                        $annot_counter++;
+                        $domaincounter{"$name.$annot_counter"} = 0;
+
+                        # The Hit Description from the Scores table can be truncated if
+                        # its too long, so use the '>>' line description when its longer
+                        if (length $hit_list[
+                                             $hitinfo{"$name.$annot_counter"}
+                                             ]
+                                             [1] < length $desc
+                            ) {
+                            $hit_list[ $hitinfo{"$name.$annot_counter"} ][1] = $desc;
+                        }
 
                         while ( defined( $_ = $self->_readline ) ) {
-
-                            # Grab table data for sequence
                             if (   $_ =~ m/Internal pipeline statistics/
+                                || $_ =~ m/Alignments for each domain/
+                                || $_ =~ m/^\s+Alignment:/
                                 || $_ =~ m/^\>\>/ )
                             {
                                 $self->_pushback($_);
                                 last;
                             }
-                            if ( $_ =~ m/Alignments for each domain/ ) {
-                                $self->_pushback($_);
-                                last;
-                            }
-                            if (   $_ =~ m/^\s+\#\s+score/
-                                || $_ =~ m/^\s\-\-\-\s+/
-                                ||
-
-                                # $_ =~ m/^\>\>/  ||
-                                $_ =~ m/^$/
+                            elsif (   $_ =~ m/^\s+score\s+bias/
+                                   || $_ =~ m/^\s+\#\s+score/
+                                   || $_ =~ m/^\s+------\s+/
+                                   || $_ =~ m/^\s\-\-\-\s+/
+                                   || $_ =~ m/^$/
                                 )
                             {
                                 next;
                             }
 
                             # Grab hsp data from table, push into @hsp;
-                            if (my ($domain_num, $score,     $bias,
-                                    $ceval,      $ieval,     $hmmstart,
-                                    $hmmstop,    $qalistart, $qalistop,
-                                    $envstart,   $envstop,   $envbound,
-                                    $acc
-                                )
-                                = m|^\s+(\d+)\s\!*\?*\s+  # domain number
-                                   (\S+)\s+(\S+)\s+       # score, bias
-                                   (\S+)\s+(\S+)\s+       # c-eval, i-eval
-                                   (\d+)\s+(\d+).+?       # hmm start, stop
-                                   (\d+)\s+(\d+).+?       # query start, stop
-                                   (\d+)\s+(\d+).+?       # env start, stop
-                                   (\S+)                  # Accession
-                                   \s*$|ox
-                                )
-                            {
-                               # Keep it simple for now. let's customize later
-                                my @vals = (
-                                    $hmmstart,  $hmmstop,
-                                    $qalistart, $qalistop,
-                                    $score,     $ceval,
-                                    '',         '',
-                                    ''
-                                );
-                                my $info = $hit_list[ $hitinfo{$name} ];
+                            if ($self->{'_reporttype'} =~ m/(?:HMMSCAN|HMMSEARCH|NHMMER)/) {
+                                my ( $domain_num, $score,    $bias,
+                                     $ceval,      $ieval,
+                                     $hmm_start,  $hmm_stop, $hmm_cov,
+                                     $seq_start,  $seq_stop, $seq_cov,
+                                     $env_start,  $env_stop, $env_cov,
+                                     $hitlength,  $acc );
+                                my @vals;
+
+                                if ( # HMMSCAN & HMMSEARCH
+                                    ( $domain_num, $score,    $bias,
+                                      $ceval,      $ieval,
+                                      $hmm_start,  $hmm_stop, $hmm_cov,
+                                      $seq_start,  $seq_stop, $seq_cov,
+                                      $env_start,  $env_stop, $env_cov,
+                                      $acc ) = (
+                                            m|^\s+(\d+)\s\!*\?*\s+     # domain number
+                                              (\S+)\s+(\S+)\s+         # score, bias
+                                              (\S+)\s+(\S+)\s+         # c-eval, i-eval
+                                              (\d+)\s+(\d+)\s+(\S+)\s+ # hmm start, stop, coverage
+                                              (\d+)\s+(\d+)\s+(\S+)\s+ # seq start, stop, coverage
+                                              (\d+)\s+(\d+)\s+(\S+)\s+ # env start, stop, coverage
+                                              (\S+)                    # posterior probability accuracy
+                                               \s*$|ox
+                                        )
+                                    ) {
+                                    # Values assigned when IF succeeded
+
+                                    # Try to get the Hit length from the alignment information
+                                    $hitlength = 0;
+                                    if ($self->{'_reporttype'} eq 'HMMSEARCH') {
+                                        # For Hmmsearch, if seq coverage ends in ']' it means that the alignment
+                                        # runs until the end. In that case add the END coordinate to @hitinfo
+                                        # to use it as Hit Length
+                                        if ( $seq_cov =~ m/\]$/ ) {
+                                            $hitlength = $seq_stop;
+                                        }
+                                    }
+                                    elsif ($self->{'_reporttype'} eq 'HMMSCAN') {
+                                        # For Hmmscan, if hmm coverage ends in ']' it means that the alignment
+                                        # runs until the end. In that case add the END coordinate to @hitinfo
+                                        # to use it as Hit Length
+                                        if ( $hmm_cov =~ m/\]$/ ) {
+                                            $hitlength = $hmm_stop;
+                                        }
+                                    }
+                                }
+                                elsif ( # NHMMER
+                                       ( $score,     $bias,     $ceval,
+                                         $hmm_start, $hmm_stop, $hmm_cov,
+                                         $seq_start, $seq_stop, $seq_cov,
+                                         $env_start, $env_stop, $env_cov,
+                                         $hitlength, $acc ) = (
+                                            m|^\s+[!?]\s+
+                                              (\S+)\s+(\S+)\s+(\S+)\s+ # score, bias, evalue
+                                              (\d+)\s+(\d+)\s+(\S+)\s+ # hmm start, stop, coverage
+                                              (\d+)\s+(\d+)\s+(\S+)\s+ # seq start, stop, coverage
+                                              (\d+)\s+(\d+)\s+(\S+)\s+ # env start, stop, coverage
+                                              (\d+)\s+(\S+)            # target length, pp accuracy
+                                               .*$|ox
+                                        )
+                                    ) {
+                                    # Values assigned when IF succeeded
+                                }
+                                else {
+                                    print "Missed this line: $_\n";
+                                    next;
+                                }
+
+                                my $info = $hit_list[ $hitinfo{"$name.$annot_counter"} ];
                                 if ( !defined $info ) {
                                     $self->warn(
-                                        "Incomplete sequence information; can't find $name, hitinfo says $hitinfo{$name}\n"
+                                        "Incomplete information: can't find HSP $name in list of hits\n"
                                     );
                                     next;
                                 }
-                                $domaincounter{$name}++;
+
+                                $domaincounter{"$name.$annot_counter"}++;
                                 my $hsp_key
-                                    = $name . "_" . $domaincounter{$name};
+                                    = $name . "_" . $domaincounter{"$name.$annot_counter"};
+
+                                # Keep it simple for now. let's customize later
+                                @vals = (
+                                    $hmm_start, $hmm_stop,
+                                    $seq_start, $seq_stop,
+                                    $score,     $ceval,
+                                    $hitlength, '',
+                                    '',         '',
+                                    '',         ''
+                                );
                                 push @hsp_list, [ $name, @vals ];
-                                $hspinfo{$hsp_key} = $#hsp_list;
-                            }
-                            else {
-                                print "missed this line: $_\n";
+                                $hspinfo{"$hsp_key.$annot_counter"} = $#hsp_list;
                             }
                         }
                     }
-                    elsif ( /Alignments for each domain/ ) {
-                        my $domain_count = 0;
-
+                    elsif ( /Alignment(?:s for each domain)?:/ ) {
                         #line counter
                         my $count = 0;
 
@@ -519,7 +658,14 @@ sub next_result {
                         my $max_count = 3;
                         my $lastdomain;
                         my $hsp;
-                        my ( $hline, $midline, $qline );
+                        my ( $csline, $hline, $midline, $qline, $pline );
+
+                        # To avoid deleting whitespaces from the homology line,
+                        # keep track of the position and length of the alignment
+                        # in each individual hline/qline, to take them as reference
+                        # and use them in the homology line
+                        my $align_offset = 0;
+                        my $align_length = 0;
 
                         while ( defined( $_ = $self->_readline ) ) {
                             if (   $_ =~ m/^\>\>/
@@ -528,158 +674,88 @@ sub next_result {
                                 $self->_pushback($_);
                                 last;
                             }
-                            elsif ($hitinfo{$name} eq "below_inclusion"
-                                || $_ =~ m/^$/ )
+                            elsif ($_ =~ m/^$/ )
                             {
                                 next;
                             }
-                            elsif ( $_ =~ /\s\s\=\=\sdomain\s(\d+)\s+/ ) {
-                                my $domainnum = $1;
+
+                            if (   $_ =~ /\s\s\=\=\sdomain\s(\d+)\s+/
+                                or $_ =~ /\s\sscore:\s\S+\s+/
+                                ) {
+                                my $domainnum = $1 || 1;
                                 $count = 0;
                                 my $key = $name . "_" . $domainnum;
-                                $hsp        = $hsp_list[ $hspinfo{$key} ];
-                                $hline      = $$hsp[-3];
-                                $midline    = $$hsp[-2];
-                                $qline      = $$hsp[-1];
+                                $hsp        = $hsp_list[ $hspinfo{"$key.$annot_counter"} ];
+                                $csline     = $$hsp[-5];
+                                $hline      = $$hsp[-4];
+                                $midline    = $$hsp[-3];
+                                $qline      = $$hsp[-2];
+                                $pline      = $$hsp[-1];
                                 $lastdomain = $name;
                             }
-
                             # model data track, some reports don't have
-                            elsif ( $_ =~ m/\s+\S+\sCS$/ ) {
-                                my $modeltrack = $_;
+                            elsif ( $_ =~ m/\s+\S+\s(?:CS|RF)$/ ) {
+                                my @data = split( " ", $_ );
+                                $csline .= $data[-2];
                                 $max_count++;
                                 $count++;
                                 next;
                             }
-                            elsif ( $count == $max_count - 3 ) {
-
-                                # hit sequence
+                            # Query line and Hit line swaps positions
+                            # depending of the program
+                            elsif (    $count == $max_count - 3
+                                   or  $count == $max_count - 1
+                                   ) {
                                 my @data = split( " ", $_ );
-                                my $seq = $data[-2];
-                                $hline .= $seq;
-                                $count++;
-                                next;
-                            }
-                            elsif ( $count == $max_count - 2 ) {
 
-                                # conservation track
-                                # storage isn't quite right - need to remove
-                                # leading/lagging whitespace while preserving
-                                # gap data (latter isn't done, former is)
-                                $_ =~ s/^\s+//;
-                                $_ =~ s/\s+$//;
-                                $midline .= $_;
+                                my $line_offset = 0;
+                                while ($_ =~ m/$data[-2]/g) {
+                                    $line_offset = pos;
+                                }
+                                if ($line_offset != 0) {
+                                    $align_length = length $data[-2];
+                                    $align_offset = $line_offset - $align_length;
+                                }
+
+                                if ($self->{'_reporttype'} eq 'HMMSCAN') {
+                                    # hit sequence
+                                    $hline .= $data[-2] if ($count == $max_count - 3);
+                                    # query sequence
+                                    $qline .= $data[-2] if ($count == $max_count - 1);
+                                }
+                                else { # hmmsearch & nhmmer
+                                    # hit sequence
+                                    $hline .= $data[-2] if ($count == $max_count - 1);
+                                    # query sequence
+                                    $qline .= $data[-2] if ($count == $max_count - 3);
+                                }
+
                                 $count++;
                                 next;
                             }
-                            elsif ( $count == $max_count - 1 ) {
-
-                                # query track
-                                my @data = split( " ", $_ );
-                                my $seq = $data[-2];
-                                $qline .= $seq;
+                            # conservation track
+                            # storage isn't quite right - need to remove
+                            # leading/lagging whitespace while preserving
+                            # gap data (latter isn't done, former is)
+                            elsif ( $count == $max_count - 2 ) {
+                                $midline .= substr $_, $align_offset, $align_length;
                                 $count++;
                                 next;
                             }
+                            # posterior probability track
                             elsif ( $count == $max_count ) {
-
-                                #pval track
-                                my $pvals = $_;
+                                my @data   = split(" ", $_);
+                                $pline    .= $data[-2];
                                 $count     = 0;
                                 $max_count = 3;
-                                $$hsp[-3]  = $hline;
-                                $$hsp[-2]  = $midline;
-                                $$hsp[-1]  = $qline;
+                                $$hsp[-5]  = $csline;
+                                $$hsp[-4]  = $hline;
+                                $$hsp[-3]  = $midline;
+                                $$hsp[-2]  = $qline;
+                                $$hsp[-1]  = $pline;
                                 next;
                             }
                             else {
-                                print "missed $_\n";
-                            }
-                        }
-                    }
-                }
-            }
-
-            # Annotation for each hit, nhmmer
-            # This code is currently incomplete, the alignment strings
-            # are not being captured
-            elsif ( /Annotation for each hit\s+\(and alignments\)/ ) {
-                @hsp_list = ();
-                my $name;
-
-                while ( defined( $_ = $self->_readline ) ) {
-                    if ( $_ =~ m/Internal pipeline statistics/
-                        || m/\[No targets detected/ )
-                    {
-                        $self->_pushback($_);
-                        last;
-                    }
-                    if ( /^>>\s+(\S+)\s+/ ) {
-                        $name = $1;
-
-                        while ( defined( $_ = $self->_readline ) ) {
-
-                            if (   $_ =~ m/Internal pipeline statistics/
-                                || $_ =~ m/^>>/ )
-                            {
-                                $self->_pushback($_);
-                                last;
-                            }
-                            elsif (
-                                   $_ =~ /^\s+#\s+score/
-                                || $_ =~ /^\s+------\s+/
-                                || $_ =~ /^>>/
-                                || $_ =~ /^$/
-                                || $_ =~ /^\s+Alignment:/
-                                || $_ =~ /^\s+score:/
-                                || $_ =~ /^\s+score\s+bias/
-                                || $_ =~ /^\s+\S+\s+\d+\s+([\s+.$ambiguous_nt-]+)/i     # Alignment, line 1
-                                || $_ =~ /^\s{20,}([\s+gatc-]+)/i                       # Alignment, line 2
-                                || $_ =~ /^\s+$name\s+[\d-]+\s+([\s+$ambiguous_nt-]+)/i # Alignment, line 3
-                                || $_ =~ /^\s+[\d.\*]+/                                 # Alignment, line 4
-                                )
-                            {
-                                next;
-                            }
-                            elsif (
-                                /^\s+[!?]\s+(\S+)\s+
-                                    (\S+)\s+(\S+)\s+
-                                    (\d+)\s+(\d+)\s+[.\[\]]*\s+
-                                    (\d+)\s+(\d+)\s+[.\[\]]*\s+
-                                    (\d+)\s+(\d+)\s+[.\[\]]*\s+
-                                    (\d+)\s+(\S+).*$/ox
-                                )
-                            {
-                                my ($score,    $bias,     $eval,
-                                    $hmmstart, $hmmstop,  $hitstart,
-                                    $hitstop,  $envstart, $envstop,
-                                    $length,   $acc
-                                    )
-                                    = (
-                                    $1, $2, $3, $4,  $5, $6,
-                                    $7, $8, $9, $10, $11
-                                    );
-
-                                my @vals = (
-                                    $hitstart, $hitstop,
-                                    $hmmstart, $hmmstop,
-                                    $score,    $eval,
-                                    '',        '',
-                                    ''
-                                );
-                                my $info = $hit_list[ $hitinfo{$name} ];
-                                if ( !defined $info ) {
-                                    $self->warn(
-                                        "Incomplete information: can't find HSP $name in list of hits\n"
-                                    );
-                                    next;
-                                }
-                                $domaincounter{$name}++;
-                                my $hsp_key = $name . "_" . $domaincounter{$name};
-                                push @hsp_list, [ $name, @vals ];
-                                $hspinfo{$hsp_key} = $#hsp_list;
-                            }
-                            else {
                                 print "Missed this line: $_\n";
                             }
                         }
@@ -687,8 +763,8 @@ sub next_result {
                 }
             }
 
+            # End of report
             elsif ( m/Internal pipeline statistics/ || m!^//! ) {
-
                 # If within hit, hsp close;
                 if ( $self->within_element('hit') ) {
                     if ( $self->within_element('hsp') ) {
@@ -703,12 +779,14 @@ sub next_result {
                 }
 
                 # Do a lot of processing of hits and hsps here
+                my $index = 0;
                 while ( my $hit = shift @hit_list ) {
+                    $index++;
                     my $hit_name    = shift @$hit;
                     my $hit_desc    = shift @$hit;
                     my $hit_signif  = shift @$hit;
                     my $hit_score   = shift @$hit;
-                    my $num_domains = $domaincounter{$hit_name} || 0;
+                    my $num_domains = $domaincounter{"$hit_name.$index"} || 0;
 
                     $self->start_element( { 'Name' => 'Hit' } );
                     $self->element(
@@ -734,62 +812,131 @@ sub next_result {
 
                     for my $i ( 1 .. $num_domains ) {
                         my $key = $hit_name . "_" . $i;
-                        my $hsp = $hsp_list[ $hspinfo{$key} ];
+                        my $hsp = $hsp_list[ $hspinfo{"$key.$index"} ];
                         if ( defined $hsp ) {
                             my $hsp_name = shift @$hsp;
                             $self->start_element( { 'Name' => 'Hsp' } );
+                            # Since HMMER doesn't print some data explicitly,
+                            # calculate it from the homology line (midline)
+                            if ($$hsp[-3] ne '') {
+                                my $length    = length $$hsp[-3];
+                                my $identical = ($$hsp[-3] =~ tr/a-zA-Z//);
+                                my $positive  = ($$hsp[-3] =~ tr/+//) + $identical;
+                                $self->element(
+                                    {
+                                        'Name' => 'Hsp_align-len',
+                                        'Data' => $length
+                                    }
+                                );
+                                $self->element(
+                                    {   'Name' => 'Hsp_identity',
+                                        'Data' => $identical
+                                    }
+                                );
+                                $self->element(
+                                    {   'Name' => 'Hsp_positive',
+                                        'Data' => $positive
+                                    }
+                                );
+                            }
+                            else {
+                                $self->element(
+                                    {   'Name' => 'Hsp_identity',
+                                        'Data' => 0
+                                    }
+                                );
+                                $self->element(
+                                    {   'Name' => 'Hsp_positive',
+                                        'Data' => 0
+                                    }
+                                );
+                            }
+                            if ( $self->{'_reporttype'} eq 'HMMSCAN' ) {
+                                $self->element(
+                                    {   'Name' => 'Hsp_hit-from',
+                                        'Data' => shift @$hsp
+                                    }
+                                );
+                                $self->element(
+                                    {   'Name' => 'Hsp_hit-to',
+                                        'Data' => shift @$hsp
+                                    }
+                                );
+                                $self->element(
+                                    {   'Name' => 'Hsp_query-from',
+                                        'Data' => shift @$hsp
+                                    }
+                                );
+                                $self->element(
+                                    {   'Name' => 'Hsp_query-to',
+                                        'Data' => shift @$hsp
+                                    }
+                                );
+                            }
+                            elsif (   $self->{'_reporttype'} eq 'HMMSEARCH'
+                                   or $self->{'_reporttype'} eq 'NHMMER'
+                                   ) {
+                                $self->element(
+                                    {   'Name' => 'Hsp_query-from',
+                                        'Data' => shift @$hsp
+                                    }
+                                );
+                                $self->element(
+                                    {   'Name' => 'Hsp_query-to',
+                                        'Data' => shift @$hsp
+                                    }
+                                );
+                                $self->element(
+                                    {   'Name' => 'Hsp_hit-from',
+                                        'Data' => shift @$hsp
+                                    }
+                                );
+                                $self->element(
+                                    {   'Name' => 'Hsp_hit-to',
+                                        'Data' => shift @$hsp
+                                    }
+                                );
+                            }
                             $self->element(
-                                {   'Name' => 'Hsp_identity',
-                                    'Data' => 0
-                                }
-                            );
-                            $self->element(
-                                {   'Name' => 'Hsp_positive',
-                                    'Data' => 0
-                                }
-                            );
-                            $self->element(
-                                {   'Name' => 'Hsp_hit-from',
-                                    'Data' => shift @$hsp
-                                }
-                            );
-                            $self->element(
-                                {   'Name' => 'Hsp_hit-to',
-                                    'Data' => shift @$hsp
-                                }
-                            );
-                            $self->element(
-                                {   'Name' => 'Hsp_query-from',
+                                {   'Name' => 'Hsp_score',
                                     'Data' => shift @$hsp
                                 }
                             );
                             $self->element(
-                                {   'Name' => 'Hsp_query-to',
+                                {   'Name' => 'Hsp_evalue',
                                     'Data' => shift @$hsp
                                 }
                             );
+                            my $hitlength = shift @$hsp;
+                            if ( $hitlength != 0 ) {
+                                $self->element(
+                                    {   'Name' => 'Hit_len',
+                                        'Data' => $hitlength
+                                    }
+                                );
+                            }
                             $self->element(
-                                {   'Name' => 'Hsp_score',
+                                {   'Name' => 'Hsp_csline',
                                     'Data' => shift @$hsp
                                 }
                             );
                             $self->element(
-                                {   'Name' => 'Hsp_evalue',
+                                {   'Name' => 'Hsp_hseq',
                                     'Data' => shift @$hsp
                                 }
                             );
                             $self->element(
-                                {   'Name' => 'Hsp_hseq',
+                                {   'Name' => 'Hsp_midline',
                                     'Data' => shift @$hsp
                                 }
                             );
                             $self->element(
-                                {   'Name' => 'Hsp_midline',
+                                {   'Name' => 'Hsp_qseq',
                                     'Data' => shift @$hsp
                                 }
                             );
                             $self->element(
-                                {   'Name' => 'Hsp_qseq',
+                                {   'Name' => 'Hsp_pline',
                                     'Data' => shift @$hsp
                                 }
                             );
@@ -895,7 +1042,7 @@ sub end_element {
     # Hsp are sort of weird, in that they end when another
     # object begins so have to detect this in end_element for now
     if ( $nm eq 'Hsp' ) {
-        foreach (qw(Hsp_qseq Hsp_midline Hsp_hseq)) {
+        foreach (qw(Hsp_csline Hsp_qseq Hsp_midline Hsp_hseq Hsp_pline)) {
             my $data = $self->{'_last_hspdata'}->{$_};
             if ( $data && $_ eq 'Hsp_hseq' ) {
 
@@ -917,6 +1064,12 @@ sub end_element {
                 $self->{'_values'} );
         }
         my $lastelem = shift @{ $self->{'_elements'} };
+
+        # Flush corresponding values from the {_values} buffer
+        my $name = uc $type;
+        foreach my $key (keys %{ $self->{_values} }) {
+            delete $self->{_values}->{$key} if ($key =~ m/^$name-/);
+        }
     }
     elsif ( $MAPPING{$nm} ) {
         if ( ref( $MAPPING{$nm} ) =~ /hash/i ) {
@@ -986,7 +1139,7 @@ sub characters {
     my ( $self, $data ) = @_;
 
     if (   $self->in_element('hsp')
-        && $data->{'Name'} =~ /Hsp\_(qseq|hseq|midline)/o
+        && $data->{'Name'} =~ /Hsp\_(?:qseq|hseq|csline|pline|midline)/o
         && defined $data->{'Data'} )
     {
         $self->{'_last_hspdata'}->{ $data->{'Name'} } .= $data->{'Data'};
@@ -65,7 +65,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Sendu Bala
 
@@ -67,7 +67,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Chris Fields
 
@@ -85,7 +85,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -273,7 +273,7 @@ sub next_result{
        $self->end_element({ 'Name' => 'MegaBlastOutput'});
        return $self->end_document();
    }
-   return 0;
+   return;
 }
 
 =head2 report_format
@@ -61,7 +61,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -54,7 +54,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Chris Fields
 
@@ -65,7 +65,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -63,7 +63,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -57,7 +57,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -90,7 +90,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich & Steve Chervitz
 
@@ -726,7 +726,7 @@ sub TIEHANDLE {
 
 sub READLINE {
   my $self = shift;
-  return $self->{'processor'}->next_result() unless wantarray;
+  return $self->{'processor'}->next_result() || undef unless wantarray;
   my (@list, $obj);
   push @list, $obj while $obj = $self->{'processor'}->next_result();
   return @list;
@@ -71,7 +71,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Hilmar Lapp
 
@@ -134,7 +134,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Aaron Mackey
 
@@ -76,7 +76,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Albert Vilella
 
@@ -63,7 +63,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Ewan Birney, Jason Stajich
 
@@ -61,7 +61,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Ewan Birney
 
@@ -63,7 +63,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 email or the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Albert Vilella
 
@@ -111,7 +111,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Heikki Lehvaslaiho
 
@@ -167,7 +167,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Heikki Lehvaslaiho
 
@@ -135,7 +135,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Heikki Lehvaslaiho
 
@@ -84,7 +84,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Chad Matsalla
 
@@ -173,7 +173,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -88,7 +88,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Chad Matsalla
 
@@ -146,7 +146,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Heikki Lehvaslaiho
 
@@ -80,7 +80,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Ewan Birney
 
@@ -61,7 +61,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Ewan Birney
 
@@ -107,7 +107,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Hilmar Lapp
 
@@ -59,7 +59,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -57,7 +57,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -99,7 +99,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Chad Matsalla
 
@@ -51,7 +51,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Chad Matsalla
 
@@ -74,7 +74,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Chad Matsalla
 
@@ -432,7 +432,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Ewan Birney, inspired by Ian Korf objects
 
@@ -74,7 +74,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Hilmar Lapp, Jason Stajich
 
@@ -77,7 +77,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -53,7 +53,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -55,7 +55,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -68,7 +68,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via 
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -124,7 +124,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Hilmar Lapp
 
@@ -113,7 +113,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -64,7 +64,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -72,7 +72,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Ewan Birney, Mark Fiers
 
@@ -62,7 +62,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Hilmar Lapp
 
@@ -54,7 +54,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Hilmar Lapp
 
@@ -55,7 +55,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
  the bugs and their resolution. Bug reports can be submitted via the
  web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Hilmar Lapp
 
@@ -52,7 +52,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Hilmar Lapp
 
@@ -51,7 +51,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - David Block
 
@@ -51,7 +51,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - David Block
 
@@ -51,7 +51,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - David Block
 
@@ -51,7 +51,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - David Block
 
@@ -51,7 +51,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
  the bugs and their resolution.  Bug reports can be submitted via the
  web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Hilmar Lapp
 
@@ -53,7 +53,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Hilmar Lapp
 
@@ -53,7 +53,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - David Block
 
@@ -114,7 +114,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via 
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Ewan Birney
 
@@ -196,9 +196,9 @@ sub new {
 
   $arg{-strand} ||= 0;
   if ($arg{-strand} =~ /^[\+\-\.]$/){
-	$arg{-strand} = "+" && $self->{strand} ='1';
-	$arg{-strand} = "-" && $self->{strand} = '-1';
-	$arg{-strand} = "." && $self->{strand} = '0';
+	($arg{-strand} eq "+") && ($self->{strand} = '1');
+	($arg{-strand} eq "-") && ($self->{strand} = '-1');
+	($arg{-strand} eq ".") && ($self->{strand} = '0');
   } else {
 	  $self->{strand}  = $arg{-strand} ? ($arg{-strand} >= 0 ? +1 : -1) : 0;
   }
@@ -57,7 +57,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Ewan Birney
 
@@ -88,7 +88,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR 
 
@@ -71,7 +71,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -72,7 +72,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -59,7 +59,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Hilmar Lapp
 
@@ -67,7 +67,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Hilmar Lapp
 
@@ -71,7 +71,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via 
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -86,7 +86,7 @@ report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Chris Mungall
 
@@ -54,7 +54,7 @@ report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Chris Mungall
 
@@ -78,7 +78,7 @@ report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Chris Mungall
 
@@ -604,7 +604,7 @@ report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Chris Mungall
 
@@ -936,13 +936,13 @@ sub problem {
     if (@sfs) {
 	foreach my $sf (@sfs) {
 	    $desc .=
-	      sprintf("\nSF [$sf]: %s\n",
+	      sprintf("\nSF [$sf]: ". $sf->location->to_FTstring . "; %s\n",
 		      join('; ',
                            $sf->primary_tag,
 			   map {
 			       $sf->has_tag($_) ?
 				 $sf->get_tag_values($_) : ()
-			     } qw(gene product label)));
+			     } qw(locus_tag gene product label)));
 	}
     }
     my $thresh = $self->error_threshold;
@@ -80,7 +80,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Ewan Birney
 
@@ -1,7 +1,7 @@
 #
 # BioPerl module for Bio::SeqFeatureI
 #
-# Please direct questions and support issues to <bioperl-l@bioperl.org> 
+# Please direct questions and support issues to <bioperl-l@bioperl.org>
 #
 # Cared for by Ewan Birney <birney@ebi.ac.uk>
 #
@@ -20,29 +20,30 @@ Bio::SeqFeatureI - Abstract interface of a Sequence Feature
     # get a seqfeature somehow, eg, from a Sequence with Features attached
 
     foreach $feat ( $seq->get_SeqFeatures() ) {
-       print "Feature from ", $feat->start, "to ",
-	       $feat->end, " Primary tag  ", $feat->primary_tag,
-	          ", produced by ", $feat->source_tag(), "\n";
-
-       if( $feat->strand == 0 ) {
-		    print "Feature applicable to either strand\n";
-       } else {
-          print "Feature on strand ", $feat->strand,"\n"; # -1,1
-       }
-
-       print "feature location is ",$feat->start, "..",
-          $feat->end, " on strand ", $feat->strand, "\n";
-       print "easy utility to print locations in GenBank/EMBL way ",
-          $feat->location->to_FTstring(), "\n";
-
-       foreach $tag ( $feat->get_all_tags() ) {
-		    print "Feature has tag ", $tag, " with values, ",
-		      join(' ',$feat->get_tag_values($tag)), "\n";
-       }
-	    print "new feature\n" if $feat->has_tag('new');
-	    # features can have sub features
-	    my @subfeat = $feat->get_SeqFeatures();
-	 }
+        print "Feature from ", $feat->start, "to ",
+              $feat->end, " Primary tag  ", $feat->primary_tag,
+              ", produced by ", $feat->source_tag(), "\n";
+
+        if ( $feat->strand == 0 ) {
+            print "Feature applicable to either strand\n";
+        }
+        else {
+            print "Feature on strand ", $feat->strand,"\n"; # -1,1
+        }
+
+        print "feature location is ",$feat->start, "..",
+              $feat->end, " on strand ", $feat->strand, "\n";
+        print "easy utility to print locations in GenBank/EMBL way ",
+              $feat->location->to_FTstring(), "\n";
+
+        foreach $tag ( $feat->get_all_tags() ) {
+            print "Feature has tag ", $tag, " with values, ",
+                  join(' ',$feat->get_tag_values($tag)), "\n";
+        }
+        print "new feature\n" if $feat->has_tag('new');
+        # features can have sub features
+        my @subfeat = $feat->get_SeqFeatures();
+    }
 
 =head1 DESCRIPTION
 
@@ -62,15 +63,15 @@ of the Bioperl mailing lists.  Your participation is much appreciated.
   bioperl-l@bioperl.org                  - General discussion
   http://bioperl.org/wiki/Mailing_lists  - About the mailing lists
 
-=head2 Support 
+=head2 Support
 
 Please direct usage questions or support issues to the mailing list:
 
 I<bioperl-l@bioperl.org>
 
-rather than to the module maintainer directly. Many experienced and 
-reponsive experts will be able look at the problem and quickly 
-address it. Please include a thorough description of the problem 
+rather than to the module maintainer directly. Many experienced and
+reponsive experts will be able look at the problem and quickly
+address it. Please include a thorough description of the problem
 with code and data examples if at all possible.
 
 =head2 Reporting Bugs
@@ -79,7 +80,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 APPENDIX
 
@@ -184,7 +185,7 @@ sub source_tag{
 
  Title   : has_tag
  Usage   : $tag_exists = $self->has_tag('some_tag')
- Function: 
+ Function:
  Returns : TRUE if the specified tag exists, and FALSE otherwise
  Args    :
 
@@ -201,7 +202,7 @@ sub has_tag{
 
  Title   : get_tag_values
  Usage   : @values = $self->get_tag_values('some_tag')
- Function: 
+ Function:
  Returns : An array comprising the values of the specified tag.
  Args    : a string
 
@@ -217,7 +218,7 @@ sub get_tag_values {
 
  Title   : get_tagset_values
  Usage   : @values = $self->get_tagset_values(qw(label transcript_id product))
- Function: 
+ Function:
  Returns : An array comprising the values of the specified tags, in order of tags
  Args    : An array of strings
 
@@ -439,9 +440,9 @@ but can be validly overwritten by subclasses
                        in a circular sequence where a gene span starts
                        before the end of the sequence and ends after the
                        sequence start. Example : join(15685..16260,1..207)
-					   (default = if sequence is_circular(), 1, otherwise 0)
-			-phase     truncates the returned sequence based on the
-					   intron phase (0,1,2).
+                       (default = if sequence is_circular(), 1, otherwise 0)
+            -phase     truncates the returned sequence based on the
+                       intron phase (0,1,2).
 
   Returns : A L<Bio::PrimarySeqI> object
 
@@ -449,55 +450,56 @@ but can be validly overwritten by subclasses
 
 sub spliced_seq {
     my $self = shift;
-	my @args = @_;
-	my ($db, $nosort, $phase) =
-	   $self->_rearrange([qw(DB NOSORT PHASE)], @args);
-	
-	# set no_sort based on the parent sequence status
-	if ($self->entire_seq->is_circular) {
-		$nosort = 1;
-	}
-	
-	# (added 7/7/06 to allow use old API (with warnings)
-	my $old_api = (!(grep {$_ =~ /(?:nosort|db|phase)/} @args)) ? 1 : 0;
-	if (@args && $old_api) {
-		$self->warn(q(API has changed; please use '-db' or '-nosort' ).
-                     qq(for args. See POD for more details.));
-		$db = shift @args if @args;
-		$nosort = shift @args if @args;
-		$phase = shift @args if @args;
-	};
-	
-	if (defined($phase) && ($phase < 0 || $phase > 2)) {
-	    $self->warn("Phase must be 0,1, or 2.  Setting phase to 0...");
-	    $phase = 0;
-	}
-	
-	if( $db && ref($db) && ! $db->isa('Bio::DB::RandomAccessI') ) {
-        $self->warn("Must pass in a valid Bio::DB::RandomAccessI object".
-                    " for access to remote locations for spliced_seq");
+    my @args = @_;
+    my ($db, $nosort, $phase) =
+       $self->_rearrange([qw(DB NOSORT PHASE)], @args);
+
+    # set no_sort based on the parent sequence status
+    if ($self->entire_seq->is_circular) {
+        $nosort = 1;
+    }
+
+    # (added 7/7/06 to allow use old API (with warnings)
+    my $old_api = (!(grep {$_ =~ /(?:nosort|db|phase)/} @args)) ? 1 : 0;
+    if (@args && $old_api) {
+        $self->warn(  q(API has changed; please use '-db' or '-nosort' )
+                    . qq(for args. See POD for more details.));
+        $db     = shift @args if @args;
+        $nosort = shift @args if @args;
+        $phase  = shift @args if @args;
+    };
+
+    if (defined($phase) && ($phase < 0 || $phase > 2)) {
+        $self->warn("Phase must be 0,1, or 2.  Setting phase to 0...");
+        $phase = 0;
+    }
+
+    if ( $db && ref($db) && ! $db->isa('Bio::DB::RandomAccessI') ) {
+        $self->warn(  "Must pass in a valid Bio::DB::RandomAccessI object"
+                    . " for access to remote locations for spliced_seq");
         $db = undef;
-    } elsif( defined $db && $HasInMemory &&
-            $db->isa('Bio::DB::InMemoryCache') ) {
+    }
+    elsif ( defined $db && $HasInMemory && $db->isa('Bio::DB::InMemoryCache') ) {
         $db = Bio::DB::InMemoryCache->new(-seqdb => $db);
     }
 
-    if( ! $self->location->isa("Bio::Location::SplitLocationI") ) {
+    if ( not $self->location->isa("Bio::Location::SplitLocationI") ) {
         if ($phase) {
-	    $self->debug("Subseq start: ",$phase+1,"\tend: ",$self->end,"\n");
-	    my $seqstr = substr($self->seq->seq, $phase);
-	    my $out = Bio::Seq->new( -id => $self->entire_seq->display_id
-				. "_spliced_feat",
-			 -seq => $seqstr);
-	    return $out;
-	} else {
-	    return $self->seq(); # nice and easy!
-	}
+            $self->debug("Subseq start: ",$phase+1,"\tend: ",$self->end,"\n");
+            my $seqstr = substr($self->seq->seq, $phase);
+            my $out = Bio::Seq->new( -id  =>   $self->entire_seq->display_id
+                                             . "_spliced_feat",
+                                     -seq => $seqstr);
+            return $out;
+        }
+        else {
+            return $self->seq(); # nice and easy!
+        }
     }
-    
+
     # redundant test, but the above ISA is probably not ideal.
-    if( ! $self->location->isa("Bio::Location::SplitLocationI") ) {
-	$self->throw("not atomic, not split, yikes, in trouble!");
+    if ( not $self->location->isa("Bio::Location::SplitLocationI") ) {
+        $self->throw("not atomic, not split, yikes, in trouble!");
     }
 
     my $seqstr = '';
@@ -511,120 +513,182 @@ sub spliced_seq {
 
     my ($mixed,$mixedloc, $fstrand) = (0);
 
-    if( $self->isa('Bio::Das::SegmentI') &&
-	! $self->absolute ) {
-	$self->warn("Calling spliced_seq with a Bio::Das::SegmentI which does have absolute set to 1 -- be warned you may not be getting things on the correct strand");
+    if ( $self->isa('Bio::Das::SegmentI') and not $self->absolute ) {
+        $self->warn(  "Calling spliced_seq with a Bio::Das::SegmentI which "
+                    . "does have absolute set to 1 -- be warned you may not "
+                    . "be getting things on the correct strand");
     }
 
     my @locset = $self->location->each_Location;
     my @locs;
-    if( ! $nosort ) {
-	@locs = map { $_->[0] }
-	# sort so that most negative is first basically to order
-	# the features on the opposite strand 5'->3' on their strand
-	# rather than they way most are input which is on the fwd strand
-
-	sort { $a->[1] <=> $b->[1] } # Yes Tim, Schwartzian transformation
-	map {
-	    $fstrand = $_->strand unless defined $fstrand;
-	    $mixed = 1 if defined $_->strand && $fstrand != $_->strand;
-	    if( defined $_->seq_id ) {
-		$mixedloc = 1 if( $_->seq_id ne $seqid );
-	    }
-	    [ $_, $_->start * ($_->strand || 1)];
-	} @locset;
-
-	if ( $mixed ) {
-	    $self->warn("Mixed strand locations, spliced seq using the input order rather than trying to sort");
-	    @locs = @locset;
-	}
-    } else {
-	# use the original order instead of trying to sort
-	@locs = @locset;
-	$fstrand = $locs[0]->strand;
+    if ( not $nosort ) {
+        @locs = map { $_->[0] }
+        # sort so that most negative is first basically to order
+        # the features on the opposite strand 5'->3' on their strand
+        # rather than they way most are input which is on the fwd strand
+
+        sort { $a->[1] <=> $b->[1] } # Yes Tim, Schwartzian transformation
+        map {
+             $fstrand = $_->strand unless defined $fstrand;
+             $mixed   = 1 if defined $_->strand && $fstrand != $_->strand;
+
+             if( defined $_->seq_id ) {
+                $mixedloc = 1 if( $_->seq_id ne $seqid );
+             }
+             [ $_, $_->start * ($_->strand || 1) ];
+        } @locset;
+
+        if ( $mixed ) {
+            $self->warn(  "Mixed strand locations, spliced seq using the "
+                        . "input order rather than trying to sort");
+            @locs = @locset;
+        }
     }
+    else {
+        # use the original order instead of trying to sort
+        @locs = @locset;
+        $fstrand = $locs[0]->strand;
+    }
+
+
+    my $last_id    = undef;
+    my $called_seq = undef;
+    # This will be left as undefined if 1) db is remote or 2)seq_id is undefined.
+    # In that case, old code is used to make exon sequence
+    my $called_seq_seq = undef;
+    my $called_seq_len = undef;
 
     foreach my $loc ( @locs ) {
-	if( ! $loc->isa("Bio::Location::Atomic") ) {
-	    $self->throw("Can only deal with one level deep locations");
-	}
-	my $called_seq;
-	if( $fstrand != $loc->strand ) {
-	    $self->warn("feature strand is different from location strand!");
-	}
-	# deal with remote sequences
-
-	if( defined $loc->seq_id &&
-	    $loc->seq_id ne $seqid ) {
-	    if( defined $db ) {
-		my $sid = $loc->seq_id;
-		$sid =~ s/\.\d+$//g;
-		eval {
-		    $called_seq = $db->get_Seq_by_acc($sid);
-		};
-		if( $@ ) {
-		    $self->warn("In attempting to join a remote location, sequence $sid was not in database. Will provide padding N's. Full exception \n\n$@");
-		    $called_seq = undef;
-		}
-	    } else {
-		$self->warn( "cannot get remote location for ".$loc->seq_id ." without a valid Bio::DB::RandomAccessI database handle (like Bio::DB::GenBank)");
-		$called_seq = undef;
-	    }
-	    if( !defined $called_seq ) {
-		$seqstr .= 'N' x $self->length;
-		next;
-	    }
-	} else {
-	    $called_seq = $self->entire_seq;
-	}
-
-    # does the called sequence make sense? Bug 1780
-    if ($called_seq->length < $loc->end) {
-        my $accession = $called_seq->accession;
-        my $end = $loc->end;
-        my $length = $called_seq->length;
-        my $orig_id = $self->seq_id; # originating sequence
-        my ($locus) = $self->get_tagset_values("locus_tag");
-        $self->throw("Location end ($end) exceeds length ($length) of ".
-                     "called sequence $accession.\nCheck sequence version used in ".
-                     "$locus locus-tagged SeqFeature in $orig_id.");
-    }
+        if ( not $loc->isa("Bio::Location::Atomic") ) {
+            $self->throw("Can only deal with one level deep locations");
+        }
+
+        if ( $fstrand != $loc->strand ) {
+            $self->warn("feature strand is different from location strand!");
+        }
+
+        my $loc_seq_id;
+        if ( defined $loc->seq_id ) {
+            $loc_seq_id = $loc->seq_id;
+
+            # deal with remote sequences
+            if ($loc_seq_id ne $seqid ) {
+                # might be too big to download whole sequence
+                $called_seq_seq = undef;
+
+                if ( defined $db ) {
+                    my $sid = $loc_seq_id;
+                    $sid =~ s/\.\d+$//g;
+                    eval {
+                        $called_seq = $db->get_Seq_by_acc($sid);
+                    };
+                    if( $@ ) {
+                        $self->warn(  "In attempting to join a remote location, sequence $sid "
+                                    . "was not in database. Will provide padding N's. Full exception \n\n$@");
+                        $called_seq = undef;
+                    }
+                }
+                else {
+                    $self->warn(  "cannot get remote location for ".$loc_seq_id ." without a valid "
+                                . "Bio::DB::RandomAccessI database handle (like Bio::DB::GenBank)");
+                    $called_seq = undef;
+                }
+                if ( !defined $called_seq ) {
+                    $seqstr .= 'N' x $loc->length;
+                    next;
+                }
+            }
+            # have local sequence available
+            else {
+                # don't have to pull out source sequence again if it's local unless
+                # it's the first exon or different from previous exon
+                unless (defined(($last_id) && $last_id eq $loc_seq_id )){
+                    $called_seq = $self->entire_seq;
+                    $called_seq_seq = $called_seq->seq();  # this is slow
+                }
+            }
+        }
+        #undefined $loc->seq->id
+        else {
+            $called_seq = $self->entire_seq;
+            $called_seq_seq = undef;
+        }
+
+        my ($start,$end) = ($loc->start,$loc->end);
+
+        # does the called sequence make sense? Bug 1780
+        my $called_seq_len;
+
+        # can avoid a seq() call on called_seq
+        if (defined($called_seq_seq)) {
+            $called_seq_len = length($called_seq_seq);
+        }
+        # can't avoid a seq() call on called_seq
+        else {
+            $called_seq_len = $called_seq->length  # this is slow
+        }
+
+        if ($called_seq_len < $loc->end) {
+            my $accession = $called_seq->accession;
+            my $orig_id   = $self->seq_id; # originating sequence
+            my ($locus)   = $self->get_tagset_values("locus_tag");
+            $self->throw(  "Location end ($end) exceeds length ($called_seq_len) of "
+                         . "called sequence $accession.\nCheck sequence version used in "
+                         . "$locus locus-tagged SeqFeature in $orig_id.");
+        }
+
+        if ( $self->isa('Bio::Das::SegmentI') ) {
+            # $called_seq is Bio::DB::GFF::RelSegment, as well as its subseq();
+            # Bio::DB::GFF::RelSegment::seq() returns a Bio::PrimarySeq, and using seq()
+            # in turn returns a string.  Confused?
+            $seqstr .= $called_seq->subseq($start,$end)->seq()->seq(); # this is slow
+        }
+        else {
+            my $exon_seq;
+            if (defined ($called_seq_seq)){
+                $exon_seq = substr($called_seq_seq, $start-1, $end-$start+1);  # this is quick
+            }
+            else {
+                $exon_seq = $called_seq->subseq($loc->start,$loc->end);  # this is slow
+            }
+
+            # If guide_strand is defined, assemble the sequence first and revcom later if needed,
+            # if its not defined, apply revcom immediately to proper locations
+            if (defined $self->location->guide_strand) {
+                $seqstr .= $exon_seq;
+            }
+            else {
+                my $strand = defined ($loc->strand) ? ($loc->strand) : 0;
+
+                # revcomp $exon_seq
+                if ($strand == -1) {
+                    $exon_seq = reverse($exon_seq);
+                    $exon_seq =~ tr/ABCDGHKMNRSTUVWXYabcdghkmnrstuvwxy/TVGHCDMKNYSAABWXRtvghcdmknysaabwxr/;
+                    $seqstr .= $exon_seq;
+                }
+                else {
+                    $seqstr .= $exon_seq;
+                }
+            }
+        }
+
+        $last_id = $loc_seq_id if (defined($loc_seq_id));
+    } #next $loc
 
-	if( $self->isa('Bio::Das::SegmentI') ) {
-	    my ($s,$e) = ($loc->start,$loc->end);
-		# $called_seq is Bio::DB::GFF::RelSegment, as well as its subseq();
-		# Bio::DB::GFF::RelSegment::seq() returns a Bio::PrimarySeq, and using seq()
-		# in turn returns a string.  Confused?
-	    $seqstr .= $called_seq->subseq($s,$e)->seq()->seq();
-	} else {
-	    # If guide_strand is defined, assemble the sequence first and revcom later if needed,
-	    # if its not defined, apply revcom immediately to proper locations
-	    if (defined $self->location->guide_strand) {
-		$seqstr .= $called_seq->subseq($loc->start,$loc->end);
-	    } else {
-		my $strand = defined ($loc->strand) ? ($loc->strand) : 0;
-		if ($strand == -1) {
-		    $seqstr .= $called_seq->trunc($loc->start,$loc->end)->revcom->seq;
-		} else {
-		    $seqstr .= $called_seq->subseq($loc->start,$loc->end);
-		}
-	    }
-	}
-    }
     # Use revcom only after the whole sequence has been assembled
     my $guide_strand = defined ($self->location->guide_strand) ? ($self->location->guide_strand) : 0;
     if ($guide_strand == -1) {
-	my $seqstr_obj = Bio::Seq->new(-seq => $seqstr);
-	$seqstr = $seqstr_obj->revcom->seq;
+        my $seqstr_obj = Bio::Seq->new(-seq => $seqstr);
+        $seqstr = $seqstr_obj->revcom->seq;
     }
-    
+
     if (defined($phase)) {
-	$seqstr = substr($seqstr, $phase);
+        $seqstr = substr($seqstr, $phase);
     }
-    
-    my $out = Bio::Seq->new( -id => $self->entire_seq->display_id
-			            . "_spliced_feat",
-			     -seq => $seqstr);
+
+    my $out = Bio::Seq->new( -id =>   $self->entire_seq->display_id
+                                    . "_spliced_feat",
+                             -seq => $seqstr);
 
     return $out;
 }
@@ -634,7 +698,7 @@ sub spliced_seq {
  Title   : location
  Usage   : my $location = $seqfeature->location()
  Function: returns a location object suitable for identifying location
-	   of feature on sequence or parent feature
+           of feature on sequence or parent feature
  Returns : Bio::LocationI object
  Args    : none
 
@@ -89,7 +89,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Ewan Birney
 
@@ -13,7 +13,7 @@
 
 =head1 NAME
 
-Bio::SeqIO::FTHelper - Helper class for Embl/Genbank feature tables
+Bio::SeqIO::FTHelper - Helper class for EMBL/Genbank feature tables
 
 =head1 SYNOPSIS
 
@@ -55,7 +55,7 @@ with code and data examples if at all possible.
 Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Ewan Birney
 
@@ -84,8 +84,6 @@ use Bio::Location::Simple;
 use Bio::Location::Fuzzy;
 use Bio::Location::Split;
 
-
-
 use base qw(Bio::Root::Root);
 
 sub new {
@@ -109,7 +107,6 @@ sub new {
            this feature is located, optionally a string indicating the source
            (GenBank/EMBL/SwissProt)
 
-
 =cut
 
 sub _generic_seqfeature {
@@ -123,7 +123,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Chris Fields
 
@@ -17,9 +17,9 @@ Bio::SeqIO::MultiFile - Treating a set of files as a single input stream
 
 =head1 SYNOPSIS
 
-   $seqin = Bio::SeqIO::MultiFile( '-format' => 'Fasta',
-                                   '-files'  => ['file1','file2'] );
-   while((my $seq = $seqin->next_seq)) {
+   my $seqin = Bio::SeqIO::MultiFile->new( -format => 'Fasta',
+                                           -files  => ['file1','file2'] );
+   while (my $seq = $seqin->next_seq) {
        # do something with $seq
    }
 
@@ -27,6 +27,7 @@ Bio::SeqIO::MultiFile - Treating a set of files as a single input stream
 
 Bio::SeqIO::MultiFile provides a simple way of bundling a whole
 set of identically formatted sequence input files as a single stream.
+File format is automatically determined by C<Bio::SeqIO>.
 
 =head1 FEEDBACK
 
@@ -56,7 +57,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.
 Bug reports can be submitted via the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Ewan Birney
 
@@ -81,33 +82,26 @@ use base qw(Bio::SeqIO);
 # _initialize is where the heavy stuff will happen when new is called
 
 sub _initialize {
-  my($self,@args) = @_;
-
-  $self->SUPER::_initialize(@args);
-
-  my ($file_array,$format) = $self->_rearrange([qw(
-					 FILES
-					 FORMAT
-					)],
-				     @args,
-				     );
-  if( !defined $file_array || ! ref $file_array ) {
-      $self->throw("Must have an array files for MultiFile");
-  }
-
-  if( !defined $format ) {
-      $self->throw("Must have a format for MultiFile");
-  }
-
-  $self->{'_file_array'} = [];
-
-  $self->_set_file(@$file_array);
-  $self->_format($format);
-  if( $self->_load_file() == 0 ) {
-     $self->throw("Unable even to initialise the first file");
-  }
+    my($self, @args) = @_;
+
+    $self->SUPER::_initialize(@args);
+
+    my ($file_array, $format) = $self->_rearrange([qw(FILES FORMAT)], @args);
+    if( !defined $file_array || ! ref $file_array ) {
+        $self->throw("Must have an array files for MultiFile");
+    }
+
+    $self->{'_file_array'} = [];
+    $self->_set_file(@$file_array);
+
+    $self->format($format) if defined $format;
+
+    if( $self->_load_file() == 0 ) {
+        $self->throw("Unable to initialise the first file");
+    }
 }
 
+
 =head2 next_seq
 
  Title   : next_seq
@@ -117,25 +111,23 @@ sub _initialize {
  Returns :
  Args    :
 
-
 =cut
 
 sub next_seq{
-   my ($self,@args) = @_;
-
-   my $seq = $self->_current_seqio->next_seq();
-   if( !defined $seq ) {
-       if( $self->_load_file() == 0) {
-	   return;
-       } else {
-	   return $self->next_seq();
-       }
-   } else {
-       return $seq;
-   }
-
+    my ($self, @args) = @_;
+    my $seq = $self->_current_seqio->next_seq();
+    if( !defined $seq ) {
+        if( $self->_load_file() == 0) {
+            return;
+        } else {
+            return $self->next_seq();
+        }
+    } else {
+        return $seq;
+    }
 }
 
+
 =head2 next_primary_seq
 
  Title   : next_primary_seq
@@ -145,25 +137,23 @@ sub next_seq{
  Returns :
  Args    :
 
-
 =cut
 
 sub next_primary_seq{
-   my ($self,@args) = @_;
-
-   my $seq = $self->_current_seqio->next_primary_seq();
-   if( !defined $seq ) {
-       if( $self->_load_file() == 0) {
-	   return;
-       } else {
-	   return $self->next_primary_seq();
-       }
-   } else {
-       return $seq;
-   }
-
+    my ($self, @args) = @_;
+    my $seq = $self->_current_seqio->next_primary_seq();
+    if( !defined $seq ) {
+        if( $self->_load_file() == 0) {
+            return;
+        } else {
+            return $self->next_primary_seq();
+        }
+    } else {
+        return $seq;
+    }
 }
 
+
 =head2 _load_file
 
  Title   : _load_file
@@ -173,26 +163,32 @@ sub next_primary_seq{
  Returns :
  Args    :
 
-
 =cut
 
 sub _load_file{
-   my ($self,@args) = @_;
-
-   my $file = shift(@{$self->{'_file_array'}});
-   if( !defined $file ) {
-       return 0;
-   }
-   my $seqio = Bio::SeqIO->new( '-format' => $self->_format(), -file => $file);
-   # should throw an exception - but if not...
-   if( !defined $seqio) {
-       $self->throw("no seqio built for $file!");
-   }
+    my ($self, @args) = @_;
+    my $file = shift @{$self->{'_file_array'}};
+    if( !defined $file ) {
+        return 0;
+    }
+    my $seqio;
+    my $format = $self->format;
+    if ($format) {
+        $seqio = Bio::SeqIO->new( -file => $file, -format => $format );
+    } else {
+        $seqio = Bio::SeqIO->new( -file => $file );
+        $self->format($seqio->format) if not $format;
+    }
 
-   $self->_current_seqio($seqio);
-   return 1;
+    # should throw an exception - but if not...
+    if( !defined $seqio) {
+        $self->throw("Could not build SeqIO object for $file!");
+    }
+    $self->_current_seqio($seqio);
+    return 1;
 }
 
+
 =head2 _set_file
 
  Title   : _set_file
@@ -202,16 +198,14 @@ sub _load_file{
  Returns :
  Args    :
 
-
 =cut
 
 sub _set_file{
-   my ($self,@files) = @_;
-
-   push(@{$self->{'_file_array'}},@files);
-
+    my ($self, @files) = @_;
+    push @{$self->{'_file_array'}}, @files;
 }
 
+
 =head2 _current_seqio
 
  Title   : _current_seqio
@@ -221,37 +215,26 @@ sub _set_file{
  Returns : value of _current_seqio
  Args    : newvalue (optional)
 
-
 =cut
 
 sub _current_seqio{
-   my ($obj,$value) = @_;
-   if( defined $value) {
-      $obj->{'_current_seqio'} = $value;
+    my ($obj, $value) = @_;
+    if( defined $value) {
+        $obj->{'_current_seqio'} = $value;
     }
     return $obj->{'_current_seqio'};
-
 }
 
-=head2 _format
-
- Title   : _format
- Usage   : $obj->_format($newval)
- Function:
- Example :
- Returns : value of _format
- Args    : newvalue (optional)
-
 
-=cut
+# We overload the format() method of Bio::Root::IO by a simple get/set
 
-sub _format{
-   my ($obj,$value) = @_;
-   if( defined $value) {
-      $obj->{'_format'} = $value;
+sub format{
+    my ($obj, $value) = @_;
+    if( defined $value) {
+        $obj->{'_format'} = $value;
     }
     return $obj->{'_format'};
-
 }
 
+
 1;
@@ -54,7 +54,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.
 Bug reports can be submitted via the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHORS - Aaron Mackey
 
@@ -61,7 +61,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.
 Bug reports can be submitted via the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHORS - James Gilbert
 
@@ -74,7 +74,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.
 Bug reports can be submitted via the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Simon K. Chan
 
@@ -1455,7 +1455,7 @@ sub next_seq {
     } else {
         # All done.  Nothing more to parse.
         # print "returning nothing!\n";
-        return 0;
+        return;
     }
 
 
@@ -51,7 +51,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.
 Bug reports can be submitted via the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHORS - Aaron Mackey
 
@@ -64,7 +64,7 @@ with code and data examples if at all possible.
 Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Chris Mungall
 
@@ -95,7 +95,7 @@ with code and data examples if at all possible.
  the bugs and their resolution.
  Bug reports can be submitted via the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head2 Things Still to Do
 
@@ -67,7 +67,7 @@ with code and data examples if at all possible.
  the bugs and their resolution. Bug reports can be submitted via the
  web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -202,7 +202,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.
 Bug reports can be submitted via the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Peili Zhang
 
@@ -111,7 +111,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.
 Bug reports can be submitted via the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Chris Mungall
 
@@ -67,7 +67,7 @@ with code and data examples if at all possible.
 Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Chris Mungall
 
@@ -51,7 +51,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.
 Bug reports can be submitted via the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHORS - Aaron Mackey
 
@@ -100,7 +100,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Ewan Birney
 
@@ -214,7 +214,7 @@ sub next_seq {
 
         # ID   DQ299383; SV 1; linear; mRNA; STD; MAM; 431 BP.
         # This regexp comes from the new2old.pl conversion script, from EBI
-        if ($line =~ m/^ID   (\w+);\s+SV (\d+); (\w+); ([^;]+); (\w{3}); (\w{3}); (\d+) BP./) {
+        if ($line =~ m/^ID   (\S+);\s+SV (\d+); (\w+); ([^;]+); (\w{3}); (\w{3}); (\d+) BP./) {
             ($name, $sv, $topology, $mol, $div) = ($1, $2, $3, $4, $6);
         }
         if (defined $sv) {
@@ -100,7 +100,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Ewan Birney
 
@@ -97,7 +97,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Stefan Kirov
 
@@ -354,11 +354,21 @@ sub next_seq {
     }
 
     #Homology
-    my ( $uncapt, $hom, $anchor ) = _process_src( $xval->{homology}->{source} );
-    foreach my $homann (@$hom) {
-        $self->{_ann}->add_Annotation( 'dblink', $homann );
+    my @homologies; # Sometimes there are multiple entries
+    if (ref $xval->{homology} eq 'ARRAY') {
+        @homologies = @{ $xval->{homology} };
+    }
+    else {
+        push @homologies, $xval->{homology};
+    }
+
+    foreach my $homology (@homologies) {
+        my ( $uncapt, $hom, $anchor ) = _process_src( $homology->{source} );
+        foreach my $homann (@$hom) {
+            $self->{_ann}->add_Annotation( 'dblink', $homann );
+        }
+        push @alluncaptured, $uncapt;
     }
-    push @alluncaptured, $uncapt;
 
     #Index terms
     if (   ( exists( $xval->{'xtra-index-terms'} ) )
@@ -857,6 +867,7 @@ sub _process_locus {
         );
         $gseq->add_SeqFeature($nfeat);
     }
+
     my @products;
     if ( ref( $self->{_current}->{products} ) eq 'ARRAY' ) {
         @products = @{ $self->{_current}->{products} };
@@ -865,6 +876,7 @@ sub _process_locus {
         push @products, $self->{_current}->{products};
     }
     delete $self->{_current}->{products};
+
     my $gstruct = Bio::SeqFeature::Gene::GeneStructure->new();
     foreach my $product (@products) {
         my ( $tr, $uncapt ) =
@@ -890,8 +902,9 @@ sub _process_products_coordinates {
       || 0;    #In case it is not known: should there be an entry at all?
     my $end    = shift || 1;
     my $strand = shift || 1;
-    my ( @coords, @uncapt );
     return unless ( exists( $coord->{accession} ) );
+
+    my ( @coords, @uncapt );
     my $transcript = Bio::SeqFeature::Gene::Transcript->new(
         -primary => $coord->{accession},    #Desc is actually non functional...
         -start   => $start,
@@ -921,13 +934,24 @@ sub _process_products_coordinates {
             push @uncapt, $exon;
         }
     }
+
     my ( $prot, $uncapt );
     if ( exists( $coord->{products} ) ) {
-        my ( $prot, $uncapt ) =
-          _process_products_coordinates( $coord->{products},
-            $start, $end, $strand );
-        $transcript->add_SeqFeature($prot);
-        push @uncapt, $uncapt;
+        my @products; # Sometimes there are multiple entries
+        if (ref $coord->{products} eq 'ARRAY') {
+            @products = @{ $coord->{products} };
+        }
+        else {
+            push @products, $coord->{products};
+        }
+
+        foreach my $product (@products) {
+            my ( $prot, $uncapt ) =
+              _process_products_coordinates( $product,
+                $start, $end, $strand );
+            $transcript->add_SeqFeature($prot);
+            push @uncapt, $uncapt;
+        }
     }
     return $transcript, \@uncapt;
 }
@@ -88,7 +88,7 @@ the bugs and their resolution.
 
 Bug reports can be submitted via email or the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Hilmar Lapp
 
@@ -51,7 +51,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHORS - Aaron Mackey
 
@@ -54,7 +54,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHORS - Ewan Birney & Lincoln Stein
 
@@ -433,7 +433,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHORS - Chris Fields (taken over from Tony Cox)
 
@@ -59,7 +59,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.
 Bug reports can be submitted via the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Peili Zhang
 
@@ -55,7 +55,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Sheldon McKay
 
@@ -53,7 +53,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Sheldon McKay
 
@@ -61,7 +61,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Sheldon McKay
 
@@ -65,7 +65,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Sheldon McKay
 
@@ -53,7 +53,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Sheldon McKay
 
@@ -66,7 +66,7 @@ of the bugs and their resolution.
 
 Bug reports can be submitted via the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Sheldon McKay
 
@@ -119,7 +119,7 @@ with code and data examples if at all possible.
 Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution. Bug reports can be submitted via the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Bioperl Project
 
@@ -62,7 +62,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution. Bug reports can be submitted via the
 web:
 
- https://redmine.open-bio.org/projects/bioperl/
+ https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Ryan Golhar
 
@@ -55,7 +55,7 @@ with code and data examples if at all possible.
 Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHORS - Ewan Birney & Lincoln Stein
 
@@ -1,7 +1,7 @@
 #
 # BioPerl module for Bio::SeqIO::genbank
 #
-# Please direct questions and support issues to <bioperl-l@bioperl.org> 
+# Please direct questions and support issues to <bioperl-l@bioperl.org>
 #
 # Cared for by Bioperl project bioperl-l(at)bioperl.org
 #
@@ -20,11 +20,11 @@ Bio::SeqIO::genbank - GenBank sequence input/output stream
 It is probably best not to use this object directly, but
 rather go through the SeqIO handler:
 
-    $stream = Bio::SeqIO->new(-file => $filename,
+    $stream = Bio::SeqIO->new(-file   => $filename,
                               -format => 'GenBank');
 
-    while ( my $seq = $stream->next_seq() ) {
-	    # do something with $seq
+    while ( my $seq = $stream->next_seq ) {
+        # do something with $seq
     }
 
 
@@ -130,15 +130,15 @@ of the Bioperl mailing lists.  Your participation is much appreciated.
   bioperl-l@bioperl.org                  - General discussion
   http://bioperl.org/wiki/Mailing_lists  - About the mailing lists
 
-=head2 Support 
+=head2 Support
 
 Please direct usage questions or support issues to the mailing list:
 
 I<bioperl-l@bioperl.org>
 
-rather than to the module maintainer directly. Many experienced and 
-reponsive experts will be able look at the problem and quickly 
-address it. Please include a thorough description of the problem 
+rather than to the module maintainer directly. Many experienced and
+reponsive experts will be able look at the problem and quickly
+address it. Please include a thorough description of the problem
 with code and data examples if at all possible.
 
 =head2 Reporting Bugs
@@ -146,7 +146,7 @@ with code and data examples if at all possible.
 Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution. Bug reports can be submitted via the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Bioperl Project
 
@@ -232,16 +232,16 @@ our %VALID_ALPHABET = (
 );
 
 sub _initialize {
-    my($self,@args) = @_;
+    my($self, @args) = @_;
 
     $self->SUPER::_initialize(@args);
     # hash for functions for decoding keys.
     $self->{'_func_ftunit_hash'} = {};
     $self->_show_dna(1); # sets this to one by default. People can change it
-    if( ! defined $self->sequence_factory ) {
-            $self->sequence_factory(Bio::Seq::SeqFactory->new
-                            (-verbose => $self->verbose(),
-                             -type => 'Bio::Seq::RichSeq'));
+    if ( not defined $self->sequence_factory ) {
+        $self->sequence_factory
+            (Bio::Seq::SeqFactory->new(-verbose => $self->verbose,
+                                       -type    => 'Bio::Seq::RichSeq'));
     }
 }
 
@@ -256,9 +256,9 @@ sub _initialize {
 =cut
 
 sub next_seq {
-    my ( $self, @args ) = @_;
+    my ($self, @args) = @_;
     my %args    = @args;
-    my $builder = $self->sequence_builder();
+    my $builder = $self->sequence_builder;
     my $seq;
     my %params;
 
@@ -276,29 +276,26 @@ sub next_seq {
         $species    = undef;
         %params     = ( -verbose => $self->verbose );    # reset hash
         local ($/) = "\n";
-        while ( defined( $buffer = $self->_readline() ) ) {
+        while ( defined( $buffer = $self->_readline ) ) {
             last if index( $buffer, 'LOCUS       ' ) == 0;
         }
         return unless defined $buffer;                   # end of file
         $buffer =~ /^LOCUS\s+(\S.*)$/o
-          || $self->throw(
-"GenBank stream with bad LOCUS line. Not GenBank in my book. Got '$buffer'"
-          );
-
+            or $self->throw(  "GenBank stream with bad LOCUS line. "
+                            . "Not GenBank in my book. Got '$buffer'");
         my @tokens = split( ' ', $1 );
 
         # this is important to have the id for display in e.g. FTHelper,
         # otherwise you won't know which entry caused an error
-        $display_id = shift(@tokens);
+        $display_id = shift @tokens;
         $params{'-display_id'} = $display_id;
 
         # may still be useful if we don't want the seq
-        my $seqlength = shift(@tokens);
+        my $seqlength = shift @tokens;
         if ( exists $VALID_ALPHABET{$seqlength} ) {
-
             # moved one token too far.  No locus name?
-            $self->warn(
-"Bad LOCUS name?  Changing [$params{'-display_id'}] to 'unknown' and length to $display_id"
+            $self->warn(  "Bad LOCUS name?  Changing [$params{'-display_id'}] "
+                        . "to 'unknown' and length to '$display_id'"
             );
             $params{'-display_id'} = 'unknown';
             $params{'-length'}     = $display_id;
@@ -310,8 +307,9 @@ sub next_seq {
             $params{'-length'} = $seqlength;
         }
 
-# the alphabet of the entry
-# shouldn't assign alphabet unless one is specifically designated (such as for rc files)
+        # the alphabet of the entry
+        # shouldn't assign alphabet unless one
+        # is specifically designated (such as for rc files)
         my $alphabet = lc( shift @tokens );
         $params{'-alphabet'} =
           ( exists $VALID_ALPHABET{$alphabet} )
@@ -327,32 +325,32 @@ sub next_seq {
         }
 
         # take care of lower case issues
-        if ( $params{'-molecule'} eq 'dna' || $params{'-molecule'} eq 'rna' ) {
+        if ( $params{'-molecule'} eq 'dna' or $params{'-molecule'} eq 'rna' ) {
             $params{'-molecule'} = uc $params{'-molecule'};
         }
-        $self->debug( "Unrecognized molecule type:" . $params{'-molecule'} )
-          if !exists( $VALID_MOLTYPE{ $params{'-molecule'} } );
-        my $circ = shift(@tokens);
+        $self->debug( "Unrecognized molecule type: " . $params{'-molecule'} )
+            if not exists( $VALID_MOLTYPE{ $params{'-molecule'} } );
+
+        my $circ = shift @tokens;
         if ( $circ eq 'circular' ) {
             $params{'-is_circular'} = 1;
-            $params{'-division'}    = shift(@tokens);
+            $params{'-division'}    = shift @tokens;
         }
         else {
             # 'linear' or 'circular' may actually be omitted altogether
             $params{'-division'} =
-              ( CORE::length($circ) == 3 ) ? $circ : shift(@tokens);
+                ( CORE::length($circ) == 3 ) ? $circ : shift @tokens;
         }
         my $date = join( ' ', @tokens );    # we lump together the rest
 
         # this is per request bug #1513
-        # we can handle
+        # we can handle:
         # 9-10-2003
         # 9-10-03
         # 09-10-2003
         # 09-10-03
         if ( $date =~ s/\s*((\d{1,2})-(\w{3})-(\d{2,4})).*/$1/ ) {
             if ( length($date) < 11 ) {
-
                 # improperly formatted date
                 # But we'll be nice and fix it for them
                 my ( $d, $m, $y ) = ( $2, $3, $4 );
@@ -368,8 +366,8 @@ sub next_seq {
                     else {
                         $y = "20$y";
                     }
-                    $self->warn(
-"Date was malformed, guessing the century for $date to be $y\n"
+                    $self->warn(  "Date was malformed, guessing the "
+                                . "century for $date to be $y\n"
                     );
                 }
                 $params{'-dates'} = [ join( '-', $d, $m, $y ) ];
@@ -384,51 +382,56 @@ sub next_seq {
         %params = ();
 
         # parse the rest if desired, otherwise start over
-        if ( !$builder->want_object() ) {
-            $builder->make_object();
+        if ( not $builder->want_object ) {
+            $builder->make_object;
             next RECORDSTART;
         }
 
         # set up annotation depending on what the builder wants
         if ( $builder->want_slot('annotation') ) {
-            $annotation = Bio::Annotation::Collection->new();
+            $annotation = Bio::Annotation::Collection->new;
         }
-        $buffer = $self->_readline();
-        until ( !defined($buffer) ) {
-            $_ = $buffer;
 
+        $buffer = $self->_readline;
+        while ( defined( my $line = $buffer ) ) {
             # Description line(s)
-            if (/^DEFINITION\s+(\S.*\S)/) {
+            if ($line =~ /^DEFINITION\s+(\S.*\S)/) {
                 my @desc = ($1);
-                while ( defined( $_ = $self->_readline ) ) {
-                    if (/^\s+(.*)/) { push( @desc, $1 ); next }
+                while ( defined( $line = $self->_readline ) ) {
+                    if ($line =~ /^\s+(.*)/) {
+                        push( @desc, $1 );
+                        next;
+                    }
                     last;
                 }
                 $builder->add_slot_value( -desc => join( ' ', @desc ) );
 
-                # we'll continue right here because DEFINITION always comes
-                # at the top of the entry
-                $buffer = $_;
+                # we'll continue right here because DEFINITION
+                # always comes at the top of the entry
+                $buffer = $line;
             }
 
             # accession number (there can be multiple accessions)
-            if (/^ACCESSION\s+(\S.*\S)/) {
+            if ($line =~ /^ACCESSION\s+(\S.*\S)/) {
                 push( @acc, split( /\s+/, $1 ) );
-                while ( defined( $_ = $self->_readline ) ) {
-                    /^\s+(.*)/ && do { push( @acc, split( /\s+/, $1 ) ); next };
+                while ( defined( $line = $self->_readline ) ) {
+                    if ($line =~ /^\s+(.*)/) {
+                        push( @acc, split( /\s+/, $1 ) );
+                        next;
+                    }
                     last;
                 }
-                $buffer = $_;
+                $buffer = $line;
                 next;
             }
 
             # PID
-            elsif (/^PID\s+(\S+)/) {
+            elsif ($line =~ /^PID\s+(\S+)/) {
                 $params{'-pid'} = $1;
             }
 
             # Version number
-            elsif (/^VERSION\s+(\S.+)$/) {
+            elsif ($line =~ /^VERSION\s+(\S.+)$/) {
                 my ( $acc, $gi ) = split( ' ', $1 );
                 if ( $acc =~ /^\w+\.(\d+)/ ) {
                     $params{'-version'}     = $1;
@@ -440,29 +443,31 @@ sub next_seq {
             }
 
             # Keywords
-            elsif (/^KEYWORDS\s+(\S.*)/) {
+            elsif ($line =~ /^KEYWORDS\s+(\S.*)/) {
                 my @kw = split( /\s*\;\s*/, $1 );
-                while ( defined( $_ = $self->_readline ) ) {
-                    chomp;
-                    /^\s+(.*)/
-                      && do { push( @kw, split( /\s*\;\s*/, $1 ) ); next };
+                while ( defined( $line = $self->_readline ) ) {
+                    chomp $line;
+                    if ($line =~ /^\s+(.*)/) {
+                        push( @kw, split( /\s*\;\s*/, $1 ) );
+                        next;
+                    }
                     last;
                 }
 
                 @kw && $kw[-1] =~ s/\.$//;
                 $params{'-keywords'} = \@kw;
-                $buffer = $_;
+                $buffer = $line;
                 next;
             }
 
             # Organism name and phylogenetic information
-            elsif (/^SOURCE\s+\S/) {
+            elsif ($line =~ /^SOURCE\s+\S/) {
                 if ( $builder->want_slot('species') ) {
                     $species = $self->_read_GenBank_Species( \$buffer );
                     $builder->add_slot_value( -species => $species );
                 }
                 else {
-                    while ( defined( $buffer = $self->_readline() ) ) {
+                    while ( defined( $buffer = $self->_readline ) ) {
                         last if substr( $buffer, 0, 1 ) ne ' ';
                     }
                 }
@@ -470,7 +475,7 @@ sub next_seq {
             }
 
             # References
-            elsif (/^REFERENCE\s+\S/) {
+            elsif ($line =~ /^REFERENCE\s+\S/) {
                 if ($annotation) {
                     my @refs = $self->_read_GenBank_References( \$buffer );
                     foreach my $ref (@refs) {
@@ -478,7 +483,7 @@ sub next_seq {
                     }
                 }
                 else {
-                    while ( defined( $buffer = $self->_readline() ) ) {
+                    while ( defined( $buffer = $self->_readline ) ) {
                         last if substr( $buffer, 0, 1 ) ne ' ';
                     }
                 }
@@ -486,21 +491,21 @@ sub next_seq {
             }
 
             # Project
-            elsif (/^PROJECT\s+(\S.*)/) {
+            elsif ($line =~ /^PROJECT\s+(\S.*)/) {
                 if ($annotation) {
                     my $project =
-                      Bio::Annotation::SimpleValue->new( -value => $1 );
+                        Bio::Annotation::SimpleValue->new( -value => $1 );
                     $annotation->add_Annotation( 'project', $project );
                 }
             }
 
             # Comments
-            elsif (/^COMMENT\s+(\S.*)/) {
+            elsif ($line =~ /^COMMENT\s+(\S.*)/) {
                 if ($annotation) {
                     my $comment = $1;
-                    while ( defined( $_ = $self->_readline ) ) {
-                        last if (/^\S/);
-                        $comment .= $_;
+                    while ( defined( $line = $self->_readline ) ) {
+                        last if ($line =~ /^\S/);
+                        $comment .= $line;
                     }
                     $comment =~ s/\n/ /g;
                     $comment =~ s/  +/ /g;
@@ -511,10 +516,10 @@ sub next_seq {
                             -tagname => 'comment'
                         )
                     );
-                    $buffer = $_;
+                    $buffer = $line;
                 }
                 else {
-                    while ( defined( $buffer = $self->_readline() ) ) {
+                    while ( defined( $buffer = $self->_readline ) ) {
                         last if substr( $buffer, 0, 1 ) ne ' ';
                     }
                 }
@@ -522,18 +527,18 @@ sub next_seq {
             }
 
             # Corresponding Genbank nucleotide id, Genpept only
-            elsif (/^DB(?:SOURCE|LINK)\s+(\S.+)/) {
+            elsif ($line =~ /^DB(?:SOURCE|LINK)\s+(\S.+)/) {
                 if ($annotation) {
                     my $dbsource = $1;
-                    while ( defined( $_ = $self->_readline ) ) {
-                        last if (/^\S/);
-                        $dbsource .= $_;
+                    while ( defined( $line = $self->_readline ) ) {
+                        last if ($line =~ /^\S/);
+                        $dbsource .= $line;
                     }
 
                     # deal with UniProKB dbsources
                     if ( $dbsource =~
-                        s/(UniProt(?:KB)?|swissprot):\s+locus\s+(\S+)\,.+\n// )
-                    {
+                        s/(UniProt(?:KB)?|swissprot):\s+locus\s+(\S+)\,.+\n//
+                        ) {
                         $annotation->add_Annotation(
                             'dblink',
                             Bio::Annotation::DBLink->new(
@@ -552,9 +557,8 @@ sub next_seq {
                             );
                         }
                         while ( $dbsource =~
-s/\s+(sequence|annotation)\s+updated:\s+([^\.]+)\.\n//g
-                          )
-                        {
+                               s/\s+(sequence|annotation)\s+updated:\s+([^\.]+)\.\n//g
+                            ) {
                             $annotation->add_Annotation(
                                 'swissprot_dates',
                                 Bio::Annotation::SimpleValue->new(
@@ -565,25 +569,21 @@ s/\s+(sequence|annotation)\s+updated:\s+([^\.]+)\.\n//g
                         }
                         $dbsource =~ s/\n/ /g;
                         if ( $dbsource =~
-                            s/\s+xrefs:\s+((?:\S+,\s+)+\S+)\s+xrefs/xrefs/ )
-                        {
+                            s/\s+xrefs:\s+((?:\S+,\s+)+\S+)\s+xrefs/xrefs/
+                            ) {
                             # will use $i to determine even or odd
                             # for swissprot the accessions are paired
                             my $i = 0;
                             for my $dbsrc ( split( /,\s+/, $1 ) ) {
                                 if (   $dbsrc =~ /(\S+)\.(\d+)/
-                                    || $dbsrc =~ /(\S+)/ )
-                                {
+                                    or $dbsrc =~ /(\S+)/
+                                    ) {
                                     my ( $id, $version ) = ( $1, $2 );
                                     $version = '' unless defined $version;
-                                    my $db;
-                                    if ( $id =~ /^\d\S{3}/ ) {
-                                        $db = 'PDB';
-                                    }
-                                    else {
-                                        $db =
-                                          ( $i++ % 2 ) ? 'GenPept' : 'GenBank';
-                                    }
+                                    my $db = ( $id =~ /^\d\S{3}/ ) ? 'PDB'
+                                           : ( $i++ % 2 )          ? 'GenPept'
+                                           : 'GenBank';
+
                                     $annotation->add_Annotation(
                                         'dblink',
                                         Bio::Annotation::DBLink->new(
@@ -596,10 +596,8 @@ s/\s+(sequence|annotation)\s+updated:\s+([^\.]+)\.\n//g
                                 }
                             }
                         }
-                        elsif (
-                            $dbsource =~ s/\s+xrefs:\s+(.+)\s+xrefs/xrefs/i )
-                        {
-                 # download screwed up and ncbi didn't put acc in for gi numbers
+                        elsif ( $dbsource =~ s/\s+xrefs:\s+(.+)\s+xrefs/xrefs/i ) {
+                            # download screwed up and ncbi didn't put acc in for gi numbers
                             my $i = 0;
                             for my $id ( split( /\,\s+/, $1 ) ) {
                                 my ( $acc, $db );
@@ -628,22 +626,20 @@ s/\s+(sequence|annotation)\s+updated:\s+([^\.]+)\.\n//g
                         else {
                             $self->debug("Cannot match $dbsource\n");
                         }
-                        if (
-                            $dbsource =~
-                            s/xrefs\s+\(non\-sequence\s+databases\):\s+
-                ((?:\S+,\s+)+\S+)//x
-                          )
-                        {
+                        if ( $dbsource =~ s/xrefs\s+
+                                            \(non\-sequence\s+databases\):\s+
+                                            ((?:\S+,\s+)+\S+)//x
+                            ) {
                             for my $id ( split( /\,\s+/, $1 ) ) {
                                 my $db;
 
                                 # this is because GenBank dropped the spaces!!!
                                 # I'm sure we're not going to get this right
-                                ##if( $id =~ s/^://i ) {
+                                ##if ( $id =~ s/^://i ) {
                                 ##    $db = $1;
                                 ##}
                                 $db = substr( $id, 0, index( $id, ':' ) );
-                                if ( !exists $DBSOURCE{$db} ) {
+                                if ( not exists $DBSOURCE{$db} ) {
                                     $db = '';    # do we want 'GenBank' here?
                                 }
                                 $id = substr( $id, index( $id, ':' ) + 1 );
@@ -657,12 +653,11 @@ s/\s+(sequence|annotation)\s+updated:\s+([^\.]+)\.\n//g
                                 );
                             }
                         }
-
                     }
                     else {
                         if ( $dbsource =~
-                            /^(\S*?):?\s*accession\s+(\S+)\.(\d+)/ )
-                        {
+                            /^(\S*?):?\s*accession\s+(\S+)\.(\d+)/
+                            ) {
                             my ( $db, $id, $version ) = ( $1, $2, $3 );
                             $annotation->add_Annotation(
                                 'dblink',
@@ -691,10 +686,11 @@ s/\s+(sequence|annotation)\s+updated:\s+([^\.]+)\.\n//g
                             if ( $2 eq ':' ) {
                                 $db = $1;
 
-          # Genbank 192 release notes say this: "The second field can consist of
-          #     multiple comma-separated identifiers, if a sequence record has
-          #     multiple DBLINK cross-references of a given type."
-          #     For example: DBLINK      Project:100,200,300"
+                                # Genbank 192 release notes say this: "The second
+                                # field can consist of multiple comma-separated
+                                # identifiers, if a sequence record has multiple
+                                # DBLINK cross-references of a given type."
+                                # For example: DBLINK      Project:100,200,300"
                                 @ids = split( /,/, $3 );
                             }
                             else {
@@ -719,11 +715,10 @@ s/\s+(sequence|annotation)\s+updated:\s+([^\.]+)\.\n//g
                                 "Unrecognized DBSOURCE data: $dbsource\n");
                         }
                     }
-
-                    $buffer = $_;
+                    $buffer = $line;
                 }
                 else {
-                    while ( defined( $buffer = $self->_readline() ) ) {
+                    while ( defined( $buffer = $self->_readline ) ) {
                         last if substr( $buffer, 0, 1 ) ne ' ';
                     }
                 }
@@ -731,7 +726,10 @@ s/\s+(sequence|annotation)\s+updated:\s+([^\.]+)\.\n//g
             }
 
             # Exit at start of Feature table, or start of sequence
-            last if (/^(FEATURES|ORIGIN)/);
+            if ($line =~ /^(FEATURES|ORIGIN)/) {
+                my $trap;
+            }
+            last if ($line =~ /^(FEATURES|ORIGIN)/);
 
             # Get next line and loop again
             $buffer = $self->_readline;
@@ -748,27 +746,28 @@ s/\s+(sequence|annotation)\s+updated:\s+([^\.]+)\.\n//g
         %params = ();    # reset before possible re-use to avoid setting twice
 
         # start over if we don't want to continue with this entry
-        if ( !$builder->want_object() ) {
-            $builder->make_object();
+        if ( not $builder->want_object ) {
+            $builder->make_object;
             next RECORDSTART;
         }
 
         # some "minimal" formats may not necessarily have a feature table
-        if ( $builder->want_slot('features') && defined($_) && /^FEATURES/o ) {
-
+        if (    $builder->want_slot('features')
+            and defined $buffer
+            and $buffer =~ /^FEATURES/o
+            ) {
             # need to read the first line of the feature table
             $buffer = $self->_readline;
 
-            # DO NOT read lines in the while condition -- this is done as a side
-            # effect in _read_FTHelper_GenBank!
+            # DO NOT read lines in the while condition -- this is done
+            # as a side effect in _read_FTHelper_GenBank!
 
-            #	    part of new circular spec:
-            #	    commented out for now until kinks worked out
+            # part of new circular spec:
+            # commented out for now until kinks worked out
             #my $sourceEnd = 0;
             #$sourceEnd = $2 if ($buffer =~ /(\d+?)\.\.(\d+?)$/);
 
-            while ( defined($buffer) ) {
-
+            while ( defined $buffer ) {
                 # check immediately -- not at the end of the loop
                 # note: GenPept entries obviously do not have a BASE line
                 last if ( $buffer =~ /^BASE|ORIGIN|CONTIG|WGS/o );
@@ -777,12 +776,11 @@ s/\s+(sequence|annotation)\s+updated:\s+([^\.]+)\.\n//g
                 # the next feature will have been read already, so we need
                 # to pass a reference, and the called method must set this
                 # to the last line read before returning
-
                 my $ftunit = $self->_read_FTHelper_GenBank( \$buffer );
 
-                #		implement new circular spec: features that cross the origin are now
-                #		seamless instead of being 2 separate joined features
-                #		commented out until kinks get worked out
+                # implement new circular spec: features that cross the origin are now
+                # seamless instead of being 2 separate joined features
+                # commented out until kinks get worked out
                 #if ((! $args{'-nojoin'}) && $ftunit->{'loc'} =~ /^join\((\d+?)\.\.(\d+?),(\d+?)..(\d+?)\)$/
                 #&& $sourceEnd == $2 && $3 == 1) {
                 #my $start = $1;
@@ -792,37 +790,33 @@ s/\s+(sequence|annotation)\s+updated:\s+([^\.]+)\.\n//g
 
                 # fix suggested by James Diggans
 
-                if ( !defined $ftunit ) {
-
+                if ( not defined $ftunit ) {
                     # GRRRR. We have fallen over. Try to recover
-                    $self->warn( "Unexpected error in feature table for "
-                          . $params{'-display_id'}
-                          . " Skipping feature, attempting to recover" );
-                    unless ( ( $buffer =~ /^\s{5,5}\S+/o )
-                        or ( $buffer =~ /^\S+/o ) )
-                    {
-                        $buffer = $self->_readline();
+                    $self->warn(  "Unexpected error in feature table for "
+                                . $params{'-display_id'}
+                                . " Skipping feature, attempting to recover" );
+
+                    unless (   $buffer =~ /^\s{5,5}\S+/o
+                            or $buffer =~ /^\S+/o
+                        ) {
+                        $buffer = $self->_readline;
                     }
                     next;    # back to reading FTHelpers
                 }
 
                 # process ftunit
                 my $feat =
-                  $ftunit->_generic_seqfeature( $self->location_factory(),
-                    $display_id );
+                    $ftunit->_generic_seqfeature( $self->location_factory,
+                                                  $display_id );
 
                 # add taxon_id from source if available
-                if (
-                       $species
-                    && ( $feat->primary_tag eq 'source' )
-                    && $feat->has_tag('db_xref')
-                    && (
-                        !$species->ncbi_taxid()
-                        || (   $species->ncbi_taxid
-                            && $species->ncbi_taxid =~ /^list/ )
-                    )
-                  )
-                {
+                if (   $species
+                    and $feat->primary_tag eq 'source'
+                    and $feat->has_tag('db_xref')
+                    and (    not $species->ncbi_taxid
+                         or (    $species->ncbi_taxid
+                             and $species->ncbi_taxid =~ /^list/ ) )
+                    ) {
                     foreach my $tagval ( $feat->get_tag_values('db_xref') ) {
                         if ( index( $tagval, "taxon:" ) == 0 ) {
                             $species->ncbi_taxid( substr( $tagval, 6 ) );
@@ -835,17 +829,16 @@ s/\s+(sequence|annotation)\s+updated:\s+([^\.]+)\.\n//g
                 push( @features, $feat );
             }
             $builder->add_slot_value( -features => \@features );
-            $_ = $buffer;
         }
 
-        if ( defined($_) ) {
+        if ( defined $buffer ) {
             # CONTIG lines: TODO, this needs to be cleaned up
-            if (/^CONTIG\s+(.*)/o) {
+            if ($buffer =~/^CONTIG\s+(.*)/o) {
                 my $ctg = $1;
-                while ( defined( $_ = $self->_readline)) {
-                    last if m{^ORIGIN|//}o;
-                    s/\s+(.*)/$1/;
-                    $ctg .= $_;
+                while ( defined( $buffer = $self->_readline ) ) {
+                    last if $buffer =~ m{^ORIGIN|//}o;
+                    $buffer =~ s/\s+(.*)/$1/;
+                    $ctg .= $buffer;
                 }
                 if ($ctg) {
                     $annotation->add_Annotation(
@@ -856,64 +849,63 @@ s/\s+(sequence|annotation)\s+updated:\s+([^\.]+)\.\n//g
                     );
                 }
             }
-            elsif (/^WGS|WGS_SCAFLD\s+/o) {    # catch WGS/WGS_SCAFLD lines
-                while ( $_ =~ s/(^WGS|WGS_SCAFLD)\s+// ) {    # gulp lines
-                    chomp;
+            elsif ($buffer =~ /^WGS|WGS_SCAFLD\s+/o) {    # catch WGS/WGS_SCAFLD lines
+                while ( $buffer =~ s/(^WGS|WGS_SCAFLD)\s+// ) {    # gulp lines
+                    chomp $buffer;
                     $annotation->add_Annotation(
                         Bio::Annotation::SimpleValue->new(
-                            -value   => $_,
-                            -tagname => lc($1)
+                            -value   => $buffer,
+                            -tagname => lc $1
                         )
                     );
-                    $_ = $self->_readline;
+                    $buffer = $self->_readline;
                 }
             }
-            elsif ( !m{^ORIGIN|//}o ) {    # advance to the sequence, if any
-                while ( defined( $_ = $self->_readline ) ) {
-                    last if m{^(ORIGIN|//)};
+            elsif ( $buffer !~ m{^ORIGIN|//}o ) {    # advance to the sequence, if any
+                while ( defined( $buffer = $self->_readline ) ) {
+                    last if $buffer =~ m{^(ORIGIN|//)};
                 }
             }
         }
-        if ( !$builder->want_object() ) {
-            $builder->make_object();        # implicit end-of-object
+        if ( not $builder->want_object ) {
+            $builder->make_object;        # implicit end-of-object
             next RECORDSTART;
         }
         if ( $builder->want_slot('seq') ) {
             # the fact that we want a sequence does not necessarily mean that
             # there also is a sequence ...
-            if ( defined($_) && s/^ORIGIN\s+// ) {
-                if ( $annotation && length($_) > 0 ) {
+            if ( defined $buffer and $buffer =~ s/^ORIGIN\s+// ) {
+                if ( $annotation and length($buffer) > 0 ) {
                     $annotation->add_Annotation(
                         'origin',
                         Bio::Annotation::SimpleValue->new(
                             -tagname => 'origin',
-                            -value   => $_
+                            -value   => $buffer
                         )
                     );
                 }
                 my $seqc = '';
-                while ( defined( $_ = $self->_readline ) ) {
-                    last if m{^//};
-                    $_ = uc($_);
-                    s/[^A-Za-z]//g;
-                    $seqc .= $_;
+                while ( defined( $buffer = $self->_readline ) ) {
+                    last if $buffer =~ m{^//};
+                    $buffer = uc $buffer;
+                    $buffer =~ s/[^A-Za-z]//g;
+                    $seqc .= $buffer;
                 }
 
                 $builder->add_slot_value( -seq => $seqc );
             }
         }
-        elsif ( defined($_) && ( substr( $_, 0, 2 ) ne '//' ) ) {
-
+        elsif ( defined($buffer) and ( substr( $buffer, 0, 2 ) ne '//' ) ) {
             # advance to the end of the record
-            while ( defined( $_ = $self->_readline ) ) {
-                last if substr( $_, 0, 2 ) eq '//';
+            while ( defined( $buffer = $self->_readline ) ) {
+                last if substr( $buffer, 0, 2 ) eq '//';
             }
         }
 
         # Unlikely, but maybe the sequence is so weird that we don't want it
         # anymore. We don't want to return undef if the stream's not exhausted
         # yet.
-        $seq = $builder->make_object();
+        $seq = $builder->make_object;
         next RECORDSTART unless $seq;
         last RECORDSTART;
     }    # end while RECORDSTART
@@ -929,311 +921,317 @@ s/\s+(sequence|annotation)\s+updated:\s+([^\.]+)\.\n//g
  Returns : 1 for success and 0 for error
  Args    : array of 1 to n Bio::SeqI objects
 
-
 =cut
 
 sub write_seq {
     my ($self,@seqs) = @_;
 
     foreach my $seq ( @seqs ) {
-	$self->throw("Attempting to write with no seq!") unless defined $seq;
-
-	if( ! ref $seq || ! $seq->isa('Bio::SeqI') ) {
-	    $self->warn(" $seq is not a SeqI compliant module. Attempting to dump, but may fail!");
-	}
-
-	my $str = $seq->seq;
-
-	my ($div, $mol);
-	my $len = $seq->length();
-
-	if ( $seq->can('division') ) {
-	    $div = $seq->division;
-	}
-	if( !defined $div || ! $div ) { $div = 'UNK'; }
-	my $alpha = $seq->alphabet;
-	if( !$seq->can('molecule') || ! defined ($mol = $seq->molecule()) ) {
-	    $mol =  $alpha || 'DNA';
-	}
-
-	my $circular = 'linear  ';
-	$circular = 'circular' if $seq->is_circular;
-
-	local($^W) = 0;	# supressing warnings about uninitialized fields.
-
-	my $temp_line;
-	if( $self->_id_generation_func ) {
-	    $temp_line = &{$self->_id_generation_func}($seq);
-	} else {
-	    my $date = '';
-	    if( $seq->can('get_dates') ) {
-		($date) = $seq->get_dates();
-	    }
-
-	    $self->warn("No whitespace allowed in GenBank display id [". $seq->display_id. "]")
-		if $seq->display_id =~ /\s/;
-        
-	    $temp_line = sprintf ("%-12s%-15s%13s %s%4s%-8s%-8s %3s %-s\n",
-				  'LOCUS', $seq->id(),$len,
-				  (lc($alpha) eq 'protein') ? ('aa','', '') :
-				  ('bp', '',$mol),$circular,$div,$date);
-	}
-
-	$self->_print($temp_line);
-	$self->_write_line_GenBank_regex("DEFINITION  ", "            ",
-					 $seq->desc(),"\\s\+\|\$",80);
-
-	# if there, write the accession line
-
-	if( $self->_ac_generation_func ) {
-	    $temp_line = &{$self->_ac_generation_func}($seq);
-	    $self->_print("ACCESSION   $temp_line\n");
-	} else {
-	    my @acc = ();
-	    push(@acc, $seq->accession_number());
-	    if( $seq->isa('Bio::Seq::RichSeqI') ) {
-		push(@acc, $seq->get_secondary_accessions());
-	    }
-	    $self->_print("ACCESSION   ", join(" ", @acc), "\n");
-	    # otherwise - cannot print <sigh>
-	}
-
-	# if PID defined, print it
-	if($seq->isa('Bio::Seq::RichSeqI') && $seq->pid()) {
-	    $self->_print("PID         ", $seq->pid(), "\n");
-	}
-
-	# if there, write the version line
-
-	if( defined $self->_sv_generation_func() ) {
-	    $temp_line = &{$self->_sv_generation_func}($seq);
-	    if( $temp_line ) {
-		$self->_print("VERSION     $temp_line\n");
-	    }
-	} else {
-	    if($seq->isa('Bio::Seq::RichSeqI') && defined($seq->seq_version)) {
-		my $id = $seq->primary_id(); # this may be a GI number
-		$self->_print("VERSION     ",
-			      $seq->accession_number(), ".", $seq->seq_version,
-			      ($id && ($id =~ /^\d+$/) ? "  GI:".$id : ""),
-			      "\n");
-	    }
-	}
-    
-    # if there, write the PROJECT line    
-	for my $proj ( $seq->annotation->get_Annotations('project') ) {
-		$self->_print("PROJECT     ".$proj->value."\n");
-    }
+        $self->throw("Attempting to write with no seq!") unless defined $seq;
+
+        if ( not ref $seq or not $seq->isa('Bio::SeqI') ) {
+            $self->warn(" $seq is not a SeqI compliant module. Attempting to dump, but may fail!");
+        }
+
+        my $str   = $seq->seq;
+        my $len   = $seq->length;
+        my $alpha = $seq->alphabet;
+
+        my ($div, $mol);
+        if (   not $seq->can('division')
+            or not defined($div = $seq->division)
+            ) {
+            $div = 'UNK';
+        }
+        if (   not $seq->can('molecule')
+            or not defined ($mol = $seq->molecule)
+           ) {
+            $mol =  $alpha || 'DNA';
+        }
+
+        my $circular = ($seq->is_circular) ? 'circular' : 'linear  ';
+
+        local($^W) = 0; # supressing warnings about uninitialized fields.
+
+        my $temp_line;
+        if ( $self->_id_generation_func ) {
+            $temp_line = &{$self->_id_generation_func}($seq);
+        }
+        else {
+            my $date = '';
+            if ( $seq->can('get_dates') ) {
+                ($date) = $seq->get_dates;
+            }
+
+            $self->warn("No whitespace allowed in GenBank display id [". $seq->display_id. "]")
+                if $seq->display_id =~ /\s/;
+
+            my @data = ( lc($alpha) eq 'protein' ) ? ('aa', '', '') : ('bp', '', $mol);
+            $temp_line = sprintf ("%-12s%-15s%13s %s%4s%-8s%-8s %3s %-s\n",
+                                  'LOCUS', $seq->id, $len,
+                                  @data, $circular, $div, $date);
+        }
+
+        $self->_print($temp_line);
+        $self->_write_line_GenBank_regex("DEFINITION  ", "            ",
+                                         $seq->desc,     "\\s\+\|\$",80);
+
+        # if there, write the accession line
+
+        if ( $self->_ac_generation_func ) {
+            $temp_line = &{$self->_ac_generation_func}($seq);
+            $self->_print("ACCESSION   $temp_line\n");
+        }
+        else {
+            my @acc = ();
+            push @acc, $seq->accession_number;
+            if ( $seq->isa('Bio::Seq::RichSeqI') ) {
+                push @acc, $seq->get_secondary_accessions;
+            }
+            $self->_print("ACCESSION   ", join(" ", @acc), "\n");
+            # otherwise - cannot print <sigh>
+        }
+
+        # if PID defined, print it
+        if ($seq->isa('Bio::Seq::RichSeqI') and $seq->pid) {
+            $self->_print("PID         ", $seq->pid, "\n");
+        }
+
+        # if there, write the version line
+        if ( defined $self->_sv_generation_func ) {
+            $temp_line = &{$self->_sv_generation_func}($seq);
+            if ( $temp_line ) {
+                $self->_print("VERSION     $temp_line\n");
+            }
+        }
+        elsif ($seq->isa('Bio::Seq::RichSeqI') and defined($seq->seq_version)) {
+            my $id = $seq->primary_id; # this may be a GI number
+            my $data = (defined $id and $id =~ /^\d+$/) ? "  GI:$id" : "";
+            $self->_print("VERSION     ",
+                          $seq->accession_number, ".",
+                          $seq->seq_version, $data, "\n");
+        }
+
+        # if there, write the PROJECT line
+        for my $proj ( $seq->annotation->get_Annotations('project') ) {
+            $self->_print("PROJECT     ".$proj->value."\n");
+        }
+
+        # if there, write the DBSOURCE line
+        foreach my $ref ( $seq->annotation->get_Annotations('dblink') ) {
+            my ($db, $id) = ($ref->database, $ref->primary_id);
+            my $prefix = $db eq 'Project' ? 'DBLINK' : 'DBSOURCE';
+            my $text   = $db eq 'GenBank' ? ''
+                       : $db eq 'Project' ? "$db:$id"
+                       : "$db accession $id";
+            $self->_print(sprintf ("%-11s %s\n", $prefix, $text));
+        }
 
-	# if there, write the DBSOURCE line
-	foreach my $ref ( $seq->annotation->get_Annotations('dblink') ) {
-        my ($db, $id) = ($ref->database, $ref->primary_id);
-        my $prefix = $db eq 'Project' ? 'DBLINK' : 'DBSOURCE';
-        my $text =  $db eq 'GenBank' ? ''           :
-                    $db eq 'Project' ? "$db:$id"    :  "$db accession $id";
-	    $self->_print(sprintf ("%-11s %s\n",$prefix, $text));
-	}
-
-	# if there, write the keywords line
-	if( defined $self->_kw_generation_func() ) {
-	    $temp_line = &{$self->_kw_generation_func}($seq);
-	    $self->_print("KEYWORDS    $temp_line\n");
-	} else {
-	    if( $seq->can('keywords') ) {
-		my $kw = $seq->keywords;
-		$kw .= '.' if( $kw !~ /\.$/ );
-		$self->_print("KEYWORDS    $kw\n");
-	    }
-	}
-
-	# SEGMENT if it exists
-	foreach my $ref ( $seq->annotation->get_Annotations('segment') ) {
-	    $self->_print(sprintf ("%-11s %s\n",'SEGMENT',
-				   $ref->value));
-	}
-
-	# Organism lines
-	if (my $spec = $seq->species) {
-	    my ($on, $sn, $cn) = ($spec->can('organelle') ? $spec->organelle : '',
-				  $spec->scientific_name,
-				  $spec->common_name);
-	    my @classification;
-        if ($spec->isa('Bio::Species')) {
-            @classification = $spec->classification;
-    	    shift(@classification);
-        } else {
-            # Bio::Taxon should have a DB handle of some type attached, so
-            # derive the classification from that
-            my $node = $spec;
-            while ($node) {
-                $node = $node->ancestor || last;
-                unshift(@classification, $node->node_name);
-                #$node eq $root && last;
+        # if there, write the keywords line
+        if ( defined $self->_kw_generation_func ) {
+            $temp_line = &{$self->_kw_generation_func}($seq);
+            $self->_print("KEYWORDS    $temp_line\n");
+        }
+        elsif ( $seq->can('keywords') ) {
+            my $kw = $seq->keywords;
+            $kw .= '.' if ( $kw !~ /\.$/ );
+            $self->_print("KEYWORDS    $kw\n");
+        }
+
+        # SEGMENT if it exists
+        foreach my $ref ( $seq->annotation->get_Annotations('segment') ) {
+            $self->_print(sprintf ("%-11s %s\n",'SEGMENT',
+                                   $ref->value));
+        }
+
+        # Organism lines
+        if (my $spec = $seq->species) {
+            my ($on, $sn, $cn) = ($spec->can('organelle') ? $spec->organelle : '',
+                                  $spec->scientific_name,
+                                  $spec->common_name);
+            my @classification;
+            if ($spec->isa('Bio::Species')) {
+                @classification = $spec->classification;
+                shift @classification;
             }
-            @classification = reverse @classification;
+            else {
+                # Bio::Taxon should have a DB handle of some type attached, so
+                # derive the classification from that
+                my $node = $spec;
+                while ($node) {
+                    $node = $node->ancestor || last;
+                    unshift @classification, $node->node_name;
+                    #$node eq $root && last;
+                }
+                @classification = reverse @classification;
+            }
+            my $abname = $spec->name('abbreviated') ? # from genbank file
+                         $spec->name('abbreviated')->[0] : $sn;
+            my $sl = $on ? "$on "          : '';
+            $sl   .= $cn ? "$abname ($cn)" : $abname;
+
+            $self->_write_line_GenBank_regex("SOURCE      ", ' 'x12, $sl, "\\s\+\|\$", 80);
+            $self->_print("  ORGANISM  ", $spec->scientific_name, "\n");
+            my $OC = join('; ', reverse @classification) . '.';
+            $self->_write_line_GenBank_regex(' 'x12,' 'x12, $OC, "\\s\+\|\$", 80);
         }
-	    my $abname = $spec->name('abbreviated') ? # from genbank file
-		$spec->name('abbreviated')->[0] : $sn;
-	    my $sl = $on ? "$on "            : '';
-	    $sl   .= $cn ? $abname." ($cn)" : "$abname";
-
-	    $self->_write_line_GenBank_regex("SOURCE      ", ' 'x12, $sl, "\\s\+\|\$",80);
-	    $self->_print("  ORGANISM  ", $spec->scientific_name, "\n");
-	    my $OC = join('; ', (reverse(@classification))) .'.';
-	    $self->_write_line_GenBank_regex(' 'x12,' 'x12,
-					     $OC,"\\s\+\|\$",80);
-	}
-
-	# Reference lines
-	my $count = 1;
-	foreach my $ref ( $seq->annotation->get_Annotations('reference') ) {
-	    $temp_line = "REFERENCE   $count";
-	    if ($ref->start) {
+
+        # Reference lines
+        my $count = 1;
+        foreach my $ref ( $seq->annotation->get_Annotations('reference') ) {
+            $temp_line = "REFERENCE   $count";
+            if ($ref->start) {
                 $temp_line .= sprintf ("  (%s %d to %d)",
                                        ($seq->alphabet() eq "protein" ?
                                         "residues" : "bases"),
-                                       $ref->start,$ref->end);
-            } elsif ($ref->gb_reference) {
+                                       $ref->start, $ref->end);
+            }
+            elsif ($ref->gb_reference) {
                 $temp_line .= sprintf ("  (%s)", $ref->gb_reference);
             }
-	    $self->_print("$temp_line\n");
-	    $self->_write_line_GenBank_regex("  AUTHORS   ",' 'x12,
-					     $ref->authors,"\\s\+\|\$",80);
-	    $self->_write_line_GenBank_regex("  CONSRTM   ",' 'x12,
-					     $ref->consortium,"\\s\+\|\$",80) if $ref->consortium;
-	    $self->_write_line_GenBank_regex("  TITLE     "," "x12,
-					     $ref->title,"\\s\+\|\$",80);
-	    $self->_write_line_GenBank_regex("  JOURNAL   "," "x12,
-					     $ref->location,"\\s\+\|\$",80);
-	    if( $ref->medline) {
-		$self->_write_line_GenBank_regex("  MEDLINE   "," "x12,
-						 $ref->medline, "\\s\+\|\$",80);
-		# I am assuming that pubmed entries only exist when there
-		# are also MEDLINE entries due to the indentation
-	    }
-	    # This could be a wrong assumption
-	    if( $ref->pubmed ) {
-		$self->_write_line_GenBank_regex("   PUBMED   "," "x12,
-						 $ref->pubmed, "\\s\+\|\$",
-						 80);
-	    }
-	    # put remark at the end
-	    if ($ref->comment) {
-		$self->_write_line_GenBank_regex("  REMARK    "," "x12,
-						 $ref->comment,"\\s\+\|\$",80);
-	    }
-	    $count++;
-	}
-
-	# Comment lines
-	foreach my $comment ( $seq->annotation->get_Annotations('comment') ) {
-	    $self->_write_line_GenBank_regex("COMMENT     "," "x12,
-					     $comment->text,"\\s\+\|\$",80);
-	}
-	$self->_print("FEATURES             Location/Qualifiers\n");
-
-	if( defined $self->_post_sort ) {
-	    # we need to read things into an array. Process. Sort them. Print 'em
-
-	    my $post_sort_func = $self->_post_sort();
-	    my @fth;
-
-	    foreach my $sf ( $seq->top_SeqFeatures ) {
-		push(@fth,Bio::SeqIO::FTHelper::from_SeqFeature($sf,$seq));
-	    }
-
-	    @fth = sort { &$post_sort_func($a,$b) } @fth;
-
-	    foreach my $fth ( @fth ) {
-		$self->_print_GenBank_FTHelper($fth);
-	    }
-	} else {
-	    # not post sorted. And so we can print as we get them.
-	    # lower memory load...
-
-	    foreach my $sf ( $seq->top_SeqFeatures ) {
-		my @fth = Bio::SeqIO::FTHelper::from_SeqFeature($sf,$seq);
-		foreach my $fth ( @fth ) {
-		    if( ! $fth->isa('Bio::SeqIO::FTHelper') ) {
-			$sf->throw("Cannot process FTHelper... $fth");
-		    }
-		    $self->_print_GenBank_FTHelper($fth);
-		}
-	    }
-	}
-
-	# deal with WGS; WGS_SCAFLD present only if WGS is also present
-	if($seq->annotation->get_Annotations('wgs')) {
-	    foreach my $wgs
-		(map {$seq->annotation->get_Annotations($_)} qw(wgs wgs_scaffold)) {
-		    $self->_print(sprintf ("%-11s %s\n",uc($wgs->tagname),
-					   $wgs->value));
-		}
-	    $self->_show_dna(0);
-	}
-	if($seq->annotation->get_Annotations('contig')) {
-	    my $ct = 0;
-	    my $cline;
-	    foreach my $contig ($seq->annotation->get_Annotations('contig')) {
-		unless ($ct) {
-		    $cline = uc($contig->tagname)."      ".$contig->value."\n";
-		} else {
-		    $cline = "            ".$contig->value."\n";
-		}
-		$self->_print($cline);
-		$ct++;
-	    }
-	    $self->_show_dna(0);
-	}
-	if( $seq->length == 0 ) { $self->_show_dna(0) }
-
-	if( $self->_show_dna() == 0 ) {
-	    $self->_print("\n//\n");
-	    return;
-	}
-
-	# finished printing features.
-
-	$str =~ tr/A-Z/a-z/;
-
-	my ($o) = $seq->annotation->get_Annotations('origin');
-	$self->_print(sprintf("%-12s%s\n",
-			      'ORIGIN', $o ? $o->value : ''));
-	# print out the sequence
-	my $nuc = 60;		# Number of nucleotides per line
-	my $whole_pat = 'a10' x 6; # Pattern for unpacking a whole line
-	my $out_pat   = 'A11' x 6; # Pattern for packing a line
-	my $length = length($str);
-
-	# Calculate the number of nucleotides which fit on whole lines
-	my $whole = int($length / $nuc) * $nuc;
-
-	# Print the whole lines
-	my $i;
-	for ($i = 0; $i < $whole; $i += $nuc) {
-	    my $blocks = pack $out_pat,
-	    unpack $whole_pat,
-	    substr($str, $i, $nuc);
-	    chop $blocks;
-	    $self->_print(sprintf("%9d $blocks\n", $i + $nuc - 59));
-	}
-
-	# Print the last line
-	if (my $last = substr($str, $i)) {
-	    my $last_len = length($last);
-	    my $last_pat = 'a10' x int($last_len / 10) .
-		'a'. $last_len % 10;
-	    my $blocks = pack $out_pat,
-	    unpack($last_pat, $last);
-	    $blocks =~ s/ +$//;
-	    $self->_print(sprintf("%9d $blocks\n",
-				  $length - $last_len + 1));
-	}
-
-	$self->_print("//\n");
-
-	$self->flush if $self->_flush_on_write && defined $self->_fh;
-	return 1;
+            $self->_print("$temp_line\n");
+            $self->_write_line_GenBank_regex("  AUTHORS   ", ' 'x12,
+                                             $ref->authors,    "\\s\+\|\$", 80);
+            $self->_write_line_GenBank_regex("  CONSRTM   ", ' 'x12,
+                                             $ref->consortium, "\\s\+\|\$", 80) if $ref->consortium;
+            $self->_write_line_GenBank_regex("  TITLE     ", ' 'x12,
+                                             $ref->title,      "\\s\+\|\$", 80);
+            $self->_write_line_GenBank_regex("  JOURNAL   ", ' 'x12,
+                                             $ref->location,   "\\s\+\|\$", 80);
+            if ( $ref->medline) {
+                $self->_write_line_GenBank_regex("  MEDLINE   ", ' 'x12,
+                                                 $ref->medline,  "\\s\+\|\$", 80);
+                # I am assuming that pubmed entries only exist when there
+                # are also MEDLINE entries due to the indentation
+            }
+            # This could be a wrong assumption
+            if ( $ref->pubmed ) {
+                $self->_write_line_GenBank_regex("   PUBMED   ", ' 'x12,
+                                                 $ref->pubmed,   "\\s\+\|\$", 80);
+            }
+            # put remark at the end
+            if ($ref->comment) {
+                $self->_write_line_GenBank_regex("  REMARK    ", ' 'x12,
+                                                 $ref->comment,  "\\s\+\|\$", 80);
+            }
+            $count++;
+        }
+
+        # Comment lines
+        foreach my $comment ( $seq->annotation->get_Annotations('comment') ) {
+            $self->_write_line_GenBank_regex("COMMENT     ", ' 'x12,
+                                             $comment->text, "\\s\+\|\$", 80);
+        }
+
+        # FEATURES section
+        $self->_print("FEATURES             Location/Qualifiers\n");
+
+        if ( defined $self->_post_sort ) {
+            # we need to read things into an array. Process. Sort them. Print 'em
+            my $post_sort_func = $self->_post_sort;
+            my @fth;
+
+            foreach my $sf ( $seq->top_SeqFeatures ) {
+                push @fth, Bio::SeqIO::FTHelper::from_SeqFeature($sf, $seq);
+            }
+
+            @fth = sort { &$post_sort_func($a, $b) } @fth;
+
+            foreach my $fth ( @fth ) {
+                $self->_print_GenBank_FTHelper($fth);
+            }
+        }
+        else {
+            # not post sorted. And so we can print as we get them.
+            # lower memory load...
+            foreach my $sf ( $seq->top_SeqFeatures ) {
+                my @fth = Bio::SeqIO::FTHelper::from_SeqFeature($sf, $seq);
+                foreach my $fth ( @fth ) {
+                    if ( ! $fth->isa('Bio::SeqIO::FTHelper') ) {
+                        $sf->throw("Cannot process FTHelper... $fth");
+                    }
+                    $self->_print_GenBank_FTHelper($fth);
+                }
+            }
+        }
+
+        # deal with WGS; WGS_SCAFLD present only if WGS is also present
+        if ($seq->annotation->get_Annotations('wgs')) {
+            foreach my $wgs (map {$seq->annotation->get_Annotations($_)}
+                             qw(wgs wgs_scaffold)
+                ) {
+                $self->_print(sprintf ("%-11s %s\n",
+                                       uc($wgs->tagname),
+                                       $wgs->value));
+            }
+            $self->_show_dna(0);
+        }
+        if ($seq->annotation->get_Annotations('contig')) {
+            my $ct = 0;
+            my $cline;
+            foreach my $contig ($seq->annotation->get_Annotations('contig')) {
+                unless ($ct) {
+                    $cline = uc($contig->tagname) . "      " . $contig->value . "\n";
+                }
+                else {
+                    $cline = "            " . $contig->value . "\n";
+                }
+                $self->_print($cline);
+                $ct++;
+            }
+            $self->_show_dna(0);
+        }
+        if ( $seq->length == 0 ) {
+            $self->_show_dna(0);
+        }
+
+        if ( $self->_show_dna == 0 ) {
+            $self->_print("\n//\n");
+            return;
+        }
+
+        # finished printing features.
+
+        $str =~ tr/A-Z/a-z/;
+
+        my ($o) = $seq->annotation->get_Annotations('origin');
+        $self->_print(sprintf("%-12s%s\n",
+                              'ORIGIN', $o ? $o->value : ''));
+        # print out the sequence
+        my $nuc = 60;           # Number of nucleotides per line
+        my $whole_pat = 'a10' x 6; # Pattern for unpacking a whole line
+        my $out_pat   = 'A11' x 6; # Pattern for packing a line
+        my $length = length $str;
+
+        # Calculate the number of nucleotides which fit on whole lines
+        my $whole = int($length / $nuc) * $nuc;
+
+        # Print the whole lines
+        my $i;
+        for ($i = 0; $i < $whole; $i += $nuc) {
+            my $blocks = pack $out_pat,
+            unpack $whole_pat,
+            substr($str, $i, $nuc);
+            chop $blocks;
+            $self->_print(sprintf("%9d $blocks\n", $i + $nuc - 59));
+        }
+
+        # Print the last line
+        if (my $last = substr($str, $i)) {
+            my $last_len = length($last);
+            my $last_pat = 'a10' x int($last_len / 10)
+                         . 'a' . $last_len % 10;
+            my $blocks = pack $out_pat,
+            unpack($last_pat, $last);
+            $blocks =~ s/ +$//;
+            $self->_print(sprintf("%9d $blocks\n",
+                                  $length - $last_len + 1));
+        }
+
+        $self->_print("//\n");
+
+        $self->flush if $self->_flush_on_write && defined $self->_fh;
+        return 1;
     }
 }
 
@@ -1246,43 +1244,61 @@ sub write_seq {
  Returns :
  Args    :
 
-
 =cut
 
 sub _print_GenBank_FTHelper {
-    my ($self,$fth) = @_;
+    my ( $self, $fth ) = @_;
 
-    if( ! ref $fth || ! $fth->isa('Bio::SeqIO::FTHelper') ) {
-	$fth->warn("$fth is not a FTHelper class. Attempting to print, but there could be tears!");
+    if ( not ref $fth or not $fth->isa('Bio::SeqIO::FTHelper') ) {
+        $fth->warn(
+            "$fth is not a FTHelper class. Attempting to print but there could be issues"
+        );
     }
-    my $spacer = (length $fth->key >= 15) ? ' ' : '';
-    $self->_write_line_GenBank_regex(sprintf("     %-16s%s",$fth->key,$spacer),
-				     " "x21,
-				     $fth->loc,"\,\|\$",80);
-    foreach my $tag ( keys %{$fth->field} ) {
-	foreach my $value ( @{$fth->field->{$tag}} ) {
-	    $value =~ s/\"/\"\"/g;
-	    if ($value eq "_no_value") {
-		$self->_write_line_GenBank_regex(" "x21,
-						 " "x21,
-						 "/$tag","\.\|\$",80);
-	    }
-	    # there are almost 3x more quoted qualifier values and they
-	    # are more common too so we take quoted ones first
-            #
-            # Long qualifiers, that will be line wrapped, are always quoted
-	    elsif (!$FTQUAL_NO_QUOTE{$tag} or length("/$tag=$value") >= $FTQUAL_LINE_LENGTH) {
-		my ($pat) = ($value =~ /\s/ ? '\s|$' : '.|$');
-		$self->_write_line_GenBank_regex(" "x21,
-						 " "x21,
-						 "/$tag=\"$value\"",$pat,80);
-
-	    } else {
-		$self->_write_line_GenBank_regex(" "x21,
-						 " "x21,
-						 "/$tag=$value","\.\|\$",80);
-	    }
-	}
+
+    my $spacer = ( length $fth->key >= 15 ) ? ' ' : '';
+    $self->_write_line_GenBank_regex(
+        sprintf( "     %-16s%s", $fth->key, $spacer ),
+                 " " x 21, $fth->loc, "\,\|\$", 80 );
+
+    foreach my $tag ( keys %{ $fth->field } ) {
+        # Account for hash structure in Annotation::DBLink, not the expected array
+        if ( $tag eq 'db_xref' and grep /HASH/, @{ $fth->field->{$tag} }) {
+            for my $ref ( @{ $fth->field->{$tag} } ) {
+                my $db = $ref->{'database'};
+                my $id = $ref->{'primary_id'};
+                $self->_write_line_GenBank_regex
+                    ( " " x 21, " " x 21,
+                      "/$tag=\"$db:$id\"", "\.\|\$", 80 );
+            }
+        }
+        # The usual case, where all values are found in an array
+        else {
+            foreach my $value ( @{ $fth->field->{$tag} } ) {
+                $value =~ s/\"/\"\"/g;
+                if ( $value eq "_no_value" ) {
+                    $self->_write_line_GenBank_regex
+                        ( " " x 21, " " x 21,
+                          "/$tag", "\.\|\$", 80 );
+                }
+
+               # There are almost 3x more quoted qualifier values and they
+               # are more common too so we take quoted ones first.
+               # Long qualifiers, that will be line wrapped, are always quoted
+                elsif (   not $FTQUAL_NO_QUOTE{$tag}
+                       or length("/$tag=$value") >= $FTQUAL_LINE_LENGTH
+                    ) {
+                    my ($pat) = ( $value =~ /\s/ ? '\s|$' : '.|$' );
+                    $self->_write_line_GenBank_regex
+                        ( " " x 21, " " x 21,
+                          "/$tag=\"$value\"", $pat, 80 );
+                }
+                else {
+                    $self->_write_line_GenBank_regex
+                        ( " " x 21, " " x 21,
+                          "/$tag=$value", "\.\|\$", 80 );
+                }
+            }
+        }
     }
 }
 
@@ -1297,155 +1313,177 @@ sub _print_GenBank_FTHelper {
 =cut
 
 sub _read_GenBank_References {
-    my ($self,$buffer) = @_;
+    my ($self, $buffer) = @_;
     my (@refs);
     my $ref;
 
     # assumme things are starting with RN
-
-    if( $$buffer !~ /^REFERENCE/ ) {
-	warn("Not parsing line '$$buffer' which maybe important");
+    if ( $$buffer !~ /^REFERENCE/ ) {
+        warn("Not parsing line '$$buffer' which maybe important");
     }
 
-    $_ = $$buffer;
+    my $line = $$buffer;
 
     my (@title,@loc,@authors,@consort,@com,@medline,@pubmed);
 
-  REFLOOP: while( defined($_) || defined($_ = $self->_readline) ) {
-      if (/^\s{2}AUTHORS\s+(.*)/o) {
-	  push (@authors, $1);
-	  while ( defined($_ = $self->_readline) ) {
-	      /^\s{9,}(.*)/o && do { push (@authors, $1);next;};
-	      last;
-	  }
-	  $ref->authors(join(' ', @authors));
-      }
-      if (/^\s{2}CONSRTM\s+(.*)/o) {
-	  push (@consort, $1);
-	  while ( defined($_ = $self->_readline) ) {
-	      /^\s{9,}(.*)/o && do { push (@consort, $1);next;};
-	      last;
-	  }
-	  $ref->consortium(join(' ', @consort));
-      }
-      if (/^\s{2}TITLE\s+(.*)/o)  {
-	  push (@title, $1);
-	  while ( defined($_ = $self->_readline) ) {
-	      /^\s{9,}(.*)/o && do { push (@title, $1);
-				     next;
-				 };
-	      last;
-	  }
-	  $ref->title(join(' ', @title));
-      }
-      if (/^\s{2}JOURNAL\s+(.*)/o) {
-	  push(@loc, $1);
-	  while ( defined($_ = $self->_readline) ) {
-	      # we only match when there are at least 4 spaces
-	      # there is probably a better way to match this
-	      # as it assumes that the describing tag is short enough
-	      /^\s{9,}(.*)/o && do { push(@loc, $1);
-				     next;
-				 };
-	      last;
-	  }
-	  $ref->location(join(' ', @loc));
-	  redo REFLOOP;
-      }
-      if (/^\s{2}REMARK\s+(.*)/o) {
-	  push (@com, $1);
-	  while ( defined($_ = $self->_readline) ) {
-	      /^\s{9,}(.*)/o && do { push(@com, $1);
-				     next;
-				 };
-	      last;
-	  }
-	  $ref->comment(join(' ', @com));
-	  redo REFLOOP;
-      }
-      if( /^\s{2}MEDLINE\s+(.*)/ ) {
-	  push(@medline,$1);
-	  while ( defined($_ = $self->_readline) ) {
-	      /^\s{9,}(.*)/ && do { push(@medline, $1);
-				    next;
-				};
-	      last;
-	  }
-	  $ref->medline(join(' ', @medline));
-	  redo REFLOOP;
-      }
-      if( /^\s{3}PUBMED\s+(.*)/ ) {
-	  push(@pubmed,$1);
-	  while ( defined($_ = $self->_readline) ) {
-	      /^\s{9,}(.*)/ && do { push(@pubmed, $1);
-				    next;
-				};
-	      last;
-	  }
-	  $ref->pubmed(join(' ', @pubmed));
-	  redo REFLOOP;
-      }
-
-      /^REFERENCE/o && do {
-	  # store current reference
-	  $self->_add_ref_to_array(\@refs,$ref) if defined $ref;
-	  # reset
-	  @authors = ();
-	  @title = ();
-	  @loc = ();
-	  @com = ();
-	  @pubmed = ();
-	  @medline = ();
-	  # create the new reference object
-	  $ref = Bio::Annotation::Reference->new(-tagname => 'reference');
-	  # check whether start and end base is given
-	  if (/^REFERENCE\s+\d+\s+\([a-z]+ (\d+) to (\d+)\)/){
-	      $ref->start($1);
-	      $ref->end($2);
-	  } elsif (/^REFERENCE\s+\d+\s+\((.*)\)/) {
-	      $ref->gb_reference($1);
-	  }
-      };
-
-      /^(FEATURES)|(COMMENT)/o && last;
-
-      $_ = undef;	       # Empty $_ to trigger read of next line
-  }
+  REFLOOP:
+    while( defined($line) or defined($line = $self->_readline) ) {
+        if ($line =~ /^\s{2}AUTHORS\s+(.*)/o) {
+            push @authors, $1;
+            while ( defined($line = $self->_readline) ) {
+                if ($line =~ /^\s{9,}(.*)/o) {
+                    push @authors, $1;
+                    next;
+                }
+                last;
+            }
+            $ref->authors(join(' ', @authors));
+        }
+
+        if ($line =~ /^\s{2}CONSRTM\s+(.*)/o) {
+            push @consort, $1;
+            while ( defined($line = $self->_readline) ) {
+                if ($line =~ /^\s{9,}(.*)/o) {
+                    push @consort, $1;
+                    next;
+                }
+                last;
+            }
+            $ref->consortium(join(' ', @consort));
+        }
+
+        if ($line =~ /^\s{2}TITLE\s+(.*)/o) {
+            push @title, $1;
+            while ( defined($line = $self->_readline) ) {
+                if ($line =~ /^\s{9,}(.*)/o) {
+                    push @title, $1;
+                    next;
+                }
+                last;
+            }
+            $ref->title(join(' ', @title));
+        }
+
+        if ($line =~ /^\s{2}JOURNAL\s+(.*)/o) {
+            push @loc, $1;
+            while ( defined($line = $self->_readline) ) {
+                # we only match when there are at least 4 spaces
+                # there is probably a better way to match this
+                # as it assumes that the describing tag is short enough
+                if ($line =~ /^\s{9,}(.*)/o) {
+                    push @loc, $1;
+                    next;
+                }
+                last;
+            }
+            $ref->location(join(' ', @loc));
+            redo REFLOOP;
+        }
+
+        if ($line =~ /^\s{2}REMARK\s+(.*)/o) {
+            push @com, $1;
+            while ( defined($line = $self->_readline) ) {
+                if ($line =~ /^\s{9,}(.*)/o) {
+                    push @com, $1;
+                    next;
+                }
+                last;
+            }
+            $ref->comment(join(' ', @com));
+            redo REFLOOP;
+        }
+
+        if ( $line =~ /^\s{2}MEDLINE\s+(.*)/ ) {
+            push @medline, $1;
+            while ( defined($line = $self->_readline) ) {
+                if ($line =~ /^\s{9,}(.*)/) {
+                    push @medline, $1;
+                    next;
+                }
+                last;
+            }
+            $ref->medline(join(' ', @medline));
+            redo REFLOOP;
+        }
+
+        if ( $line =~ /^\s{3}PUBMED\s+(.*)/ ) {
+            push @pubmed, $1;
+            while ( defined($line = $self->_readline) ) {
+                if ($line =~ /^\s{9,}(.*)/) {
+                    push @pubmed, $1;
+                    next;
+                }
+                last;
+            }
+            $ref->pubmed(join(' ', @pubmed));
+            redo REFLOOP;
+        }
+
+        if ( $line =~ /^REFERENCE/o ) {
+            # store current reference
+            $self->_add_ref_to_array(\@refs,$ref) if defined $ref;
+
+            # reset
+            @authors = ();
+            @title   = ();
+            @loc     = ();
+            @com     = ();
+            @pubmed  = ();
+            @medline = ();
+
+            # create the new reference object
+            $ref = Bio::Annotation::Reference->new(-tagname => 'reference');
+
+            # check whether start and end base is given
+            if ($line =~ /^REFERENCE\s+\d+\s+\([a-z]+ (\d+) to (\d+)\)/){
+                $ref->start($1);
+                $ref->end($2);
+            }
+            elsif ($line =~ /^REFERENCE\s+\d+\s+\((.*)\)/) {
+                $ref->gb_reference($1);
+            }
+        }
+
+        last if ($line =~ /^(FEATURES)|(COMMENT)/o);
+
+        $line = undef; # Empty $line to trigger read of next line
+    }
 
     # store last reference
-    $self->_add_ref_to_array(\@refs,$ref) if defined $ref;
+    $self->_add_ref_to_array(\@refs, $ref) if defined $ref;
 
-    $$buffer = $_;
+    $$buffer = $line;
 
     #print "\nnumber of references found: ", $#refs+1,"\n";
 
     return @refs;
 }
 
-#
-# This is undocumented as it shouldn't be called by anywhere else as
-# read_GenBank_References. For those who still want to know:
-#
-# Purpose: adds a Reference object to an array of Reference objects, takes
-#     care of possible cleanups to be done (currently, only author and title
-#     will be chopped of trailing semicolons).
-# Parameters:
-#     a reference to an array of Reference objects
-#     the Reference object to be added
-# Returns: nothing
-#
+=head2 _add_ref_to_array
+
+Title: _add_ref_to_array
+Usage:
+Function: Adds a Reference object to an array of Reference objects, takes
+          care of possible cleanups to be done (currently, only author and title
+          will be chopped of trailing semicolons).
+Args:     A reference to an array of Reference objects and
+          the Reference object to be added
+Returns: nothing
+
+=cut
+
 sub _add_ref_to_array {
     my ($self, $refs, $ref) = @_;
 
     # first, polish author and title by removing possible trailing semicolons
-    my $au = $ref->authors();
-    my $title = $ref->title();
-    $au =~ s/;\s*$//g if $au;
+    my $au    = $ref->authors;
+    my $title = $ref->title;
+    $au    =~ s/;\s*$//g if $au;
     $title =~ s/;\s*$//g if $title;
     $ref->authors($au);
     $ref->title($title);
     # the rest should be clean already, so go ahead and add it
-    push(@{$refs}, $ref);
+    push @{$refs}, $ref;
 }
 
 =head2 _read_GenBank_Species
@@ -1484,99 +1522,109 @@ sub _read_GenBank_Species {
     my ($self, $buffer) = @_;
 
     my @unkn_names = ('other', 'unknown organism', 'not specified', 'not shown',
-		      'Unspecified', 'Unknown', 'None', 'unclassified',
-		      'unidentified organism', 'not supplied');
+                      'Unspecified', 'Unknown', 'None', 'unclassified',
+                      'unidentified organism', 'not supplied');
     # dictionary of synonyms for taxid 32644
-    my @unkn_genus = ('unknown','unclassified','uncultured','unidentified');
+    my @unkn_genus = ('unknown', 'unclassified', 'uncultured', 'unidentified');
     # all above can be part of valid species name
 
     my $line = $$buffer;
 
-    my( $sub_species, $species, $genus, $sci_name, $common, $class_lines,
-        $source_flag, $abbr_name, $organelle, $sl );
+    my( $sub_species, $species, $genus, $sci_name, $common,
+        $class_lines, $source_flag, $abbr_name, $organelle, $sl );
     my %source = map { $_ => 1 } qw(SOURCE ORGANISM CLASSIFICATION);
+
     # upon first entering the loop, we must not read a new line -- the SOURCE
     # line is already in the buffer (HL 05/10/2000)
     my ($ann, $tag, $data);
-    while (defined($line) || defined($line = $self->_readline())) {
+    while (defined($line) or defined($line = $self->_readline)) {
         # de-HTMLify (links that may be encountered here don't contain
         # escaped '>', so a simple-minded approach suffices)
         $line =~ s{<[^>]+>}{}g;
         if ($line =~ m{^(?:\s{0,2})(\w+)\s+(.+)?$}ox) {
             ($tag, $data) = ($1, $2 || '');
-            last if ($tag && !exists $source{$tag});            
-        } else {
+            last if ($tag and not exists $source{$tag});
+        }
+        else {
             return unless $tag;
             ($data = $line) =~ s{^\s+}{};
             chomp $data;
-            $tag = 'CLASSIFICATION' if ($tag ne 'CLASSIFICATION' && $tag eq 'ORGANISM' &&  $line =~ m{[;\.]+});
+            $tag = 'CLASSIFICATION' if (    $tag ne 'CLASSIFICATION'
+                                        and $tag eq 'ORGANISM'
+                                        # Don't match "str." or "var." (NC_021815)
+                                        and  $line =~ m{(?<!\bstr|\bvar)[;\.]+});
         }
         (exists $ann->{$tag}) ? ($ann->{$tag} .= ' '.$data) : ($ann->{$tag} .= $data);
-        $line = undef;        
+        $line = undef;
     }
-    
+
     ($sl, $class_lines, $sci_name) = ($ann->{SOURCE}, $ann->{CLASSIFICATION}, $ann->{ORGANISM});
-    
+
     $$buffer = $line;
 
-    $sci_name || return;
+    $sci_name or return;
 
     # parse out organelle, common name, abbreviated name if present;
     # this should catch everything, but falls back to
     # entire SOURCE line just in case
-    if ($sl =~ m{^
-		     (mitochondrion|chloroplast|plastid)?
-		     \s*(.*?)
-		     \s*(?: \( (.*?) \) )?\.?
-		     $ 
-		 }xms ){ 
+    if ($sl =~ m{^(mitochondrion|chloroplast|plastid)?
+                  \s*(.*?)
+                  \s*(?: \( (.*?) \) )?\.?
+                  $
+                 }xms
+        ) {
         ($organelle, $abbr_name, $common) = ($1, $2, $3); # optional
-    } else {
-        $abbr_name = $sl;	# nothing caught; this is a backup!
+    }
+    else {
+        $abbr_name = $sl; # nothing caught; this is a backup!
     }
 
     # Convert data in classification lines into classification array.
     # only split on ';' or '.' so that classification that is 2 or more words will
     # still get matched, use map() to remove trailing/leading/intervening spaces
-    my @class = map { s/^\s+//; s/\s+$//; s/\s{2,}/ /g; $_; } split /(?<!subgen)[;\.]+/, $class_lines;
+    my @class = map { $_ =~ s/^\s+//;
+                      $_ =~ s/\s+$//;
+                      $_ =~ s/\s{2,}/ /g;
+                      $_; }
+                split /(?<!subgen)[;\.]+/, $class_lines;
 
     # do we have a genus?
     my $possible_genus =  quotemeta($class[-1])
-       . ($class[-2] ? "|" . quotemeta($class[-2]) : '');
+                       . ($class[-2] ? "|" . quotemeta($class[-2]) : '');
     if ($sci_name =~ /^($possible_genus)/) {
-	$genus = $1;
-	($species) = $sci_name =~ /^$genus\s+(.+)/;
+        $genus = $1;
+        ($species) = $sci_name =~ /^$genus\s+(.+)/;
     }
     else {
-	$species = $sci_name;
+        $species = $sci_name;
     }
 
     # is this organism of rank species or is it lower?
     # (we don't catch everything lower than species, but it doesn't matter -
     # this is just so we abide by previous behaviour whilst not calling a
     # species a subspecies)
-    if ($species && $species =~ /(.+)\s+((?:subsp\.|var\.).+)/) {
+    if ($species and $species =~ /(.+)\s+((?:subsp\.|var\.).+)/) {
         ($species, $sub_species) = ($1, $2);
     }
 
     # Don't make a species object if it's empty or "Unknown" or "None"
     # return unless $genus and  $genus !~ /^(Unknown|None)$/oi;
     # Don't make a species object if it belongs to taxid 32644
-#	my $unkn = grep { $_ =~ /^\Q$sl\E$/; } @unkn_names;
+#    my $unkn = grep { $_ =~ /^\Q$sl\E$/; } @unkn_names;
     my $unkn = grep { $_ eq $sl } @unkn_names;
-    return unless ($species || $genus) and $unkn == 0;
+    return unless (defined $species or defined $genus) and $unkn == 0;
 
     # Bio::Species array needs array in Species -> Kingdom direction
-    push(@class, $sci_name);
+    push @class, $sci_name;
     @class = reverse @class;
 
-    my $make = Bio::Species->new();
+    my $make = Bio::Species->new;
     $make->scientific_name($sci_name);
-    $make->classification(@class) if @class > 0;
-    $make->common_name( $common ) if $common;
+    $make->classification(@class)          if @class > 0;
+    $make->common_name( $common )          if $common;
     $make->name('abbreviated', $abbr_name) if $abbr_name;
-    $make->organelle($organelle) if $organelle;
-    #$make->sub_species( $sub_species ) if $sub_species;
+    $make->organelle($organelle)           if $organelle;
+    #$make->sub_species( $sub_species )     if $sub_species;
     return $make;
 }
 
@@ -1592,56 +1640,60 @@ sub _read_GenBank_Species {
 =cut
 
 sub _read_FTHelper_GenBank {
-    my ($self,$buffer) = @_;
+    my ($self, $buffer) = @_;
 
-    my ($key,			# The key of the feature
-	$loc			# The location line from the feature
-	);
-    my @qual = ();	  # An array of lines making up the qualifiers
+    my ($key, # The key of the feature
+        $loc  # The location line from the feature
+    );
+    my @qual = (); # An array of lines making up the qualifiers
 
     if ($$buffer =~ /^\s{5}(\S+)\s+(.+?)\s*$/o) {
-	$key = $1;
-	$loc = $2;
-	# Read all the lines up to the next feature
-	while ( defined($_ = $self->_readline) ) {
-	    if (/^(\s+)(.+?)\s*$/o) {
-				# Lines inside features are preceded by 21 spaces
-				# A new feature is preceded by 5 spaces
-		if (length($1) > 6) {
-		    # Add to qualifiers if we're in the qualifiers, or if it's
-		    # the first qualifier
-		    if (@qual || (index($2,'/') == 0)) {
-			push(@qual, $2);
-		    }
-		    # We're still in the location line, so append to location
-		    else {
-			$loc .= $2;
-		    }
-		} else {
-		    # We've reached the start of the next feature
-		    last;
-		}
-	    } else {
-				# We're at the end of the feature table
-		last;
-	    }
-	}
-    } else {
-	# No feature key
-	$self->debug("no feature key!\n");
-	# change suggested by JDiggans to avoid infinite loop-
-	# see bugreport 1062.
-	# reset buffer to prevent infinite loop
-	$$buffer = $self->_readline();
-	return;
+        $key = $1;
+        $loc = $2;
+        # Read all the lines up to the next feature
+        while ( defined(my $line = $self->_readline) ) {
+            if ($line =~ /^(\s+)(.+?)\s*$/o) {
+                # Lines inside features are preceded by 21 spaces
+                # A new feature is preceded by 5 spaces
+                if (length($1) > 6) {
+                    # Add to qualifiers if we're in the qualifiers, or if it's
+                    # the first qualifier
+                    if (@qual or (index($2,'/') == 0)) {
+                        push @qual, $2;
+                    }
+                    # We're still in the location line, so append to location
+                    else {
+                        $loc .= $2;
+                    }
+                }
+                else {
+                    # We've reached the start of the next feature
+                    # Put the first line of the next feature into the buffer
+                    $$buffer = $line;
+                    last;
+                }
+            }
+            else {
+                # We're at the end of the feature table
+                # Put the first line of the next feature into the buffer
+                $$buffer = $line;
+                last;
+            }
+        }
+    }
+    else {
+        # No feature key
+        $self->debug("no feature key!\n");
+        # change suggested by JDiggans to avoid infinite loop-
+        # see bugreport 1062.
+        # reset buffer to prevent infinite loop
+        $$buffer = $self->_readline;
+        return;
     }
-
-    # Put the first line of the next feature into the buffer
-    $$buffer = $_;
 
     # Make the new FTHelper object
-    my $out = Bio::SeqIO::FTHelper->new();
-    $out->verbose($self->verbose());
+    my $out = Bio::SeqIO::FTHelper->new;
+    $out->verbose($self->verbose);
     $out->key($key);
     $out->loc($loc);
 
@@ -1649,68 +1701,72 @@ sub _read_FTHelper_GenBank {
     # intact to provide informative error messages.)
   QUAL:
     for (my $i = 0; $i < @qual; $i++) {
-	$_ = $qual[$i];
-	my( $qualifier, $value ) = (m{^/([^=]+)(?:=(.+))?})
-	    or $self->warn("cannot see new qualifier in feature $key: ".
-			   $qual[$i]);
-	$qualifier = '' unless( defined $qualifier);
-	if (defined $value) {
-	    # Do we have a quoted value?
-	    if (substr($value, 0, 1) eq '"') {
-				# Keep adding to value until we find the trailing quote
-				# and the quotes are balanced
-		while ($value !~ /\"$/ or $value =~ tr/"/"/ % 2) {
-		    if($i >= $#qual) {
-			$self->warn("Unbalanced quote in:\n" .
-				    join("\n", @qual) .
-				    "No further qualifiers will " .
-				    "be added for this feature");
-			last QUAL;
-		    }
-		    $i++; # modifying a for-loop variable inside of the loop
-		    # is not the best programming style ...
-		    my $next = $qual[$i];
-
-		    # add to value with a space unless the value appears
-		    # to be a sequence (translation for example)
-		    # if(($value.$next) =~ /[^A-Za-z\"\-]/o) {
-		    # changed to explicitly look for translation tag - cjf 06/8/29
-		    if ($qualifier !~ /^translation$/i ) {
-			$value .= " ";
-		    }
-		    $value .= $next;
-		}
-				# Trim leading and trailing quotes
-		$value =~ s/^"|"$//g;
-				# Undouble internal quotes
-		$value =~ s/""/\"/g;
-	    } elsif ( $value =~ /^\(/ ) { # values quoted by ()s
-				# Keep adding to value until we find the trailing bracket
-				# and the ()s are balanced
-		my $left = ($value =~ tr/\(/\(/); # count left parens
-		my $right = ($value =~ tr/\)/\)/); # count right parens
-
-		while( $left != $right ) { # was "$value !~ /\)$/ or $left != $right"
-		    if( $i >= $#qual) {
-			$self->warn("Unbalanced parens in:\n".
-				    join("\n", @qual).
-				    "\nNo further qualifiers will ".
-				    "be added for this feature");
-			last QUAL;
-		    }
-		    $i++;
-		    my $next = $qual[$i];
-		    $value .= $next;
-		    $left += ($next =~ tr/\(/\(/);
-		    $right += ($next =~ tr/\)/\)/);
-		}
-	    }
-	} else {
-	    $value = '_no_value';
-	}
-	# Store the qualifier
-	$out->field->{$qualifier} ||= [];
-	push(@{$out->field->{$qualifier}},$value);
+        my $data = $qual[$i];
+        my ( $qualifier, $value ) = ($data =~ m{^/([^=]+)(?:=(.+))?})
+            or $self->warn(  "cannot see new qualifier in feature $key: "
+                           . $qual[$i]);
+        $qualifier = '' unless( defined $qualifier );
+
+        if (defined $value) {
+            # Do we have a quoted value?
+            if (substr($value, 0, 1) eq '"') {
+                # Keep adding to value until we find the trailing quote
+                # and the quotes are balanced
+                while ($value !~ /\"$/ or $value =~ tr/"/"/ % 2) {
+                    if ($i >= $#qual) {
+                        $self->warn(  "Unbalanced quote in:\n"
+                                    . join("\n", @qual)
+                                    . "No further qualifiers will "
+                                    . "be added for this feature");
+                        last QUAL;
+                    }
+                    # modifying a for-loop variable inside of the loop
+                    # is not the best programming style ...
+                    $i++;
+                    my $next = $qual[$i];
+
+                    # add to value with a space unless the value appears
+                    # to be a sequence (translation for example)
+                    # if (($value.$next) =~ /[^A-Za-z\"\-]/o) {
+                    # changed to explicitly look for translation tag - cjf 06/8/29
+                    if ($qualifier !~ /^translation$/i ) {
+                        $value .= " ";
+                    }
+                    $value .= $next;
+                }
+                # Trim leading and trailing quotes
+                $value =~ s/^"|"$//g;
+                # Undouble internal quotes
+                $value =~ s/""/\"/g;
+            }
+            elsif ( $value =~ /^\(/ ) { # values quoted by ()s
+                # Keep adding to value until we find the trailing bracket
+                # and the ()s are balanced
+                my $left  = ($value =~ tr/\(/\(/); # count left parens
+                my $right = ($value =~ tr/\)/\)/); # count right parens
+
+                while( $left != $right ) { # was "$value !~ /\)$/ or $left != $right"
+                    if ( $i >= $#qual) {
+                        $self->warn(  "Unbalanced parens in:\n"
+                                    . join("\n", @qual)
+                                    . "\nNo further qualifiers will "
+                                    . "be added for this feature");
+                        last QUAL;
+                    }
+                    $i++;
+                    my $next = $qual[$i];
+                    $value .=  $next;
+                    $left  += ($next =~ tr/\(/\(/);
+                    $right += ($next =~ tr/\)/\)/);
+                }
+            }
+        }
+        else {
+            $value = '_no_value';
+        }
+        # Store the qualifier
+        $out->field->{$qualifier} ||= [];
+        push @{$out->field->{$qualifier}}, $value;
     }
     return $out;
 }
@@ -1727,21 +1783,20 @@ sub _read_FTHelper_GenBank {
 =cut
 
 sub _write_line_GenBank {
-    my ($self,$pre1,$pre2,$line,$length) = @_;
+    my ($self, $pre1, $pre2, $line, $length) = @_;
 
-    $length || $self->throw("Miscalled write_line_GenBank without length. Programming error!");
-    my $subl = $length - length $pre2;
+    $length or $self->throw("Miscalled write_line_GenBank without length. Programming error!");
+    my $subl  = $length - length $pre2;
     my $linel = length $line;
     my $i;
 
     my $subr = substr($line,0,$length - length $pre1);
 
     $self->_print("$pre1$subr\n");
-    for($i= ($length - length $pre1);$i < $linel;  $i += $subl) {
-	$subr = substr($line,$i,$subl);
-	$self->_print("$pre2$subr\n");
+    for($i = ($length - length $pre1); $i < $linel; $i += $subl) {
+        $subr = substr($line, $i, $subl);
+        $self->_print("$pre2$subr\n");
     }
-
 }
 
 =head2 _write_line_GenBank_regex
@@ -1754,49 +1809,49 @@ sub _write_line_GenBank {
            text
  Example :
  Returns : nothing
- Args    : file handle, 
-           first header,  
-           second header, 
-           text-line, 
-           regex for line breaks, 
+ Args    : file handle,
+           first header,
+           second header,
+           text-line,
+           regex for line breaks,
            total line length
 
-
 =cut
 
 sub _write_line_GenBank_regex {
-    my ($self,$pre1,$pre2,$line,$regex,$length) = @_;
+    my ($self, $pre1, $pre2, $line, $regex, $length) = @_;
 
     #print STDOUT "Going to print with $line!\n";
 
-    $length || $self->throw( "Miscalled write_line_GenBank without length. Programming error!");
+    $length or $self->throw("Miscalled write_line_GenBank without length. Programming error!");
 
-    my $subl = $length - (length $pre1) - 2;
+    my $subl  = $length - (length $pre1) - 2;
     my @lines = ();
 
-    CHUNK: while($line) {
+  CHUNK:
+    while ($line) {
         foreach my $pat ($regex, '[,;\.\/-]\s|'.$regex, '[,;\.\/-]|'.$regex) {
-          if($line =~ m/^(.{0,$subl})($pat)(.*)/ ) {
-              my $l = $1.$2;
-              $line = substr($line,length($l));
-              # be strict about not padding spaces according to
-              # genbank format
-              $l =~ s/\s+$//;
-              next CHUNK if ($l eq '');
-              push(@lines, $l);
-              next CHUNK;
-          }
+            if ($line =~ m/^(.{0,$subl})($pat)(.*)/ ) {
+                my $l = $1 . $2;
+                $line = substr($line, length $l);
+                # be strict about not padding spaces according to
+                # genbank format
+                $l =~ s/\s+$//;
+                next CHUNK if ($l eq '');
+                push @lines, $l;
+                next CHUNK;
+            }
         }
         # if we get here none of the patterns matched $subl or less chars
-        $self->warn("trouble dissecting \"$line\"\n     into chunks ".
-            "of $subl chars or less - this tag won't print right");
+        $self->warn(  "trouble dissecting \"$line\"\n     into chunks "
+                    . "of $subl chars or less - this tag won't print right");
         # insert a space char to prevent infinite loops
-        $line = substr($line,0,$subl) . " " . substr($line,$subl);
+        $line = substr($line, 0, $subl) . " " . substr($line, $subl);
     }
     my $s = shift @lines;
     $self->_print("$pre1$s\n") if $s;
     foreach my $s ( @lines ) {
-	$self->_print("$pre2$s\n");
+        $self->_print("$pre2$s\n");
     }
 }
 
@@ -1808,18 +1863,16 @@ sub _write_line_GenBank_regex {
  Returns : value of _post_sort
  Args    : newvalue (optional)
 
-
 =cut
 
 sub _post_sort {
     my ($obj,$value) = @_;
-    if( defined $value) {
-	$obj->{'_post_sort'} = $value;
+    if ( defined $value) {
+        $obj->{'_post_sort'} = $value;
     }
     return $obj->{'_post_sort'};
 }
 
-
 =head2 _show_dna
 
  Title   : _show_dna
@@ -1828,13 +1881,12 @@ sub _post_sort {
  Returns : value of _show_dna
  Args    : newvalue (optional)
 
-
 =cut
 
 sub _show_dna {
     my ($obj,$value) = @_;
-    if( defined $value) {
-	$obj->{'_show_dna'} = $value;
+    if ( defined $value) {
+        $obj->{'_show_dna'} = $value;
     }
     return $obj->{'_show_dna'};
 }
@@ -1847,18 +1899,16 @@ sub _show_dna {
  Returns : value of _id_generation_func
  Args    : newvalue (optional)
 
-
 =cut
 
 sub _id_generation_func {
     my ($obj,$value) = @_;
-    if( defined $value ) {
-	$obj->{'_id_generation_func'} = $value;
+    if ( defined $value ) {
+        $obj->{'_id_generation_func'} = $value;
     }
     return $obj->{'_id_generation_func'};
 }
 
-
 =head2 _ac_generation_func
 
  Title   : _ac_generation_func
@@ -1871,13 +1921,12 @@ sub _id_generation_func {
 
 sub _ac_generation_func {
     my ($obj,$value) = @_;
-    if( defined $value ) {
-	$obj->{'_ac_generation_func'} = $value;
+    if ( defined $value ) {
+        $obj->{'_ac_generation_func'} = $value;
     }
     return $obj->{'_ac_generation_func'};
 }
 
-
 =head2 _sv_generation_func
 
  Title   : _sv_generation_func
@@ -1886,19 +1935,16 @@ sub _ac_generation_func {
  Returns : value of _sv_generation_func
  Args    : newvalue (optional)
 
-
 =cut
 
 sub _sv_generation_func {
     my ($obj,$value) = @_;
-    if( defined $value ) {
-	$obj->{'_sv_generation_func'} = $value;
+    if ( defined $value ) {
+        $obj->{'_sv_generation_func'} = $value;
     }
     return $obj->{'_sv_generation_func'};
-
 }
 
-
 =head2 _kw_generation_func
 
  Title   : _kw_generation_func
@@ -1909,11 +1955,10 @@ sub _sv_generation_func {
 
 =cut
 
-	
 sub _kw_generation_func {
     my ($obj,$value) = @_;
-    if( defined $value ) {
-	$obj->{'_kw_generation_func'} = $value;
+    if ( defined $value ) {
+        $obj->{'_kw_generation_func'} = $value;
     }
     return $obj->{'_kw_generation_func'};
 }
@@ -59,7 +59,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jared Fox
 
@@ -119,7 +119,7 @@ with code and data examples if at all possible.
 Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution. Bug reports can be submitted via the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Allen Day
 
@@ -66,7 +66,7 @@ with code and data examples if at all possible.
 Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHORS - Jason Stajich
 
@@ -61,7 +61,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHORS
 
@@ -80,7 +80,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via 
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Keith Ching
 
@@ -43,7 +43,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/  
+  https://github.com/bioperl/bioperl-live/issues  
 
 =head1 AUTHOR - Warren Kretzschmar
 
@@ -77,7 +77,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Heikki Lehvaslaiho
 
@@ -48,7 +48,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/  
+  https://github.com/bioperl/bioperl-live/issues  
 
 =head1 AUTHOR - Warren Kretzschmar
 
@@ -53,7 +53,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHORS - Chase Miller
 
@@ -51,7 +51,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.
 Bug reports can be submitted via the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR Chad Matsalla
 
@@ -60,7 +60,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.
 Bug reports can be submitted via the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHORS
 
@@ -51,7 +51,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.
 Bug reports can be submitted via the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHORS - Aaron Mackey
 
@@ -58,7 +58,7 @@ with code and data examples if at all possible.
 Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR Chad Matsalla
 
@@ -66,7 +66,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.
 Bug reports can be submitted via the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHORS
 
@@ -52,7 +52,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR Chad Matsalla
 
@@ -92,7 +92,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHORS - Dave Messina
 
@@ -65,7 +65,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHORS - Malcolm Cook
 
@@ -181,7 +181,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.
 Bug reports can be submitted via the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Elia Stupka
 
@@ -72,7 +72,7 @@ with code and data examples if at all possible.
 Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution. Bug reports can be submitted via the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Bioperl Project
 
@@ -86,7 +86,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.
 Bug reports can be submitted via the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHORS
 
@@ -3,12 +3,7 @@
 #
 # Please direct questions and support issues to <bioperl-l@bioperl.org> 
 #
-# Cared for by Hilmar Lapp <hlapp at gmx.net>
-#
-
-#
-# (c) Hilmar Lapp, hlapp at gmx.net, 2005.
-# (c) GNF, Genomics Institute of the Novartis Research Foundation, 2005.
+# Cared for by Hilmar Lapp
 #
 # You may distribute this module under the same terms as perl itself.
 # Refer to the Perl Artistic License (see the license accompanying this
@@ -28,8 +23,8 @@ Bio::SeqIO::table - sequence input/output stream from a delimited table
 
 =head1 SYNOPSIS
 
-  #It is probably best not to use this object directly, but
-  #rather go through the SeqIO handler system. Go:
+  # It is probably best not to use this object directly, but
+  # rather go through the SeqIO handler system. Go:
 
   $stream = Bio::SeqIO->new(-file => $filename, -format => 'table');
 
@@ -82,7 +77,7 @@ the bugs and their resolution.
 
 Bug reports can be submitted via email or the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Hilmar Lapp
 
@@ -115,61 +110,60 @@ use base qw(Bio::SeqIO);
  Returns : A Bio::SeqIO stream for a table format
  Args    : Named parameters:
 
-             -file    name of file to read
-             -fh      filehandle to attach to
-             -comment leading character(s) introducing a comment line
-             -header  the number of header lines to skip; the first
-                      non-comment header line will be used to obtain
-                      column names; column names will be used as the
-                      default tags for attaching annotation.
-             -delim   the delimiter for columns as a regular expression;
-                      consecutive occurrences of the delimiter will
-                      not be collapsed.
-             -display_id the one-based index of the column containing
-                      the display ID of the sequence
-             -accession_number the one-based index of the column
-                      containing the accession number of the sequence
-             -seq     the one-based index of the column containing
-                      the sequence string of the sequence
-             -species the one-based index of the column containing the
-                      species for the sequence record; if not a
-                      number, will be used as the static species
-                      common to all records
-             -annotation if provided and a scalar (but see below), a
-                      flag whether or not all additional columns are
-                      to be preserved as annotation, the tags used
-                      will either be 'colX' if there is no column
-                      header and where X is the one-based column
-                      index, and otherwise the column headers will be
-                      used as tags;
-
-                      if a reference to an array, or a square
-                      bracket-enclosed string of comma-delimited
-                      values, only those columns (one-based index)
-                      will be preserved as annotation, tags as before;
-
-                      if a reference to a hash, or a curly
-                      braces-enclosed string of comma-delimited key
-                      and value pairs in alternating order, the keys
-                      are one-based column indexes to be preserved,
-                      and the values are the tags under which the
-                      annotation is to be attached; if not provided or
-                      supplied as undef, no additional annotation will
-                      be preserved.
-             -colnames a reference to an array of column labels, or a
-                      string of comma-delimited labels, denoting the
-                      columns to be converted into annotation; this is
-                      an alternative to -annotation and will be
-                      ignored if -annotation is also supplied with a
-                      valid value.
-             -trim    flag determining whether or not all values should
-                      be trimmed of leading and trailing white space
-                      and double quotes
-
-           Additional arguments may be used to e.g. set factories and
-           builders involved in the sequence object creation (see the
-           POD of Bio::SeqIO).
-
+ -file              Name of file to read
+ -fh                Filehandle to attach to
+ -comment           Leading character(s) introducing a comment line
+ -header            the number of header lines to skip; the first
+                    non-comment header line will be used to obtain
+                    column names; column names will be used as the
+                    default tags for attaching annotation.
+ -delim             The delimiter for columns as a regular expression;
+                    consecutive occurrences of the delimiter will
+                    not be collapsed.
+ -display_id        The one-based index of the column containing
+                    the display ID of the sequence
+ -accession_number  The one-based index of the column
+                    containing the accession number of the sequence
+ -seq               The one-based index of the column containing
+                    the sequence string of the sequence
+ -species           The one-based index of the column containing the
+                    species for the sequence record; if not a
+                    number, will be used as the static species
+                    common to all records
+ -annotation        If provided and a scalar (but see below), a
+                    flag whether or not all additional columns are
+                    to be preserved as annotation, the tags used
+                    will either be 'colX' if there is no column
+                    header and where X is the one-based column
+                    index, and otherwise the column headers will be
+                    used as tags;
+
+                    If a reference to an array, or a square
+                    bracket-enclosed string of comma-delimited
+                    values, only those columns (one-based index)
+                    will be preserved as annotation, tags as before;
+
+                    If a reference to a hash, or a curly
+                    braces-enclosed string of comma-delimited key
+                    and value pairs in alternating order, the keys
+                    are one-based column indexes to be preserved,
+                    and the values are the tags under which the
+                    annotation is to be attached; if not provided or
+                    supplied as undef, no additional annotation will
+                    be preserved.
+ -colnames          A reference to an array of column labels, or a
+                    string of comma-delimited labels, denoting the
+                    columns to be converted into annotation; this is
+                    an alternative to -annotation and will be
+                    ignored if -annotation is also supplied with a
+                    valid value.
+ -trim              Flag determining whether or not all values should
+                    be trimmed of leading and trailing white space
+                    and double quotes
+
+ Additional arguments may be used to e.g. set factories and
+ builders involved in the sequence object creation (see the
+ POD of Bio::SeqIO).
 
 =cut
 
@@ -51,7 +51,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.
 Bug reports can be submitted via the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHORS - Josh Lauricha
 
@@ -58,7 +58,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -61,7 +61,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 SEE ALSO
 
@@ -1,6 +1,6 @@
 # BioPerl module for Bio::SeqIO::tinyseq
 #
-# Please direct questions and support issues to <bioperl-l@bioperl.org> 
+# Please direct questions and support issues to <bioperl-l@bioperl.org>
 #
 # Cared for by Donald Jackson, donald.jackson@bms.com
 #
@@ -43,15 +43,15 @@ the Bioperl mailing list.  Your participation is much appreciated.
   bioperl-l@bioperl.org                  - General discussion
   http://bioperl.org/wiki/Mailing_lists  - About the mailing lists
 
-=head2 Support 
+=head2 Support
 
 Please direct usage questions or support issues to the mailing list:
 
 I<bioperl-l@bioperl.org>
 
-rather than to the module maintainer directly. Many experienced and 
-reponsive experts will be able look at the problem and quickly 
-address it. Please include a thorough description of the problem 
+rather than to the module maintainer directly. Many experienced and
+reponsive experts will be able look at the problem and quickly
+address it. Please include a thorough description of the problem
 with code and data examples if at all possible.
 
 =head2 Reporting Bugs
@@ -60,7 +60,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 SEE ALSO
 
@@ -89,6 +89,7 @@ use Bio::Species;
 use Bio::SeqIO::tinyseq::tinyseqHandler;
 use XML::Parser::PerlSAX;
 use XML::Writer;
+use Bio::Root::Version;
 
 use base qw(Bio::SeqIO);
 
@@ -98,7 +99,7 @@ sub _initialize {
     $self->SUPER::_initialize(@args);
 
     unless (defined $self->sequence_factory) {
-	$self->sequence_factory(Bio::Seq::SeqFastaSpeedFactory->new());
+        $self->sequence_factory(Bio::Seq::SeqFastaSpeedFactory->new);
     }
 
     $self->{'_species_objects'} = {};
@@ -107,11 +108,11 @@ sub _initialize {
 
 =head2 next_seq
 
-  Title		: next_seq
-  Usage		: $seq = $stream->next_seq()
-  Function	: returns the next sequence in the stream
-  Returns	: Bio::Seq object
-  Args		: NONE
+  Title   : next_seq
+  Usage   : $seq = $stream->next_seq()
+  Function: returns the next sequence in the stream
+  Returns : Bio::Seq object
+  Args    : NONE
 
 =cut
 
@@ -125,11 +126,11 @@ sub next_seq {
 
 =head2 write_seq
 
-  Title		: write_seq
-  Usage		: $seq = $stream->write_seq(@sequence_objects); undef $stream
-  Function	: outputs one or more sequence objects as TinySeq XML
-  Returns	: 1 on success
-  Args		: one or more sequence objects as TinySeq XML
+  Title   : write_seq
+  Usage   : $seq = $stream->write_seq(@sequence_objects); undef $stream
+  Function: outputs one or more sequence objects as TinySeq XML
+  Returns : 1 on success
+  Args    : one or more sequence objects as TinySeq XML
 
 Because the TSeq dtd includes closing tags after all sets are written,
 the output will not be complete until the program terminates or the
@@ -142,37 +143,38 @@ sub write_seq {
     my ($self, @seqobjs) = @_;
 
     $self->throw('write_seq must be called with at least one  Bio::SeqI or Bio::PrimarySeqI compliant object')
-	unless (@seqobjs and ( $seqobjs[0]->isa('Bio::SeqI') || $seqobjs[0]->isa('Bio::PrimarySeqI')));
+        unless (@seqobjs and ( $seqobjs[0]->isa('Bio::SeqI') || $seqobjs[0]->isa('Bio::PrimarySeqI')));
 
     my $writer = $self->_get_writer;
 
     foreach my $seqobj (@seqobjs) {
-	my ($id_element, $id_value) = $self->_get_idstring($seqobj);
- 	$writer->startTag('TSeq');
-	$writer->emptyTag('TSeq_seqtype', value => $self->_convert_seqtype($seqobj));
-	$writer->dataElement('TSeq_gi', $seqobj->primary_id || '');
-	$writer->dataElement($id_element, $id_value);
-	#$writer->dataElement('TSeq_orgname', $seqobj->taxid) if ($seqobj->can('taxid'); # just a placeholder
-	$writer->dataElement('TSeq_defline', $seqobj->desc);
-	$writer->dataElement('TSeq_length', $seqobj->length);
-	$writer->dataElement('TSeq_sequence', $seqobj->seq);
-
-	if ($seqobj->can('species') && $seqobj->species) {
-	    $self->_write_species($writer, $seqobj->species);
-	}
-
-	$writer->endTag('TSeq');
+        my ($id_element, $id_value) = $self->_get_idstring($seqobj);
+        $writer->startTag('TSeq');
+        $writer->emptyTag('TSeq_seqtype', value => $self->_convert_seqtype($seqobj));
+
+        $writer->dataElement('TSeq_gi',       $seqobj->primary_id || '');
+        $writer->dataElement($id_element,     $id_value);
+        #$writer->dataElement('TSeq_orgname',  $seqobj->taxid) if ($seqobj->can('taxid')); # just a placeholder
+        $writer->dataElement('TSeq_defline',  $seqobj->desc);
+        $writer->dataElement('TSeq_length',   $seqobj->length);
+        $writer->dataElement('TSeq_sequence', $seqobj->seq);
+
+        if ($seqobj->can('species') && $seqobj->species) {
+            $self->_write_species($writer, $seqobj->species);
+        }
+
+        $writer->endTag('TSeq');
     }
     1;
 }
 
 =head2 _get_seqs
 
-  Title		: _get_seqs
-  Usage		: Internal function - use next_seq() instead
-  Function	: parses the XML and creates Bio::Seq objects
-  Returns	: 1 on success
-  Args		: NONE
+  Title   : _get_seqs
+  Usage   : Internal function - use next_seq() instead
+  Function: parses the XML and creates Bio::Seq objects
+  Returns : 1 on success
+  Args    : NONE
 
 Currently stores all sequence objects into memory.  I will work on do
 more of a stream-based approach
@@ -181,44 +183,41 @@ more of a stream-based approach
 
 sub _get_seqs {
     my ($self) = @_;
-
     my $fh = $self->_fh;
 
     my $handler = Bio::SeqIO::tinyseq::tinyseqHandler->new();
-    my $parser = XML::Parser::PerlSAX->new( Handler => $handler );
-
+    my $parser  = XML::Parser::PerlSAX->new( Handler => $handler );
     my @seqatts = $parser->parse( Source => { ByteStream => $fh });
-
     my $factory = $self->sequence_factory;
 
     $self->{_seqlist} ||= [];
     foreach my $seqatt(@seqatts) {
-	foreach my $subatt(@$seqatt) { # why are there two hashes?
-	    my $seqobj = $factory->create(%$subatt);
-	    $self->_assign_identifier($seqobj, $subatt);
-
-	    if ($seqobj->can('species')) {
-# 		my $class = [reverse(split(/ /, $subatt->{'-organism'}))];
-# 		my $species = Bio::Species->new( -classification	=> $class,
-# 						 -ncbi_taxid		=> $subatt->{'-taxid'} );
-		my $species = $self->_get_species($subatt->{'-organism'}, $subatt->{'-taxid'});
-		$seqobj->species($species) if ($species);
-	    }
-
-	    push(@{$self->{_seqlist}}, $seqobj);
-	}
+        foreach my $subatt(@$seqatt) { # why are there two hashes?
+            my $seqobj = $factory->create(%$subatt);
+            $self->_assign_identifier($seqobj, $subatt);
+
+            if ($seqobj->can('species')) {
+#               my $class = [reverse(split(/ /, $subatt->{'-organism'}))];
+#               my $species = Bio::Species->new( -classification => $class,
+#                                                -ncbi_taxid     => $subatt->{'-taxid'} );
+                my $species = $self->_get_species($subatt->{'-organism'}, $subatt->{'-taxid'});
+                $seqobj->species($species) if ($species);
+            }
+
+            push(@{$self->{_seqlist}}, $seqobj);
+        }
     }
     $self->{_parsed} = 1;
 }
 
 =head2 _get_species
 
-  Title		: _get_species
-  Usage		: Internal function
-  Function	: gets a Bio::Species object from cache or creates as needed
-  Returns	: a Bio::Species object on success, undef on failure
-  Args		: a classification string (eg 'Homo sapiens') and
-                  a NCBI taxon id (optional)
+  Title   : _get_species
+  Usage   : Internal function
+  Function: gets a Bio::Species object from cache or creates as needed
+  Returns : a Bio::Species object on success, undef on failure
+  Args    : a classification string (eg 'Homo sapiens') and
+            a NCBI taxon id (optional)
 
 Objects are cached for parsing multiple sequence files.
 
@@ -228,19 +227,19 @@ sub _get_species {
      my ($self, $orgname, $taxid) = @_;
 
      unless ($self->{'_species_objects'}->{$orgname}) {
-	 my $species = $self->_create_species($orgname, $taxid);
-	 $self->{'_species_objects'}->{$orgname} = $species;
+         my $species = $self->_create_species($orgname, $taxid);
+         $self->{'_species_objects'}->{$orgname} = $species;
      }
      return $self->{'_species_objects'}->{$orgname};
 }
 
 =head2 _create_species
 
-  Title		: _create_species
-  Usage		: Internal function
-  Function	: creates a Bio::Species object
-  Returns	: a Bio::Species object on success, undef on failure
-  Args		: a classification string (eg 'Homo sapiens') and
+  Title   : _create_species
+  Usage   : Internal function
+  Function: creates a Bio::Species object
+  Returns : a Bio::Species object on success, undef on failure
+  Args    : a classification string (eg 'Homo sapiens') and
                   a NCBI taxon id (optional)
 
 =cut
@@ -254,7 +253,7 @@ sub _create_species {
     $params{'-ncbi_taxid'} = $taxid if ($taxid);
 
     my $species = Bio::Species->new(%params)
-	or return;
+        or return;
 
     return $species;
 }
@@ -262,11 +261,11 @@ sub _create_species {
 
 =head2 _assign_identifier
 
-  Title		: _assign_identifier
-  Usage		: Internal function
-  Function	: looks for sequence accession
-  Returns	: 1 on success
-  Args		: NONE
+  Title   : _assign_identifier
+  Usage   : Internal function
+  Function: looks for sequence accession
+  Returns : 1 on success
+  Args    : NONE
 
 NCBI puts refseq accessions in TSeq_sid, others in TSeq_accver.
 
@@ -277,35 +276,34 @@ sub _assign_identifier {
     my ($accession, $version);
 
    if ($atts->{'-accver'}) {
-	($accession, $version) = split(/\./, $atts->{'-accver'});;
+        ($accession, $version) = split(/\./, $atts->{'-accver'});;
     }
     elsif ($atts->{'-sid'}) {
-	my $sidstring =$atts->{'-sid'};
-	$sidstring =~ s/^.+?\|//;
-	$sidstring =~ s/\|[^\|]*//;
-	($accession, $version) = split(/\./, $sidstring);;
+        my $sidstring =$atts->{'-sid'};
+        $sidstring =~ s/^.+?\|//;
+        $sidstring =~ s/\|[^\|]*//;
+        ($accession, $version) = split(/\./, $sidstring);;
     }
     else {
-	$self->throw('NO accession information found for this sequence');
+        $self->throw('NO accession information found for this sequence');
     }
     $seqobj->accession_number($accession) if ($seqobj->can('accession_number'));
     $seqobj->version($version) if ($seqobj->can('version'));
-
 }
 
 =head2 _convert_seqtype
 
-  Title		: _convert_seqtype
-  Usage		: Internal function
-  Function	: maps Bio::Seq::alphabet() values [dna/rna/protein] onto
-                  TSeq_seqtype values [protein/nucleotide]
+  Title   : _convert_seqtype
+  Usage   : Internal function
+  Function: maps Bio::Seq::alphabet() values [dna/rna/protein] onto
+            TSeq_seqtype values [protein/nucleotide]
 
 =cut
 
 sub _convert_seqtype {
     my ($self, $seqobj) = @_;
 
-    return 'protein' 	if ($seqobj->alphabet eq 'protein');
+    return 'protein'    if ($seqobj->alphabet eq 'protein');
     return 'nucleotide' if ($seqobj->alphabet eq 'dna');
     return 'nucleotide' if ($seqobj->alphabet eq 'rna');
 
@@ -315,10 +313,10 @@ sub _convert_seqtype {
 
 =head2 _get_idstring
 
-  Title		: _get_idstring
-  Usage		: Internal function
-  Function	: parse accession and version info from TSeq_accver
-                  or TSeq_sid
+  Title   : _get_idstring
+  Usage   : Internal function
+  Function: parse accession and version info from TSeq_accver
+            or TSeq_sid
 
 =cut
 
@@ -328,18 +326,18 @@ sub _get_idstring {
     my $accver = $seqobj->accession_number;
     $accver .= '.' . $seqobj->version if ($seqobj->can('version') and $seqobj->version);
     if ($accver =~ /^(NM_|NP_|XM_|XP_|NT_|NC_|NG_)/) {
-	return ('TSeq_sid', join('|', 'ref', $accver, ''));
+        return ('TSeq_sid', join('|', 'ref', $accver, ''));
     }
     else {
-	return ('TSeq_accver', $accver);
+        return ('TSeq_accver', $accver);
     }
 }
 
 =head2 _get_writer
 
-  Title		: _get_writer
-  Usage		: Internal function
-  Function	: instantiate XML::Writer object if needed,
+  Title   : _get_writer
+  Usage   : Internal function
+  Function: instantiate XML::Writer object if needed,
                   output initial XML
 
 =cut
@@ -349,30 +347,28 @@ sub _get_writer {
     my ($self) = @_;
 
     unless ($self->{_writer}) {
-	my $fh = $self->_fh;
-	my $writer = XML::Writer->new(OUTPUT 		=> $fh,
-				      DATA_MODE		=> 1,
-				      DATA_INDENT	=> 2,
-				      NEWLINE		=> 1,
-				      );
-	$writer->doctype('TSeqSet', '-//NCBI//NCBI TSeq/EN', 'http://www.ncbi.nlm.nih.gov/dtd/NCBI_TSeq.dtd');
-
-	$writer->comment("Generated by Bio::SeqIO::tinyseq VERSION ".$Bio::SeqIO::tinyseq::VERSION);
-
-	$writer->startTag('TSeqSet');
-
-	$self->{_writer} = $writer;
+        my $fh = $self->_fh;
+        my $writer = XML::Writer->new(OUTPUT      => $fh,
+                                      DATA_MODE   => 1,
+                                      DATA_INDENT => 2,
+                                      NEWLINE     => 1,
+                                      );
+        $writer->doctype('TSeqSet', '-//NCBI//NCBI TSeq/EN', 'http://www.ncbi.nlm.nih.gov/dtd/NCBI_TSeq.dtd');
+        $writer->comment("Generated by Bio::SeqIO::tinyseq VERSION " . $Bio::Root::Version::VERSION);
+        $writer->startTag('TSeqSet');
+
+        $self->{_writer} = $writer;
     }
     return $self->{_writer};
 }
 
 =head2 close_writer
 
-  Title		: close_writer
-  Usage		: $self->close_writer()
-  Function	: terminate XML output
-  Args		: NONE
-  Returns	: 1 on success
+  Title   : close_writer
+  Usage   : $self->close_writer()
+  Function: terminate XML output
+  Args    : NONE
+  Returns : 1 on success
 
 Called automatically by DESTROY when object goes out of scope
 
@@ -382,10 +378,10 @@ sub close_writer {
     # close out any dangling writer
     my ($self) = @_;
     if ($self->{_writer}) {
-	my $writer = $self->{_writer};
-	$writer->endTag('TSeqSet');
-	$writer->end;
-	undef $writer;
+        my $writer = $self->{_writer};
+        $writer->endTag('TSeqSet');
+        $writer->end;
+        undef $writer;
     }
     close($self->_fh) if ($self->_fh);
     1;
@@ -394,8 +390,8 @@ sub close_writer {
 sub _write_species {
     my ($self, $writer, $species) = @_;
     $writer->dataElement('TSeq_orgname', $species->binomial);
-    $writer->dataElement('TSeq_taxid', $species->ncbi_taxid)
-	if($species->ncbi_taxid);
+    $writer->dataElement('TSeq_taxid',   $species->ncbi_taxid)
+        if($species->ncbi_taxid);
 }
 
 sub DESTROY {
@@ -51,7 +51,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.
 Bug reports can be submitted via the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHORS - Aaron Mackey
 
@@ -127,13 +127,14 @@ This makes the simplest ever reformatter
 
 =head2 Bio::SeqIO-E<gt>new()
 
-   $seqIO = Bio::SeqIO->new(-file => 'filename',   -format=>$format);
-   $seqIO = Bio::SeqIO->new(-fh   => \*FILEHANDLE, -format=>$format);
+   $seqIO = Bio::SeqIO->new(-file   => 'seqs.fasta', -format => $format);
+   $seqIO = Bio::SeqIO->new(-fh     => \*FILEHANDLE, -format => $format);
+   $seqIO = Bio::SeqIO->new(-string => $string     , -format => $format);
    $seqIO = Bio::SeqIO->new(-format => $format);
 
-The new() class method constructs a new Bio::SeqIO object. The
-returned object can be used to retrieve or print Seq objects. new()
-accepts the following parameters:
+The new() class method constructs a new Bio::SeqIO object. The returned object
+can be used to retrieve or print Seq objects. new() accepts the following
+parameters:
 
 =over 5
 
@@ -151,16 +152,10 @@ conventions apply:
 
 =item -fh
 
-You may provide new() with a previously-opened filehandle.  For
+You may use new() with a opened filehandle, provided as a glob reference. For
 example, to read from STDIN:
 
-   $seqIO = Bio::SeqIO->new(-fh => \*STDIN);
-
-Note that you must pass filehandles as references to globs.
-
-If neither a filehandle nor a filename is specified, then the module
-will read from the @ARGV array or STDIN, using the familiar E<lt>E<gt>
-semantics.
+   my $seqIO = Bio::SeqIO->new(-fh => \*STDIN);
 
 A string filehandle is handy if you want to modify the output in the
 memory, before printing it out. The following program reads in EMBL
@@ -169,8 +164,8 @@ some HTML tags:
 
   use Bio::SeqIO;
   use IO::String;
-  my $in  = Bio::SeqIO->new(-file => "emblfile",
-                            -format => 'EMBL');
+  my $in = Bio::SeqIO->new(-file => "emblfile",
+                           -format => 'EMBL');
   while ( my $seq = $in->next_seq() ) {
       # the output handle is reset for every file
       my $stringio = IO::String->new($string);
@@ -184,6 +179,13 @@ some HTML tags:
       print $string;
   }
 
+=item -string
+
+A string to read the sequences from. For example:
+
+   my $string = ">seq1\nACGCTAGCTAGC\n";
+   my $seqIO = Bio::SeqIO->new(-string => $string);
+
 =item -format
 
 Specify the format of the file.  Supported formats include fasta,
@@ -304,7 +306,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Ewan Birney, Lincoln Stein
 
@@ -342,15 +344,16 @@ my %valid_alphabet_cache;
                                      -format => 'fasta');
  Function: Returns a new sequence stream
  Returns : A Bio::SeqIO stream initialised with the appropriate format
- Args    : Named parameters:
-             -file   => filename
-             -fh     => filehandle to attach to
-             -format => format
-
-           Additional arguments may be used. They all have reasonable defaults
-           and are thus optional.
+ Args    : Named parameters indicating where to read the sequences from or to
+           write them to:
+             -file   => filename, OR
+             -fh     => filehandle to attach to, OR
+             -string => string
+
+           Additional arguments, all with reasonable defaults:
+             -format     => format of the sequences, usually auto-detected
              -alphabet   => 'dna', 'rna', or 'protein'
-             -flush      => 0 or 1 (default, flush filehandles after each write)
+             -flush      => 0 or 1 (default: flush filehandles after each write)
              -seqfactory => sequence factory
              -locfactory => location factory
              -objbuilder => object builder
@@ -362,7 +365,7 @@ See L<Bio::SeqIO::Handler>
 my $entry = 0;
 
 sub new {
-    my ($caller,@args) = @_;
+    my ($caller, @args) = @_;
     my $class = ref($caller) || $caller;
 
     # or do we want to call SUPER on an object if $caller is an
@@ -372,45 +375,50 @@ sub new {
         $self->_initialize(@args);
         return $self;
     } else {
+        my %params = @args;
+        @params{ map { lc $_ } keys %params } = values %params; # lowercase keys
 
-        my %param = @args;
-        @param{ map { lc $_ } keys %param } = values %param; # lowercase keys
-
-        unless( defined $param{-file} ||
-                defined $param{-fh}   ||
-                defined $param{-string} ) {
+        unless( defined $params{-file} ||
+                defined $params{-fh}   ||
+                defined $params{-string} ) {
             $class->throw("file argument provided, but with an undefined value") 
-                if exists $param{'-file'};
+                if exists $params{'-file'};
             $class->throw("fh argument provided, but with an undefined value") 
-                if exists $param{'-fh'};
+                if exists $params{'-fh'};
             $class->throw("string argument provided, but with an undefined value") 
-                if exists($param{'-string'});
+                if exists($params{'-string'});
             # $class->throw("No file, fh, or string argument provided"); # neither defined
         }
 
-        my $format = $param{'-format'} ||
-            $class->_guess_format( $param{-file} || $ARGV[0] );
-        
-        if( ! $format ) {
-            if ($param{-file}) {
-                $format = Bio::Tools::GuessSeqFormat->new(-file => $param{-file}||$ARGV[0] )->guess;
-            } elsif ($param{-fh}) {
-                $format = Bio::Tools::GuessSeqFormat->new(-fh => $param{-fh}||$ARGV[0] )->guess;
+        # Determine or guess sequence format and variant
+        my $format = $params{'-format'};
+        if (! $format ) {
+            if ($params{-file}) {
+                # Guess from filename extension, and then from file content
+                $format = $class->_guess_format( $params{-file} ) ||
+                          Bio::Tools::GuessSeqFormat->new(-file => $params{-file}  )->guess;
+            } elsif ($params{-fh}) {
+                # Guess from filehandle content
+                $format = Bio::Tools::GuessSeqFormat->new(-fh   => $params{-fh}    )->guess;
+            } elsif ($params{-string}) {
+                # Guess from string content
+                $format = Bio::Tools::GuessSeqFormat->new(-text => $params{-string})->guess;
             }
         }
+
         # changed 1-3-11; no need to print out an empty string (only way this
         # exception is triggered) - cjfields
-        $class->throw("Could not guess format from file/fh") unless $format;
+        $class->throw("Could not guess format from file, filehandle or string")
+            if not $format;
         $format = "\L$format";  # normalize capitalization to lower case
 
         if ($format =~ /-/) {
             ($format, my $variant) = split('-', $format, 2);
-            push @args, (-variant => $variant);
+            $params{-variant} = $variant;
         }
 
-
         return unless( $class->_load_format_module($format) );
-        return "Bio::SeqIO::$format"->new(@args);
+        return "Bio::SeqIO::$format"->new(%params);
     }
 }
 
@@ -576,8 +584,8 @@ sub alphabet {
             # creating a dummy sequence object
             eval {
                 require Bio::PrimarySeq;
-                my $seq = Bio::PrimarySeq->new('-verbose' => $self->verbose,
-                                                         '-alphabet' => $value);
+                my $seq = Bio::PrimarySeq->new( -verbose  => $self->verbose,
+                                                -alphabet => $value          );
             };
             if ($@) {
                 $self->throw("Invalid alphabet: $value\n. See Bio::PrimarySeq for allowed values.");
@@ -678,6 +686,7 @@ sub _filehandle {
 sub _guess_format {
    my $class = shift;
    return unless $_ = shift;
+
    return 'abi'        if /\.ab[i1]$/i;
    return 'ace'        if /\.ace$/i;
    return 'alf'        if /\.alf$/i;
@@ -696,13 +705,11 @@ sub _guess_format {
    return 'qual'       if /\.qual$/i;
    return 'raw'        if /\.txt$/i;
    return 'scf'        if /\.scf$/i;
-   return 'swiss'      if /\.(swiss|sp)$/i;
-
    # from Strider 1.4 Release Notes: The file name extensions used by
    # Strider 1.4 are ".xdna", ".xdgn", ".xrna" and ".xprt" for DNA,
    # DNA Degenerate, RNA and Protein Sequence Files, respectively
    return 'strider'    if /\.(xdna|xdgn|xrna|xprt)$/i;
-
+   return 'swiss'      if /\.(swiss|sp)$/i;
    return 'ztr'        if /\.ztr$/i;
 }
 
@@ -721,7 +728,7 @@ sub TIEHANDLE {
 
 sub READLINE {
     my $self = shift;
-    return $self->{'seqio'}->next_seq() unless wantarray;
+    return $self->{'seqio'}->next_seq() || undef unless wantarray;
     my (@list, $obj);
     push @list, $obj while $obj = $self->{'seqio'}->next_seq();
     return @list;
@@ -165,7 +165,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Heikki Lehvaslaiho
 
@@ -121,7 +121,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -514,7 +514,7 @@ sub sort_by_list {
     }
 
     my $ct=1;
-    open(my $listfh, '<', $list) || $self->throw("can't open file for reading: $list");
+    open my $listfh, '<', $list or $self->throw("Could not read file '$list': $!");
     while (<$listfh>) {
       chomp;
       my $name=$_;
@@ -55,7 +55,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -77,7 +77,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -188,8 +188,10 @@ sub classification {
         # (lineage may have subspecies, species, genus ...)
         my $name = $taxon->node_name;
         my ($genus, $species) = (quotemeta($vals[1]), quotemeta($vals[0]));
-        if ($name && ($name !~ m{$species}i && $name !~ m{$genus}i) && $name !~ m{$vals[1] $vals[0]}i) {
-            if ($name =~ /^$vals[1] $vals[0]\s*(.+)/) {
+        if ($name && 
+           ($name !~ m{$species}i && $name !~ m{$genus}i) && 
+            $name !~ m{$genus $species}i) {
+            if ($name =~ /^$genus $species\s*(.+)/) {
                 # just assume the problem is someone tried to make a Bio::Species starting at subspecies
                 #*** no idea if this is appropriate! just a possible fix related to bug 2092
                 $self->sub_species($1);
@@ -50,7 +50,7 @@ with code and data examples if at all possible.
 Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Kris Boulez
 
@@ -50,7 +50,7 @@ with code and data examples if at all possible.
 Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Kris Boulez
 
@@ -55,7 +55,7 @@ with code and data examples if at all possible.
 Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Kris Boulez
 
@@ -62,7 +62,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Kris Boulez
 
@@ -194,7 +194,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.
 Bug reports can be submitted via the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHORS - Ewan Birney, Lincoln Stein, Kris Boulez
 
@@ -536,7 +536,7 @@ sub TIEHANDLE {
 
 sub READLINE {
   my $self = shift;
-  return $self->{'structio'}->next_seq() unless wantarray;
+  return $self->{'structio'}->next_seq() || undef unless wantarray;
   my (@list, $obj);
   push @list, $obj while $obj = $self->{'structio'}->next_seq();
   return @list;
@@ -50,7 +50,7 @@ with code and data examples if at all possible.
 Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Kris Boulez
 
@@ -50,7 +50,7 @@ with code and data examples if at all possible.
 Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Kris Boulez
 
@@ -135,7 +135,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Ed Green
 
@@ -119,7 +119,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Ed Green
 
@@ -1,7 +1,7 @@
 #
 # BioPerl module for Bio::Structure::StructureI
 #
-# Please direct questions and support issues to <bioperl-l@bioperl.org> 
+# Please direct questions and support issues to <bioperl-l@bioperl.org>
 #
 # Cared for by Kris Boulez <kris.boulez@algonomics.com>
 #
@@ -34,15 +34,15 @@ the Bioperl mailing list.  Your participation is much appreciated.
   bioperl-l@bioperl.org                  - General discussion
   http://bioperl.org/wiki/Mailing_lists  - About the mailing lists
 
-=head2 Support 
+=head2 Support
 
 Please direct usage questions or support issues to the mailing list:
 
 I<bioperl-l@bioperl.org>
 
-rather than to the module maintainer directly. Many experienced and 
-reponsive experts will be able look at the problem and quickly 
-address it. Please include a thorough description of the problem 
+rather than to the module maintainer directly. Many experienced and
+reponsive experts will be able look at the problem and quickly
+address it. Please include a thorough description of the problem
 with code and data examples if at all possible.
 
 =head2 Reporting Bugs
@@ -51,7 +51,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Kris Boulez
 
@@ -65,7 +65,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -61,7 +61,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -55,7 +55,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -55,7 +55,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -73,7 +73,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -64,7 +64,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -128,7 +128,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Sendu Bala
 
@@ -52,7 +52,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -143,7 +143,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 CONTACT
 
@@ -91,7 +91,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Chad Matsalla
 
@@ -237,18 +237,27 @@ sub count_sequences_with_grep {
     # Tom Christiansen's 'tcgrep'
     # http://www.cpan.org/modules/by-authors/id/TOMC/scripts/tcgrep.gz
 
-    open(my $FILE, $self->{'filename'}) or do { $self->warn("cannot open file ".$self->{'filename'}. " for grepping"); return}; 
+    open my $FILE, '<', $self->{'filename'} or do {
+        $self->warn("Could not read file '$self->{'filename'}' for grepping: $!");
+        return
+    };
     my $counter =0;
     while(<$FILE>) { $counter++ if(/^AF/); }
-
     close $FILE;
-    opendir(my $SINGLETS,$self->{'path'});
+
+    opendir my $SINGLETS, $self->{'path'};
     foreach my $f ( readdir($SINGLETS) ) {
-	next unless ($f =~ /\.singlets$/); 
-	open(my $FILE, File::Spec->catfile($self->{'path'},$f)) or do{ $self->warn("cannot open file ".File::Spec->catfile($self->{'path'},$f)); next };
-	while(<$FILE>) { $counter++ if(/^>/) }
-	close $FILE;
+        next unless ($f =~ /\.singlets$/);
+
+        my $singlet_file = File::Spec->catfile($self->{'path'}, $f);
+        open my $S_FILE, '<', $singlet_file or do {
+            $self->warn("Could not read file '$singlet_file': $!");
+            next
+        };
+        while(<$S_FILE>) { $counter++ if(/^>/) }
+        close $S_FILE;
     }
+    closedir $SINGLETS;
     return $counter;
 }
 
@@ -384,10 +393,10 @@ sub freeze_hash {
         my %contigs = %{$self->{'contigs'}};
         my $frozen = freeze(%contigs);
         umask 0001;
-        open (my $FREEZE,">$filename") or do {
+        open my $FREEZE, '>', $filename or do {
             $self->warn( "Bio::Tools::Alignment::Consed could not ".
                          "freeze the contig hash because the file ".
-                         "($filename) could not be opened: $!\n");
+                         "($filename) could not be opened: $!");
             return 1;
         };
         print $FREEZE $frozen;
@@ -1332,9 +1341,9 @@ sub write_stats {
     my ($statsfilecontents) = $statistics_raw =~ s/.*\ \:\ //g;
     umask 0001;
     my $fh = Bio::Root::IO->new(-file=>"$stats_filename");
-    # open(STATSFILE,">$stats_filename") or print("Could not open the statsfile: $!\n");
+    # open my $STATSFILE, '>', $stats_filename or print "Could not write the statsfile: $!\n");
     $fh->_print("$statsfilecontents");
-    # close STATSFILE;
+    # close $STATSFILE;
     $fh->close();
 }
 
@@ -68,7 +68,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Chad Matsalla
 
@@ -133,7 +133,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -123,7 +123,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHORS
 
@@ -141,7 +141,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHORS
 
@@ -74,7 +74,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHORS
 
@@ -131,7 +131,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHORS
 
@@ -131,7 +131,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHORS
 
@@ -117,7 +117,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHORS
 
@@ -91,7 +91,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHORS
 
@@ -138,7 +138,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHORS
 
@@ -135,7 +135,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHORS
 
@@ -62,7 +62,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHORS
 
@@ -86,7 +86,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Hilmar Lapp
 
@@ -50,7 +50,7 @@ with code and data examples if at all possible.
  of the bugs and their resolution. Bug reports can be submitted the
  web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Balamurugan Kumarasamy
 
@@ -166,7 +166,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Heikki Lehvaslaiho
 
@@ -57,7 +57,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -101,7 +101,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -71,7 +71,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 email or the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -70,7 +70,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -88,7 +88,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Chris Fields
 
@@ -73,7 +73,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Hilmar Lapp
 
@@ -72,7 +72,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Tania Oh 
 
@@ -65,7 +65,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -86,7 +86,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Chris Dwan
 
@@ -59,7 +59,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Shawn Hoon 
 
@@ -121,7 +121,7 @@ with code and data examples if at all possible.
 Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Matthew Pocock
 
@@ -1293,7 +1293,7 @@ sub TIEHANDLE {
 
 sub READLINE {
     my $self = shift;
-    return $self->{'gffio'}->next_feature() unless wantarray;
+    return $self->{'gffio'}->next_feature() || undef unless wantarray;
     my (@list, $obj);
     push @list, $obj while $obj = $self->{'gffio'}->next_feature();
     return @list;
@@ -77,7 +77,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Allen Day
 
@@ -74,7 +74,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Keith James
 
@@ -89,7 +89,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Hilmar Lapp, Mark Fiers
 
@@ -60,7 +60,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Fugu Team, Jason Stajich 
 
@@ -62,7 +62,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Fugu Team, Jason Stajich 
 
@@ -86,7 +86,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Hilmar Lapp
 
@@ -103,7 +103,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 email or the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -79,7 +79,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -26,8 +26,8 @@ filehandle.
     # To guess the format from an already open filehandle:
     my $guesser = Bio::Tools::GuessSeqFormat->new( -fh => $filehandle );
     my $format  = $guesser->guess;
-    # If the filehandle is seekable (STDIN isn't), it will be
-    # returned to its original position.
+    # The filehandle will be returned to its original position. Note that this
+    # filehandle can be STDIN.
 
     # To guess the format of one or several lines of text (with
     # embedded newlines):
@@ -55,9 +55,9 @@ examine the data, line by line, until it finds a line to which
 only one format can be assigned.  If no conclusive guess can be
 made, undef is returned.
 
-If the Bio::Tools::GuessSeqFormat object is given a filehandle
-which is seekable, it will be restored to its original position
-on return from the guess() method.
+If the Bio::Tools::GuessSeqFormat object is given a filehandle,
+e.g. STDIN, it will be restored to its original position on
+return from the guess() method.
 
 =head2 Formats
 
@@ -228,7 +228,7 @@ Report bugs to the Bioperl bug tracking system to help us
 keep track the bugs and their resolution.  Bug reports can be
 submitted via the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -266,7 +266,7 @@ underscore are considered to be internal.
  Example    : See SYNOPSIS.
  Returns    : A new object.
  Arguments  : -file The filename of the file whose format is to
-                    be guessed, or
+                    be guessed, e.g. STDIN, or
               -fh   An already opened filehandle from which a text
                     stream may be read, or
               -text A scalar containing one or several lines of
@@ -406,10 +406,9 @@ sub text
               format can not be found, undef is returned.
  Arguments  : None.
 
-    If the object is associated with a filehandle and if that
-    filehandle is searchable, the position of the filehandle
-    will be returned to its original position before the method
-    returns.
+    If the object is associated with a filehandle, the position
+    of the filehandle will be returned to its original position
+    before the method returns.
 
 =cut
 
@@ -436,10 +435,10 @@ our %formats = (
     mase        => { test => \&_possibly_mase       },
     mega        => { test => \&_possibly_mega       },
     msf         => { test => \&_possibly_msf        },
-    phrap       => { test => \&_possibly_phrap      },
-    pir         => { test => \&_possibly_pir        },
     pfam        => { test => \&_possibly_pfam       },
+    phrap       => { test => \&_possibly_phrap      },
     phylip      => { test => \&_possibly_phylip     },
+    pir         => { test => \&_possibly_pir        },
     prodom      => { test => \&_possibly_prodom     },
     raw         => { test => \&_possibly_raw        },
     rsf         => { test => \&_possibly_rsf        },
@@ -447,63 +446,64 @@ our %formats = (
     stockholm   => { test => \&_possibly_stockholm  },
     swiss       => { test => \&_possibly_swiss      },
     tab         => { test => \&_possibly_tab        },
-    vcf         => { test => \&_possibly_vcf        }
+    vcf         => { test => \&_possibly_vcf        },
 );
 
 sub guess
 {
     my $self = shift;
 
-    foreach my $fmt_key (keys %formats) {
+    while (my ($fmt_key) = each (%formats)) {
         $formats{$fmt_key}{fmt_string} = $fmt_key;
     }
 
     my $fh;
     my $start_pos;
-    my @lines;
     if (defined $self->{-text}) {
-	# Break the text into separate lines.
-	@lines = split /\n/, $self->{-text};
+        # Break the text into separate lines.
+        my $text = $self->{-text};
+        open $fh, '<', \$text or $self->throw("Could not read from string: $!");
+
     } elsif (defined $self->{-file}) {
         # If given a filename, open the file.
-        open($fh, $self->{-file}) or
-            $self->throw("Can not open '$self->{-file}' for reading: $!");
+        my $file = $self->{-file};
+        open $fh, '<', $file or $self->throw("Could not read file '$file': $!");
+
     } elsif (defined $self->{-fh}) {
-        # If given a filehandle, figure out if it's a plain GLOB
-        # or a IO::Handle which is seekable.  In the case of a
-        # GLOB, we'll assume it's seekable.  Get the current
-        # position in the stream.
+        # If given a filehandle, get the current position in the stream.
         $fh = $self->{-fh};
-        if (ref $fh eq 'GLOB') {
-            $start_pos = tell($fh);
-        } elsif (UNIVERSAL::isa($fh, 'IO::Seekable')) {
-            $start_pos = $fh->getpos();
+        if (not seek $fh, 0, 1) { # seek to current position to determine seekability
+            # Work around non-seekable filehandles if IO::Scalar is available
+            # (adapted from http://www.perlmonks.org/?node_id=33587)
+            # IO::Mark may be an option for very large streams?
+            $self->throw("Need IO::Scalar to guess from unseekable filehandles")
+                if not eval { require IO::Scalar };
+            my $data;
+            { local $/; $data = <$fh>; $.-- };  # copy raw data from fh
+            tie *$fh, 'IO::Scalar', my $s;      # replace fh by scalar-tied fh
+            print $fh $data;                    # write raw data to tied fh
+            seek $fh, 0, 0;                     # return to start of tied fh
         }
+        $start_pos = tell $fh;
     }
 
     my $done  = 0;
     my $lineno = 0;
-    my $fmt_string;
+    my $guess;
     while (!$done) {
         my $line;       # The next line of the file.
         my $match = 0;  # Number of possible formats of this line.
 
-	if (defined $self->{-text}) {
-	    last if (scalar @lines == 0);
-	    $line = shift @lines;
-	} else {
-	    last if (!defined($line = <$fh>));
-	}
+        last if (!defined($line = <$fh>));
         next if ($line =~ /^\s*$/); # Skip white and empty lines.
-
-        chomp($line);
+        chomp $line;
         $line =~ s/\r$//;   # Fix for DOS files on Unix.
         ++$lineno;
 
         while (my ($fmt_key, $fmt) = each (%formats)) {
             if ($fmt->{test}($line, $lineno)) {
                 ++$match;
-                $fmt_string = $fmt->{fmt_string};
+                $guess = $fmt->{fmt_string};
             }
         }
 
@@ -511,18 +511,14 @@ sub guess
         $done = ($match == 1);
     }
 
-    if (defined $self->{-file}) {
-        # Close the file we opened.
-        close($fh);
-    } elsif (ref $fh eq 'GLOB') {
-        # Try seeking to the start position.
-        seek($fh, $start_pos, 0) || $self->throw("Failed resetting the ".
-                                        "filehandle; IO error occurred");;
-    } elsif (defined $fh && $fh->can('setpos')) {
-        # Seek to the start position.
-        $fh->setpos($start_pos);
+    if (defined $self->{-fh}) {
+        # Go back to original position in filehandle
+        seek $fh, $start_pos, 0 or $self->throw("Could not reset filehandle $fh: $!");
+    } else {
+        # Close the filehandle we opened
+        close $fh;
     }
-    return ($done ? $fmt_string : undef);
+    return ($done ? $guess : undef);
 }
 
 =head1 HELPER SUBROUTINES
@@ -636,7 +632,7 @@ sub _possibly_fastq
 {
     my ($line, $lineno) = (shift, shift);
     return ( ($lineno == 1 && $line =~ /^@/) ||
-	     ($lineno == 3 && $line =~ /^\+/) );
+             ($lineno == 3 && $line =~ /^\+/) );
 }
 
 =head2 _possibly_fastxy
@@ -77,7 +77,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Ewan Birney
 
@@ -60,7 +60,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.Bug reports can be submitted via the
 web: 
 
- https://redmine.open-bio.org/projects/bioperl/
+ https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Ewan Birney
 
@@ -53,7 +53,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Balamurugan Kumarasamy
 
@@ -149,7 +149,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Aaron Mackey
 
@@ -118,7 +118,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Chris Fields
 
@@ -147,7 +147,7 @@ with code and data examples if at all possible.
 Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution. Bug reports can be submitted via the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -259,7 +259,7 @@ sub _parse {
 	my $file = $1;
 
 	$self->warn("Opening $self->{seqfile} for parsing...\n") if $self->{lucy_verbose};
-	open my $SEQ, $self->{seqfile} or $self->throw("Could not open sequence file: $self->{seqfile}");
+	open my $SEQ, '<', $self->{seqfile} or $self->throw("Could not read sequence file '$self->{seqfile}': $!");
 	my ($name, $line);
 	my $seq = "";
 	my @lines = <$SEQ>;
@@ -293,17 +293,17 @@ sub _parse {
 
 	# now parse quality values (check for presence of quality file first) 
 	if ($self->{qualfile}) {
-		open my $QUAL, "$self->{qualfile}" or $self->throw("Could not open quality file: $self->{qualfile}");
+		open my $QUAL, '<', $self->{qualfile} or $self->throw("Could not read quality file '$self->{qualfile}': $!");
 		@lines = <$QUAL>;
 	}
 	elsif (-e "$file.qual") {
 		$self->warn("You did not set qualfile, but I'm opening $file.qual\n") if $self->{lucy_verbose};
-	$self->qualfile("$file.qual");
-		open my $QUAL, "$file.qual" or $self->throw("Could not open quality file: $file.qual");
+		$self->qualfile("$file.qual");
+		open my $QUAL, '<', "$file.qual" or $self->throw("Could not read quality file '$file.qual': $!");
 		@lines = <$QUAL>;
 	}
     else {
-		 $self->warn("I did not find a quality file.  You will not be able to use all of the accessor methods.\n") if $self->{lucy_verbose};
+		 $self->warn("I did not find a quality file. You will not be able to use all of the accessor methods.\n") if $self->{lucy_verbose};
 		 @lines = ();
     }
 
@@ -332,17 +332,17 @@ sub _parse {
 
 	# determine whether reads are full length
 	if ($self->{infofile}) {
-		open my $INFO, "$self->{infofile}" or $self->throw("Could not open info file: $self->{infofile}");
+		open my $INFO, '<', $self->{infofile} or $self->throw("Could not read info file '$self->{infofile}': $!");
 		@lines = <$INFO>;
 	}
 	elsif (-e "$file.info") {
 		$self->warn("You did not set infofile, but I'm opening $file.info\n") if $self->{lucy_verbose};
 		$self->infofile("$file.info");
-		open my $INFO, "$file.info" or $self->throw("Could not open info file: $file.info");
+		open my $INFO, '<', "$file.info" or $self->throw("Could not read info file '$file.info': $!");
 		@lines = <$INFO>;
 	}
 	else {
-		$self->warn("I did not find an info file.  You will not be able to use all of the accessor methods.\n") if $self->{lucy_verbose};
+		$self->warn("I did not find an info file. You will not be able to use all of the accessor methods.\n") if $self->{lucy_verbose};
 		@lines = ();
 	}
 
@@ -356,17 +356,17 @@ sub _parse {
 
 	# parse rejects (and presence of poly-A if Lucy has been modified)
 	if ($self->{stderrfile}) {
-		open my $STDERR_LUCY, "$self->{stderrfile}" or $self->throw("Could not open quality file: $self->{stderrfile}");
+		open my $STDERR_LUCY, '<', $self->{stderrfile} or $self->throw("Could not read quality file '$self->{stderrfile}': $!");
 		@lines = <$STDERR_LUCY>;
 	}
 	elsif (-e "$file.stderr") {
 		$self->warn("You did not set stderrfile, but I'm opening $file.stderr\n") if $self->{lucy_verbose};
 		$self->stderrfile("$file.stderr");
-		open my $STDERR_LUCY, "$file.stderr" or $self->throw("Could not open quality file: $file.stderr");
+		open my $STDERR_LUCY, '<', "$file.stderr" or $self->throw("Could not read quality file '$file.stderr': $!");
 		@lines = <$STDERR_LUCY>;
 	}
 	else {
-		$self->warn("I did not find a standard error file.  You will not be able to use all of the accessor methods.\n") if $self->{lucy_verbose};
+		$self->warn("I did not find a standard error file. You will not be able to use all of the accessor methods.\n") if $self->{lucy_verbose};
 		@lines = ();
 	}
 
@@ -83,7 +83,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Hilmar Lapp
 
@@ -67,7 +67,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Sendu Bala
 
@@ -117,7 +117,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -70,7 +70,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Sendu Bala
 
@@ -62,7 +62,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Sendu Bala
 
@@ -96,7 +96,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -92,7 +92,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -72,7 +72,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 email or the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -117,7 +117,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 email or the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich, Aaron Mackey
 
@@ -166,7 +166,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich, Aaron Mackey
 
@@ -904,9 +904,16 @@ sub _parse_distmat {
         last if ( /^\s+$/ && exists $self->{'_summary'}->{'ngmatrix'} );
         next if ( /^\s+$/ || /^NOTE:/i );
         chomp;
-        $_ =~ m/(.+?)\s*(-*\d+?\.\d+?.*)/;
- 		my $seq = $1;
- 		my $rest = $2;
+
+        my ( $seq, $rest );
+        if ( $self->{'_summary'}->{'seqtype'} eq 'YN00' ) {
+             ( $seq, $rest ) = split( /\s+/, $_, 2 );
+        }
+        else {
+            $_ =~ m/(.+?)\s*(-*\d+?\.\d+?.*)/;
+ 	        $seq = $1;
+ 		$rest = $2;
+	}
         $rest = '' unless defined $rest;    # get rid of empty messages
         my $j = 0;
         if ( $self->{'_summary'}->{'seqtype'} eq 'YN00' ) {
@@ -55,7 +55,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Shawn Hoon 
 
@@ -58,7 +58,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Hilmar Lapp
 
@@ -62,7 +62,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Hilmar Lapp
 
@@ -53,7 +53,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Ewan Birney
 
@@ -1,6 +1,6 @@
 # BioPerl module for Bio::Tools::Primer::AssessorI
 #
-# Please direct questions and support issues to <bioperl-l@bioperl.org> 
+# Please direct questions and support issues to <bioperl-l@bioperl.org>
 #
 # Cared for by Ewan Birney <birney@ebi.ac.uk>
 #
@@ -40,15 +40,15 @@ the Bioperl mailing list.  Your participation is much appreciated.
   bioperl-l@bioperl.org                  - General discussion
   http://bioperl.org/wiki/Mailing_lists  - About the mailing lists
 
-=head2 Support 
+=head2 Support
 
 Please direct usage questions or support issues to the mailing list:
 
 I<bioperl-l@bioperl.org>
 
-rather than to the module maintainer directly. Many experienced and 
-reponsive experts will be able look at the problem and quickly 
-address it. Please include a thorough description of the problem 
+rather than to the module maintainer directly. Many experienced and
+reponsive experts will be able look at the problem and quickly
+address it. Please include a thorough description of the problem
 with code and data examples if at all possible.
 
 =head2 Reporting Bugs
@@ -57,7 +57,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Ewan Birney
 
@@ -67,7 +67,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Ewan Birney
 
@@ -60,7 +60,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Ewan Birney
 
@@ -96,7 +96,7 @@ with code and data examples if at all possible.
 Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR -
 
@@ -54,7 +54,7 @@ with code and data examples if at all possible.
  of the bugs and their resolution. Bug reports can be submitted via
  the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Balamurugan Kumarasamy
 
@@ -51,7 +51,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Balamurugan Kumarasamy
 
@@ -73,7 +73,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Shawn Hoon
 
@@ -56,7 +56,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -106,7 +106,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -135,7 +135,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Chris Fields
 
@@ -63,7 +63,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -55,7 +55,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Shawn Hoon
 
@@ -54,7 +54,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Chad Matsalla
 
@@ -55,7 +55,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Chad Matsalla
 
@@ -133,7 +133,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR 
 
@@ -175,7 +175,7 @@ use base qw(Bio::Root::IO Exporter);
 
 our @EXPORT = qw( NOT_FINISHED ERR_QBSTATUS ERR_NOCONTENT ERR_HTTPFAIL ERR_QBNONSPEC );
 our $MODVERSION = $Bio::Root::Version::VERSION;
-our $URLBASE = 'http://www.ncbi.nlm.nih.gov/blast/Blast.cgi';
+our $URLBASE = 'http://blast.ncbi.nlm.nih.gov/Blast.cgi';
 
 # In GET/PUTPARAMS the values are regexes which validate the input.
 our %PUTPARAMS = (
@@ -645,30 +645,32 @@ sub retrieve_blast {
 =cut
 
 sub save_output {
-        my ($self, $filename) = @_;
-        if( ! defined $filename ) {
-                $self->throw("Can't save blast output.  You must specify a filename to save to.");
+    my ($self, $filename) = @_;
+    if( not defined $filename ) {
+        $self->throw("Can't save blast output.  You must specify a filename to save to.");
+    }
+    my $blastfile = $self->file;
+    #open temp file and output file, have to filter out some HTML
+    open my $TMP, '<', $blastfile or $self->throw("Could not read file '$blastfile': $!");
+
+    open my $SAVEOUT, '>', $filename or $self->throw("Could not write file '$filename': $!");
+    my $seentop = 0;
+    while (my $line = <$TMP>) {
+        next if ($line =~ /<pre>/);
+
+        if (   $line =~ /^(?:[T]?BLAST[NPX])\s*.+$/i
+            or $line =~ /^RPS-BLAST\s*.+$/i
+            or $line =~ /<\?xml\sversion=/
+            or $line =~ /^#\s+(?:[T]?BLAST[NPX])\s*.+$/
+           ) {
+            $seentop = 1;
         }
-        my $blastfile = $self->file;
-        #open temp file and output file, have to filter out some HTML
-        open(my $TMP, $blastfile) or $self->throw("cannot open $blastfile");
-
-        open(my $SAVEOUT, ">", $filename) or $self->throw("cannot open $filename");
-        my $seentop = 0;
-        while(<$TMP>) {
-                next if (/<pre>/);
-                if(/^(?:[T]?BLAST[NPX])\s*.+$/i ||
-           /^RPS-BLAST\s*.+$/i ||
-           /<\?xml\sversion=/ ||
-           /^#\s+(?:[T]?BLAST[NPX])\s*.+$/) {
-                        $seentop=1;
-                } 
         next if !$seentop;
-                if( $seentop ) {
-                        print $SAVEOUT $_;
-                }
+        if ( $seentop ) {
+            print $SAVEOUT $line;
         }
-        return 1;
+    }
+    return 1;
 }
 
 sub _load_input {
@@ -224,7 +224,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via 
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Peter Schattner
 
@@ -49,7 +49,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via 
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Peter Schattner
 
@@ -431,6 +431,10 @@ sub _runblast {
 		return;
 	}
     
+    # Use double quotes if executable path have empty spaces
+    if ($exe =~ m/ /) {
+        $exe = "\"$exe\"";
+    }
 	my $commandstring = $exe.$param_string;
     
 	$self->debug("$commandstring\n");
@@ -48,7 +48,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via 
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Peter Schattner
 
@@ -240,6 +240,10 @@ sub _runwublast {
         return;
 	}
     
+    # Use double quotes if executable path have empty spaces
+    if ($exe =~ m/ /) {
+        $exe = "\"$exe\"";
+    }
 	my $commandstring = $exe.$param_string;
     
 	$self->debug("$commandstring\n");
@@ -215,7 +215,7 @@ Here is an example config file. Further details in prose are below.
  
  our @program_commands = qw(
   rpsblast
-  cat
+  find
   goob
   blorb
   multiglob
@@ -386,7 +386,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Mark A. Jensen
 
@@ -946,15 +946,15 @@ sub _run {
 	# set up redirects and file switches
 	for (@$filespec) {
 	    m/^1?>#?(.*)/ && do {
-		defined($args{$1}) && ( open($out,">", $args{$1}) or $self->throw("Open for write error : $!"));
+		defined($args{$1}) && ( open $out, '>', $args{$1} or $self->throw("Could not write file '$args{$1}': $!") );
 		next;
 	    };
 	    m/^2>#?(.*)/ && do {
-		defined($args{$1}) && (open($err, ">", $args{$1}) or $self->throw("Open for write error : $!"));
+		defined($args{$1}) && ( open $err, '>', $args{$1} or $self->throw("Could not write file '$args{$1}': $!") );
 		next;
 	    };
 	    m/^<#?(.*)/ && do {
-		defined($args{$1}) && (open($in, "<", $args{$1}) or $self->throw("Open for read error : $!"));
+		defined($args{$1}) && ( open $in, '<', $args{$1} or $self->throw("Could not read file '$args{$1}': $!") );
 		next;
 	    };
 	    if (m/^-(.*)\|/) {
@@ -972,6 +972,7 @@ sub _run {
     # Get program executable
     my $exe = $self->executable;
     $self->throw("Can't find executable for '".($self->is_pseudo ? $self->command : $self->program_name)."'; can't continue") unless $exe;
+
     # Get command-line options
     my $options = $self->_translate_params();
     # Get file specs sans redirects in correct order
@@ -63,7 +63,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track of
 the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -65,7 +65,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Torsten Seemann
 
@@ -181,7 +181,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -196,7 +196,7 @@ with code and data examples if at all possible.
 Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Peter Schattner
 
@@ -106,7 +106,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -109,7 +109,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -87,7 +87,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -113,7 +113,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -142,7 +142,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -87,7 +87,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -69,7 +69,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted va the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -85,7 +85,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Ewan Birney, Hilmar Lapp
 
@@ -107,7 +107,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Ewan Birney, Hilmar Lapp
 
@@ -83,7 +83,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Ryan Golhar
 
@@ -94,7 +94,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Ryan Golhar
 
@@ -81,7 +81,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Eric Just
 
@@ -85,7 +85,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHORS - Emmanuel Quevillon
 
@@ -60,7 +60,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Torsten Seemann
 
@@ -190,7 +190,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -76,7 +76,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Sheldon McKay
 
@@ -147,9 +147,9 @@ sub new {
   my @result;
 
   if ($file) {
-      open FH, $file;
-      @result = (<FH>);
-      close FH;
+      open my $FH, '<', $file or $self->throw("Could not read file '$file': $!");
+      @result = (<$FH>);
+      close $FH;
   }
   elsif ($fh) {
       @result = (<$fh>);
@@ -76,7 +76,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Sheldon McKay
 
@@ -77,7 +77,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution. Bug reports can be submitted via the 
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -106,7 +106,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/           
+  https://github.com/bioperl/bioperl-live/issues           
 
 =head1 AUTHOR
 
@@ -61,7 +61,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -60,7 +60,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -66,7 +66,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Mira Han
 
@@ -112,7 +112,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 SEE ALSO
 
@@ -80,7 +80,7 @@ with code and data examples if at all possible.
 Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -103,7 +103,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Gabriel Valiente
 
@@ -435,7 +435,7 @@ sub print {
   my ($file) = $self->_rearrange([qw(FILE)], @args);
   $file ||= "output.eps"; # stdout
 
-  open(my $INFO,">", $file);
+  open my $INFO, '>', $file or $self->throw("Could not write file '$file': $!");
   print $INFO "%!PS-Adobe-\n";
   print $INFO "%%BoundingBox: 0 0 ", $width, " ", $height, "\n";
   print $INFO "1 setlinewidth\n";
@@ -60,7 +60,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -100,7 +100,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -61,7 +61,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Aaron Mackey
 
@@ -80,7 +80,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -55,7 +55,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -80,7 +80,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -389,7 +389,7 @@ sub as_text {
     $self->_load_module($iomod);
 
     my $string = '';
-    open my $fh, '>', \$string or die "Couldn't open $string as file: $!\n";
+    open my $fh, '>', \$string or $self->throw("Could not write '$string' as file: $!");
     my $test = $iomod->new( -format => $format, -fh => $fh );
 
     # Get the default params for the given IO module.
@@ -62,7 +62,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich, Aaron Mackey, Justin Reese
 
@@ -1156,7 +1156,7 @@ sub _read_trait_file {
 
     my $trait_name;
     my $trait_values;
-    open my $TRAIT, '<', $file or $self->throw("Could not open file $file: $!\n");
+    open my $TRAIT, '<', $file or $self->throw("Could not read file '$file': $!");
 
     my $first_line = 1;
     while (<$TRAIT>) {
@@ -59,7 +59,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -55,7 +55,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jessica Severin (EnsEMBL implementation), Greg Jordan (BioPerl adaptation)
 
@@ -154,7 +154,14 @@ sub parse_newick {
             $self->_end('nhx_tag');
 
             $token = next_token(\$newick, ",);"); #move to , or )
-        }
+        } elsif ($token =~ /\[/) {
+            # This is a hack to make AMPHORA2 work
+            if ($token =~ /\[(\S+)\]/) {
+                $self->_start('bootstrap');
+                $self->_chars($1);
+                $self->_end('bootstrap');
+             }
+            $token = next_token(\$newick, ",);");        }
         $state = 5;
       } elsif ($state == 5) { # end node
         if($token eq ')') {
@@ -53,7 +53,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -61,7 +61,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Guillaume Rousse
 
@@ -97,7 +97,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -56,7 +56,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -55,7 +55,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Chase Miller
 
@@ -66,7 +66,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -55,7 +55,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted viax the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Aaron Mackey
 
@@ -59,7 +59,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -56,7 +56,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted viax the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Mira Han
 
@@ -57,7 +57,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Brian OConnor
 
@@ -57,7 +57,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -60,7 +60,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -367,7 +367,7 @@ sub TIEHANDLE {
 
 sub READLINE {
   my $self = shift;
-  return $self->{'treeio'}->next_tree() unless wantarray;
+  return $self->{'treeio'}->next_tree() || undef unless wantarray;
   my (@list,$obj);
   push @list,$obj  while $obj = $self->{'treeio'}->next_tree();
   return @list;
@@ -54,7 +54,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - David Block
 
@@ -82,7 +82,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Heikki Lehvaslaiho
 
@@ -76,7 +76,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Heikki Lehvaslaiho
 
@@ -68,7 +68,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Heikki Lehvaslaiho
 
@@ -79,7 +79,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Heikki Lehvaslaiho
 
@@ -52,7 +52,7 @@ report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Heikki Lehvaslaiho
 
@@ -61,7 +61,7 @@ report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Heikki Lehvaslaiho
 
@@ -220,7 +220,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Heikki Lehvaslaiho
 
@@ -20,7 +20,7 @@ information:
 
 
 Send bug reports using the bioperl bug-tracking system at
-  https://redmine.open-bio.org/projects/bioperl/.
+  https://github.com/bioperl/bioperl-live/issues.
  
 Send general comments, questions, and feature requests to the bioperl
 mailing list:
@@ -92,7 +92,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Heikki Lehvaslaiho
 
@@ -45,7 +45,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -84,7 +84,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Heikki Lehvaslaiho
 
@@ -85,7 +85,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Heikki Lehvaslaiho
 
@@ -67,7 +67,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -206,7 +206,7 @@ and all are welcome!
 We know that there are bugs in this code. If you find something which you are pretty
 sure is a problem, post a bug report using our Bugzilla tracking system:
 
-L<https://redmine.open-bio.org/projects/bioperl/>
+L<https://github.com/bioperl/bioperl-live/issues>
 
 Please read the main bug tracking (L<http://www.bioperl.org/wiki/Bugs>) for an
 overview of what we expect in a bug report. Specifically, having a code and
@@ -64,12 +64,19 @@ my %recommends = (
     #'Bio::ASN1::EntrezGene'     => [0,
     #    'Parsing entrezgene/Bio::SeqIO::entrezgene [circular dependency!]'],
 
+    'Bio::Phylo'                => [0,
+        'NeXML related modules/Bio::AlignIO::nexml,Bio::Nexml::Factory,'.
+        'Bio::SeqIO::nexml,Bio::TreeIO::nexml'],
+
     'Clone'                     => [0,
         'Cloning objects/Bio::Root::Root,Bio::Tools::Primer3'],
 
     'Convert::Binary::C'        => [0,
         'Strider functionality/Bio::SeqIO::strider'],
 
+    'DB_File'                   => [0,
+        'Database functionality/Bio::Assemby,Bio::DB'],
+
     'Error'                     => [0,
         'OO-based exception handling (very optional)/Bio::Root::Exception'],
 
@@ -82,7 +89,7 @@ my %recommends = (
         'Bio::Assembly::Tools::ContigSpectrum'],
 
     'GraphViz'                  => [0,
-        'Phylogenetic Network Visulization/Bio::PhyloNetwork::GraphViz'],
+        'Phylogenetic Network Visualization/Bio::PhyloNetwork::GraphViz'],
 
     'HTML::Entities'            => [0,
         'Remote analysis POST submissions/Bio::SearchIO::blastxml'],
@@ -98,6 +105,9 @@ my %recommends = (
         '/Bio::DB::*,Bio::Tools::Run::RemoteBlast,'.
         'Bio::Tools::Analysis::Protein*,Bio::Tools::Analysis::DNA*'],
 
+    'IO::Scalar'               => [0,
+        'Deal with non-seekable filehandles/Bio::Tools::GuessSeqFormat'],
+
     'List::MoreUtils'           => [0,
         'Back- or reverse-translation of sequences/'.
         'Bio::Tools::SeqPattern,Bio::Tools::SeqPattern::BackTranslate'],
@@ -135,8 +145,17 @@ my %recommends = (
     'Text::ParseWords'          => [0,
         'Test scripts/Bio::DB::SeqFeature::Store::FeatureFileLoader'],
 
+    'XML::DOM'                  => [0,
+        'Parsing XML/Bio::SeqIO::bsml,Bio::SeqIO::interpro'],
+
+    'XML::DOM::XPath'           => [0,
+        'Parsing XML/Bio::SeqIO::interpro'],
+
+    'XML::LibXML'               => [0,
+        'Parsing XML/Bio::SeqIO::seqxml,Bio::TreeIO::phyloxml'],
+
     'XML::Parser'               => [0,
-        'parsing xml/Bio::Biblio::IO::medlinexml'],
+        'Parsing XML/Bio::Biblio::IO::medlinexml'],
 
     'XML::Parser::PerlSAX'      => [0,
         'Parsing XML/Bio::SeqIO::tinyseq,Bio::SeqIO::game::gameSubs,',
@@ -180,7 +199,6 @@ my $build = Bio::Root::Build->new(
     requires            => {
                             'perl'                      => '5.6.1',
                             'IO::String'                => 0,    # why is this required?
-                            'DB_File'                   => 0,    # why is this required?
                             'Data::Stag'                => 0.11, # Bio::SeqIO::swiss, we can change to 'recommend' if needed
                             'Scalar::Util'              => 0,    # not in Perl 5.6.1, arrived in core in 5.7.3
                             'ExtUtils::Manifest'        => '1.52', # allows spaces in file names
@@ -319,7 +337,7 @@ sub make_bdb_test {
     my $path0 = File::Spec->catfile('t', 'LocalDB', 'SeqFeature.t');
     my $path = File::Spec->catfile('t', 'LocalDB','SeqFeature_BDB.t');
     unlink($path) if (-e $path);
-    open(my $F, ">", $path) || die "Can't create test file\n";
+    open my $F, '>', $path or die "Could not write test file '$path': $!\n";
     print $F <<END;
 system '$^X $path0 -adaptor berkeleydb -create 1 -temp 1';
 END
@@ -351,7 +369,7 @@ sub make_dbi_test {
     my $test_db = $build->notes('test_db');
     my $user = $build->notes('test_user');
     my $pass = $build->notes('test_pass');
-    open my $F,">$path";
+    open my $F, '>', $path or die "Could not write file '$path' for DBI test: $!\n";
     my $str = "$path0 -adaptor DBI::$driver -create 1 -temp 1 -dsn \"$dsn\"";
     $str .= " -user $user" if $user;
     $str .= " -password $pass" if $pass;
@@ -12,11 +12,100 @@ Some of that history is also highlighted on our wiki:
 
 Bugs and requested features list:
 
-   https://redmine.open-bio.org/projects/bioperl
+   https://github.com/bioperl/bioperl-live/issues
 
 CPAN releases are branched from 'master'.
 ---------------------------------------------------------
 
+1.6.924
+
+    [Significant changes]
+
+    * Bug/feature issue tracking has moved to GitHub Issues:
+          https://github.com/bioperl/bioperl-live/issues
+    * DB_File has been demoted from "required" to "recommended",
+      which should make easier for Windows users to install BioPerl
+      if they don't need that module.
+
+    [New features]
+
+    * Bio::Search::HSP::GenericHSP
+        - Bug #3370, added a "posterior_string" method to retrieve the
+          posterior probability lines (PP) from HMMER3 reports [fjossandon]
+        - Added a "consensus_string" method to retrieve the consensus
+          structure lines (CS|RF) from HMMER2 and HMMER3 reports when available [fjossandon]
+    * Bio::SearchIO::hmmer2
+        - The number of identical and conserved residues are now calculated
+          directly from the homology line [fjossandon]
+        - Now the Query Length and Hit Length are reported when the alignment
+          runs until the end of the sequence/model ('.]' or '[]') [fjossandon]
+        - Implemented the capture of the consensus structure lines [fjossandon]
+    * Bio::SearchIO::hmmer3
+        - The number of identical and conserved residues are now calculated
+          directly from the homology line [fjossandon]
+        - Now the Hit Length is reported when the alignment runs until the end
+          of the sequence/model ('.]' or '[]') [fjossandon]
+        - Implemented the capture of the consensus structure lines [fjossandon]
+        - Implemented the capture of the posterior probability lines [fjossandon]
+        - Completed the development of NHMMER parsing, including alignments [fjossandon]
+    * Bio::SearchIO::SearchResultEventBuilder & Bio::SearchIO::IteratedSearchResultEventBuilder
+        - Feature #2615, moved "_init_parse_params", "max_significance, "signif",
+          "min_score", "min_bits, and "hit_filter" methods from
+          'IteratedSearchResultEventBuilder' to parent 'SearchResultEventBuilder'.
+          This means that the Bio::SearchIO->new() parameters '-signif', '-score',
+          '-bits' and '-hit_filter' will now work with other Bio::SearchIO formats
+          besides Blast, instead of being ignored. Added tests for all moved methods
+          using HMMER outputs and run the full test suite and everything pass [fjossandon]
+    * Bio::SeqIO::MultiFile
+        - Autodetection of file format [fangly]
+    * Bio::Tools::GuessSeqFormat:
+        - Format detection from non-seekable filehandles such as STDIN [fangly]
+
+    [Bug fixes]
+
+    * Fix problems when using Storable as backend for cloning [v1.6.x branch, tsibley]
+    * Fix potential problems with Storable in Bio::DB::SeqFeature::Store [tsibley]
+    * SeqFeature::Lite: Fixed wrong strand when using "+", "-", or "." [nathanweeks]
+    * Abstract: Fixed ActivePerl incapability of removing temporary files
+      because of problems closing tied filehandles [fjossandon]
+    * IndexedBase: For Windows' ActivePerl, several LocalDB tests were failing
+      because ActivePerl were producing a ".index.pag" and ".index.dir"
+      files instead of a single ".index" file (like Strawberry Perl).
+      Now those temporary files are correctly considered and deleted. [fjossandon]
+    * Test files: Added missing module requirements (DB_File and Data::Stag)
+      to several tests files that were failing because those modules were
+      not present. Now those test files are correctly skipped instead. [fjossandon]
+    * Blast: Added support to changes in bl2seq from BLAST+ output, which
+      now uses "Subject=" instead of ">" to start hit lines [yschensandiego]
+    * Phylip: Return undef in "next_aln" at file end to avoid
+      an infinite loop [yschensandiego]
+    * HMMER3: When a hit description is too long, it is truncated in
+      the Scores table. In those cases, the more complete description from
+      the Annotation line (>>) will be used [fjossandon]
+    * GenericHSP: Added '.' to gap symbols in "_pre_gaps" (except for ERPIN),
+      since it is now used by HMMER3 format in alignments [fjossandon]
+    * GenericHit: Changed "frac_aligned_query" and "frac_aligned_hit"
+      to return undef if the query/hit length is unknown (like in some
+      HMMER outputs), to avoid division by 0 crashes. Also "query_length"
+      now is set to 0 if its undefined, to be consistent with hit "length" [fjossandon]
+    * HMMER: fixed many bugs in the parsing of Hmmer2 and Hmmer3 outputs,
+      added support to multi-query reports, reduced code redundancy,
+      and eliminated the automatic removal of hits below "inclusion threshold" [fjossandon]
+    * [3369] - Fixed reported bugs in parse from HMMSEARCH3 reports [fjossandon]
+    * [3446] - Fixed wrong marker position in Bio::Map::Physical [fjossandon]
+    * [3455] - Fixed wrong print of DBLink in Genbank file [bosborne]
+    * Fixed some Bio::Root::Utilities subroutines [fjossandon]
+    * Double-quotes on paths are needed in some places [fjossandon]
+    * [3453] - Allow multiple homologies and products in Entrezgene [fjossandon]
+    * Use "NUL" instead of"/dev/null" when running in Windows [fjossandon]
+    * Updated all files from Bio-Root, Bio-Coordinate and Bio-SearchIO-blastxml
+      with the latest changes made in their own repositories [fjossandon]
+    * General synching of files with the master branch [fjossandon]
+    * Fixed tests failing in Windows because of using Linux commands [fjossandon]
+    * Closed many open filehandles that prevented temporary files deletion [fjossandon]
+    * Fixed broken MeSH parser [fjossandon]
+    * Fixed missing detection of format in SeqIO when given a -string [fangly]
+
 1.6.923
     
     * Major Windows support updates! [fjossandon]
@@ -276,7 +365,7 @@ CPAN releases are branched from 'master'.
     * [3034] - AlignIO::clustal output [Bernd, DaveMessina]
     * [3031] - Parse algorithm ref for BLAST [Razi Khaja, cjfields]
     * [3028] - Bio::TreeIO::nexus and FigTree compat [Kevin Balbi, cjfields]
-    * [3025] - Bio::SeqIO::embl infinite loop [Adam Sjøgren, cjfields]
+    * [3025] - Bio::SeqIO::embl infinite loop [Adam Sjøgren, cjfields]
     * [3040, 3023, 2974, 2921, 2753, 2636, 2482] - PAML parser fixed, works with
                PAML 4.4d [DaveMessina]
     * [3015, 3022] - Bio::Restriction withrefm regexp [Emmanuel Quevillon,
@@ -296,7 +385,7 @@ CPAN releases are branched from 'master'.
     * [2944] - Bio::Tools::GFF score [cjfields]
     * [2942] - correct MapTiling output [maj]
     * [2939] - PDB residue insertion codes [John May, maj]
-    * [2930] - PrimarySeqI term symbol [Adam Sjøgren, maj]
+    * [2930] - PrimarySeqI term symbol [Adam Sjøgren, maj]
     * [2928] - GuessSeqFormat raw [maj]
     * [2926] - Bio:Tools::TandemRepeatsFinder seq_id [takadonet, cjfields]
     * [2922] - open() directive issue [cjfields]
@@ -305,7 +394,7 @@ CPAN releases are branched from 'master'.
     * [2899] - SeqFeature::Store host issues [lstein, dbolser]
     * [2897] - Add a "mask_below_threshold" method to Seq::Quality [dbolser,
                cjfields]
-    * [2881] - .scf files don't' roundtrip [Adam Sjøgren, cjfields]
+    * [2881] - .scf files don't' roundtrip [Adam Sjøgren, cjfields]
     * [2876] - CDD search with RemoteBlast [Malcolm Cook]
     * [2863] - Root::IO::_initialize_io causes crash [rbuels, maj, DaveMessina]
     * [2845] - Bio::Seq::Quality gives seq with no ID [Tristan Lefebure, cjfields]
@@ -462,7 +551,7 @@ CPAN releases are branched from 'master'.
     * Bio::SeqIO::raw
         - add option for 'single' and 'multiple'
     * Bio::SeqIO::scf
-        - bug 2881 - fix scf round-tripping [Adam Søgren]
+        - bug 2881 - fix scf round-tripping [Adam Søgren]
     * Bio::SeqUtils
         - bug 2766, 2810 - copy over tags from features, doc fixes [David
           Jackson]
@@ -10,13 +10,12 @@ Installing BioPerl for Unix
      * 8 WHERE ARE THE MAN PAGES?
      * 9 EXTERNAL PROGRAMS
           * 9.1 Environment Variables
-     * 10 THE BIOPERL BUNDLE
-     * 11 INSTALLING BIOPERL SCRIPTS
-     * 12 INSTALLING BIOPERL IN A PERSONAL MODULE AREA
-     * 13 INSTALLING BIOPERL MODULES THE HARD WAY
-     * 14 USING MODULES NOT INSTALLED IN THE STANDARD LOCATION
-     * 15 THE TEST SYSTEM
-     * 16 BUILDING THE OPTIONAL bioperl-ext PACKAGE
+     * 10 INSTALLING BIOPERL SCRIPTS
+     * 11 INSTALLING BIOPERL IN A PERSONAL MODULE AREA
+     * 12 INSTALLING BIOPERL MODULES THE HARD WAY
+     * 13 USING MODULES NOT INSTALLED IN THE STANDARD LOCATION
+     * 14 THE TEST SYSTEM
+     * 15 BUILDING THE OPTIONAL bioperl-ext PACKAGE
           * 16.1 CONFIGURING for BSD and Solaris boxes
           * 16.2 INSTALLATION
 
@@ -28,10 +27,9 @@ BioPerl wiki:
   http://www.bioperl.org/wiki/Installing_BioPerl
 
 BioPerl has been installed on many forms of Unix, Win9X/NT/2000/XP,
-and on Mac OS X (see the PLATFORMS file for more details). Following
-are instructions for installing BioPerl for Unix/Linux/Mac OS X;
-Windows installation instructions can be found in INSTALL.WIN. For
-installing BioPerl for Mac OS X using Fink, see:
+and on Mac OS X. The following are instructions for installing BioPerl 
+for Unix/Linux/Mac OS X. Windows installation instructions can be found 
+in INSTALL.WIN. For installing BioPerl for Mac OS X using Fink, see:
 
 http://www.bioperl.org/wiki/Getting_BioPerl#Mac_OS_X_using_fink
 
@@ -92,6 +90,7 @@ PRELIMINARY PREPARATION
  cpan>o conf makepl_arg "EXPATLIBPATH=/non-standard/lib EXPATINCPATH=/non-standard/include"
  cpan>o conf commit
 
+
 INSTALLING BIOPERL THE EASY WAY USING Build.PL
 
 The advantage of this approach is it's stepwise, so it's easy to stop
@@ -99,8 +98,8 @@ and analyze in case of any problem.
 
 Download, then unpack the tar file. For example:
 
- >tar xvfz BioPerl-1.6.1.tar.gz
- >cd BioPerl-1.6.1
+ >tar xvfz BioPerl-1.6.923.tar.gz
+ >cd BioPerl-1.6.923
 
 Now issue the build commands:
 
@@ -123,8 +122,7 @@ fine, do:
 
  >./Build install
 
-This is what most experienced BioPerl users would do. However, if
-you're concerned about a failed test and need assistance or advice
+If you're concerned about a failed test and need assistance or advice
 then contact bioperl-l@bioperl.org. (You could provide us the detailed
 results of the failed test(s): see the `THE TEST SYSTEM' below for
 information on how to generate such results.)
@@ -139,6 +137,7 @@ It is also straightforward to install the package outside of the this
 standard Perl5 location. See INSTALLING BIOPERL IN A PERSONAL MODULE
 AREA, below.
 
+
 INSTALLING BIOPERL THE EASY WAY USING CPAN
 
 You can use the CPAN shell to install BioPerl. For example:
@@ -152,19 +151,16 @@ Or you might have the cpan alias installed:
 Then find the name of the BioPerl version you want:
 
  cpan>d /bioperl/
- CPAN: Storable loaded ok
- Going to read /home/bosborne/.cpan/Metadata
- Database was generated on Mon, 20 Nov 2006 05:24:36 GMT
 
  ....
 
- Distribution B/BI/BIRNEY/bioperl-1.2.tar.gz
- Distribution B/BI/BIRNEY/bioperl-1.4.tar.gz
- Distribution C/CJ/CJFIELDS/BioPerl-1.6.1.tar.gz
+Distribution    CJFIELDS/BioPerl-1.6.901.tar.gz
+Distribution    CJFIELDS/BioPerl-1.6.922.tar.gz
+Distribution    CJFIELDS/BioPerl-1.6.923.tar.gz
 
 Now install:
 
- cpan>install C/CJ/CJFIELDS/BioPerl-1.6.1.tar.gz
+ cpan>install CJFIELDS/BioPerl-1.6.923.tar.gz
 
 If you've installed everything perfectly and all the network
 connections are working then you may pass all the tests run in the
@@ -179,10 +175,9 @@ tests, a few failed tests may not affect your usage of BioPerl.
 If you decide that the failed tests will not affect how you intend to
 use BioPerl and you'd like to install anyway do:
 
- cpan>force install C/CJ/CJFIELDS/BioPerl-1.6.1.tar.gz
+ cpan>force install C/CJ/CJFIELDS/BioPerl-1.6.923.tar.gz
 
-This is what most experienced BioPerl users would do. However, if
-you're concerned about a failed test and need assistance or advice
+If you're concerned about a failed test and need assistance or advice
 then contact bioperl-l@bioperl.org. (You could provide us the detailed
 results of the failed test(s): see the `THE TEST SYSTEM' below for
 information on how to generate such results.)
@@ -260,16 +255,6 @@ Some environment variables include:
 |               |(e.g. http://USERNAME:PASSWORD@proxy.example.com:8080). |
 +------------------------------------------------------------------------+
 
-THE BIOPERL BUNDLE
-
-Users of previous versions of BioPerl may remember Bundle::BioPerl.
-You no longer need to install Bundle::BioPerl. Instead, the normal
-installation process will ask you if you'd like to install optional
-external module dependencies that BioPerl has.
-
-A full list of BioPerl dependencies can be found in the DEPENDENCIES
-file included with this distribution.
-
 INSTALLING BIOPERL SCRIPTS
 
 BioPerl comes with a set of production-quality scripts that are
@@ -6,28 +6,27 @@
 
      * 1 Introduction
      * 2 Requirements
-     * 3 Installation using the Perl Package Manager
+     * 3 Installation using the ActiveState Perl Package Manager
      
           * 3.1 GUI Installation
           * 3.2 Comand-line Installation
           
      * 4 Installation using CPAN or manual installation
      * 5 Bioperl
-     * 6 Perl on Windows
-     * 7 Bioperl on Windows
-     * 8 Beyond the Core
-
-          * 8.1 Setting environment variables
-          * 8.2 Installing bioperl-db
-
-     * 9 Bioperl in Cygwin
-     * 10 bioperl-db in Cygwin
-     * 11 Cygwin tips
-     * 12 MySQL and DBD::mysql
-     * 13 Expat
-     * 14 Directory for temporary files
-     * 15 BLAST
-     * 16 Compiling C code
+     * 6 Bioperl on Windows
+     * 7 Beyond the Core
+
+          * 7.1 Setting environment variables
+          * 7.2 Installing bioperl-db
+
+     * 8 Bioperl in Cygwin
+     * 9 bioperl-db in Cygwin
+     * 10 Cygwin tips
+     * 11 MySQL and DBD::mysql
+     * 12 Expat
+     * 13 Directory for temporary files
+     * 14 BLAST
+     * 15 Compiling C code
 
 Introduction
 
@@ -44,51 +43,75 @@ Introduction
 
 Requirements
 
-   Only ActivePerl >= 5.8.8.819 is supported by the Bioperl team. Earlier
-   versions may work, but we do not support them.
+   There are a couple of ways of installing Perl on a Windows machine. One is
+   to get the most recent build from Strawberry Perl, and the other is to get
+   it from ActiveState; both are software companies that provides free builds
+   of Perl for Windows users, but Strawberry Perl is recommended since is more
+   CPAN friendly because it includes a compiler (gcc), related tools and other
+   external libraries. The current (March 2014) build is 5.18.2.
+
+   NOTE - Only Perl >= 5.8.8.819 is supported by the BioPerl team. Earlier
+   versions may work, but we do not support them. Perl 5.18 also works. One of
+   the reason for this requirement is that ActivePerl >= 5.8.8.819 now use Perl
+   Package Manager 4 (PPM4). PPM4 is now superior to earlier versions and also
+   includes a Graphical User Interface (GUI). In short, it's easier for us to
+   produce and maintain a package for installation via PPM and also easier for
+   you to do the install! Proceed with earlier versions at your own risk.
+
+   To install Perl on Windows:
 
-   One of the reason for this requirement is that ActivePerl >= 5.8.8.819 now
-   use Perl Package Manager 4 (PPM4). PPM4 is now superior to earlier
-   versions and also includes a Graphical User Interface (GUI). In short,
-   it's easier for us to produce and maintain a package for installation via
-   PPM and also easier for you to do the install! Proceed with earlier
-   versions at your own risk.
+           1) Download the Strawberry Perl MSI from
+           http://strawberryperl.com/releases.html or ActivePerl MSI from
+           http://www.activestate.com/activeperl/downloads.
 
-   To install ActivePerl:
+           2) Run the Installer (accepting all defaults is fine).
+
+   You can also build Perl yourself (which requires a C compiler) or download
+   one of the other binary distributions. The Perl source for building it
+   yourself is available from CPAN, as are a few other binary distributions
+   that are alternatives to ActiveState. This approach is not recommended
+   unless you have specific reasons for doing so and know what you're doing.
+   If that's the case you probably don't need to be reading this guide.
 
-           1) Download the ActivePerl MSI from ActiveState
+   Cygwin is a UNIX emulation environment for Windows and comes with its own
+   copy of Perl.
 
-           2) Run the ActivePerl Installer (accepting all defaults is fine).
+   Information on Cygwin and Bioperl is found below. 
 
-Installation using the Perl Package Manager
+Installation using the ActiveState Perl Package Manager
 
   GUI Installation
 
            1) Start the Perl Package Manager GUI from the Start menu.
 
            2) Go to Edit >> Preferences and click the Repositories tab. Add a
-           new repository for each of the following:
+           new repository for each of the following (note the difference based
+           on the perl version). NOTE - The DB_File installed with ActivePerl
+           5.10 and above is a stub (i.e. it does not work). The Trouchelle
+           database below has a working DB_File.
 
                               Repositories to add
        +----------------------------------------------------------------+
        |           Name           |              Location               |
        |--------------------------+-------------------------------------|
-       |BioPerl-Release Candidates|[37]http://bioperl.org/DIST/RC       |
+       |BioPerl-Release Candidates|http://bioperl.org/DIST/RC           |
        |--------------------------+-------------------------------------|
-       |BioPerl-Regular Releases  |[38]http://bioperl.org/DIST          |
+       |BioPerl-Regular Releases  |http://bioperl.org/DIST              |
        |--------------------------+-------------------------------------|
-       |Kobes                     |[39]http://theoryx5.uwinnipeg.ca/ppms|
+       |Kobes                     |http://theoryx5.uwinnipeg.ca/ppms    |
        |--------------------------+-------------------------------------|
-       |Bribes                    |[40]http://www.Bribes.org/perl/ppm   |
+       |Bribes                    |http://www.Bribes.org/perl/ppm       |
+       |--------------------------+-------------------------------------|
+       |Trouchelle                |http://trouchelle.com/ppm            |
        +----------------------------------------------------------------+
 
-
            3) Select View >> All Packages.
 
            4) In the search box type bioperl.
 
            5) Right click the latest version of Bioperl available and choose
-           install.
+           install. (Note for users of previous Bioperl releases: you should
+           not have to use the Bundle-BioPerl package anymore.)
 
            5a) From bioperl 1.5.2 onward, all 'optional' pre-requisites will
            be marked for installation. If you see that some of them complain
@@ -159,20 +182,29 @@ Installation using the Perl Package Manager
 
 Installation using CPAN or manual installation
 
-   Installation using PPM is preferred since it is easier, but if you run
-   into problems, or a ppm isn't available for the version/package of bioperl
-   you want, or you want to choose which optional dependencies to install,
-   you can install manually by downloading the appropriate package or by
-   using CPAN. In fact both methods ultimately need nmake to be
-   installed, CPAN to be upgraded to >= v1.81, Module::Build to be installed
-   (>= v0.2805) and Test::Harness to be upgraded to >= v2.62:
-
-           1) Download nmake
-
-           2) Double-click to run it, which extracts 3 files. Move both
-           NMAKE.EXE and the NMAKE.ERR files to a place in your PATH; if set
-           up properly, you can move these to your Perl bin directory,
-           normally C:\Perl\bin.
+   When using ActivePerl, installation using PPM is preferred since it is
+   easier, but if you run into problems, or a PPM isn't available for the
+   latest version/package of BioPerl, or you want to choose which optional
+   dependencies to install, you can install manually by downloading the
+   appropriate package or by using CPAN (installation using CPAN will always
+   get you the latest version). Both manual methods ultimately need an
+   accessory compiling program like MinGW, which incorporates the necessary
+   tools like dmake and gcc. MinGW comes by default with Strawberry Perl, but
+   must be installed through PPM for ActivePerl. Also CPAN neeed to be upgraded
+   to >= v1.81, Module::Build to be installed (>= v0.2805) and Test::Harness to
+   be upgraded to >= v2.62:
+
+   Dmake for ActivePerl
+
+           1) Install MinGW package through PPM: Using a cmd window type
+           'ppm install MinGW' for 32bits Windows or 'ppm install MinGW64' for
+           64bits Windows. Is IMPORTANT to check previously if ActiveState
+           provides the MinGW package for your ActivePerl version. For example,
+           although ActivePerl 5.18.2.1802 is currently available (May 2014),
+           the download page point mainly at ActivePerl 5.16.3.1604, and the
+           MinGW package is available for version 5.16 but NOT for version 5.18.
+
+   CPAN for ActivePerl and Strawberry Perl
 
            1) Open a cmd window by going to Start >> Run and typing 'cmd'
            into the box and pressing return.
@@ -193,23 +225,25 @@ Installation using CPAN or manual installation
 
            7) At the cpan> prompt, type 'install Test::Harness'.
 
-   You can now follow the unix instructions for installing using CPAN, or
-   install manually:
+           8) At the cpan> prompt, type 'install Test::Most'.
+
+   You can now follow the unix instructions for installing using CPAN
+   (preferred), or install manually:
 
-           8) Download the .zip version of the package you want.
+           9) Download the .zip version of the package you want.
 
-           9) Extract the archive in the normal way.
+           10) Extract the archive in the normal way.
 
-           10) In a cmd window 'cd' to the directory you extracted to. Eg. if
+           11) In a cmd window 'cd' to the directory you extracted to. Eg. if
            you extracted to directory 'Temp', 'cd Temp\bioperl-1.5.2_100'
 
-           11) Type 'perl Build.PL' and answer the questions appropriately.
+           12) Type 'perl Build.PL' and answer the questions appropriately.
 
-           12) Type 'perl Build test'. All the tests should pass, but if they
+           13) Type 'perl Build test'. All the tests should pass, but if they
            don't, let us know. Your usage of Bioperl may not be affected
            by the failure, so you can choose to continue anyway.
 
-           13) Type 'perl Build install' to install Bioperl.
+           14) Type 'perl Build install' to install Bioperl.
 
 Bioperl
 
@@ -269,34 +303,6 @@ Bioperl
    Windows. A number of Bioperl users are using this approach successfully
    and it is discussed in more detail below.
 
-Perl on Windows
-
-   There are a couple of ways of installing Perl on a Windows machine. The
-   most common and easiest is to get the most recent build from
-   ActiveState, a software company that provides free builds of Perl for
-   Windows users. The current (October 2006) build is ActivePerl 5.8.8.819.
-   Bioperl also works on Perl 5.6.x, but due to installation problems etc,
-   only ActivePerl 5.8.8.819 or later is supported for WinXP installation.
-   To install ActivePerl on Windows:
-
-           1) Download the ActivePerl MSI from
-           http://www.activestate.com/Products/ActivePerl/.
-
-           2) Run the ActivePerl Installer (accepting all defaults is fine).
-
-   You can also build Perl yourself (which requires a C compiler) or download
-   one of the other binary distributions. The Perl source for building it
-   yourself is available from CPAN, as are a few other binary
-   distributions that are alternatives to ActiveState. This approach is not
-   recommended unless you have specific reasons for doing so and know what
-   you're doing. If that's the case you probably don't need to be reading
-   this guide.
-
-   Cygwin is a UNIX emulation environment for Windows and comes with
-   its own copy of Perl.
-
-   Information on Cygwin and Bioperl is found below.
-
 Bioperl on Windows
 
    Perl is a programming language that has been extended a lot by the
@@ -369,14 +375,12 @@ Beyond the Core
    Bioperl search in PPM.  If these are not available, though, you can use
    the following instructions for installing the other distributions.
 
-   For this you will need a Windows version of the program make
-   called nmake:
-
-   http://download.microsoft.com/download/vc15/Patch/1.52/W95/EN-US/Nmake15.exe
-
-   You will also want to have a willingness to experiment. You'll have to
-   read the installation documents for each component that you want to
-   install, and use nmake where the instructions call for make, like so:
+   For bioperl-run, bioperl-db and bioperl-network v1.5.2 or higher you can use
+   the PPD or CPAN installation instructions above. For other packages you will
+   need nmake (see also the CPAN installation instructions), and a willingness
+   to experiment. You'll have to read the installation documents for each
+   component that you want to install, and use nmake where the instructions
+   call for make, like so:
 
  perl Makefile.PL
  nmake
@@ -384,15 +388,14 @@ Beyond the Core
  nmake install
 
    'nmake test' will likely produce lots of warnings, many of these can be
-   safely ignored (these stem from the excessively paranoid '-w' flag in
-   ActivePerl). You will have to determine from the installation documents
+   safely ignored. You will have to determine from the installation documents
    what dependencies are required, and you will have to get them, read their
    documentation and install them first. It is recommended that you look
-   through the PPM repositories for any modules before resorting to using
-   nmake as there isn't any guarantee modules built using nmake will work.
-   The details of this are beyond the scope of this guide. Read the
-   documentation. Search Google. Try your best, and if you get stuck consult
-   with others on the BioPerl mailing list.
+   through the PPM repositories for any modules before resorting to using nmake
+   as there isn't any guarantee modules built using nmake will work. The
+   details of this are beyond the scope of this guide. Read the documentation.
+   Search Google. Try your best, and if you get stuck consult with others on
+   the BioPerl mailing list.
 
     Setting environment variables
 
@@ -463,8 +466,8 @@ Beyond the Core
  >mysql -u root -p bioseqdb < biosqldb-mysql.sql
  Enter password: **********
 
-   Download bioperl-db from CVS. Use the following to install the
-   modules:
+   Download bioperl-db from the anonymous Git repository. Use the following
+   to install the modules:
 
  perl Makefile.PL
  nmake
@@ -613,13 +616,11 @@ MySQL and DBD::mysql
    instructions online:
 
      * Instructions included with DBD::mysql:
-     
        http://search.cpan.org/src/JWIED/DBD-mysql-2.1025/INSTALL.html#windows/cygwin
        
      * Additional instructions if you run into any problems; this
        information is more up-to-date, covers post-2.9 DBD::mysql quirks in
        Cygwin.
-       
        http://rage.against.org/installingdbdmysqlInCygwin
 
 Expat
@@ -652,15 +653,16 @@ Directory for temporary files
 
 BLAST
 
-   If you want use BLAST we recommend that the Windows binary be obtained
-   from NCBI (ftp://ftp.ncbi.nih.gov/blast/executables/LATEST/ - the
-   file will be named something like blast-2.2.13-ia32-win32.exe). Then
-   follow the Windows instructions in README.bls. You will also need to set
-   the BLASTDIR environment variable to reflect the directory which holds the
-   blast executable and data folder. You may also want to set other variables
-   to reflect the location of your databases and substitution matrices if
-   they differ from the location of your blast executables; see
-   Installing Bioperl for Unix for more details.
+   If you want use BLAST we recommend that the Windows binary be obtained from
+   NCBI (ftp://ftp.ncbi.nih.gov/blast/executables/blast+/LATEST/ - the file
+   will be named something like ncbi-blast-2.2.29+-win64.exe). Then follow the
+   Windows instructions from BLAST Help
+   (http://www.ncbi.nlm.nih.gov/books/NBK1762). You will also need to set the
+   BLASTDIR environment variable to reflect the directory which holds the blast
+   executable and data folder. You may also want to set other variables to
+   reflect the location of your databases and substitution matrices if they
+   differ from the location of your blast executables; see Installing Bioperl
+   for Unix for more details.
 
 Compiling C code
 
@@ -943,6 +943,8 @@ maintenance/README
 maintenance/symlink_script.pl
 maintenance/version.pl
 MANIFEST			This list of files
+META.json
+META.yml
 models/biblio.dia
 models/bio_liveseq_variation.dia
 models/bio_map.dia
@@ -1121,6 +1123,7 @@ t/data/AHCYL1.kegg
 t/data/alleles.fas
 t/data/alnfile.fasta
 t/data/amino.fa
+t/data/amphora.newick
 t/data/AnnIX-v003.gbk
 t/data/ar.embl
 t/data/assembly_with_singlets.ace
@@ -1149,6 +1152,7 @@ t/data/biofpc.fpc
 t/data/biorecipe.nhx
 t/data/Bird_Ovomucoids.nex
 t/data/BK000016-tpa.gbk
+t/data/bl2seq+.blastn
 t/data/bl2seq.blastn
 t/data/bl2seq.blastn.rev
 t/data/bl2seq.blastx.out
@@ -1308,6 +1312,7 @@ t/data/EG352462.gbxml
 t/data/empty.bl2seq
 t/data/ENr111.mfa.example.elems
 t/data/entrezgene.dat
+t/data/entrezgene_bug3453.dat
 t/data/ex1.nucl.nhx
 t/data/example.hap
 t/data/example.phase
@@ -1390,7 +1395,6 @@ t/data/gmap_f9.txt
 t/data/GO.defs.test
 t/data/GO.defs.test2
 t/data/headerless.psl
-t/data/hemoglobinA.meg
 t/data/hg16_chroms.gff
 t/data/hmmpfam.out
 t/data/hmmpfam_cs.out
@@ -1402,6 +1406,7 @@ t/data/hmmscan_multi_domain.out
 t/data/hmmscan_sec_struct.out
 t/data/hmmsearch.out
 t/data/hmmsearch3.out
+t/data/hmmsearch3_multi.out
 t/data/hs_est.est2genome
 t/data/hs_fugu.newick
 t/data/hs_owlmonkey.aln
@@ -1733,11 +1738,9 @@ t/data/test.interpro-go.xml
 t/data/test.lasergene
 t/data/test.locuslink
 t/data/test.maq
-t/data/test.mase
 t/data/test.metafasta
 t/data/test.nh
 t/data/test.nhx
-t/data/test.pfam
 t/data/test.phd
 t/data/test.pir
 t/data/test.pln
@@ -1761,12 +1764,13 @@ t/data/test_clear_range.fastq
 t/data/test_data.axt
 t/data/test_singlets.cns.fastq
 t/data/test_singlets.maq
-t/data/testaln.aln
 t/data/testaln.arp
+t/data/testaln.clustalw
 t/data/testaln.fasta
 t/data/testaln.fastq
 t/data/testaln.list
 t/data/testaln.mase
+t/data/testaln.mega
 t/data/testaln.metafasta
 t/data/testaln.msf
 t/data/testaln.nexus
@@ -1806,6 +1810,7 @@ t/data/tricky.wublast
 t/data/trna.strict.rnamotif
 t/data/U58726.gb
 t/data/U71225.gb
+t/data/U71225.gb.mac
 t/data/U71225.gb.unix
 t/data/U71225.gb.win
 t/data/U83300.bsml
@@ -1906,10 +1911,9 @@ t/Restriction/Gel.t
 t/Restriction/IO.t
 t/Root/Exception.t
 t/Root/HTTPget.t
+t/Root/IO.t
 t/Root/RootI.t
-t/Root/RootIO.t
 t/Root/Storable.t
-t/Root/Tempfile.t
 t/Root/Utilities.t
 t/SearchDist.t
 t/SearchIO/axt.t
@@ -1969,7 +1973,6 @@ t/SeqFeature/RangeI.t
 t/SeqFeature/SeqAnalysisParser.t
 t/SeqFeature/SubSeq.t
 t/SeqFeature/Unflattener.t
-t/SeqFeature/Unflattener2.t
 t/SeqIO/abi.t
 t/SeqIO/ace.t
 t/SeqIO/agave.t
@@ -2056,7 +2059,6 @@ t/Tools/Genewise.t
 t/Tools/Genomewise.t
 t/Tools/Genpred.t
 t/Tools/GFF.t
-t/Tools/GuessSeqFormat.t
 t/Tools/Hmmer.t
 t/Tools/IUPAC.t
 t/Tools/Lucy.t
@@ -2120,5 +2122,3 @@ t/Variation/SeqDiff.t
 t/Variation/SNP.t
 t/Variation/Variation_IO.t
 travis_scripts/dependency_installs
-META.yml
-META.json
@@ -4,7 +4,7 @@
       "BioPerl Team <bioperl-l@bioperl.org>"
    ],
    "dynamic_config" : 1,
-   "generated_by" : "Module::Build version 0.4203",
+   "generated_by" : "Module::Build version 0.4003, CPAN::Meta::Converter version 2.141520",
    "license" : [
       "perl_5"
    ],
@@ -30,15 +30,17 @@
       },
       "configure" : {
          "requires" : {
-            "Module::Build" : "0.42"
+            "Module::Build" : "0.40"
          }
       },
       "runtime" : {
          "recommends" : {
             "Algorithm::Munkres" : "0",
             "Array::Compare" : "0",
+            "Bio::Phylo" : "0",
             "Clone" : "0",
             "Convert::Binary::C" : "0",
+            "DB_File" : "0",
             "Error" : "0",
             "GD" : "0",
             "Graph" : "0.5",
@@ -47,6 +49,7 @@
             "HTML::HeadParser" : "3",
             "HTML::TableExtract" : "0",
             "HTTP::Request::Common" : "0",
+            "IO::Scalar" : "0",
             "LWP::UserAgent" : "0",
             "List::MoreUtils" : "0",
             "PostScript::TextBlock" : "0",
@@ -58,6 +61,9 @@
             "Spreadsheet::ParseExcel" : "0",
             "Storable" : "2.05",
             "Text::ParseWords" : "0",
+            "XML::DOM" : "0",
+            "XML::DOM::XPath" : "0",
+            "XML::LibXML" : "0",
             "XML::Parser" : "0",
             "XML::Parser::PerlSAX" : "0",
             "XML::SAX" : "0.15",
@@ -68,7 +74,6 @@
             "YAML" : "0"
          },
          "requires" : {
-            "DB_File" : "0",
             "Data::Stag" : "0.11",
             "ExtUtils::Manifest" : "1.52",
             "IO::String" : "0",
@@ -77,11 +82,3313 @@
          }
       }
    },
+   "provides" : {
+      "Bio::Align::AlignI" : {
+         "file" : "Bio/Align/AlignI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Align::DNAStatistics" : {
+         "file" : "Bio/Align/DNAStatistics.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Align::Graphics" : {
+         "file" : "Bio/Align/Graphics.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Align::PairwiseStatistics" : {
+         "file" : "Bio/Align/PairwiseStatistics.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Align::ProteinStatistics" : {
+         "file" : "Bio/Align/ProteinStatistics.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Align::StatisticsI" : {
+         "file" : "Bio/Align/StatisticsI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Align::Utilities" : {
+         "file" : "Bio/Align/Utilities.pm",
+         "version" : "1.006924"
+      },
+      "Bio::AlignIO" : {
+         "file" : "Bio/AlignIO.pm",
+         "version" : "1.006924"
+      },
+      "Bio::AlignIO::Handler::GenericAlignHandler" : {
+         "file" : "Bio/AlignIO/Handler/GenericAlignHandler.pm",
+         "version" : "1.006924"
+      },
+      "Bio::AlignIO::arp" : {
+         "file" : "Bio/AlignIO/arp.pm",
+         "version" : "1.006924"
+      },
+      "Bio::AlignIO::bl2seq" : {
+         "file" : "Bio/AlignIO/bl2seq.pm",
+         "version" : "1.006924"
+      },
+      "Bio::AlignIO::clustalw" : {
+         "file" : "Bio/AlignIO/clustalw.pm",
+         "version" : "1.006924"
+      },
+      "Bio::AlignIO::emboss" : {
+         "file" : "Bio/AlignIO/emboss.pm",
+         "version" : "1.006924"
+      },
+      "Bio::AlignIO::fasta" : {
+         "file" : "Bio/AlignIO/fasta.pm",
+         "version" : "1.006924"
+      },
+      "Bio::AlignIO::largemultifasta" : {
+         "file" : "Bio/AlignIO/largemultifasta.pm",
+         "version" : "1.006924"
+      },
+      "Bio::AlignIO::maf" : {
+         "file" : "Bio/AlignIO/maf.pm",
+         "version" : "1.006924"
+      },
+      "Bio::AlignIO::mase" : {
+         "file" : "Bio/AlignIO/mase.pm",
+         "version" : "1.006924"
+      },
+      "Bio::AlignIO::mega" : {
+         "file" : "Bio/AlignIO/mega.pm",
+         "version" : "1.006924"
+      },
+      "Bio::AlignIO::meme" : {
+         "file" : "Bio/AlignIO/meme.pm",
+         "version" : "1.006924"
+      },
+      "Bio::AlignIO::metafasta" : {
+         "file" : "Bio/AlignIO/metafasta.pm",
+         "version" : "1.006924"
+      },
+      "Bio::AlignIO::msf" : {
+         "file" : "Bio/AlignIO/msf.pm",
+         "version" : "1.006924"
+      },
+      "Bio::AlignIO::nexml" : {
+         "file" : "Bio/AlignIO/nexml.pm",
+         "version" : "1.006924"
+      },
+      "Bio::AlignIO::nexus" : {
+         "file" : "Bio/AlignIO/nexus.pm",
+         "version" : "1.006924"
+      },
+      "Bio::AlignIO::pfam" : {
+         "file" : "Bio/AlignIO/pfam.pm",
+         "version" : "1.006924"
+      },
+      "Bio::AlignIO::phylip" : {
+         "file" : "Bio/AlignIO/phylip.pm",
+         "version" : "1.006924"
+      },
+      "Bio::AlignIO::po" : {
+         "file" : "Bio/AlignIO/po.pm",
+         "version" : "1.006924"
+      },
+      "Bio::AlignIO::proda" : {
+         "file" : "Bio/AlignIO/proda.pm",
+         "version" : "1.006924"
+      },
+      "Bio::AlignIO::prodom" : {
+         "file" : "Bio/AlignIO/prodom.pm",
+         "version" : "1.006924"
+      },
+      "Bio::AlignIO::psi" : {
+         "file" : "Bio/AlignIO/psi.pm",
+         "version" : "1.006924"
+      },
+      "Bio::AlignIO::selex" : {
+         "file" : "Bio/AlignIO/selex.pm",
+         "version" : "1.006924"
+      },
+      "Bio::AlignIO::stockholm" : {
+         "file" : "Bio/AlignIO/stockholm.pm",
+         "version" : "1.006924"
+      },
+      "Bio::AlignIO::xmfa" : {
+         "file" : "Bio/AlignIO/xmfa.pm",
+         "version" : "1.006924"
+      },
+      "Bio::AnalysisI" : {
+         "file" : "Bio/AnalysisI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::AnalysisI::JobI" : {
+         "file" : "Bio/AnalysisI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::AnalysisParserI" : {
+         "file" : "Bio/AnalysisParserI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::AnalysisResultI" : {
+         "file" : "Bio/AnalysisResultI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::AnnotatableI" : {
+         "file" : "Bio/AnnotatableI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Annotation::AnnotationFactory" : {
+         "file" : "Bio/Annotation/AnnotationFactory.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Annotation::Collection" : {
+         "file" : "Bio/Annotation/Collection.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Annotation::Comment" : {
+         "file" : "Bio/Annotation/Comment.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Annotation::DBLink" : {
+         "file" : "Bio/Annotation/DBLink.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Annotation::OntologyTerm" : {
+         "file" : "Bio/Annotation/OntologyTerm.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Annotation::Reference" : {
+         "file" : "Bio/Annotation/Reference.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Annotation::Relation" : {
+         "file" : "Bio/Annotation/Relation.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Annotation::SimpleValue" : {
+         "file" : "Bio/Annotation/SimpleValue.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Annotation::StructuredValue" : {
+         "file" : "Bio/Annotation/StructuredValue.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Annotation::TagTree" : {
+         "file" : "Bio/Annotation/TagTree.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Annotation::Target" : {
+         "file" : "Bio/Annotation/Target.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Annotation::Tree" : {
+         "file" : "Bio/Annotation/Tree.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Annotation::TypeManager" : {
+         "file" : "Bio/Annotation/TypeManager.pm",
+         "version" : "1.006924"
+      },
+      "Bio::AnnotationCollectionI" : {
+         "file" : "Bio/AnnotationCollectionI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::AnnotationI" : {
+         "file" : "Bio/AnnotationI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Assembly::Contig" : {
+         "file" : "Bio/Assembly/Contig.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Assembly::ContigAnalysis" : {
+         "file" : "Bio/Assembly/ContigAnalysis.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Assembly::IO" : {
+         "file" : "Bio/Assembly/IO.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Assembly::IO::ace" : {
+         "file" : "Bio/Assembly/IO/ace.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Assembly::IO::bowtie" : {
+         "file" : "Bio/Assembly/IO/bowtie.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Assembly::IO::maq" : {
+         "file" : "Bio/Assembly/IO/maq.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Assembly::IO::phrap" : {
+         "file" : "Bio/Assembly/IO/phrap.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Assembly::IO::sam" : {
+         "file" : "Bio/Assembly/IO/sam.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Assembly::IO::tigr" : {
+         "file" : "Bio/Assembly/IO/tigr.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Assembly::Scaffold" : {
+         "file" : "Bio/Assembly/Scaffold.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Assembly::ScaffoldI" : {
+         "file" : "Bio/Assembly/ScaffoldI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Assembly::Singlet" : {
+         "file" : "Bio/Assembly/Singlet.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Assembly::Tools::ContigSpectrum" : {
+         "file" : "Bio/Assembly/Tools/ContigSpectrum.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Cluster::ClusterFactory" : {
+         "file" : "Bio/Cluster/ClusterFactory.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Cluster::FamilyI" : {
+         "file" : "Bio/Cluster/FamilyI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Cluster::SequenceFamily" : {
+         "file" : "Bio/Cluster/SequenceFamily.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Cluster::UniGene" : {
+         "file" : "Bio/Cluster/UniGene.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Cluster::UniGeneI" : {
+         "file" : "Bio/Cluster/UniGeneI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::ClusterI" : {
+         "file" : "Bio/ClusterI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::ClusterIO" : {
+         "file" : "Bio/ClusterIO.pm",
+         "version" : "1.006924"
+      },
+      "Bio::ClusterIO::dbsnp" : {
+         "file" : "Bio/ClusterIO/dbsnp.pm",
+         "version" : "1.006924"
+      },
+      "Bio::ClusterIO::unigene" : {
+         "file" : "Bio/ClusterIO/unigene.pm",
+         "version" : "1.006924"
+      },
+      "Bio::CodonUsage::IO" : {
+         "file" : "Bio/CodonUsage/IO.pm",
+         "version" : "1.006924"
+      },
+      "Bio::CodonUsage::Table" : {
+         "file" : "Bio/CodonUsage/Table.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Coordinate::Chain" : {
+         "file" : "Bio/Coordinate/Chain.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Coordinate::Collection" : {
+         "file" : "Bio/Coordinate/Collection.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Coordinate::ExtrapolatingPair" : {
+         "file" : "Bio/Coordinate/ExtrapolatingPair.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Coordinate::GeneMapper" : {
+         "file" : "Bio/Coordinate/GeneMapper.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Coordinate::Graph" : {
+         "file" : "Bio/Coordinate/Graph.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Coordinate::MapperI" : {
+         "file" : "Bio/Coordinate/MapperI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Coordinate::Pair" : {
+         "file" : "Bio/Coordinate/Pair.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Coordinate::Result" : {
+         "file" : "Bio/Coordinate/Result.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Coordinate::Result::Gap" : {
+         "file" : "Bio/Coordinate/Result/Gap.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Coordinate::Result::Match" : {
+         "file" : "Bio/Coordinate/Result/Match.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Coordinate::ResultI" : {
+         "file" : "Bio/Coordinate/ResultI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Coordinate::Utils" : {
+         "file" : "Bio/Coordinate/Utils.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::Ace" : {
+         "file" : "Bio/DB/Ace.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::BioFetch" : {
+         "file" : "Bio/DB/BioFetch.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::CUTG" : {
+         "file" : "Bio/DB/CUTG.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::DBFetch" : {
+         "file" : "Bio/DB/DBFetch.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::EMBL" : {
+         "file" : "Bio/DB/EMBL.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::EntrezGene" : {
+         "file" : "Bio/DB/EntrezGene.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::Expression" : {
+         "file" : "Bio/DB/Expression.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::Expression::geo" : {
+         "file" : "Bio/DB/Expression/geo.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::Failover" : {
+         "file" : "Bio/DB/Failover.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::Fasta" : {
+         "file" : "Bio/DB/Fasta.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::Fasta::Subdir" : {
+         "file" : "Bio/DB/SeqFeature/Store/berkeleydb.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::FileCache" : {
+         "file" : "Bio/DB/FileCache.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::Flat" : {
+         "file" : "Bio/DB/Flat.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::Flat::BDB" : {
+         "file" : "Bio/DB/Flat/BDB.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::Flat::BDB::embl" : {
+         "file" : "Bio/DB/Flat/BDB/embl.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::Flat::BDB::fasta" : {
+         "file" : "Bio/DB/Flat/BDB/fasta.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::Flat::BDB::genbank" : {
+         "file" : "Bio/DB/Flat/BDB/genbank.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::Flat::BDB::swiss" : {
+         "file" : "Bio/DB/Flat/BDB/swiss.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::Flat::BinarySearch" : {
+         "file" : "Bio/DB/Flat/BinarySearch.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::GFF" : {
+         "file" : "Bio/DB/GFF.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::GFF::Adaptor::ace" : {
+         "file" : "Bio/DB/GFF/Adaptor/ace.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::GFF::Adaptor::berkeleydb" : {
+         "file" : "Bio/DB/GFF/Adaptor/berkeleydb.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::GFF::Adaptor::berkeleydb::iterator" : {
+         "file" : "Bio/DB/GFF/Adaptor/berkeleydb/iterator.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::GFF::Adaptor::biofetch" : {
+         "file" : "Bio/DB/GFF/Adaptor/biofetch.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::GFF::Adaptor::biofetch_oracle" : {
+         "file" : "Bio/DB/GFF/Adaptor/biofetch_oracle.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::GFF::Adaptor::dbi" : {
+         "file" : "Bio/DB/GFF/Adaptor/dbi.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::GFF::Adaptor::dbi::caching_handle" : {
+         "file" : "Bio/DB/GFF/Adaptor/dbi/caching_handle.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::GFF::Adaptor::dbi::faux_dbh" : {
+         "file" : "Bio/DB/GFF/Adaptor/dbi/caching_handle.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::GFF::Adaptor::dbi::iterator" : {
+         "file" : "Bio/DB/GFF/Adaptor/dbi/iterator.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::GFF::Adaptor::dbi::mysql" : {
+         "file" : "Bio/DB/GFF/Adaptor/dbi/mysql.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::GFF::Adaptor::dbi::mysqlace" : {
+         "file" : "Bio/DB/GFF/Adaptor/dbi/mysqlace.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::GFF::Adaptor::dbi::mysqlcmap" : {
+         "file" : "Bio/DB/GFF/Adaptor/dbi/mysqlcmap.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::GFF::Adaptor::dbi::mysqlopt" : {
+         "file" : "Bio/DB/GFF/Adaptor/dbi/mysqlopt.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::GFF::Adaptor::dbi::oracle" : {
+         "file" : "Bio/DB/GFF/Adaptor/dbi/oracle.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::GFF::Adaptor::dbi::oracleace" : {
+         "file" : "Bio/DB/GFF/Adaptor/dbi/oracleace.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::GFF::Adaptor::dbi::pg" : {
+         "file" : "Bio/DB/GFF/Adaptor/dbi/pg.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::GFF::Adaptor::dbi::pg_fts" : {
+         "file" : "Bio/DB/GFF/Adaptor/dbi/pg_fts.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::GFF::Adaptor::memory" : {
+         "file" : "Bio/DB/GFF/Adaptor/memory.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::GFF::Adaptor::memory::feature_serializer" : {
+         "file" : "Bio/DB/GFF/Adaptor/memory/feature_serializer.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::GFF::Adaptor::memory::iterator" : {
+         "file" : "Bio/DB/GFF/Adaptor/memory/iterator.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::GFF::Aggregator" : {
+         "file" : "Bio/DB/GFF/Aggregator.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::GFF::Aggregator::alignment" : {
+         "file" : "Bio/DB/GFF/Aggregator/alignment.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::GFF::Aggregator::clone" : {
+         "file" : "Bio/DB/GFF/Aggregator/clone.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::GFF::Aggregator::coding" : {
+         "file" : "Bio/DB/GFF/Aggregator/coding.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::GFF::Aggregator::gene" : {
+         "file" : "Bio/DB/GFF/Aggregator/gene.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::GFF::Aggregator::match" : {
+         "file" : "Bio/DB/GFF/Aggregator/match.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::GFF::Aggregator::none" : {
+         "file" : "Bio/DB/GFF/Aggregator/none.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::GFF::Aggregator::orf" : {
+         "file" : "Bio/DB/GFF/Aggregator/orf.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::GFF::Aggregator::processed_transcript" : {
+         "file" : "Bio/DB/GFF/Aggregator/processed_transcript.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::GFF::Aggregator::so_transcript" : {
+         "file" : "Bio/DB/GFF/Aggregator/so_transcript.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::GFF::Aggregator::transcript" : {
+         "file" : "Bio/DB/GFF/Aggregator/transcript.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::GFF::Aggregator::ucsc_acembly" : {
+         "file" : "Bio/DB/GFF/Aggregator/ucsc_acembly.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::GFF::Aggregator::ucsc_ensgene" : {
+         "file" : "Bio/DB/GFF/Aggregator/ucsc_ensgene.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::GFF::Aggregator::ucsc_genscan" : {
+         "file" : "Bio/DB/GFF/Aggregator/ucsc_genscan.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::GFF::Aggregator::ucsc_refgene" : {
+         "file" : "Bio/DB/GFF/Aggregator/ucsc_refgene.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::GFF::Aggregator::ucsc_sanger22" : {
+         "file" : "Bio/DB/GFF/Aggregator/ucsc_sanger22.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::GFF::Aggregator::ucsc_sanger22pseudo" : {
+         "file" : "Bio/DB/GFF/Aggregator/ucsc_sanger22pseudo.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::GFF::Aggregator::ucsc_softberry" : {
+         "file" : "Bio/DB/GFF/Aggregator/ucsc_softberry.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::GFF::Aggregator::ucsc_twinscan" : {
+         "file" : "Bio/DB/GFF/Aggregator/ucsc_twinscan.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::GFF::Aggregator::ucsc_unigene" : {
+         "file" : "Bio/DB/GFF/Aggregator/ucsc_unigene.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::GFF::Featname" : {
+         "file" : "Bio/DB/GFF/Featname.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::GFF::Feature" : {
+         "file" : "Bio/DB/GFF/Feature.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::GFF::FeatureIterator" : {
+         "file" : "Bio/DB/GFF.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::GFF::Homol" : {
+         "file" : "Bio/DB/GFF/Homol.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::GFF::ID_Iterator" : {
+         "file" : "Bio/DB/GFF.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::GFF::RelSegment" : {
+         "file" : "Bio/DB/GFF/RelSegment.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::GFF::Segment" : {
+         "file" : "Bio/DB/GFF/Segment.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::GFF::Typename" : {
+         "file" : "Bio/DB/GFF/Typename.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::GFF::Util::Binning" : {
+         "file" : "Bio/DB/GFF/Util/Binning.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::GFF::Util::Rearrange" : {
+         "file" : "Bio/DB/GFF/Util/Rearrange.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::GenBank" : {
+         "file" : "Bio/DB/GenBank.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::GenPept" : {
+         "file" : "Bio/DB/GenPept.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::GenericWebAgent" : {
+         "file" : "Bio/DB/GenericWebAgent.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::HIV" : {
+         "file" : "Bio/DB/HIV.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::HIV::HIVAnnotProcessor" : {
+         "file" : "Bio/DB/HIV/HIVAnnotProcessor.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::HIV::HIVQueryHelper" : {
+         "file" : "Bio/DB/HIV/HIVQueryHelper.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::InMemoryCache" : {
+         "file" : "Bio/DB/InMemoryCache.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::Indexed::Stream" : {
+         "file" : "Bio/DB/IndexedBase.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::IndexedBase" : {
+         "file" : "Bio/DB/IndexedBase.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::LocationI" : {
+         "file" : "Bio/DB/LocationI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::MeSH" : {
+         "file" : "Bio/DB/MeSH.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::NCBIHelper" : {
+         "file" : "Bio/DB/NCBIHelper.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::Qual" : {
+         "file" : "Bio/DB/Qual.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::Query::GenBank" : {
+         "file" : "Bio/DB/Query/GenBank.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::Query::HIVQuery" : {
+         "file" : "Bio/DB/Query/HIVQuery.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::Query::WebQuery" : {
+         "file" : "Bio/DB/Query/WebQuery.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::QueryI" : {
+         "file" : "Bio/DB/QueryI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::RandomAccessI" : {
+         "file" : "Bio/DB/RandomAccessI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::RefSeq" : {
+         "file" : "Bio/DB/RefSeq.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::ReferenceI" : {
+         "file" : "Bio/DB/ReferenceI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::Registry" : {
+         "file" : "Bio/DB/Registry.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::SeqFeature" : {
+         "file" : "Bio/DB/SeqFeature.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::SeqFeature::NormalizedFeature" : {
+         "file" : "Bio/DB/SeqFeature/NormalizedFeature.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::SeqFeature::NormalizedFeatureI" : {
+         "file" : "Bio/DB/SeqFeature/NormalizedFeatureI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::SeqFeature::NormalizedTableFeatureI" : {
+         "file" : "Bio/DB/SeqFeature/NormalizedTableFeatureI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::SeqFeature::Segment" : {
+         "file" : "Bio/DB/SeqFeature/Segment.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::SeqFeature::Store" : {
+         "file" : "Bio/DB/SeqFeature/Store.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::SeqFeature::Store::DBI::Iterator" : {
+         "file" : "Bio/DB/SeqFeature/Store/DBI/Iterator.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::SeqFeature::Store::DBI::Pg" : {
+         "file" : "Bio/DB/SeqFeature/Store/DBI/Pg.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::SeqFeature::Store::DBI::SQLite" : {
+         "file" : "Bio/DB/SeqFeature/Store/DBI/SQLite.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::SeqFeature::Store::DBI::mysql" : {
+         "file" : "Bio/DB/SeqFeature/Store/DBI/mysql.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::SeqFeature::Store::FeatureFileLoader" : {
+         "file" : "Bio/DB/SeqFeature/Store/FeatureFileLoader.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::SeqFeature::Store::FeatureIterator" : {
+         "file" : "Bio/DB/SeqFeature/Store.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::SeqFeature::Store::GFF2Loader" : {
+         "file" : "Bio/DB/SeqFeature/Store/GFF2Loader.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::SeqFeature::Store::GFF3Loader" : {
+         "file" : "Bio/DB/SeqFeature/Store/GFF3Loader.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::SeqFeature::Store::LoadHelper" : {
+         "file" : "Bio/DB/SeqFeature/Store/LoadHelper.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::SeqFeature::Store::Loader" : {
+         "file" : "Bio/DB/SeqFeature/Store/Loader.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::SeqFeature::Store::bdb" : {
+         "file" : "Bio/DB/SeqFeature/Store/bdb.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::SeqFeature::Store::berkeleydb" : {
+         "file" : "Bio/DB/SeqFeature/Store/berkeleydb.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::SeqFeature::Store::berkeleydb3" : {
+         "file" : "Bio/DB/SeqFeature/Store/berkeleydb3.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::SeqFeature::Store::berkeleydb::Iterator" : {
+         "file" : "Bio/DB/SeqFeature/Store/berkeleydb.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::SeqFeature::Store::memory" : {
+         "file" : "Bio/DB/SeqFeature/Store/memory.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::SeqFeature::Store::memory::Iterator" : {
+         "file" : "Bio/DB/SeqFeature/Store/memory.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::SeqHound" : {
+         "file" : "Bio/DB/SeqHound.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::SeqI" : {
+         "file" : "Bio/DB/SeqI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::SeqVersion" : {
+         "file" : "Bio/DB/SeqVersion.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::SeqVersion::gi" : {
+         "file" : "Bio/DB/SeqVersion/gi.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::SwissProt" : {
+         "file" : "Bio/DB/SwissProt.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::TFBS" : {
+         "file" : "Bio/DB/TFBS.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::TFBS::transfac_pro" : {
+         "file" : "Bio/DB/TFBS/transfac_pro.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::Taxonomy" : {
+         "file" : "Bio/DB/Taxonomy.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::Taxonomy::entrez" : {
+         "file" : "Bio/DB/Taxonomy/entrez.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::Taxonomy::flatfile" : {
+         "file" : "Bio/DB/Taxonomy/flatfile.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::Taxonomy::greengenes" : {
+         "file" : "Bio/DB/Taxonomy/greengenes.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::Taxonomy::list" : {
+         "file" : "Bio/DB/Taxonomy/list.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::Taxonomy::silva" : {
+         "file" : "Bio/DB/Taxonomy/silva.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::Universal" : {
+         "file" : "Bio/DB/Universal.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::UpdateableSeqI" : {
+         "file" : "Bio/DB/UpdateableSeqI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DB::WebDBSeqI" : {
+         "file" : "Bio/DB/WebDBSeqI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DBLinkContainerI" : {
+         "file" : "Bio/DBLinkContainerI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Das::FeatureTypeI" : {
+         "file" : "Bio/Das/FeatureTypeI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Das::SegmentI" : {
+         "file" : "Bio/Das/SegmentI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DasI" : {
+         "file" : "Bio/DasI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::DescribableI" : {
+         "file" : "Bio/DescribableI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Draw::Pictogram" : {
+         "file" : "Bio/Draw/Pictogram.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Event::EventGeneratorI" : {
+         "file" : "Bio/Event/EventGeneratorI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Event::EventHandlerI" : {
+         "file" : "Bio/Event/EventHandlerI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Factory::AnalysisI" : {
+         "file" : "Bio/Factory/AnalysisI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Factory::ApplicationFactoryI" : {
+         "file" : "Bio/Factory/ApplicationFactoryI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Factory::DriverFactory" : {
+         "file" : "Bio/Factory/DriverFactory.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Factory::FTLocationFactory" : {
+         "file" : "Bio/Factory/FTLocationFactory.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Factory::LocationFactoryI" : {
+         "file" : "Bio/Factory/LocationFactoryI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Factory::MapFactoryI" : {
+         "file" : "Bio/Factory/MapFactoryI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Factory::ObjectBuilderI" : {
+         "file" : "Bio/Factory/ObjectBuilderI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Factory::ObjectFactory" : {
+         "file" : "Bio/Factory/ObjectFactory.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Factory::ObjectFactoryI" : {
+         "file" : "Bio/Factory/ObjectFactoryI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Factory::SeqAnalysisParserFactory" : {
+         "file" : "Bio/Factory/SeqAnalysisParserFactory.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Factory::SeqAnalysisParserFactoryI" : {
+         "file" : "Bio/Factory/SeqAnalysisParserFactoryI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Factory::SequenceFactoryI" : {
+         "file" : "Bio/Factory/SequenceFactoryI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Factory::SequenceProcessorI" : {
+         "file" : "Bio/Factory/SequenceProcessorI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Factory::SequenceStreamI" : {
+         "file" : "Bio/Factory/SequenceStreamI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Factory::TreeFactoryI" : {
+         "file" : "Bio/Factory/TreeFactoryI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::FeatureHolderI" : {
+         "file" : "Bio/FeatureHolderI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::HandlerBaseI" : {
+         "file" : "Bio/HandlerBaseI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::IdCollectionI" : {
+         "file" : "Bio/IdCollectionI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::IdentifiableI" : {
+         "file" : "Bio/IdentifiableI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Index::Abstract" : {
+         "file" : "Bio/Index/Abstract.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Index::AbstractSeq" : {
+         "file" : "Bio/Index/AbstractSeq.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Index::Blast" : {
+         "file" : "Bio/Index/Blast.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Index::BlastTable" : {
+         "file" : "Bio/Index/BlastTable.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Index::EMBL" : {
+         "file" : "Bio/Index/EMBL.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Index::Fasta" : {
+         "file" : "Bio/Index/Fasta.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Index::Fastq" : {
+         "file" : "Bio/Index/Fastq.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Index::GenBank" : {
+         "file" : "Bio/Index/GenBank.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Index::Hmmer" : {
+         "file" : "Bio/Index/Hmmer.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Index::Qual" : {
+         "file" : "Bio/Index/Qual.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Index::Stockholm" : {
+         "file" : "Bio/Index/Stockholm.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Index::SwissPfam" : {
+         "file" : "Bio/Index/SwissPfam.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Index::Swissprot" : {
+         "file" : "Bio/Index/Swissprot.pm",
+         "version" : "1.006924"
+      },
+      "Bio::LiveSeq::AARange" : {
+         "file" : "Bio/LiveSeq/AARange.pm",
+         "version" : "1.006924"
+      },
+      "Bio::LiveSeq::Chain" : {
+         "file" : "Bio/LiveSeq/Chain.pm",
+         "version" : "1.006924"
+      },
+      "Bio::LiveSeq::ChainI" : {
+         "file" : "Bio/LiveSeq/ChainI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::LiveSeq::DNA" : {
+         "file" : "Bio/LiveSeq/DNA.pm",
+         "version" : "1.006924"
+      },
+      "Bio::LiveSeq::Exon" : {
+         "file" : "Bio/LiveSeq/Exon.pm",
+         "version" : "1.006924"
+      },
+      "Bio::LiveSeq::Gene" : {
+         "file" : "Bio/LiveSeq/Gene.pm",
+         "version" : "1.006924"
+      },
+      "Bio::LiveSeq::IO::BioPerl" : {
+         "file" : "Bio/LiveSeq/IO/BioPerl.pm",
+         "version" : "1.006924"
+      },
+      "Bio::LiveSeq::IO::Loader" : {
+         "file" : "Bio/LiveSeq/IO/Loader.pm",
+         "version" : "1.006924"
+      },
+      "Bio::LiveSeq::Intron" : {
+         "file" : "Bio/LiveSeq/Intron.pm",
+         "version" : "1.006924"
+      },
+      "Bio::LiveSeq::Mutation" : {
+         "file" : "Bio/LiveSeq/Mutation.pm",
+         "version" : "1.006924"
+      },
+      "Bio::LiveSeq::Mutator" : {
+         "file" : "Bio/LiveSeq/Mutator.pm",
+         "version" : "1.006924"
+      },
+      "Bio::LiveSeq::Prim_Transcript" : {
+         "file" : "Bio/LiveSeq/Prim_Transcript.pm",
+         "version" : "1.006924"
+      },
+      "Bio::LiveSeq::Range" : {
+         "file" : "Bio/LiveSeq/Range.pm",
+         "version" : "1.006924"
+      },
+      "Bio::LiveSeq::Repeat_Region" : {
+         "file" : "Bio/LiveSeq/Repeat_Region.pm",
+         "version" : "1.006924"
+      },
+      "Bio::LiveSeq::Repeat_Unit" : {
+         "file" : "Bio/LiveSeq/Repeat_Unit.pm",
+         "version" : "1.006924"
+      },
+      "Bio::LiveSeq::SeqI" : {
+         "file" : "Bio/LiveSeq/SeqI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::LiveSeq::Transcript" : {
+         "file" : "Bio/LiveSeq/Transcript.pm",
+         "version" : "1.006924"
+      },
+      "Bio::LiveSeq::Translation" : {
+         "file" : "Bio/LiveSeq/Translation.pm",
+         "version" : "1.006924"
+      },
+      "Bio::LocatableSeq" : {
+         "file" : "Bio/Search/Tiling/MapTileUtils.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Location::Atomic" : {
+         "file" : "Bio/Location/Atomic.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Location::AvWithinCoordPolicy" : {
+         "file" : "Bio/Location/AvWithinCoordPolicy.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Location::CoordinatePolicyI" : {
+         "file" : "Bio/Location/CoordinatePolicyI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Location::Fuzzy" : {
+         "file" : "Bio/Location/Fuzzy.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Location::FuzzyLocationI" : {
+         "file" : "Bio/Location/FuzzyLocationI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Location::NarrowestCoordPolicy" : {
+         "file" : "Bio/Location/NarrowestCoordPolicy.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Location::Simple" : {
+         "file" : "Bio/Location/Simple.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Location::Split" : {
+         "file" : "Bio/Location/Split.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Location::SplitLocationI" : {
+         "file" : "Bio/Location/SplitLocationI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Location::WidestCoordPolicy" : {
+         "file" : "Bio/Location/WidestCoordPolicy.pm",
+         "version" : "1.006924"
+      },
+      "Bio::LocationI" : {
+         "file" : "Bio/LocationI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Map::Clone" : {
+         "file" : "Bio/Map/Clone.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Map::Contig" : {
+         "file" : "Bio/Map/Contig.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Map::CytoMap" : {
+         "file" : "Bio/Map/CytoMap.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Map::CytoMarker" : {
+         "file" : "Bio/Map/CytoMarker.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Map::CytoPosition" : {
+         "file" : "Bio/Map/CytoPosition.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Map::EntityI" : {
+         "file" : "Bio/Map/EntityI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Map::FPCMarker" : {
+         "file" : "Bio/Map/FPCMarker.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Map::Gene" : {
+         "file" : "Bio/Map/Gene.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Map::GeneMap" : {
+         "file" : "Bio/Map/GeneMap.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Map::GenePosition" : {
+         "file" : "Bio/Map/GenePosition.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Map::GeneRelative" : {
+         "file" : "Bio/Map/GeneRelative.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Map::LinkageMap" : {
+         "file" : "Bio/Map/LinkageMap.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Map::LinkagePosition" : {
+         "file" : "Bio/Map/LinkagePosition.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Map::MapI" : {
+         "file" : "Bio/Map/MapI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Map::Mappable" : {
+         "file" : "Bio/Map/Mappable.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Map::MappableI" : {
+         "file" : "Bio/Map/MappableI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Map::Marker" : {
+         "file" : "Bio/Map/Marker.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Map::MarkerI" : {
+         "file" : "Bio/Map/MarkerI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Map::Microsatellite" : {
+         "file" : "Bio/Map/Microsatellite.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Map::OrderedPosition" : {
+         "file" : "Bio/Map/OrderedPosition.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Map::OrderedPositionWithDistance" : {
+         "file" : "Bio/Map/OrderedPositionWithDistance.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Map::Physical" : {
+         "file" : "Bio/Map/Physical.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Map::Position" : {
+         "file" : "Bio/Map/Position.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Map::PositionHandler" : {
+         "file" : "Bio/Map/PositionHandler.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Map::PositionHandlerI" : {
+         "file" : "Bio/Map/PositionHandlerI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Map::PositionI" : {
+         "file" : "Bio/Map/PositionI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Map::PositionWithSequence" : {
+         "file" : "Bio/Map/PositionWithSequence.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Map::Prediction" : {
+         "file" : "Bio/Map/Prediction.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Map::Relative" : {
+         "file" : "Bio/Map/Relative.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Map::RelativeI" : {
+         "file" : "Bio/Map/RelativeI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Map::SimpleMap" : {
+         "file" : "Bio/Map/SimpleMap.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Map::TranscriptionFactor" : {
+         "file" : "Bio/Map/TranscriptionFactor.pm",
+         "version" : "1.006924"
+      },
+      "Bio::MapIO" : {
+         "file" : "Bio/MapIO.pm",
+         "version" : "1.006924"
+      },
+      "Bio::MapIO::fpc" : {
+         "file" : "Bio/MapIO/fpc.pm",
+         "version" : "1.006924"
+      },
+      "Bio::MapIO::mapmaker" : {
+         "file" : "Bio/MapIO/mapmaker.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Matrix::Generic" : {
+         "file" : "Bio/Matrix/Generic.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Matrix::IO" : {
+         "file" : "Bio/Matrix/IO.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Matrix::IO::mlagan" : {
+         "file" : "Bio/Matrix/IO/mlagan.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Matrix::IO::phylip" : {
+         "file" : "Bio/Matrix/IO/phylip.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Matrix::IO::scoring" : {
+         "file" : "Bio/Matrix/IO/scoring.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Matrix::MatrixI" : {
+         "file" : "Bio/Matrix/MatrixI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Matrix::Mlagan" : {
+         "file" : "Bio/Matrix/Mlagan.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Matrix::PSM::IO" : {
+         "file" : "Bio/Matrix/PSM/IO.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Matrix::PSM::IO::mast" : {
+         "file" : "Bio/Matrix/PSM/IO/mast.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Matrix::PSM::IO::masta" : {
+         "file" : "Bio/Matrix/PSM/IO/masta.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Matrix::PSM::IO::meme" : {
+         "file" : "Bio/Matrix/PSM/IO/meme.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Matrix::PSM::IO::psiblast" : {
+         "file" : "Bio/Matrix/PSM/IO/psiblast.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Matrix::PSM::IO::transfac" : {
+         "file" : "Bio/Matrix/PSM/IO/transfac.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Matrix::PSM::InstanceSite" : {
+         "file" : "Bio/Matrix/PSM/InstanceSite.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Matrix::PSM::InstanceSiteI" : {
+         "file" : "Bio/Matrix/PSM/InstanceSiteI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Matrix::PSM::ProtMatrix" : {
+         "file" : "Bio/Matrix/PSM/ProtMatrix.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Matrix::PSM::ProtPsm" : {
+         "file" : "Bio/Matrix/PSM/ProtPsm.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Matrix::PSM::Psm" : {
+         "file" : "Bio/Matrix/PSM/Psm.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Matrix::PSM::PsmHeader" : {
+         "file" : "Bio/Matrix/PSM/PsmHeader.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Matrix::PSM::PsmHeaderI" : {
+         "file" : "Bio/Matrix/PSM/PsmHeaderI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Matrix::PSM::PsmI" : {
+         "file" : "Bio/Matrix/PSM/PsmI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Matrix::PSM::SiteMatrix" : {
+         "file" : "Bio/Matrix/PSM/SiteMatrix.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Matrix::PSM::SiteMatrixI" : {
+         "file" : "Bio/Matrix/PSM/SiteMatrixI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Matrix::PhylipDist" : {
+         "file" : "Bio/Matrix/PhylipDist.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Matrix::Scoring" : {
+         "file" : "Bio/Matrix/Scoring.pm",
+         "version" : "1.006924"
+      },
+      "Bio::MolEvol::CodonModel" : {
+         "file" : "Bio/MolEvol/CodonModel.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Nexml::Factory" : {
+         "file" : "Bio/Nexml/Factory.pm",
+         "version" : "1.006924"
+      },
+      "Bio::NexmlIO" : {
+         "file" : "Bio/NexmlIO.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Ontology::DocumentRegistry" : {
+         "file" : "Bio/Ontology/DocumentRegistry.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Ontology::GOterm" : {
+         "file" : "Bio/Ontology/GOterm.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Ontology::InterProTerm" : {
+         "file" : "Bio/Ontology/InterProTerm.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Ontology::OBOEngine" : {
+         "file" : "Bio/Ontology/OBOEngine.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Ontology::OBOterm" : {
+         "file" : "Bio/Ontology/OBOterm.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Ontology::Ontology" : {
+         "file" : "Bio/Ontology/Ontology.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Ontology::OntologyEngineI" : {
+         "file" : "Bio/Ontology/OntologyEngineI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Ontology::OntologyI" : {
+         "file" : "Bio/Ontology/OntologyI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Ontology::OntologyStore" : {
+         "file" : "Bio/Ontology/OntologyStore.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Ontology::Path" : {
+         "file" : "Bio/Ontology/Path.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Ontology::PathI" : {
+         "file" : "Bio/Ontology/PathI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Ontology::Relationship" : {
+         "file" : "Bio/Ontology/Relationship.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Ontology::RelationshipFactory" : {
+         "file" : "Bio/Ontology/RelationshipFactory.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Ontology::RelationshipI" : {
+         "file" : "Bio/Ontology/RelationshipI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Ontology::RelationshipType" : {
+         "file" : "Bio/Ontology/RelationshipType.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Ontology::SimpleGOEngine::GraphAdaptor" : {
+         "file" : "Bio/Ontology/SimpleGOEngine/GraphAdaptor.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Ontology::SimpleOntologyEngine" : {
+         "file" : "Bio/Ontology/SimpleOntologyEngine.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Ontology::Term" : {
+         "file" : "Bio/Ontology/Term.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Ontology::TermFactory" : {
+         "file" : "Bio/Ontology/TermFactory.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Ontology::TermI" : {
+         "file" : "Bio/Ontology/TermI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::OntologyIO" : {
+         "file" : "Bio/OntologyIO.pm",
+         "version" : "1.006924"
+      },
+      "Bio::OntologyIO::Handlers::BaseSAXHandler" : {
+         "file" : "Bio/OntologyIO/Handlers/BaseSAXHandler.pm",
+         "version" : "1.006924"
+      },
+      "Bio::OntologyIO::Handlers::InterProHandler" : {
+         "file" : "Bio/OntologyIO/Handlers/InterProHandler.pm",
+         "version" : "1.006924"
+      },
+      "Bio::OntologyIO::Handlers::InterPro_BioSQL_Handler" : {
+         "file" : "Bio/OntologyIO/Handlers/InterPro_BioSQL_Handler.pm",
+         "version" : "1.006924"
+      },
+      "Bio::OntologyIO::InterProParser" : {
+         "file" : "Bio/OntologyIO/InterProParser.pm",
+         "version" : "1.006924"
+      },
+      "Bio::OntologyIO::dagflat" : {
+         "file" : "Bio/OntologyIO/dagflat.pm",
+         "version" : "1.006924"
+      },
+      "Bio::OntologyIO::goflat" : {
+         "file" : "Bio/OntologyIO/goflat.pm",
+         "version" : "1.006924"
+      },
+      "Bio::OntologyIO::obo" : {
+         "file" : "Bio/OntologyIO/obo.pm",
+         "version" : "1.006924"
+      },
+      "Bio::OntologyIO::simplehierarchy" : {
+         "file" : "Bio/OntologyIO/simplehierarchy.pm",
+         "version" : "1.006924"
+      },
+      "Bio::OntologyIO::soflat" : {
+         "file" : "Bio/OntologyIO/soflat.pm",
+         "version" : "1.006924"
+      },
+      "Bio::ParameterBaseI" : {
+         "file" : "Bio/ParameterBaseI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Perl" : {
+         "file" : "Bio/Perl.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Phenotype::Correlate" : {
+         "file" : "Bio/Phenotype/Correlate.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Phenotype::MeSH::Term" : {
+         "file" : "Bio/Phenotype/MeSH/Term.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Phenotype::MeSH::Twig" : {
+         "file" : "Bio/Phenotype/MeSH/Twig.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Phenotype::Measure" : {
+         "file" : "Bio/Phenotype/Measure.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Phenotype::OMIM::MiniMIMentry" : {
+         "file" : "Bio/Phenotype/OMIM/MiniMIMentry.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Phenotype::OMIM::OMIMentry" : {
+         "file" : "Bio/Phenotype/OMIM/OMIMentry.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Phenotype::OMIM::OMIMentryAllelicVariant" : {
+         "file" : "Bio/Phenotype/OMIM/OMIMentryAllelicVariant.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Phenotype::OMIM::OMIMparser" : {
+         "file" : "Bio/Phenotype/OMIM/OMIMparser.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Phenotype::Phenotype" : {
+         "file" : "Bio/Phenotype/Phenotype.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Phenotype::PhenotypeI" : {
+         "file" : "Bio/Phenotype/PhenotypeI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::PhyloNetwork" : {
+         "file" : "Bio/PhyloNetwork.pm",
+         "version" : "1.006924"
+      },
+      "Bio::PhyloNetwork::Factory" : {
+         "file" : "Bio/PhyloNetwork/Factory.pm",
+         "version" : "1.006924"
+      },
+      "Bio::PhyloNetwork::FactoryX" : {
+         "file" : "Bio/PhyloNetwork/FactoryX.pm",
+         "version" : "1.006924"
+      },
+      "Bio::PhyloNetwork::GraphViz" : {
+         "file" : "Bio/PhyloNetwork/GraphViz.pm",
+         "version" : "1.006924"
+      },
+      "Bio::PhyloNetwork::RandomFactory" : {
+         "file" : "Bio/PhyloNetwork/RandomFactory.pm",
+         "version" : "1.006924"
+      },
+      "Bio::PhyloNetwork::TreeFactory" : {
+         "file" : "Bio/PhyloNetwork/TreeFactory.pm",
+         "version" : "1.006924"
+      },
+      "Bio::PhyloNetwork::TreeFactoryMulti" : {
+         "file" : "Bio/PhyloNetwork/TreeFactoryMulti.pm",
+         "version" : "1.006924"
+      },
+      "Bio::PhyloNetwork::TreeFactoryX" : {
+         "file" : "Bio/PhyloNetwork/TreeFactoryX.pm",
+         "version" : "1.006924"
+      },
+      "Bio::PhyloNetwork::muVector" : {
+         "file" : "Bio/PhyloNetwork/muVector.pm",
+         "version" : "1.006924"
+      },
+      "Bio::PopGen::Genotype" : {
+         "file" : "Bio/PopGen/Genotype.pm",
+         "version" : "1.006924"
+      },
+      "Bio::PopGen::GenotypeI" : {
+         "file" : "Bio/PopGen/GenotypeI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::PopGen::HtSNP" : {
+         "file" : "Bio/PopGen/HtSNP.pm",
+         "version" : "1.006924"
+      },
+      "Bio::PopGen::IO" : {
+         "file" : "Bio/PopGen/IO.pm",
+         "version" : "1.006924"
+      },
+      "Bio::PopGen::IO::csv" : {
+         "file" : "Bio/PopGen/IO/csv.pm",
+         "version" : "1.006924"
+      },
+      "Bio::PopGen::IO::hapmap" : {
+         "file" : "Bio/PopGen/IO/hapmap.pm",
+         "version" : "1.006924"
+      },
+      "Bio::PopGen::IO::phase" : {
+         "file" : "Bio/PopGen/IO/phase.pm",
+         "version" : "1.006924"
+      },
+      "Bio::PopGen::IO::prettybase" : {
+         "file" : "Bio/PopGen/IO/prettybase.pm",
+         "version" : "1.006924"
+      },
+      "Bio::PopGen::Individual" : {
+         "file" : "Bio/PopGen/Individual.pm",
+         "version" : "1.006924"
+      },
+      "Bio::PopGen::IndividualI" : {
+         "file" : "Bio/PopGen/IndividualI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::PopGen::Marker" : {
+         "file" : "Bio/PopGen/Marker.pm",
+         "version" : "1.006924"
+      },
+      "Bio::PopGen::MarkerI" : {
+         "file" : "Bio/PopGen/MarkerI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::PopGen::PopStats" : {
+         "file" : "Bio/PopGen/PopStats.pm",
+         "version" : "1.006924"
+      },
+      "Bio::PopGen::Population" : {
+         "file" : "Bio/PopGen/Population.pm",
+         "version" : "1.006924"
+      },
+      "Bio::PopGen::PopulationI" : {
+         "file" : "Bio/PopGen/PopulationI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::PopGen::Simulation::Coalescent" : {
+         "file" : "Bio/PopGen/Simulation/Coalescent.pm",
+         "version" : "1.006924"
+      },
+      "Bio::PopGen::Simulation::GeneticDrift" : {
+         "file" : "Bio/PopGen/Simulation/GeneticDrift.pm",
+         "version" : "1.006924"
+      },
+      "Bio::PopGen::Statistics" : {
+         "file" : "Bio/PopGen/Statistics.pm",
+         "version" : "1.006924"
+      },
+      "Bio::PopGen::TagHaplotype" : {
+         "file" : "Bio/PopGen/TagHaplotype.pm",
+         "version" : "1.006924"
+      },
+      "Bio::PopGen::Utilities" : {
+         "file" : "Bio/PopGen/Utilities.pm",
+         "version" : "1.006924"
+      },
+      "Bio::PrimarySeq" : {
+         "file" : "Bio/PrimarySeq.pm",
+         "version" : "1.006924"
+      },
+      "Bio::PrimarySeq::Fasta" : {
+         "file" : "Bio/DB/Fasta.pm",
+         "version" : "1.006924"
+      },
+      "Bio::PrimarySeqI" : {
+         "file" : "Bio/PrimarySeqI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::PullParserI" : {
+         "file" : "Bio/PullParserI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Range" : {
+         "file" : "Bio/Range.pm",
+         "version" : "1.006924"
+      },
+      "Bio::RangeI" : {
+         "file" : "Bio/RangeI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Restriction::Analysis" : {
+         "file" : "Bio/Restriction/Analysis.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Restriction::Enzyme" : {
+         "file" : "Bio/Restriction/Enzyme.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Restriction::Enzyme::MultiCut" : {
+         "file" : "Bio/Restriction/Enzyme/MultiCut.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Restriction::Enzyme::MultiSite" : {
+         "file" : "Bio/Restriction/Enzyme/MultiSite.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Restriction::EnzymeCollection" : {
+         "file" : "Bio/Restriction/EnzymeCollection.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Restriction::EnzymeI" : {
+         "file" : "Bio/Restriction/EnzymeI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Restriction::IO" : {
+         "file" : "Bio/Restriction/IO.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Restriction::IO::bairoch" : {
+         "file" : "Bio/Restriction/IO/bairoch.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Restriction::IO::base" : {
+         "file" : "Bio/Restriction/IO/base.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Restriction::IO::itype2" : {
+         "file" : "Bio/Restriction/IO/itype2.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Restriction::IO::prototype" : {
+         "file" : "Bio/Restriction/IO/prototype.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Restriction::IO::withrefm" : {
+         "file" : "Bio/Restriction/IO/withrefm.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Root::Build" : {
+         "file" : "Bio/Root/Build.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Root::Exception" : {
+         "file" : "Bio/Root/Exception.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Root::HTTPget" : {
+         "file" : "Bio/Root/HTTPget.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Root::IO" : {
+         "file" : "Bio/Root/IO.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Root::Root" : {
+         "file" : "Bio/Root/Root.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Root::RootI" : {
+         "file" : "Bio/Root/RootI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Root::Storable" : {
+         "file" : "Bio/Root/Storable.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Root::Test" : {
+         "file" : "Bio/Root/Test.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Root::Utilities" : {
+         "file" : "Bio/Root/Utilities.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Root::Version" : {
+         "file" : "Bio/Root/Version.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Search::BlastStatistics" : {
+         "file" : "Bio/Search/BlastStatistics.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Search::BlastUtils" : {
+         "file" : "Bio/Search/BlastUtils.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Search::DatabaseI" : {
+         "file" : "Bio/Search/DatabaseI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Search::GenericDatabase" : {
+         "file" : "Bio/Search/GenericDatabase.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Search::GenericStatistics" : {
+         "file" : "Bio/Search/GenericStatistics.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Search::HSP::BlastHSP" : {
+         "file" : "Bio/Search/HSP/BlastHSP.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Search::HSP::BlastPullHSP" : {
+         "file" : "Bio/Search/HSP/BlastPullHSP.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Search::HSP::FastaHSP" : {
+         "file" : "Bio/Search/HSP/FastaHSP.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Search::HSP::GenericHSP" : {
+         "file" : "Bio/Search/HSP/GenericHSP.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Search::HSP::HMMERHSP" : {
+         "file" : "Bio/Search/HSP/HMMERHSP.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Search::HSP::HSPFactory" : {
+         "file" : "Bio/Search/HSP/HSPFactory.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Search::HSP::HSPI" : {
+         "file" : "Bio/Search/Tiling/MapTileUtils.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Search::HSP::HmmpfamHSP" : {
+         "file" : "Bio/Search/HSP/HmmpfamHSP.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Search::HSP::ModelHSP" : {
+         "file" : "Bio/Search/HSP/ModelHSP.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Search::HSP::PSLHSP" : {
+         "file" : "Bio/Search/HSP/PSLHSP.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Search::HSP::PsiBlastHSP" : {
+         "file" : "Bio/Search/HSP/PsiBlastHSP.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Search::HSP::PullHSPI" : {
+         "file" : "Bio/Search/HSP/PullHSPI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Search::HSP::WABAHSP" : {
+         "file" : "Bio/Search/HSP/WABAHSP.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Search::Hit::BlastHit" : {
+         "file" : "Bio/Search/Hit/BlastHit.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Search::Hit::BlastPullHit" : {
+         "file" : "Bio/Search/Hit/BlastPullHit.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Search::Hit::Fasta" : {
+         "file" : "Bio/Search/Hit/Fasta.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Search::Hit::GenericHit" : {
+         "file" : "Bio/Search/Hit/GenericHit.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Search::Hit::HMMERHit" : {
+         "file" : "Bio/Search/Hit/HMMERHit.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Search::Hit::HitFactory" : {
+         "file" : "Bio/Search/Hit/HitFactory.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Search::Hit::HitI" : {
+         "file" : "Bio/Search/Hit/HitI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Search::Hit::HmmpfamHit" : {
+         "file" : "Bio/Search/Hit/HmmpfamHit.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Search::Hit::ModelHit" : {
+         "file" : "Bio/Search/Hit/ModelHit.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Search::Hit::PsiBlastHit" : {
+         "file" : "Bio/Search/Hit/PsiBlastHit.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Search::Hit::PullHitI" : {
+         "file" : "Bio/Search/Hit/PullHitI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Search::Hit::hmmer3Hit" : {
+         "file" : "Bio/Search/Hit/hmmer3Hit.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Search::Iteration::GenericIteration" : {
+         "file" : "Bio/Search/Iteration/GenericIteration.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Search::Iteration::IterationI" : {
+         "file" : "Bio/Search/Iteration/IterationI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Search::Processor" : {
+         "file" : "Bio/Search/Processor.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Search::Result::BlastPullResult" : {
+         "file" : "Bio/Search/Result/BlastPullResult.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Search::Result::BlastResult" : {
+         "file" : "Bio/Search/Result/BlastResult.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Search::Result::CrossMatchResult" : {
+         "file" : "Bio/Search/Result/CrossMatchResult.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Search::Result::GenericResult" : {
+         "file" : "Bio/Search/Result/GenericResult.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Search::Result::HMMERResult" : {
+         "file" : "Bio/Search/Result/HMMERResult.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Search::Result::HmmpfamResult" : {
+         "file" : "Bio/Search/Result/HmmpfamResult.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Search::Result::PullResultI" : {
+         "file" : "Bio/Search/Result/PullResultI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Search::Result::ResultFactory" : {
+         "file" : "Bio/Search/Result/ResultFactory.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Search::Result::ResultI" : {
+         "file" : "Bio/Search/Result/ResultI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Search::Result::WABAResult" : {
+         "file" : "Bio/Search/Result/WABAResult.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Search::Result::hmmer3Result" : {
+         "file" : "Bio/Search/Result/hmmer3Result.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Search::SearchUtils" : {
+         "file" : "Bio/Search/SearchUtils.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Search::StatisticsI" : {
+         "file" : "Bio/Search/StatisticsI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Search::Tiling::MapTileUtils" : {
+         "file" : "Bio/Search/Tiling/MapTileUtils.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Search::Tiling::MapTiling" : {
+         "file" : "Bio/Search/Tiling/MapTiling.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Search::Tiling::TilingI" : {
+         "file" : "Bio/Search/Tiling/TilingI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SearchDist" : {
+         "file" : "Bio/SearchDist.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SearchIO" : {
+         "file" : "Bio/SearchIO.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SearchIO::EventHandlerI" : {
+         "file" : "Bio/SearchIO/EventHandlerI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SearchIO::FastHitEventBuilder" : {
+         "file" : "Bio/SearchIO/FastHitEventBuilder.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SearchIO::IteratedSearchResultEventBuilder" : {
+         "file" : "Bio/SearchIO/IteratedSearchResultEventBuilder.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SearchIO::SearchResultEventBuilder" : {
+         "file" : "Bio/SearchIO/SearchResultEventBuilder.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SearchIO::SearchWriterI" : {
+         "file" : "Bio/SearchIO/SearchWriterI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SearchIO::Writer::BSMLResultWriter" : {
+         "file" : "Bio/SearchIO/Writer/BSMLResultWriter.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SearchIO::Writer::GbrowseGFF" : {
+         "file" : "Bio/SearchIO/Writer/GbrowseGFF.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SearchIO::Writer::HSPTableWriter" : {
+         "file" : "Bio/SearchIO/Writer/HSPTableWriter.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SearchIO::Writer::HTMLResultWriter" : {
+         "file" : "Bio/SearchIO/Writer/HTMLResultWriter.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SearchIO::Writer::HitTableWriter" : {
+         "file" : "Bio/SearchIO/Writer/HitTableWriter.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SearchIO::Writer::ResultTableWriter" : {
+         "file" : "Bio/SearchIO/Writer/ResultTableWriter.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SearchIO::Writer::TextResultWriter" : {
+         "file" : "Bio/SearchIO/Writer/TextResultWriter.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SearchIO::XML::BlastHandler" : {
+         "file" : "Bio/SearchIO/XML/BlastHandler.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SearchIO::XML::PsiBlastHandler" : {
+         "file" : "Bio/SearchIO/XML/PsiBlastHandler.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SearchIO::axt" : {
+         "file" : "Bio/SearchIO/axt.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SearchIO::blast" : {
+         "file" : "Bio/SearchIO/blast.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SearchIO::blast_pull" : {
+         "file" : "Bio/SearchIO/blast_pull.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SearchIO::blasttable" : {
+         "file" : "Bio/SearchIO/blasttable.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SearchIO::blastxml" : {
+         "file" : "Bio/SearchIO/blastxml.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SearchIO::cross_match" : {
+         "file" : "Bio/SearchIO/cross_match.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SearchIO::erpin" : {
+         "file" : "Bio/SearchIO/erpin.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SearchIO::exonerate" : {
+         "file" : "Bio/SearchIO/exonerate.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SearchIO::fasta" : {
+         "file" : "Bio/SearchIO/fasta.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SearchIO::gmap_f9" : {
+         "file" : "Bio/SearchIO/gmap_f9.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SearchIO::hmmer" : {
+         "file" : "Bio/SearchIO/hmmer.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SearchIO::hmmer2" : {
+         "file" : "Bio/SearchIO/hmmer2.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SearchIO::hmmer3" : {
+         "file" : "Bio/SearchIO/hmmer3.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SearchIO::hmmer_pull" : {
+         "file" : "Bio/SearchIO/hmmer_pull.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SearchIO::infernal" : {
+         "file" : "Bio/SearchIO/infernal.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SearchIO::megablast" : {
+         "file" : "Bio/SearchIO/megablast.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SearchIO::psl" : {
+         "file" : "Bio/SearchIO/psl.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SearchIO::rnamotif" : {
+         "file" : "Bio/SearchIO/rnamotif.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SearchIO::sim4" : {
+         "file" : "Bio/SearchIO/sim4.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SearchIO::waba" : {
+         "file" : "Bio/SearchIO/waba.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SearchIO::wise" : {
+         "file" : "Bio/SearchIO/wise.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Seq" : {
+         "file" : "Bio/Seq.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Seq::BaseSeqProcessor" : {
+         "file" : "Bio/Seq/BaseSeqProcessor.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Seq::EncodedSeq" : {
+         "file" : "Bio/Seq/EncodedSeq.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Seq::LargeLocatableSeq" : {
+         "file" : "Bio/Seq/LargeLocatableSeq.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Seq::LargePrimarySeq" : {
+         "file" : "Bio/Seq/LargePrimarySeq.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Seq::LargeSeq" : {
+         "file" : "Bio/Seq/LargeSeq.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Seq::LargeSeqI" : {
+         "file" : "Bio/Seq/LargeSeqI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Seq::Meta" : {
+         "file" : "Bio/Seq/Meta.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Seq::Meta::Array" : {
+         "file" : "Bio/Seq/Meta/Array.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Seq::MetaI" : {
+         "file" : "Bio/Seq/MetaI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Seq::PrimaryQual" : {
+         "file" : "Bio/Seq/PrimaryQual.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Seq::PrimaryQual::Qual" : {
+         "file" : "Bio/DB/Qual.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Seq::PrimedSeq" : {
+         "file" : "Bio/Seq/PrimedSeq.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Seq::QualI" : {
+         "file" : "Bio/Seq/QualI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Seq::Quality" : {
+         "file" : "Bio/Seq/Quality.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Seq::RichSeq" : {
+         "file" : "Bio/Seq/RichSeq.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Seq::RichSeqI" : {
+         "file" : "Bio/Seq/RichSeqI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Seq::SeqBuilder" : {
+         "file" : "Bio/Seq/SeqBuilder.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Seq::SeqFactory" : {
+         "file" : "Bio/Seq/SeqFactory.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Seq::SeqFastaSpeedFactory" : {
+         "file" : "Bio/Seq/SeqFastaSpeedFactory.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Seq::SeqWithQuality" : {
+         "file" : "Bio/Seq/SeqWithQuality.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Seq::SequenceTrace" : {
+         "file" : "Bio/Seq/SequenceTrace.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Seq::SimulatedRead" : {
+         "file" : "Bio/Seq/SimulatedRead.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Seq::TraceI" : {
+         "file" : "Bio/Seq/TraceI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqAnalysisParserI" : {
+         "file" : "Bio/SeqAnalysisParserI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqEvolution::DNAPoint" : {
+         "file" : "Bio/SeqEvolution/DNAPoint.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqEvolution::EvolutionI" : {
+         "file" : "Bio/SeqEvolution/EvolutionI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqEvolution::Factory" : {
+         "file" : "Bio/SeqEvolution/Factory.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqFeature::Amplicon" : {
+         "file" : "Bio/SeqFeature/Amplicon.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqFeature::AnnotationAdaptor" : {
+         "file" : "Bio/SeqFeature/AnnotationAdaptor.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqFeature::Collection" : {
+         "file" : "Bio/SeqFeature/Collection.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqFeature::CollectionI" : {
+         "file" : "Bio/SeqFeature/CollectionI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqFeature::Computation" : {
+         "file" : "Bio/SeqFeature/Computation.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqFeature::FeaturePair" : {
+         "file" : "Bio/SeqFeature/FeaturePair.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqFeature::Gene::Exon" : {
+         "file" : "Bio/SeqFeature/Gene/Exon.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqFeature::Gene::ExonI" : {
+         "file" : "Bio/SeqFeature/Gene/ExonI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqFeature::Gene::GeneStructure" : {
+         "file" : "Bio/SeqFeature/Gene/GeneStructure.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqFeature::Gene::GeneStructureI" : {
+         "file" : "Bio/SeqFeature/Gene/GeneStructureI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqFeature::Gene::Intron" : {
+         "file" : "Bio/SeqFeature/Gene/Intron.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqFeature::Gene::NC_Feature" : {
+         "file" : "Bio/SeqFeature/Gene/NC_Feature.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqFeature::Gene::Poly_A_site" : {
+         "file" : "Bio/SeqFeature/Gene/Poly_A_site.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqFeature::Gene::Promoter" : {
+         "file" : "Bio/SeqFeature/Gene/Promoter.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqFeature::Gene::Transcript" : {
+         "file" : "Bio/SeqFeature/Gene/Transcript.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqFeature::Gene::TranscriptI" : {
+         "file" : "Bio/SeqFeature/Gene/TranscriptI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqFeature::Gene::UTR" : {
+         "file" : "Bio/SeqFeature/Gene/UTR.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqFeature::Generic" : {
+         "file" : "Bio/SeqFeature/Generic.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqFeature::Lite" : {
+         "file" : "Bio/SeqFeature/Lite.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqFeature::PositionProxy" : {
+         "file" : "Bio/SeqFeature/PositionProxy.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqFeature::Primer" : {
+         "file" : "Bio/SeqFeature/Primer.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqFeature::SiRNA::Oligo" : {
+         "file" : "Bio/SeqFeature/SiRNA/Oligo.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqFeature::SiRNA::Pair" : {
+         "file" : "Bio/SeqFeature/SiRNA/Pair.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqFeature::Similarity" : {
+         "file" : "Bio/SeqFeature/Similarity.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqFeature::SimilarityPair" : {
+         "file" : "Bio/SeqFeature/SimilarityPair.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqFeature::SubSeq" : {
+         "file" : "Bio/SeqFeature/SubSeq.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqFeature::Tools::FeatureNamer" : {
+         "file" : "Bio/SeqFeature/Tools/FeatureNamer.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqFeature::Tools::IDHandler" : {
+         "file" : "Bio/SeqFeature/Tools/IDHandler.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqFeature::Tools::TypeMapper" : {
+         "file" : "Bio/SeqFeature/Tools/TypeMapper.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqFeature::Tools::Unflattener" : {
+         "file" : "Bio/SeqFeature/Tools/Unflattener.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqFeature::TypedSeqFeatureI" : {
+         "file" : "Bio/SeqFeature/TypedSeqFeatureI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqFeatureI" : {
+         "file" : "Bio/SeqFeatureI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqI" : {
+         "file" : "Bio/SeqI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqIO" : {
+         "file" : "Bio/SeqIO.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqIO::FTHelper" : {
+         "file" : "Bio/SeqIO/FTHelper.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqIO::Handler::GenericRichSeqHandler" : {
+         "file" : "Bio/SeqIO/Handler/GenericRichSeqHandler.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqIO::MultiFile" : {
+         "file" : "Bio/SeqIO/MultiFile.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqIO::abi" : {
+         "file" : "Bio/SeqIO/abi.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqIO::ace" : {
+         "file" : "Bio/SeqIO/ace.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqIO::agave" : {
+         "file" : "Bio/SeqIO/agave.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqIO::alf" : {
+         "file" : "Bio/SeqIO/alf.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqIO::asciitree" : {
+         "file" : "Bio/SeqIO/asciitree.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqIO::bsml" : {
+         "file" : "Bio/SeqIO/bsml.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqIO::bsml_sax" : {
+         "file" : "Bio/SeqIO/bsml_sax.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqIO::chadoxml" : {
+         "file" : "Bio/SeqIO/chadoxml.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqIO::chaos" : {
+         "file" : "Bio/SeqIO/chaos.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqIO::chaosxml" : {
+         "file" : "Bio/SeqIO/chaosxml.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqIO::ctf" : {
+         "file" : "Bio/SeqIO/ctf.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqIO::embl" : {
+         "file" : "Bio/SeqIO/embl.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqIO::embldriver" : {
+         "file" : "Bio/SeqIO/embldriver.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqIO::entrezgene" : {
+         "file" : "Bio/SeqIO/entrezgene.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqIO::excel" : {
+         "file" : "Bio/SeqIO/excel.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqIO::exp" : {
+         "file" : "Bio/SeqIO/exp.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqIO::fasta" : {
+         "file" : "Bio/SeqIO/fasta.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqIO::fastq" : {
+         "file" : "Bio/SeqIO/fastq.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqIO::flybase_chadoxml" : {
+         "file" : "Bio/SeqIO/flybase_chadoxml.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqIO::game" : {
+         "file" : "Bio/SeqIO/game.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqIO::game::featHandler" : {
+         "file" : "Bio/SeqIO/game/featHandler.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqIO::game::gameHandler" : {
+         "file" : "Bio/SeqIO/game/gameHandler.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqIO::game::gameSubs" : {
+         "file" : "Bio/SeqIO/game/gameSubs.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqIO::game::gameWriter" : {
+         "file" : "Bio/SeqIO/game/gameWriter.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqIO::game::seqHandler" : {
+         "file" : "Bio/SeqIO/game/seqHandler.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqIO::gbdriver" : {
+         "file" : "Bio/SeqIO/gbdriver.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqIO::gbxml" : {
+         "file" : "Bio/SeqIO/gbxml.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqIO::gcg" : {
+         "file" : "Bio/SeqIO/gcg.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqIO::genbank" : {
+         "file" : "Bio/SeqIO/genbank.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqIO::interpro" : {
+         "file" : "Bio/SeqIO/interpro.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqIO::kegg" : {
+         "file" : "Bio/SeqIO/kegg.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqIO::largefasta" : {
+         "file" : "Bio/SeqIO/largefasta.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqIO::lasergene" : {
+         "file" : "Bio/SeqIO/lasergene.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqIO::locuslink" : {
+         "file" : "Bio/SeqIO/locuslink.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqIO::mbsout" : {
+         "file" : "Bio/SeqIO/mbsout.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqIO::metafasta" : {
+         "file" : "Bio/SeqIO/metafasta.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqIO::msout" : {
+         "file" : "Bio/SeqIO/msout.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqIO::nexml" : {
+         "file" : "Bio/SeqIO/nexml.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqIO::phd" : {
+         "file" : "Bio/SeqIO/phd.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqIO::pir" : {
+         "file" : "Bio/SeqIO/pir.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqIO::pln" : {
+         "file" : "Bio/SeqIO/pln.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqIO::qual" : {
+         "file" : "Bio/SeqIO/qual.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqIO::raw" : {
+         "file" : "Bio/SeqIO/raw.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqIO::scf" : {
+         "file" : "Bio/SeqIO/scf.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqIO::seqxml" : {
+         "file" : "Bio/SeqIO/seqxml.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqIO::strider" : {
+         "file" : "Bio/SeqIO/strider.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqIO::swiss" : {
+         "file" : "Bio/SeqIO/swiss.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqIO::swissdriver" : {
+         "file" : "Bio/SeqIO/swissdriver.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqIO::tab" : {
+         "file" : "Bio/SeqIO/tab.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqIO::table" : {
+         "file" : "Bio/SeqIO/table.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqIO::tigr" : {
+         "file" : "Bio/SeqIO/tigr.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqIO::tigrxml" : {
+         "file" : "Bio/SeqIO/tigrxml.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqIO::tinyseq" : {
+         "file" : "Bio/SeqIO/tinyseq.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqIO::tinyseq::tinyseqHandler" : {
+         "file" : "Bio/SeqIO/tinyseq/tinyseqHandler.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqIO::ztr" : {
+         "file" : "Bio/SeqIO/ztr.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SeqUtils" : {
+         "file" : "Bio/SeqUtils.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SimpleAlign" : {
+         "file" : "Bio/SimpleAlign.pm",
+         "version" : "1.006924"
+      },
+      "Bio::SimpleAnalysisI" : {
+         "file" : "Bio/SimpleAnalysisI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Species" : {
+         "file" : "Bio/Species.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Structure::Atom" : {
+         "file" : "Bio/Structure/Atom.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Structure::Chain" : {
+         "file" : "Bio/Structure/Chain.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Structure::Entry" : {
+         "file" : "Bio/Structure/Entry.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Structure::IO" : {
+         "file" : "Bio/Structure/IO.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Structure::IO::pdb" : {
+         "file" : "Bio/Structure/IO/pdb.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Structure::Model" : {
+         "file" : "Bio/Structure/Model.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Structure::Residue" : {
+         "file" : "Bio/Structure/Residue.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Structure::SecStr::DSSP::Res" : {
+         "file" : "Bio/Structure/SecStr/DSSP/Res.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Structure::SecStr::STRIDE::Res" : {
+         "file" : "Bio/Structure/SecStr/STRIDE/Res.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Structure::StructureI" : {
+         "file" : "Bio/Structure/StructureI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Symbol::Alphabet" : {
+         "file" : "Bio/Symbol/Alphabet.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Symbol::AlphabetI" : {
+         "file" : "Bio/Symbol/AlphabetI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Symbol::DNAAlphabet" : {
+         "file" : "Bio/Symbol/DNAAlphabet.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Symbol::ProteinAlphabet" : {
+         "file" : "Bio/Symbol/ProteinAlphabet.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Symbol::Symbol" : {
+         "file" : "Bio/Symbol/Symbol.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Symbol::SymbolI" : {
+         "file" : "Bio/Symbol/SymbolI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Taxon" : {
+         "file" : "Bio/Taxon.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Taxonomy" : {
+         "file" : "Bio/Taxonomy.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Taxonomy::FactoryI" : {
+         "file" : "Bio/Taxonomy/FactoryI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Taxonomy::Node" : {
+         "file" : "Bio/Taxonomy/Node.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Taxonomy::Taxon" : {
+         "file" : "Bio/Taxonomy/Taxon.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Taxonomy::Tree" : {
+         "file" : "Bio/Taxonomy/Tree.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::AlignFactory" : {
+         "file" : "Bio/Tools/AlignFactory.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::Alignment::Consed" : {
+         "file" : "Bio/Tools/Alignment/Consed.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::Alignment::Trim" : {
+         "file" : "Bio/Tools/Alignment/Trim.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::AmpliconSearch" : {
+         "file" : "Bio/Tools/AmpliconSearch.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::Analysis::DNA::ESEfinder" : {
+         "file" : "Bio/Tools/Analysis/DNA/ESEfinder.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::Analysis::Protein::Domcut" : {
+         "file" : "Bio/Tools/Analysis/Protein/Domcut.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::Analysis::Protein::ELM" : {
+         "file" : "Bio/Tools/Analysis/Protein/ELM.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::Analysis::Protein::GOR4" : {
+         "file" : "Bio/Tools/Analysis/Protein/GOR4.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::Analysis::Protein::HNN" : {
+         "file" : "Bio/Tools/Analysis/Protein/HNN.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::Analysis::Protein::Mitoprot" : {
+         "file" : "Bio/Tools/Analysis/Protein/Mitoprot.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::Analysis::Protein::NetPhos" : {
+         "file" : "Bio/Tools/Analysis/Protein/NetPhos.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::Analysis::Protein::Scansite" : {
+         "file" : "Bio/Tools/Analysis/Protein/Scansite.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::Analysis::Protein::Sopma" : {
+         "file" : "Bio/Tools/Analysis/Protein/Sopma.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::Analysis::SimpleAnalysisBase" : {
+         "file" : "Bio/Tools/Analysis/SimpleAnalysisBase.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::AnalysisResult" : {
+         "file" : "Bio/Tools/AnalysisResult.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::Blat" : {
+         "file" : "Bio/Tools/Blat.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::CodonTable" : {
+         "file" : "Bio/Tools/CodonTable.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::Coil" : {
+         "file" : "Bio/Tools/Coil.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::ECnumber" : {
+         "file" : "Bio/Tools/ECnumber.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::EMBOSS::Palindrome" : {
+         "file" : "Bio/Tools/EMBOSS/Palindrome.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::EPCR" : {
+         "file" : "Bio/Tools/EPCR.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::ERPIN" : {
+         "file" : "Bio/Tools/ERPIN.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::ESTScan" : {
+         "file" : "Bio/Tools/ESTScan.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::Eponine" : {
+         "file" : "Bio/Tools/Eponine.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::Est2Genome" : {
+         "file" : "Bio/Tools/Est2Genome.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::Fgenesh" : {
+         "file" : "Bio/Tools/Fgenesh.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::FootPrinter" : {
+         "file" : "Bio/Tools/FootPrinter.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::GFF" : {
+         "file" : "Bio/Tools/GFF.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::Gel" : {
+         "file" : "Bio/Tools/Gel.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::Geneid" : {
+         "file" : "Bio/Tools/Geneid.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::Genemark" : {
+         "file" : "Bio/Tools/Genemark.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::Genewise" : {
+         "file" : "Bio/Tools/Genewise.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::Genomewise" : {
+         "file" : "Bio/Tools/Genomewise.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::Genscan" : {
+         "file" : "Bio/Tools/Genscan.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::Glimmer" : {
+         "file" : "Bio/Tools/Glimmer.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::Grail" : {
+         "file" : "Bio/Tools/Grail.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::GuessSeqFormat" : {
+         "file" : "Bio/Tools/GuessSeqFormat.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::HMMER::Domain" : {
+         "file" : "Bio/Tools/HMMER/Domain.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::HMMER::Results" : {
+         "file" : "Bio/Tools/HMMER/Results.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::HMMER::Set" : {
+         "file" : "Bio/Tools/HMMER/Set.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::Hmmpfam" : {
+         "file" : "Bio/Tools/Hmmpfam.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::IUPAC" : {
+         "file" : "Bio/Tools/IUPAC.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::Infernal" : {
+         "file" : "Bio/Tools/Infernal.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::Lucy" : {
+         "file" : "Bio/Tools/Lucy.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::MZEF" : {
+         "file" : "Bio/Tools/MZEF.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::Match" : {
+         "file" : "Bio/Tools/Match.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::OddCodes" : {
+         "file" : "Bio/Tools/OddCodes.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::Phylo::Gerp" : {
+         "file" : "Bio/Tools/Phylo/Gerp.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::Phylo::Gumby" : {
+         "file" : "Bio/Tools/Phylo/Gumby.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::Phylo::Molphy" : {
+         "file" : "Bio/Tools/Phylo/Molphy.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::Phylo::Molphy::Result" : {
+         "file" : "Bio/Tools/Phylo/Molphy/Result.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::Phylo::PAML" : {
+         "file" : "Bio/Tools/Phylo/PAML.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::Phylo::PAML::Codeml" : {
+         "file" : "Bio/Tools/Phylo/PAML/Codeml.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::Phylo::PAML::ModelResult" : {
+         "file" : "Bio/Tools/Phylo/PAML/ModelResult.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::Phylo::PAML::Result" : {
+         "file" : "Bio/Tools/Phylo/PAML/Result.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::Phylo::Phylip::ProtDist" : {
+         "file" : "Bio/Tools/Phylo/Phylip/ProtDist.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::Prediction::Exon" : {
+         "file" : "Bio/Tools/Prediction/Exon.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::Prediction::Gene" : {
+         "file" : "Bio/Tools/Prediction/Gene.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::Primer3" : {
+         "file" : "Bio/Tools/Primer3.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::Primer::Assessor::Base" : {
+         "file" : "Bio/Tools/Primer/Assessor/Base.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::Primer::AssessorI" : {
+         "file" : "Bio/Tools/Primer/AssessorI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::Primer::Feature" : {
+         "file" : "Bio/Tools/Primer/Feature.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::Primer::Pair" : {
+         "file" : "Bio/Tools/Primer/Pair.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::Prints" : {
+         "file" : "Bio/Tools/Prints.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::Profile" : {
+         "file" : "Bio/Tools/Profile.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::Promoterwise" : {
+         "file" : "Bio/Tools/Promoterwise.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::PrositeScan" : {
+         "file" : "Bio/Tools/PrositeScan.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::Protparam" : {
+         "file" : "Bio/Tools/Protparam.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::Pseudowise" : {
+         "file" : "Bio/Tools/Pseudowise.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::QRNA" : {
+         "file" : "Bio/Tools/QRNA.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::RNAMotif" : {
+         "file" : "Bio/Tools/RNAMotif.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::RandomDistFunctions" : {
+         "file" : "Bio/Tools/RandomDistFunctions.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::RepeatMasker" : {
+         "file" : "Bio/Tools/RepeatMasker.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::Run::GenericParameters" : {
+         "file" : "Bio/Tools/Run/GenericParameters.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::Run::ParametersI" : {
+         "file" : "Bio/Tools/Run/ParametersI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::Run::RemoteBlast" : {
+         "file" : "Bio/Tools/Run/RemoteBlast.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::Run::StandAloneBlast" : {
+         "file" : "Bio/Tools/Run/StandAloneBlast.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::Run::StandAloneNCBIBlast" : {
+         "file" : "Bio/Tools/Run/StandAloneNCBIBlast.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::Run::StandAloneWUBlast" : {
+         "file" : "Bio/Tools/Run/StandAloneWUBlast.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::Run::WrapperBase" : {
+         "file" : "Bio/Tools/Run/WrapperBase.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::Seg" : {
+         "file" : "Bio/Tools/Seg.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::SeqPattern" : {
+         "file" : "Bio/Tools/SeqPattern.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::SeqPattern::Backtranslate" : {
+         "file" : "Bio/Tools/SeqPattern/Backtranslate.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::SeqStats" : {
+         "file" : "Bio/Tools/SeqStats.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::SeqWords" : {
+         "file" : "Bio/Tools/SeqWords.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::SiRNA" : {
+         "file" : "Bio/Tools/SiRNA.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::SiRNA::Ruleset::saigo" : {
+         "file" : "Bio/Tools/SiRNA/Ruleset/saigo.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::SiRNA::Ruleset::tuschl" : {
+         "file" : "Bio/Tools/SiRNA/Ruleset/tuschl.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::Sigcleave" : {
+         "file" : "Bio/Tools/Sigcleave.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::Signalp" : {
+         "file" : "Bio/Tools/Signalp.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::Signalp::ExtendedSignalp" : {
+         "file" : "Bio/Tools/Signalp/ExtendedSignalp.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::Sim4::Exon" : {
+         "file" : "Bio/Tools/Sim4/Exon.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::Sim4::Results" : {
+         "file" : "Bio/Tools/Sim4/Results.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::Spidey::Exon" : {
+         "file" : "Bio/Tools/Spidey/Exon.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::Spidey::Results" : {
+         "file" : "Bio/Tools/Spidey/Results.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::TandemRepeatsFinder" : {
+         "file" : "Bio/Tools/TandemRepeatsFinder.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::TargetP" : {
+         "file" : "Bio/Tools/TargetP.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::Tmhmm" : {
+         "file" : "Bio/Tools/Tmhmm.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::dpAlign" : {
+         "file" : "Bio/Tools/dpAlign.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::ipcress" : {
+         "file" : "Bio/Tools/ipcress.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::isPcr" : {
+         "file" : "Bio/Tools/isPcr.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::pICalculator" : {
+         "file" : "Bio/Tools/pICalculator.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::pSW" : {
+         "file" : "Bio/Tools/pSW.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tools::tRNAscanSE" : {
+         "file" : "Bio/Tools/tRNAscanSE.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tree::AlleleNode" : {
+         "file" : "Bio/Tree/AlleleNode.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tree::AnnotatableNode" : {
+         "file" : "Bio/Tree/AnnotatableNode.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tree::Compatible" : {
+         "file" : "Bio/Tree/Compatible.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tree::DistanceFactory" : {
+         "file" : "Bio/Tree/DistanceFactory.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tree::Draw::Cladogram" : {
+         "file" : "Bio/Tree/Draw/Cladogram.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tree::Node" : {
+         "file" : "Bio/Tree/Node.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tree::NodeI" : {
+         "file" : "Bio/Tree/NodeI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tree::NodeNHX" : {
+         "file" : "Bio/Tree/NodeNHX.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tree::RandomFactory" : {
+         "file" : "Bio/Tree/RandomFactory.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tree::Statistics" : {
+         "file" : "Bio/Tree/Statistics.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tree::Tree" : {
+         "file" : "Bio/Tree/Tree.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tree::TreeFunctionsI" : {
+         "file" : "Bio/Tree/TreeFunctionsI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Tree::TreeI" : {
+         "file" : "Bio/Tree/TreeI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::TreeIO" : {
+         "file" : "Bio/TreeIO.pm",
+         "version" : "1.006924"
+      },
+      "Bio::TreeIO::NewickParser" : {
+         "file" : "Bio/TreeIO/NewickParser.pm",
+         "version" : "1.006924"
+      },
+      "Bio::TreeIO::TreeEventBuilder" : {
+         "file" : "Bio/TreeIO/TreeEventBuilder.pm",
+         "version" : "1.006924"
+      },
+      "Bio::TreeIO::cluster" : {
+         "file" : "Bio/TreeIO/cluster.pm",
+         "version" : "1.006924"
+      },
+      "Bio::TreeIO::lintree" : {
+         "file" : "Bio/TreeIO/lintree.pm",
+         "version" : "1.006924"
+      },
+      "Bio::TreeIO::newick" : {
+         "file" : "Bio/TreeIO/newick.pm",
+         "version" : "1.006924"
+      },
+      "Bio::TreeIO::nexml" : {
+         "file" : "Bio/TreeIO/nexml.pm",
+         "version" : "1.006924"
+      },
+      "Bio::TreeIO::nexus" : {
+         "file" : "Bio/TreeIO/nexus.pm",
+         "version" : "1.006924"
+      },
+      "Bio::TreeIO::nhx" : {
+         "file" : "Bio/TreeIO/nhx.pm",
+         "version" : "1.006924"
+      },
+      "Bio::TreeIO::pag" : {
+         "file" : "Bio/TreeIO/pag.pm",
+         "version" : "1.006924"
+      },
+      "Bio::TreeIO::phyloxml" : {
+         "file" : "Bio/TreeIO/phyloxml.pm",
+         "version" : "1.006924"
+      },
+      "Bio::TreeIO::svggraph" : {
+         "file" : "Bio/TreeIO/svggraph.pm",
+         "version" : "1.006924"
+      },
+      "Bio::TreeIO::tabtree" : {
+         "file" : "Bio/TreeIO/tabtree.pm",
+         "version" : "1.006924"
+      },
+      "Bio::UpdateableSeqI" : {
+         "file" : "Bio/UpdateableSeqI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Variation::AAChange" : {
+         "file" : "Bio/Variation/AAChange.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Variation::AAReverseMutate" : {
+         "file" : "Bio/Variation/AAReverseMutate.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Variation::Allele" : {
+         "file" : "Bio/Variation/Allele.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Variation::DNAMutation" : {
+         "file" : "Bio/Variation/DNAMutation.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Variation::IO" : {
+         "file" : "Bio/Variation/IO.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Variation::IO::flat" : {
+         "file" : "Bio/Variation/IO/flat.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Variation::IO::xml" : {
+         "file" : "Bio/Variation/IO/xml.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Variation::RNAChange" : {
+         "file" : "Bio/Variation/RNAChange.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Variation::SNP" : {
+         "file" : "Bio/Variation/SNP.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Variation::SeqDiff" : {
+         "file" : "Bio/Variation/SeqDiff.pm",
+         "version" : "1.006924"
+      },
+      "Bio::Variation::VariantI" : {
+         "file" : "Bio/Variation/VariantI.pm",
+         "version" : "1.006924"
+      },
+      "Bio::WebAgent" : {
+         "file" : "Bio/WebAgent.pm",
+         "version" : "1.006924"
+      },
+      "FeatureStore" : {
+         "file" : "Bio/DB/GFF/Adaptor/berkeleydb.pm",
+         "version" : "1.006924"
+      }
+   },
    "release_status" : "stable",
    "resources" : {
       "license" : [
          "http://dev.perl.org/licenses/"
       ]
    },
-   "version" : "1.006923"
+   "version" : "1.006924"
 }
@@ -3,62 +3,2543 @@ abstract: 'Bioinformatics Toolkit'
 author:
   - 'BioPerl Team <bioperl-l@bioperl.org>'
 build_requires:
-  CPAN: 1.81
-  Module::Build: 0.2805
-  Test::Harness: 2.62
-  Test::Most: 0
-  URI::Escape: 0
+  CPAN: '1.81'
+  Module::Build: '0.2805'
+  Test::Harness: '2.62'
+  Test::Most: '0'
+  URI::Escape: '0'
 configure_requires:
-  Module::Build: 0.42
+  Module::Build: '0.40'
 dynamic_config: 1
-generated_by: 'Module::Build version 0.4203, CPAN::Meta::Converter version 2.132830'
+generated_by: 'Module::Build version 0.4003, CPAN::Meta::Converter version 2.141520'
 license: perl
 meta-spec:
   url: http://module-build.sourceforge.net/META-spec-v1.4.html
-  version: 1.4
+  version: '1.4'
 name: BioPerl
 no_index:
   x_dir:
     - examples/root/lib
+provides:
+  Bio::Align::AlignI:
+    file: Bio/Align/AlignI.pm
+    version: '1.006924'
+  Bio::Align::DNAStatistics:
+    file: Bio/Align/DNAStatistics.pm
+    version: '1.006924'
+  Bio::Align::Graphics:
+    file: Bio/Align/Graphics.pm
+    version: '1.006924'
+  Bio::Align::PairwiseStatistics:
+    file: Bio/Align/PairwiseStatistics.pm
+    version: '1.006924'
+  Bio::Align::ProteinStatistics:
+    file: Bio/Align/ProteinStatistics.pm
+    version: '1.006924'
+  Bio::Align::StatisticsI:
+    file: Bio/Align/StatisticsI.pm
+    version: '1.006924'
+  Bio::Align::Utilities:
+    file: Bio/Align/Utilities.pm
+    version: '1.006924'
+  Bio::AlignIO:
+    file: Bio/AlignIO.pm
+    version: '1.006924'
+  Bio::AlignIO::Handler::GenericAlignHandler:
+    file: Bio/AlignIO/Handler/GenericAlignHandler.pm
+    version: '1.006924'
+  Bio::AlignIO::arp:
+    file: Bio/AlignIO/arp.pm
+    version: '1.006924'
+  Bio::AlignIO::bl2seq:
+    file: Bio/AlignIO/bl2seq.pm
+    version: '1.006924'
+  Bio::AlignIO::clustalw:
+    file: Bio/AlignIO/clustalw.pm
+    version: '1.006924'
+  Bio::AlignIO::emboss:
+    file: Bio/AlignIO/emboss.pm
+    version: '1.006924'
+  Bio::AlignIO::fasta:
+    file: Bio/AlignIO/fasta.pm
+    version: '1.006924'
+  Bio::AlignIO::largemultifasta:
+    file: Bio/AlignIO/largemultifasta.pm
+    version: '1.006924'
+  Bio::AlignIO::maf:
+    file: Bio/AlignIO/maf.pm
+    version: '1.006924'
+  Bio::AlignIO::mase:
+    file: Bio/AlignIO/mase.pm
+    version: '1.006924'
+  Bio::AlignIO::mega:
+    file: Bio/AlignIO/mega.pm
+    version: '1.006924'
+  Bio::AlignIO::meme:
+    file: Bio/AlignIO/meme.pm
+    version: '1.006924'
+  Bio::AlignIO::metafasta:
+    file: Bio/AlignIO/metafasta.pm
+    version: '1.006924'
+  Bio::AlignIO::msf:
+    file: Bio/AlignIO/msf.pm
+    version: '1.006924'
+  Bio::AlignIO::nexml:
+    file: Bio/AlignIO/nexml.pm
+    version: '1.006924'
+  Bio::AlignIO::nexus:
+    file: Bio/AlignIO/nexus.pm
+    version: '1.006924'
+  Bio::AlignIO::pfam:
+    file: Bio/AlignIO/pfam.pm
+    version: '1.006924'
+  Bio::AlignIO::phylip:
+    file: Bio/AlignIO/phylip.pm
+    version: '1.006924'
+  Bio::AlignIO::po:
+    file: Bio/AlignIO/po.pm
+    version: '1.006924'
+  Bio::AlignIO::proda:
+    file: Bio/AlignIO/proda.pm
+    version: '1.006924'
+  Bio::AlignIO::prodom:
+    file: Bio/AlignIO/prodom.pm
+    version: '1.006924'
+  Bio::AlignIO::psi:
+    file: Bio/AlignIO/psi.pm
+    version: '1.006924'
+  Bio::AlignIO::selex:
+    file: Bio/AlignIO/selex.pm
+    version: '1.006924'
+  Bio::AlignIO::stockholm:
+    file: Bio/AlignIO/stockholm.pm
+    version: '1.006924'
+  Bio::AlignIO::xmfa:
+    file: Bio/AlignIO/xmfa.pm
+    version: '1.006924'
+  Bio::AnalysisI:
+    file: Bio/AnalysisI.pm
+    version: '1.006924'
+  Bio::AnalysisI::JobI:
+    file: Bio/AnalysisI.pm
+    version: '1.006924'
+  Bio::AnalysisParserI:
+    file: Bio/AnalysisParserI.pm
+    version: '1.006924'
+  Bio::AnalysisResultI:
+    file: Bio/AnalysisResultI.pm
+    version: '1.006924'
+  Bio::AnnotatableI:
+    file: Bio/AnnotatableI.pm
+    version: '1.006924'
+  Bio::Annotation::AnnotationFactory:
+    file: Bio/Annotation/AnnotationFactory.pm
+    version: '1.006924'
+  Bio::Annotation::Collection:
+    file: Bio/Annotation/Collection.pm
+    version: '1.006924'
+  Bio::Annotation::Comment:
+    file: Bio/Annotation/Comment.pm
+    version: '1.006924'
+  Bio::Annotation::DBLink:
+    file: Bio/Annotation/DBLink.pm
+    version: '1.006924'
+  Bio::Annotation::OntologyTerm:
+    file: Bio/Annotation/OntologyTerm.pm
+    version: '1.006924'
+  Bio::Annotation::Reference:
+    file: Bio/Annotation/Reference.pm
+    version: '1.006924'
+  Bio::Annotation::Relation:
+    file: Bio/Annotation/Relation.pm
+    version: '1.006924'
+  Bio::Annotation::SimpleValue:
+    file: Bio/Annotation/SimpleValue.pm
+    version: '1.006924'
+  Bio::Annotation::StructuredValue:
+    file: Bio/Annotation/StructuredValue.pm
+    version: '1.006924'
+  Bio::Annotation::TagTree:
+    file: Bio/Annotation/TagTree.pm
+    version: '1.006924'
+  Bio::Annotation::Target:
+    file: Bio/Annotation/Target.pm
+    version: '1.006924'
+  Bio::Annotation::Tree:
+    file: Bio/Annotation/Tree.pm
+    version: '1.006924'
+  Bio::Annotation::TypeManager:
+    file: Bio/Annotation/TypeManager.pm
+    version: '1.006924'
+  Bio::AnnotationCollectionI:
+    file: Bio/AnnotationCollectionI.pm
+    version: '1.006924'
+  Bio::AnnotationI:
+    file: Bio/AnnotationI.pm
+    version: '1.006924'
+  Bio::Assembly::Contig:
+    file: Bio/Assembly/Contig.pm
+    version: '1.006924'
+  Bio::Assembly::ContigAnalysis:
+    file: Bio/Assembly/ContigAnalysis.pm
+    version: '1.006924'
+  Bio::Assembly::IO:
+    file: Bio/Assembly/IO.pm
+    version: '1.006924'
+  Bio::Assembly::IO::ace:
+    file: Bio/Assembly/IO/ace.pm
+    version: '1.006924'
+  Bio::Assembly::IO::bowtie:
+    file: Bio/Assembly/IO/bowtie.pm
+    version: '1.006924'
+  Bio::Assembly::IO::maq:
+    file: Bio/Assembly/IO/maq.pm
+    version: '1.006924'
+  Bio::Assembly::IO::phrap:
+    file: Bio/Assembly/IO/phrap.pm
+    version: '1.006924'
+  Bio::Assembly::IO::sam:
+    file: Bio/Assembly/IO/sam.pm
+    version: '1.006924'
+  Bio::Assembly::IO::tigr:
+    file: Bio/Assembly/IO/tigr.pm
+    version: '1.006924'
+  Bio::Assembly::Scaffold:
+    file: Bio/Assembly/Scaffold.pm
+    version: '1.006924'
+  Bio::Assembly::ScaffoldI:
+    file: Bio/Assembly/ScaffoldI.pm
+    version: '1.006924'
+  Bio::Assembly::Singlet:
+    file: Bio/Assembly/Singlet.pm
+    version: '1.006924'
+  Bio::Assembly::Tools::ContigSpectrum:
+    file: Bio/Assembly/Tools/ContigSpectrum.pm
+    version: '1.006924'
+  Bio::Cluster::ClusterFactory:
+    file: Bio/Cluster/ClusterFactory.pm
+    version: '1.006924'
+  Bio::Cluster::FamilyI:
+    file: Bio/Cluster/FamilyI.pm
+    version: '1.006924'
+  Bio::Cluster::SequenceFamily:
+    file: Bio/Cluster/SequenceFamily.pm
+    version: '1.006924'
+  Bio::Cluster::UniGene:
+    file: Bio/Cluster/UniGene.pm
+    version: '1.006924'
+  Bio::Cluster::UniGeneI:
+    file: Bio/Cluster/UniGeneI.pm
+    version: '1.006924'
+  Bio::ClusterI:
+    file: Bio/ClusterI.pm
+    version: '1.006924'
+  Bio::ClusterIO:
+    file: Bio/ClusterIO.pm
+    version: '1.006924'
+  Bio::ClusterIO::dbsnp:
+    file: Bio/ClusterIO/dbsnp.pm
+    version: '1.006924'
+  Bio::ClusterIO::unigene:
+    file: Bio/ClusterIO/unigene.pm
+    version: '1.006924'
+  Bio::CodonUsage::IO:
+    file: Bio/CodonUsage/IO.pm
+    version: '1.006924'
+  Bio::CodonUsage::Table:
+    file: Bio/CodonUsage/Table.pm
+    version: '1.006924'
+  Bio::Coordinate::Chain:
+    file: Bio/Coordinate/Chain.pm
+    version: '1.006924'
+  Bio::Coordinate::Collection:
+    file: Bio/Coordinate/Collection.pm
+    version: '1.006924'
+  Bio::Coordinate::ExtrapolatingPair:
+    file: Bio/Coordinate/ExtrapolatingPair.pm
+    version: '1.006924'
+  Bio::Coordinate::GeneMapper:
+    file: Bio/Coordinate/GeneMapper.pm
+    version: '1.006924'
+  Bio::Coordinate::Graph:
+    file: Bio/Coordinate/Graph.pm
+    version: '1.006924'
+  Bio::Coordinate::MapperI:
+    file: Bio/Coordinate/MapperI.pm
+    version: '1.006924'
+  Bio::Coordinate::Pair:
+    file: Bio/Coordinate/Pair.pm
+    version: '1.006924'
+  Bio::Coordinate::Result:
+    file: Bio/Coordinate/Result.pm
+    version: '1.006924'
+  Bio::Coordinate::Result::Gap:
+    file: Bio/Coordinate/Result/Gap.pm
+    version: '1.006924'
+  Bio::Coordinate::Result::Match:
+    file: Bio/Coordinate/Result/Match.pm
+    version: '1.006924'
+  Bio::Coordinate::ResultI:
+    file: Bio/Coordinate/ResultI.pm
+    version: '1.006924'
+  Bio::Coordinate::Utils:
+    file: Bio/Coordinate/Utils.pm
+    version: '1.006924'
+  Bio::DB::Ace:
+    file: Bio/DB/Ace.pm
+    version: '1.006924'
+  Bio::DB::BioFetch:
+    file: Bio/DB/BioFetch.pm
+    version: '1.006924'
+  Bio::DB::CUTG:
+    file: Bio/DB/CUTG.pm
+    version: '1.006924'
+  Bio::DB::DBFetch:
+    file: Bio/DB/DBFetch.pm
+    version: '1.006924'
+  Bio::DB::EMBL:
+    file: Bio/DB/EMBL.pm
+    version: '1.006924'
+  Bio::DB::EntrezGene:
+    file: Bio/DB/EntrezGene.pm
+    version: '1.006924'
+  Bio::DB::Expression:
+    file: Bio/DB/Expression.pm
+    version: '1.006924'
+  Bio::DB::Expression::geo:
+    file: Bio/DB/Expression/geo.pm
+    version: '1.006924'
+  Bio::DB::Failover:
+    file: Bio/DB/Failover.pm
+    version: '1.006924'
+  Bio::DB::Fasta:
+    file: Bio/DB/Fasta.pm
+    version: '1.006924'
+  Bio::DB::Fasta::Subdir:
+    file: Bio/DB/SeqFeature/Store/berkeleydb.pm
+    version: '1.006924'
+  Bio::DB::FileCache:
+    file: Bio/DB/FileCache.pm
+    version: '1.006924'
+  Bio::DB::Flat:
+    file: Bio/DB/Flat.pm
+    version: '1.006924'
+  Bio::DB::Flat::BDB:
+    file: Bio/DB/Flat/BDB.pm
+    version: '1.006924'
+  Bio::DB::Flat::BDB::embl:
+    file: Bio/DB/Flat/BDB/embl.pm
+    version: '1.006924'
+  Bio::DB::Flat::BDB::fasta:
+    file: Bio/DB/Flat/BDB/fasta.pm
+    version: '1.006924'
+  Bio::DB::Flat::BDB::genbank:
+    file: Bio/DB/Flat/BDB/genbank.pm
+    version: '1.006924'
+  Bio::DB::Flat::BDB::swiss:
+    file: Bio/DB/Flat/BDB/swiss.pm
+    version: '1.006924'
+  Bio::DB::Flat::BinarySearch:
+    file: Bio/DB/Flat/BinarySearch.pm
+    version: '1.006924'
+  Bio::DB::GFF:
+    file: Bio/DB/GFF.pm
+    version: '1.006924'
+  Bio::DB::GFF::Adaptor::ace:
+    file: Bio/DB/GFF/Adaptor/ace.pm
+    version: '1.006924'
+  Bio::DB::GFF::Adaptor::berkeleydb:
+    file: Bio/DB/GFF/Adaptor/berkeleydb.pm
+    version: '1.006924'
+  Bio::DB::GFF::Adaptor::berkeleydb::iterator:
+    file: Bio/DB/GFF/Adaptor/berkeleydb/iterator.pm
+    version: '1.006924'
+  Bio::DB::GFF::Adaptor::biofetch:
+    file: Bio/DB/GFF/Adaptor/biofetch.pm
+    version: '1.006924'
+  Bio::DB::GFF::Adaptor::biofetch_oracle:
+    file: Bio/DB/GFF/Adaptor/biofetch_oracle.pm
+    version: '1.006924'
+  Bio::DB::GFF::Adaptor::dbi:
+    file: Bio/DB/GFF/Adaptor/dbi.pm
+    version: '1.006924'
+  Bio::DB::GFF::Adaptor::dbi::caching_handle:
+    file: Bio/DB/GFF/Adaptor/dbi/caching_handle.pm
+    version: '1.006924'
+  Bio::DB::GFF::Adaptor::dbi::faux_dbh:
+    file: Bio/DB/GFF/Adaptor/dbi/caching_handle.pm
+    version: '1.006924'
+  Bio::DB::GFF::Adaptor::dbi::iterator:
+    file: Bio/DB/GFF/Adaptor/dbi/iterator.pm
+    version: '1.006924'
+  Bio::DB::GFF::Adaptor::dbi::mysql:
+    file: Bio/DB/GFF/Adaptor/dbi/mysql.pm
+    version: '1.006924'
+  Bio::DB::GFF::Adaptor::dbi::mysqlace:
+    file: Bio/DB/GFF/Adaptor/dbi/mysqlace.pm
+    version: '1.006924'
+  Bio::DB::GFF::Adaptor::dbi::mysqlcmap:
+    file: Bio/DB/GFF/Adaptor/dbi/mysqlcmap.pm
+    version: '1.006924'
+  Bio::DB::GFF::Adaptor::dbi::mysqlopt:
+    file: Bio/DB/GFF/Adaptor/dbi/mysqlopt.pm
+    version: '1.006924'
+  Bio::DB::GFF::Adaptor::dbi::oracle:
+    file: Bio/DB/GFF/Adaptor/dbi/oracle.pm
+    version: '1.006924'
+  Bio::DB::GFF::Adaptor::dbi::oracleace:
+    file: Bio/DB/GFF/Adaptor/dbi/oracleace.pm
+    version: '1.006924'
+  Bio::DB::GFF::Adaptor::dbi::pg:
+    file: Bio/DB/GFF/Adaptor/dbi/pg.pm
+    version: '1.006924'
+  Bio::DB::GFF::Adaptor::dbi::pg_fts:
+    file: Bio/DB/GFF/Adaptor/dbi/pg_fts.pm
+    version: '1.006924'
+  Bio::DB::GFF::Adaptor::memory:
+    file: Bio/DB/GFF/Adaptor/memory.pm
+    version: '1.006924'
+  Bio::DB::GFF::Adaptor::memory::feature_serializer:
+    file: Bio/DB/GFF/Adaptor/memory/feature_serializer.pm
+    version: '1.006924'
+  Bio::DB::GFF::Adaptor::memory::iterator:
+    file: Bio/DB/GFF/Adaptor/memory/iterator.pm
+    version: '1.006924'
+  Bio::DB::GFF::Aggregator:
+    file: Bio/DB/GFF/Aggregator.pm
+    version: '1.006924'
+  Bio::DB::GFF::Aggregator::alignment:
+    file: Bio/DB/GFF/Aggregator/alignment.pm
+    version: '1.006924'
+  Bio::DB::GFF::Aggregator::clone:
+    file: Bio/DB/GFF/Aggregator/clone.pm
+    version: '1.006924'
+  Bio::DB::GFF::Aggregator::coding:
+    file: Bio/DB/GFF/Aggregator/coding.pm
+    version: '1.006924'
+  Bio::DB::GFF::Aggregator::gene:
+    file: Bio/DB/GFF/Aggregator/gene.pm
+    version: '1.006924'
+  Bio::DB::GFF::Aggregator::match:
+    file: Bio/DB/GFF/Aggregator/match.pm
+    version: '1.006924'
+  Bio::DB::GFF::Aggregator::none:
+    file: Bio/DB/GFF/Aggregator/none.pm
+    version: '1.006924'
+  Bio::DB::GFF::Aggregator::orf:
+    file: Bio/DB/GFF/Aggregator/orf.pm
+    version: '1.006924'
+  Bio::DB::GFF::Aggregator::processed_transcript:
+    file: Bio/DB/GFF/Aggregator/processed_transcript.pm
+    version: '1.006924'
+  Bio::DB::GFF::Aggregator::so_transcript:
+    file: Bio/DB/GFF/Aggregator/so_transcript.pm
+    version: '1.006924'
+  Bio::DB::GFF::Aggregator::transcript:
+    file: Bio/DB/GFF/Aggregator/transcript.pm
+    version: '1.006924'
+  Bio::DB::GFF::Aggregator::ucsc_acembly:
+    file: Bio/DB/GFF/Aggregator/ucsc_acembly.pm
+    version: '1.006924'
+  Bio::DB::GFF::Aggregator::ucsc_ensgene:
+    file: Bio/DB/GFF/Aggregator/ucsc_ensgene.pm
+    version: '1.006924'
+  Bio::DB::GFF::Aggregator::ucsc_genscan:
+    file: Bio/DB/GFF/Aggregator/ucsc_genscan.pm
+    version: '1.006924'
+  Bio::DB::GFF::Aggregator::ucsc_refgene:
+    file: Bio/DB/GFF/Aggregator/ucsc_refgene.pm
+    version: '1.006924'
+  Bio::DB::GFF::Aggregator::ucsc_sanger22:
+    file: Bio/DB/GFF/Aggregator/ucsc_sanger22.pm
+    version: '1.006924'
+  Bio::DB::GFF::Aggregator::ucsc_sanger22pseudo:
+    file: Bio/DB/GFF/Aggregator/ucsc_sanger22pseudo.pm
+    version: '1.006924'
+  Bio::DB::GFF::Aggregator::ucsc_softberry:
+    file: Bio/DB/GFF/Aggregator/ucsc_softberry.pm
+    version: '1.006924'
+  Bio::DB::GFF::Aggregator::ucsc_twinscan:
+    file: Bio/DB/GFF/Aggregator/ucsc_twinscan.pm
+    version: '1.006924'
+  Bio::DB::GFF::Aggregator::ucsc_unigene:
+    file: Bio/DB/GFF/Aggregator/ucsc_unigene.pm
+    version: '1.006924'
+  Bio::DB::GFF::Featname:
+    file: Bio/DB/GFF/Featname.pm
+    version: '1.006924'
+  Bio::DB::GFF::Feature:
+    file: Bio/DB/GFF/Feature.pm
+    version: '1.006924'
+  Bio::DB::GFF::FeatureIterator:
+    file: Bio/DB/GFF.pm
+    version: '1.006924'
+  Bio::DB::GFF::Homol:
+    file: Bio/DB/GFF/Homol.pm
+    version: '1.006924'
+  Bio::DB::GFF::ID_Iterator:
+    file: Bio/DB/GFF.pm
+    version: '1.006924'
+  Bio::DB::GFF::RelSegment:
+    file: Bio/DB/GFF/RelSegment.pm
+    version: '1.006924'
+  Bio::DB::GFF::Segment:
+    file: Bio/DB/GFF/Segment.pm
+    version: '1.006924'
+  Bio::DB::GFF::Typename:
+    file: Bio/DB/GFF/Typename.pm
+    version: '1.006924'
+  Bio::DB::GFF::Util::Binning:
+    file: Bio/DB/GFF/Util/Binning.pm
+    version: '1.006924'
+  Bio::DB::GFF::Util::Rearrange:
+    file: Bio/DB/GFF/Util/Rearrange.pm
+    version: '1.006924'
+  Bio::DB::GenBank:
+    file: Bio/DB/GenBank.pm
+    version: '1.006924'
+  Bio::DB::GenPept:
+    file: Bio/DB/GenPept.pm
+    version: '1.006924'
+  Bio::DB::GenericWebAgent:
+    file: Bio/DB/GenericWebAgent.pm
+    version: '1.006924'
+  Bio::DB::HIV:
+    file: Bio/DB/HIV.pm
+    version: '1.006924'
+  Bio::DB::HIV::HIVAnnotProcessor:
+    file: Bio/DB/HIV/HIVAnnotProcessor.pm
+    version: '1.006924'
+  Bio::DB::HIV::HIVQueryHelper:
+    file: Bio/DB/HIV/HIVQueryHelper.pm
+    version: '1.006924'
+  Bio::DB::InMemoryCache:
+    file: Bio/DB/InMemoryCache.pm
+    version: '1.006924'
+  Bio::DB::Indexed::Stream:
+    file: Bio/DB/IndexedBase.pm
+    version: '1.006924'
+  Bio::DB::IndexedBase:
+    file: Bio/DB/IndexedBase.pm
+    version: '1.006924'
+  Bio::DB::LocationI:
+    file: Bio/DB/LocationI.pm
+    version: '1.006924'
+  Bio::DB::MeSH:
+    file: Bio/DB/MeSH.pm
+    version: '1.006924'
+  Bio::DB::NCBIHelper:
+    file: Bio/DB/NCBIHelper.pm
+    version: '1.006924'
+  Bio::DB::Qual:
+    file: Bio/DB/Qual.pm
+    version: '1.006924'
+  Bio::DB::Query::GenBank:
+    file: Bio/DB/Query/GenBank.pm
+    version: '1.006924'
+  Bio::DB::Query::HIVQuery:
+    file: Bio/DB/Query/HIVQuery.pm
+    version: '1.006924'
+  Bio::DB::Query::WebQuery:
+    file: Bio/DB/Query/WebQuery.pm
+    version: '1.006924'
+  Bio::DB::QueryI:
+    file: Bio/DB/QueryI.pm
+    version: '1.006924'
+  Bio::DB::RandomAccessI:
+    file: Bio/DB/RandomAccessI.pm
+    version: '1.006924'
+  Bio::DB::RefSeq:
+    file: Bio/DB/RefSeq.pm
+    version: '1.006924'
+  Bio::DB::ReferenceI:
+    file: Bio/DB/ReferenceI.pm
+    version: '1.006924'
+  Bio::DB::Registry:
+    file: Bio/DB/Registry.pm
+    version: '1.006924'
+  Bio::DB::SeqFeature:
+    file: Bio/DB/SeqFeature.pm
+    version: '1.006924'
+  Bio::DB::SeqFeature::NormalizedFeature:
+    file: Bio/DB/SeqFeature/NormalizedFeature.pm
+    version: '1.006924'
+  Bio::DB::SeqFeature::NormalizedFeatureI:
+    file: Bio/DB/SeqFeature/NormalizedFeatureI.pm
+    version: '1.006924'
+  Bio::DB::SeqFeature::NormalizedTableFeatureI:
+    file: Bio/DB/SeqFeature/NormalizedTableFeatureI.pm
+    version: '1.006924'
+  Bio::DB::SeqFeature::Segment:
+    file: Bio/DB/SeqFeature/Segment.pm
+    version: '1.006924'
+  Bio::DB::SeqFeature::Store:
+    file: Bio/DB/SeqFeature/Store.pm
+    version: '1.006924'
+  Bio::DB::SeqFeature::Store::DBI::Iterator:
+    file: Bio/DB/SeqFeature/Store/DBI/Iterator.pm
+    version: '1.006924'
+  Bio::DB::SeqFeature::Store::DBI::Pg:
+    file: Bio/DB/SeqFeature/Store/DBI/Pg.pm
+    version: '1.006924'
+  Bio::DB::SeqFeature::Store::DBI::SQLite:
+    file: Bio/DB/SeqFeature/Store/DBI/SQLite.pm
+    version: '1.006924'
+  Bio::DB::SeqFeature::Store::DBI::mysql:
+    file: Bio/DB/SeqFeature/Store/DBI/mysql.pm
+    version: '1.006924'
+  Bio::DB::SeqFeature::Store::FeatureFileLoader:
+    file: Bio/DB/SeqFeature/Store/FeatureFileLoader.pm
+    version: '1.006924'
+  Bio::DB::SeqFeature::Store::FeatureIterator:
+    file: Bio/DB/SeqFeature/Store.pm
+    version: '1.006924'
+  Bio::DB::SeqFeature::Store::GFF2Loader:
+    file: Bio/DB/SeqFeature/Store/GFF2Loader.pm
+    version: '1.006924'
+  Bio::DB::SeqFeature::Store::GFF3Loader:
+    file: Bio/DB/SeqFeature/Store/GFF3Loader.pm
+    version: '1.006924'
+  Bio::DB::SeqFeature::Store::LoadHelper:
+    file: Bio/DB/SeqFeature/Store/LoadHelper.pm
+    version: '1.006924'
+  Bio::DB::SeqFeature::Store::Loader:
+    file: Bio/DB/SeqFeature/Store/Loader.pm
+    version: '1.006924'
+  Bio::DB::SeqFeature::Store::bdb:
+    file: Bio/DB/SeqFeature/Store/bdb.pm
+    version: '1.006924'
+  Bio::DB::SeqFeature::Store::berkeleydb:
+    file: Bio/DB/SeqFeature/Store/berkeleydb.pm
+    version: '1.006924'
+  Bio::DB::SeqFeature::Store::berkeleydb3:
+    file: Bio/DB/SeqFeature/Store/berkeleydb3.pm
+    version: '1.006924'
+  Bio::DB::SeqFeature::Store::berkeleydb::Iterator:
+    file: Bio/DB/SeqFeature/Store/berkeleydb.pm
+    version: '1.006924'
+  Bio::DB::SeqFeature::Store::memory:
+    file: Bio/DB/SeqFeature/Store/memory.pm
+    version: '1.006924'
+  Bio::DB::SeqFeature::Store::memory::Iterator:
+    file: Bio/DB/SeqFeature/Store/memory.pm
+    version: '1.006924'
+  Bio::DB::SeqHound:
+    file: Bio/DB/SeqHound.pm
+    version: '1.006924'
+  Bio::DB::SeqI:
+    file: Bio/DB/SeqI.pm
+    version: '1.006924'
+  Bio::DB::SeqVersion:
+    file: Bio/DB/SeqVersion.pm
+    version: '1.006924'
+  Bio::DB::SeqVersion::gi:
+    file: Bio/DB/SeqVersion/gi.pm
+    version: '1.006924'
+  Bio::DB::SwissProt:
+    file: Bio/DB/SwissProt.pm
+    version: '1.006924'
+  Bio::DB::TFBS:
+    file: Bio/DB/TFBS.pm
+    version: '1.006924'
+  Bio::DB::TFBS::transfac_pro:
+    file: Bio/DB/TFBS/transfac_pro.pm
+    version: '1.006924'
+  Bio::DB::Taxonomy:
+    file: Bio/DB/Taxonomy.pm
+    version: '1.006924'
+  Bio::DB::Taxonomy::entrez:
+    file: Bio/DB/Taxonomy/entrez.pm
+    version: '1.006924'
+  Bio::DB::Taxonomy::flatfile:
+    file: Bio/DB/Taxonomy/flatfile.pm
+    version: '1.006924'
+  Bio::DB::Taxonomy::greengenes:
+    file: Bio/DB/Taxonomy/greengenes.pm
+    version: '1.006924'
+  Bio::DB::Taxonomy::list:
+    file: Bio/DB/Taxonomy/list.pm
+    version: '1.006924'
+  Bio::DB::Taxonomy::silva:
+    file: Bio/DB/Taxonomy/silva.pm
+    version: '1.006924'
+  Bio::DB::Universal:
+    file: Bio/DB/Universal.pm
+    version: '1.006924'
+  Bio::DB::UpdateableSeqI:
+    file: Bio/DB/UpdateableSeqI.pm
+    version: '1.006924'
+  Bio::DB::WebDBSeqI:
+    file: Bio/DB/WebDBSeqI.pm
+    version: '1.006924'
+  Bio::DBLinkContainerI:
+    file: Bio/DBLinkContainerI.pm
+    version: '1.006924'
+  Bio::Das::FeatureTypeI:
+    file: Bio/Das/FeatureTypeI.pm
+    version: '1.006924'
+  Bio::Das::SegmentI:
+    file: Bio/Das/SegmentI.pm
+    version: '1.006924'
+  Bio::DasI:
+    file: Bio/DasI.pm
+    version: '1.006924'
+  Bio::DescribableI:
+    file: Bio/DescribableI.pm
+    version: '1.006924'
+  Bio::Draw::Pictogram:
+    file: Bio/Draw/Pictogram.pm
+    version: '1.006924'
+  Bio::Event::EventGeneratorI:
+    file: Bio/Event/EventGeneratorI.pm
+    version: '1.006924'
+  Bio::Event::EventHandlerI:
+    file: Bio/Event/EventHandlerI.pm
+    version: '1.006924'
+  Bio::Factory::AnalysisI:
+    file: Bio/Factory/AnalysisI.pm
+    version: '1.006924'
+  Bio::Factory::ApplicationFactoryI:
+    file: Bio/Factory/ApplicationFactoryI.pm
+    version: '1.006924'
+  Bio::Factory::DriverFactory:
+    file: Bio/Factory/DriverFactory.pm
+    version: '1.006924'
+  Bio::Factory::FTLocationFactory:
+    file: Bio/Factory/FTLocationFactory.pm
+    version: '1.006924'
+  Bio::Factory::LocationFactoryI:
+    file: Bio/Factory/LocationFactoryI.pm
+    version: '1.006924'
+  Bio::Factory::MapFactoryI:
+    file: Bio/Factory/MapFactoryI.pm
+    version: '1.006924'
+  Bio::Factory::ObjectBuilderI:
+    file: Bio/Factory/ObjectBuilderI.pm
+    version: '1.006924'
+  Bio::Factory::ObjectFactory:
+    file: Bio/Factory/ObjectFactory.pm
+    version: '1.006924'
+  Bio::Factory::ObjectFactoryI:
+    file: Bio/Factory/ObjectFactoryI.pm
+    version: '1.006924'
+  Bio::Factory::SeqAnalysisParserFactory:
+    file: Bio/Factory/SeqAnalysisParserFactory.pm
+    version: '1.006924'
+  Bio::Factory::SeqAnalysisParserFactoryI:
+    file: Bio/Factory/SeqAnalysisParserFactoryI.pm
+    version: '1.006924'
+  Bio::Factory::SequenceFactoryI:
+    file: Bio/Factory/SequenceFactoryI.pm
+    version: '1.006924'
+  Bio::Factory::SequenceProcessorI:
+    file: Bio/Factory/SequenceProcessorI.pm
+    version: '1.006924'
+  Bio::Factory::SequenceStreamI:
+    file: Bio/Factory/SequenceStreamI.pm
+    version: '1.006924'
+  Bio::Factory::TreeFactoryI:
+    file: Bio/Factory/TreeFactoryI.pm
+    version: '1.006924'
+  Bio::FeatureHolderI:
+    file: Bio/FeatureHolderI.pm
+    version: '1.006924'
+  Bio::HandlerBaseI:
+    file: Bio/HandlerBaseI.pm
+    version: '1.006924'
+  Bio::IdCollectionI:
+    file: Bio/IdCollectionI.pm
+    version: '1.006924'
+  Bio::IdentifiableI:
+    file: Bio/IdentifiableI.pm
+    version: '1.006924'
+  Bio::Index::Abstract:
+    file: Bio/Index/Abstract.pm
+    version: '1.006924'
+  Bio::Index::AbstractSeq:
+    file: Bio/Index/AbstractSeq.pm
+    version: '1.006924'
+  Bio::Index::Blast:
+    file: Bio/Index/Blast.pm
+    version: '1.006924'
+  Bio::Index::BlastTable:
+    file: Bio/Index/BlastTable.pm
+    version: '1.006924'
+  Bio::Index::EMBL:
+    file: Bio/Index/EMBL.pm
+    version: '1.006924'
+  Bio::Index::Fasta:
+    file: Bio/Index/Fasta.pm
+    version: '1.006924'
+  Bio::Index::Fastq:
+    file: Bio/Index/Fastq.pm
+    version: '1.006924'
+  Bio::Index::GenBank:
+    file: Bio/Index/GenBank.pm
+    version: '1.006924'
+  Bio::Index::Hmmer:
+    file: Bio/Index/Hmmer.pm
+    version: '1.006924'
+  Bio::Index::Qual:
+    file: Bio/Index/Qual.pm
+    version: '1.006924'
+  Bio::Index::Stockholm:
+    file: Bio/Index/Stockholm.pm
+    version: '1.006924'
+  Bio::Index::SwissPfam:
+    file: Bio/Index/SwissPfam.pm
+    version: '1.006924'
+  Bio::Index::Swissprot:
+    file: Bio/Index/Swissprot.pm
+    version: '1.006924'
+  Bio::LiveSeq::AARange:
+    file: Bio/LiveSeq/AARange.pm
+    version: '1.006924'
+  Bio::LiveSeq::Chain:
+    file: Bio/LiveSeq/Chain.pm
+    version: '1.006924'
+  Bio::LiveSeq::ChainI:
+    file: Bio/LiveSeq/ChainI.pm
+    version: '1.006924'
+  Bio::LiveSeq::DNA:
+    file: Bio/LiveSeq/DNA.pm
+    version: '1.006924'
+  Bio::LiveSeq::Exon:
+    file: Bio/LiveSeq/Exon.pm
+    version: '1.006924'
+  Bio::LiveSeq::Gene:
+    file: Bio/LiveSeq/Gene.pm
+    version: '1.006924'
+  Bio::LiveSeq::IO::BioPerl:
+    file: Bio/LiveSeq/IO/BioPerl.pm
+    version: '1.006924'
+  Bio::LiveSeq::IO::Loader:
+    file: Bio/LiveSeq/IO/Loader.pm
+    version: '1.006924'
+  Bio::LiveSeq::Intron:
+    file: Bio/LiveSeq/Intron.pm
+    version: '1.006924'
+  Bio::LiveSeq::Mutation:
+    file: Bio/LiveSeq/Mutation.pm
+    version: '1.006924'
+  Bio::LiveSeq::Mutator:
+    file: Bio/LiveSeq/Mutator.pm
+    version: '1.006924'
+  Bio::LiveSeq::Prim_Transcript:
+    file: Bio/LiveSeq/Prim_Transcript.pm
+    version: '1.006924'
+  Bio::LiveSeq::Range:
+    file: Bio/LiveSeq/Range.pm
+    version: '1.006924'
+  Bio::LiveSeq::Repeat_Region:
+    file: Bio/LiveSeq/Repeat_Region.pm
+    version: '1.006924'
+  Bio::LiveSeq::Repeat_Unit:
+    file: Bio/LiveSeq/Repeat_Unit.pm
+    version: '1.006924'
+  Bio::LiveSeq::SeqI:
+    file: Bio/LiveSeq/SeqI.pm
+    version: '1.006924'
+  Bio::LiveSeq::Transcript:
+    file: Bio/LiveSeq/Transcript.pm
+    version: '1.006924'
+  Bio::LiveSeq::Translation:
+    file: Bio/LiveSeq/Translation.pm
+    version: '1.006924'
+  Bio::LocatableSeq:
+    file: Bio/Search/Tiling/MapTileUtils.pm
+    version: '1.006924'
+  Bio::Location::Atomic:
+    file: Bio/Location/Atomic.pm
+    version: '1.006924'
+  Bio::Location::AvWithinCoordPolicy:
+    file: Bio/Location/AvWithinCoordPolicy.pm
+    version: '1.006924'
+  Bio::Location::CoordinatePolicyI:
+    file: Bio/Location/CoordinatePolicyI.pm
+    version: '1.006924'
+  Bio::Location::Fuzzy:
+    file: Bio/Location/Fuzzy.pm
+    version: '1.006924'
+  Bio::Location::FuzzyLocationI:
+    file: Bio/Location/FuzzyLocationI.pm
+    version: '1.006924'
+  Bio::Location::NarrowestCoordPolicy:
+    file: Bio/Location/NarrowestCoordPolicy.pm
+    version: '1.006924'
+  Bio::Location::Simple:
+    file: Bio/Location/Simple.pm
+    version: '1.006924'
+  Bio::Location::Split:
+    file: Bio/Location/Split.pm
+    version: '1.006924'
+  Bio::Location::SplitLocationI:
+    file: Bio/Location/SplitLocationI.pm
+    version: '1.006924'
+  Bio::Location::WidestCoordPolicy:
+    file: Bio/Location/WidestCoordPolicy.pm
+    version: '1.006924'
+  Bio::LocationI:
+    file: Bio/LocationI.pm
+    version: '1.006924'
+  Bio::Map::Clone:
+    file: Bio/Map/Clone.pm
+    version: '1.006924'
+  Bio::Map::Contig:
+    file: Bio/Map/Contig.pm
+    version: '1.006924'
+  Bio::Map::CytoMap:
+    file: Bio/Map/CytoMap.pm
+    version: '1.006924'
+  Bio::Map::CytoMarker:
+    file: Bio/Map/CytoMarker.pm
+    version: '1.006924'
+  Bio::Map::CytoPosition:
+    file: Bio/Map/CytoPosition.pm
+    version: '1.006924'
+  Bio::Map::EntityI:
+    file: Bio/Map/EntityI.pm
+    version: '1.006924'
+  Bio::Map::FPCMarker:
+    file: Bio/Map/FPCMarker.pm
+    version: '1.006924'
+  Bio::Map::Gene:
+    file: Bio/Map/Gene.pm
+    version: '1.006924'
+  Bio::Map::GeneMap:
+    file: Bio/Map/GeneMap.pm
+    version: '1.006924'
+  Bio::Map::GenePosition:
+    file: Bio/Map/GenePosition.pm
+    version: '1.006924'
+  Bio::Map::GeneRelative:
+    file: Bio/Map/GeneRelative.pm
+    version: '1.006924'
+  Bio::Map::LinkageMap:
+    file: Bio/Map/LinkageMap.pm
+    version: '1.006924'
+  Bio::Map::LinkagePosition:
+    file: Bio/Map/LinkagePosition.pm
+    version: '1.006924'
+  Bio::Map::MapI:
+    file: Bio/Map/MapI.pm
+    version: '1.006924'
+  Bio::Map::Mappable:
+    file: Bio/Map/Mappable.pm
+    version: '1.006924'
+  Bio::Map::MappableI:
+    file: Bio/Map/MappableI.pm
+    version: '1.006924'
+  Bio::Map::Marker:
+    file: Bio/Map/Marker.pm
+    version: '1.006924'
+  Bio::Map::MarkerI:
+    file: Bio/Map/MarkerI.pm
+    version: '1.006924'
+  Bio::Map::Microsatellite:
+    file: Bio/Map/Microsatellite.pm
+    version: '1.006924'
+  Bio::Map::OrderedPosition:
+    file: Bio/Map/OrderedPosition.pm
+    version: '1.006924'
+  Bio::Map::OrderedPositionWithDistance:
+    file: Bio/Map/OrderedPositionWithDistance.pm
+    version: '1.006924'
+  Bio::Map::Physical:
+    file: Bio/Map/Physical.pm
+    version: '1.006924'
+  Bio::Map::Position:
+    file: Bio/Map/Position.pm
+    version: '1.006924'
+  Bio::Map::PositionHandler:
+    file: Bio/Map/PositionHandler.pm
+    version: '1.006924'
+  Bio::Map::PositionHandlerI:
+    file: Bio/Map/PositionHandlerI.pm
+    version: '1.006924'
+  Bio::Map::PositionI:
+    file: Bio/Map/PositionI.pm
+    version: '1.006924'
+  Bio::Map::PositionWithSequence:
+    file: Bio/Map/PositionWithSequence.pm
+    version: '1.006924'
+  Bio::Map::Prediction:
+    file: Bio/Map/Prediction.pm
+    version: '1.006924'
+  Bio::Map::Relative:
+    file: Bio/Map/Relative.pm
+    version: '1.006924'
+  Bio::Map::RelativeI:
+    file: Bio/Map/RelativeI.pm
+    version: '1.006924'
+  Bio::Map::SimpleMap:
+    file: Bio/Map/SimpleMap.pm
+    version: '1.006924'
+  Bio::Map::TranscriptionFactor:
+    file: Bio/Map/TranscriptionFactor.pm
+    version: '1.006924'
+  Bio::MapIO:
+    file: Bio/MapIO.pm
+    version: '1.006924'
+  Bio::MapIO::fpc:
+    file: Bio/MapIO/fpc.pm
+    version: '1.006924'
+  Bio::MapIO::mapmaker:
+    file: Bio/MapIO/mapmaker.pm
+    version: '1.006924'
+  Bio::Matrix::Generic:
+    file: Bio/Matrix/Generic.pm
+    version: '1.006924'
+  Bio::Matrix::IO:
+    file: Bio/Matrix/IO.pm
+    version: '1.006924'
+  Bio::Matrix::IO::mlagan:
+    file: Bio/Matrix/IO/mlagan.pm
+    version: '1.006924'
+  Bio::Matrix::IO::phylip:
+    file: Bio/Matrix/IO/phylip.pm
+    version: '1.006924'
+  Bio::Matrix::IO::scoring:
+    file: Bio/Matrix/IO/scoring.pm
+    version: '1.006924'
+  Bio::Matrix::MatrixI:
+    file: Bio/Matrix/MatrixI.pm
+    version: '1.006924'
+  Bio::Matrix::Mlagan:
+    file: Bio/Matrix/Mlagan.pm
+    version: '1.006924'
+  Bio::Matrix::PSM::IO:
+    file: Bio/Matrix/PSM/IO.pm
+    version: '1.006924'
+  Bio::Matrix::PSM::IO::mast:
+    file: Bio/Matrix/PSM/IO/mast.pm
+    version: '1.006924'
+  Bio::Matrix::PSM::IO::masta:
+    file: Bio/Matrix/PSM/IO/masta.pm
+    version: '1.006924'
+  Bio::Matrix::PSM::IO::meme:
+    file: Bio/Matrix/PSM/IO/meme.pm
+    version: '1.006924'
+  Bio::Matrix::PSM::IO::psiblast:
+    file: Bio/Matrix/PSM/IO/psiblast.pm
+    version: '1.006924'
+  Bio::Matrix::PSM::IO::transfac:
+    file: Bio/Matrix/PSM/IO/transfac.pm
+    version: '1.006924'
+  Bio::Matrix::PSM::InstanceSite:
+    file: Bio/Matrix/PSM/InstanceSite.pm
+    version: '1.006924'
+  Bio::Matrix::PSM::InstanceSiteI:
+    file: Bio/Matrix/PSM/InstanceSiteI.pm
+    version: '1.006924'
+  Bio::Matrix::PSM::ProtMatrix:
+    file: Bio/Matrix/PSM/ProtMatrix.pm
+    version: '1.006924'
+  Bio::Matrix::PSM::ProtPsm:
+    file: Bio/Matrix/PSM/ProtPsm.pm
+    version: '1.006924'
+  Bio::Matrix::PSM::Psm:
+    file: Bio/Matrix/PSM/Psm.pm
+    version: '1.006924'
+  Bio::Matrix::PSM::PsmHeader:
+    file: Bio/Matrix/PSM/PsmHeader.pm
+    version: '1.006924'
+  Bio::Matrix::PSM::PsmHeaderI:
+    file: Bio/Matrix/PSM/PsmHeaderI.pm
+    version: '1.006924'
+  Bio::Matrix::PSM::PsmI:
+    file: Bio/Matrix/PSM/PsmI.pm
+    version: '1.006924'
+  Bio::Matrix::PSM::SiteMatrix:
+    file: Bio/Matrix/PSM/SiteMatrix.pm
+    version: '1.006924'
+  Bio::Matrix::PSM::SiteMatrixI:
+    file: Bio/Matrix/PSM/SiteMatrixI.pm
+    version: '1.006924'
+  Bio::Matrix::PhylipDist:
+    file: Bio/Matrix/PhylipDist.pm
+    version: '1.006924'
+  Bio::Matrix::Scoring:
+    file: Bio/Matrix/Scoring.pm
+    version: '1.006924'
+  Bio::MolEvol::CodonModel:
+    file: Bio/MolEvol/CodonModel.pm
+    version: '1.006924'
+  Bio::Nexml::Factory:
+    file: Bio/Nexml/Factory.pm
+    version: '1.006924'
+  Bio::NexmlIO:
+    file: Bio/NexmlIO.pm
+    version: '1.006924'
+  Bio::Ontology::DocumentRegistry:
+    file: Bio/Ontology/DocumentRegistry.pm
+    version: '1.006924'
+  Bio::Ontology::GOterm:
+    file: Bio/Ontology/GOterm.pm
+    version: '1.006924'
+  Bio::Ontology::InterProTerm:
+    file: Bio/Ontology/InterProTerm.pm
+    version: '1.006924'
+  Bio::Ontology::OBOEngine:
+    file: Bio/Ontology/OBOEngine.pm
+    version: '1.006924'
+  Bio::Ontology::OBOterm:
+    file: Bio/Ontology/OBOterm.pm
+    version: '1.006924'
+  Bio::Ontology::Ontology:
+    file: Bio/Ontology/Ontology.pm
+    version: '1.006924'
+  Bio::Ontology::OntologyEngineI:
+    file: Bio/Ontology/OntologyEngineI.pm
+    version: '1.006924'
+  Bio::Ontology::OntologyI:
+    file: Bio/Ontology/OntologyI.pm
+    version: '1.006924'
+  Bio::Ontology::OntologyStore:
+    file: Bio/Ontology/OntologyStore.pm
+    version: '1.006924'
+  Bio::Ontology::Path:
+    file: Bio/Ontology/Path.pm
+    version: '1.006924'
+  Bio::Ontology::PathI:
+    file: Bio/Ontology/PathI.pm
+    version: '1.006924'
+  Bio::Ontology::Relationship:
+    file: Bio/Ontology/Relationship.pm
+    version: '1.006924'
+  Bio::Ontology::RelationshipFactory:
+    file: Bio/Ontology/RelationshipFactory.pm
+    version: '1.006924'
+  Bio::Ontology::RelationshipI:
+    file: Bio/Ontology/RelationshipI.pm
+    version: '1.006924'
+  Bio::Ontology::RelationshipType:
+    file: Bio/Ontology/RelationshipType.pm
+    version: '1.006924'
+  Bio::Ontology::SimpleGOEngine::GraphAdaptor:
+    file: Bio/Ontology/SimpleGOEngine/GraphAdaptor.pm
+    version: '1.006924'
+  Bio::Ontology::SimpleOntologyEngine:
+    file: Bio/Ontology/SimpleOntologyEngine.pm
+    version: '1.006924'
+  Bio::Ontology::Term:
+    file: Bio/Ontology/Term.pm
+    version: '1.006924'
+  Bio::Ontology::TermFactory:
+    file: Bio/Ontology/TermFactory.pm
+    version: '1.006924'
+  Bio::Ontology::TermI:
+    file: Bio/Ontology/TermI.pm
+    version: '1.006924'
+  Bio::OntologyIO:
+    file: Bio/OntologyIO.pm
+    version: '1.006924'
+  Bio::OntologyIO::Handlers::BaseSAXHandler:
+    file: Bio/OntologyIO/Handlers/BaseSAXHandler.pm
+    version: '1.006924'
+  Bio::OntologyIO::Handlers::InterProHandler:
+    file: Bio/OntologyIO/Handlers/InterProHandler.pm
+    version: '1.006924'
+  Bio::OntologyIO::Handlers::InterPro_BioSQL_Handler:
+    file: Bio/OntologyIO/Handlers/InterPro_BioSQL_Handler.pm
+    version: '1.006924'
+  Bio::OntologyIO::InterProParser:
+    file: Bio/OntologyIO/InterProParser.pm
+    version: '1.006924'
+  Bio::OntologyIO::dagflat:
+    file: Bio/OntologyIO/dagflat.pm
+    version: '1.006924'
+  Bio::OntologyIO::goflat:
+    file: Bio/OntologyIO/goflat.pm
+    version: '1.006924'
+  Bio::OntologyIO::obo:
+    file: Bio/OntologyIO/obo.pm
+    version: '1.006924'
+  Bio::OntologyIO::simplehierarchy:
+    file: Bio/OntologyIO/simplehierarchy.pm
+    version: '1.006924'
+  Bio::OntologyIO::soflat:
+    file: Bio/OntologyIO/soflat.pm
+    version: '1.006924'
+  Bio::ParameterBaseI:
+    file: Bio/ParameterBaseI.pm
+    version: '1.006924'
+  Bio::Perl:
+    file: Bio/Perl.pm
+    version: '1.006924'
+  Bio::Phenotype::Correlate:
+    file: Bio/Phenotype/Correlate.pm
+    version: '1.006924'
+  Bio::Phenotype::MeSH::Term:
+    file: Bio/Phenotype/MeSH/Term.pm
+    version: '1.006924'
+  Bio::Phenotype::MeSH::Twig:
+    file: Bio/Phenotype/MeSH/Twig.pm
+    version: '1.006924'
+  Bio::Phenotype::Measure:
+    file: Bio/Phenotype/Measure.pm
+    version: '1.006924'
+  Bio::Phenotype::OMIM::MiniMIMentry:
+    file: Bio/Phenotype/OMIM/MiniMIMentry.pm
+    version: '1.006924'
+  Bio::Phenotype::OMIM::OMIMentry:
+    file: Bio/Phenotype/OMIM/OMIMentry.pm
+    version: '1.006924'
+  Bio::Phenotype::OMIM::OMIMentryAllelicVariant:
+    file: Bio/Phenotype/OMIM/OMIMentryAllelicVariant.pm
+    version: '1.006924'
+  Bio::Phenotype::OMIM::OMIMparser:
+    file: Bio/Phenotype/OMIM/OMIMparser.pm
+    version: '1.006924'
+  Bio::Phenotype::Phenotype:
+    file: Bio/Phenotype/Phenotype.pm
+    version: '1.006924'
+  Bio::Phenotype::PhenotypeI:
+    file: Bio/Phenotype/PhenotypeI.pm
+    version: '1.006924'
+  Bio::PhyloNetwork:
+    file: Bio/PhyloNetwork.pm
+    version: '1.006924'
+  Bio::PhyloNetwork::Factory:
+    file: Bio/PhyloNetwork/Factory.pm
+    version: '1.006924'
+  Bio::PhyloNetwork::FactoryX:
+    file: Bio/PhyloNetwork/FactoryX.pm
+    version: '1.006924'
+  Bio::PhyloNetwork::GraphViz:
+    file: Bio/PhyloNetwork/GraphViz.pm
+    version: '1.006924'
+  Bio::PhyloNetwork::RandomFactory:
+    file: Bio/PhyloNetwork/RandomFactory.pm
+    version: '1.006924'
+  Bio::PhyloNetwork::TreeFactory:
+    file: Bio/PhyloNetwork/TreeFactory.pm
+    version: '1.006924'
+  Bio::PhyloNetwork::TreeFactoryMulti:
+    file: Bio/PhyloNetwork/TreeFactoryMulti.pm
+    version: '1.006924'
+  Bio::PhyloNetwork::TreeFactoryX:
+    file: Bio/PhyloNetwork/TreeFactoryX.pm
+    version: '1.006924'
+  Bio::PhyloNetwork::muVector:
+    file: Bio/PhyloNetwork/muVector.pm
+    version: '1.006924'
+  Bio::PopGen::Genotype:
+    file: Bio/PopGen/Genotype.pm
+    version: '1.006924'
+  Bio::PopGen::GenotypeI:
+    file: Bio/PopGen/GenotypeI.pm
+    version: '1.006924'
+  Bio::PopGen::HtSNP:
+    file: Bio/PopGen/HtSNP.pm
+    version: '1.006924'
+  Bio::PopGen::IO:
+    file: Bio/PopGen/IO.pm
+    version: '1.006924'
+  Bio::PopGen::IO::csv:
+    file: Bio/PopGen/IO/csv.pm
+    version: '1.006924'
+  Bio::PopGen::IO::hapmap:
+    file: Bio/PopGen/IO/hapmap.pm
+    version: '1.006924'
+  Bio::PopGen::IO::phase:
+    file: Bio/PopGen/IO/phase.pm
+    version: '1.006924'
+  Bio::PopGen::IO::prettybase:
+    file: Bio/PopGen/IO/prettybase.pm
+    version: '1.006924'
+  Bio::PopGen::Individual:
+    file: Bio/PopGen/Individual.pm
+    version: '1.006924'
+  Bio::PopGen::IndividualI:
+    file: Bio/PopGen/IndividualI.pm
+    version: '1.006924'
+  Bio::PopGen::Marker:
+    file: Bio/PopGen/Marker.pm
+    version: '1.006924'
+  Bio::PopGen::MarkerI:
+    file: Bio/PopGen/MarkerI.pm
+    version: '1.006924'
+  Bio::PopGen::PopStats:
+    file: Bio/PopGen/PopStats.pm
+    version: '1.006924'
+  Bio::PopGen::Population:
+    file: Bio/PopGen/Population.pm
+    version: '1.006924'
+  Bio::PopGen::PopulationI:
+    file: Bio/PopGen/PopulationI.pm
+    version: '1.006924'
+  Bio::PopGen::Simulation::Coalescent:
+    file: Bio/PopGen/Simulation/Coalescent.pm
+    version: '1.006924'
+  Bio::PopGen::Simulation::GeneticDrift:
+    file: Bio/PopGen/Simulation/GeneticDrift.pm
+    version: '1.006924'
+  Bio::PopGen::Statistics:
+    file: Bio/PopGen/Statistics.pm
+    version: '1.006924'
+  Bio::PopGen::TagHaplotype:
+    file: Bio/PopGen/TagHaplotype.pm
+    version: '1.006924'
+  Bio::PopGen::Utilities:
+    file: Bio/PopGen/Utilities.pm
+    version: '1.006924'
+  Bio::PrimarySeq:
+    file: Bio/PrimarySeq.pm
+    version: '1.006924'
+  Bio::PrimarySeq::Fasta:
+    file: Bio/DB/Fasta.pm
+    version: '1.006924'
+  Bio::PrimarySeqI:
+    file: Bio/PrimarySeqI.pm
+    version: '1.006924'
+  Bio::PullParserI:
+    file: Bio/PullParserI.pm
+    version: '1.006924'
+  Bio::Range:
+    file: Bio/Range.pm
+    version: '1.006924'
+  Bio::RangeI:
+    file: Bio/RangeI.pm
+    version: '1.006924'
+  Bio::Restriction::Analysis:
+    file: Bio/Restriction/Analysis.pm
+    version: '1.006924'
+  Bio::Restriction::Enzyme:
+    file: Bio/Restriction/Enzyme.pm
+    version: '1.006924'
+  Bio::Restriction::Enzyme::MultiCut:
+    file: Bio/Restriction/Enzyme/MultiCut.pm
+    version: '1.006924'
+  Bio::Restriction::Enzyme::MultiSite:
+    file: Bio/Restriction/Enzyme/MultiSite.pm
+    version: '1.006924'
+  Bio::Restriction::EnzymeCollection:
+    file: Bio/Restriction/EnzymeCollection.pm
+    version: '1.006924'
+  Bio::Restriction::EnzymeI:
+    file: Bio/Restriction/EnzymeI.pm
+    version: '1.006924'
+  Bio::Restriction::IO:
+    file: Bio/Restriction/IO.pm
+    version: '1.006924'
+  Bio::Restriction::IO::bairoch:
+    file: Bio/Restriction/IO/bairoch.pm
+    version: '1.006924'
+  Bio::Restriction::IO::base:
+    file: Bio/Restriction/IO/base.pm
+    version: '1.006924'
+  Bio::Restriction::IO::itype2:
+    file: Bio/Restriction/IO/itype2.pm
+    version: '1.006924'
+  Bio::Restriction::IO::prototype:
+    file: Bio/Restriction/IO/prototype.pm
+    version: '1.006924'
+  Bio::Restriction::IO::withrefm:
+    file: Bio/Restriction/IO/withrefm.pm
+    version: '1.006924'
+  Bio::Root::Build:
+    file: Bio/Root/Build.pm
+    version: '1.006924'
+  Bio::Root::Exception:
+    file: Bio/Root/Exception.pm
+    version: '1.006924'
+  Bio::Root::HTTPget:
+    file: Bio/Root/HTTPget.pm
+    version: '1.006924'
+  Bio::Root::IO:
+    file: Bio/Root/IO.pm
+    version: '1.006924'
+  Bio::Root::Root:
+    file: Bio/Root/Root.pm
+    version: '1.006924'
+  Bio::Root::RootI:
+    file: Bio/Root/RootI.pm
+    version: '1.006924'
+  Bio::Root::Storable:
+    file: Bio/Root/Storable.pm
+    version: '1.006924'
+  Bio::Root::Test:
+    file: Bio/Root/Test.pm
+    version: '1.006924'
+  Bio::Root::Utilities:
+    file: Bio/Root/Utilities.pm
+    version: '1.006924'
+  Bio::Root::Version:
+    file: Bio/Root/Version.pm
+    version: '1.006924'
+  Bio::Search::BlastStatistics:
+    file: Bio/Search/BlastStatistics.pm
+    version: '1.006924'
+  Bio::Search::BlastUtils:
+    file: Bio/Search/BlastUtils.pm
+    version: '1.006924'
+  Bio::Search::DatabaseI:
+    file: Bio/Search/DatabaseI.pm
+    version: '1.006924'
+  Bio::Search::GenericDatabase:
+    file: Bio/Search/GenericDatabase.pm
+    version: '1.006924'
+  Bio::Search::GenericStatistics:
+    file: Bio/Search/GenericStatistics.pm
+    version: '1.006924'
+  Bio::Search::HSP::BlastHSP:
+    file: Bio/Search/HSP/BlastHSP.pm
+    version: '1.006924'
+  Bio::Search::HSP::BlastPullHSP:
+    file: Bio/Search/HSP/BlastPullHSP.pm
+    version: '1.006924'
+  Bio::Search::HSP::FastaHSP:
+    file: Bio/Search/HSP/FastaHSP.pm
+    version: '1.006924'
+  Bio::Search::HSP::GenericHSP:
+    file: Bio/Search/HSP/GenericHSP.pm
+    version: '1.006924'
+  Bio::Search::HSP::HMMERHSP:
+    file: Bio/Search/HSP/HMMERHSP.pm
+    version: '1.006924'
+  Bio::Search::HSP::HSPFactory:
+    file: Bio/Search/HSP/HSPFactory.pm
+    version: '1.006924'
+  Bio::Search::HSP::HSPI:
+    file: Bio/Search/Tiling/MapTileUtils.pm
+    version: '1.006924'
+  Bio::Search::HSP::HmmpfamHSP:
+    file: Bio/Search/HSP/HmmpfamHSP.pm
+    version: '1.006924'
+  Bio::Search::HSP::ModelHSP:
+    file: Bio/Search/HSP/ModelHSP.pm
+    version: '1.006924'
+  Bio::Search::HSP::PSLHSP:
+    file: Bio/Search/HSP/PSLHSP.pm
+    version: '1.006924'
+  Bio::Search::HSP::PsiBlastHSP:
+    file: Bio/Search/HSP/PsiBlastHSP.pm
+    version: '1.006924'
+  Bio::Search::HSP::PullHSPI:
+    file: Bio/Search/HSP/PullHSPI.pm
+    version: '1.006924'
+  Bio::Search::HSP::WABAHSP:
+    file: Bio/Search/HSP/WABAHSP.pm
+    version: '1.006924'
+  Bio::Search::Hit::BlastHit:
+    file: Bio/Search/Hit/BlastHit.pm
+    version: '1.006924'
+  Bio::Search::Hit::BlastPullHit:
+    file: Bio/Search/Hit/BlastPullHit.pm
+    version: '1.006924'
+  Bio::Search::Hit::Fasta:
+    file: Bio/Search/Hit/Fasta.pm
+    version: '1.006924'
+  Bio::Search::Hit::GenericHit:
+    file: Bio/Search/Hit/GenericHit.pm
+    version: '1.006924'
+  Bio::Search::Hit::HMMERHit:
+    file: Bio/Search/Hit/HMMERHit.pm
+    version: '1.006924'
+  Bio::Search::Hit::HitFactory:
+    file: Bio/Search/Hit/HitFactory.pm
+    version: '1.006924'
+  Bio::Search::Hit::HitI:
+    file: Bio/Search/Hit/HitI.pm
+    version: '1.006924'
+  Bio::Search::Hit::HmmpfamHit:
+    file: Bio/Search/Hit/HmmpfamHit.pm
+    version: '1.006924'
+  Bio::Search::Hit::ModelHit:
+    file: Bio/Search/Hit/ModelHit.pm
+    version: '1.006924'
+  Bio::Search::Hit::PsiBlastHit:
+    file: Bio/Search/Hit/PsiBlastHit.pm
+    version: '1.006924'
+  Bio::Search::Hit::PullHitI:
+    file: Bio/Search/Hit/PullHitI.pm
+    version: '1.006924'
+  Bio::Search::Hit::hmmer3Hit:
+    file: Bio/Search/Hit/hmmer3Hit.pm
+    version: '1.006924'
+  Bio::Search::Iteration::GenericIteration:
+    file: Bio/Search/Iteration/GenericIteration.pm
+    version: '1.006924'
+  Bio::Search::Iteration::IterationI:
+    file: Bio/Search/Iteration/IterationI.pm
+    version: '1.006924'
+  Bio::Search::Processor:
+    file: Bio/Search/Processor.pm
+    version: '1.006924'
+  Bio::Search::Result::BlastPullResult:
+    file: Bio/Search/Result/BlastPullResult.pm
+    version: '1.006924'
+  Bio::Search::Result::BlastResult:
+    file: Bio/Search/Result/BlastResult.pm
+    version: '1.006924'
+  Bio::Search::Result::CrossMatchResult:
+    file: Bio/Search/Result/CrossMatchResult.pm
+    version: '1.006924'
+  Bio::Search::Result::GenericResult:
+    file: Bio/Search/Result/GenericResult.pm
+    version: '1.006924'
+  Bio::Search::Result::HMMERResult:
+    file: Bio/Search/Result/HMMERResult.pm
+    version: '1.006924'
+  Bio::Search::Result::HmmpfamResult:
+    file: Bio/Search/Result/HmmpfamResult.pm
+    version: '1.006924'
+  Bio::Search::Result::PullResultI:
+    file: Bio/Search/Result/PullResultI.pm
+    version: '1.006924'
+  Bio::Search::Result::ResultFactory:
+    file: Bio/Search/Result/ResultFactory.pm
+    version: '1.006924'
+  Bio::Search::Result::ResultI:
+    file: Bio/Search/Result/ResultI.pm
+    version: '1.006924'
+  Bio::Search::Result::WABAResult:
+    file: Bio/Search/Result/WABAResult.pm
+    version: '1.006924'
+  Bio::Search::Result::hmmer3Result:
+    file: Bio/Search/Result/hmmer3Result.pm
+    version: '1.006924'
+  Bio::Search::SearchUtils:
+    file: Bio/Search/SearchUtils.pm
+    version: '1.006924'
+  Bio::Search::StatisticsI:
+    file: Bio/Search/StatisticsI.pm
+    version: '1.006924'
+  Bio::Search::Tiling::MapTileUtils:
+    file: Bio/Search/Tiling/MapTileUtils.pm
+    version: '1.006924'
+  Bio::Search::Tiling::MapTiling:
+    file: Bio/Search/Tiling/MapTiling.pm
+    version: '1.006924'
+  Bio::Search::Tiling::TilingI:
+    file: Bio/Search/Tiling/TilingI.pm
+    version: '1.006924'
+  Bio::SearchDist:
+    file: Bio/SearchDist.pm
+    version: '1.006924'
+  Bio::SearchIO:
+    file: Bio/SearchIO.pm
+    version: '1.006924'
+  Bio::SearchIO::EventHandlerI:
+    file: Bio/SearchIO/EventHandlerI.pm
+    version: '1.006924'
+  Bio::SearchIO::FastHitEventBuilder:
+    file: Bio/SearchIO/FastHitEventBuilder.pm
+    version: '1.006924'
+  Bio::SearchIO::IteratedSearchResultEventBuilder:
+    file: Bio/SearchIO/IteratedSearchResultEventBuilder.pm
+    version: '1.006924'
+  Bio::SearchIO::SearchResultEventBuilder:
+    file: Bio/SearchIO/SearchResultEventBuilder.pm
+    version: '1.006924'
+  Bio::SearchIO::SearchWriterI:
+    file: Bio/SearchIO/SearchWriterI.pm
+    version: '1.006924'
+  Bio::SearchIO::Writer::BSMLResultWriter:
+    file: Bio/SearchIO/Writer/BSMLResultWriter.pm
+    version: '1.006924'
+  Bio::SearchIO::Writer::GbrowseGFF:
+    file: Bio/SearchIO/Writer/GbrowseGFF.pm
+    version: '1.006924'
+  Bio::SearchIO::Writer::HSPTableWriter:
+    file: Bio/SearchIO/Writer/HSPTableWriter.pm
+    version: '1.006924'
+  Bio::SearchIO::Writer::HTMLResultWriter:
+    file: Bio/SearchIO/Writer/HTMLResultWriter.pm
+    version: '1.006924'
+  Bio::SearchIO::Writer::HitTableWriter:
+    file: Bio/SearchIO/Writer/HitTableWriter.pm
+    version: '1.006924'
+  Bio::SearchIO::Writer::ResultTableWriter:
+    file: Bio/SearchIO/Writer/ResultTableWriter.pm
+    version: '1.006924'
+  Bio::SearchIO::Writer::TextResultWriter:
+    file: Bio/SearchIO/Writer/TextResultWriter.pm
+    version: '1.006924'
+  Bio::SearchIO::XML::BlastHandler:
+    file: Bio/SearchIO/XML/BlastHandler.pm
+    version: '1.006924'
+  Bio::SearchIO::XML::PsiBlastHandler:
+    file: Bio/SearchIO/XML/PsiBlastHandler.pm
+    version: '1.006924'
+  Bio::SearchIO::axt:
+    file: Bio/SearchIO/axt.pm
+    version: '1.006924'
+  Bio::SearchIO::blast:
+    file: Bio/SearchIO/blast.pm
+    version: '1.006924'
+  Bio::SearchIO::blast_pull:
+    file: Bio/SearchIO/blast_pull.pm
+    version: '1.006924'
+  Bio::SearchIO::blasttable:
+    file: Bio/SearchIO/blasttable.pm
+    version: '1.006924'
+  Bio::SearchIO::blastxml:
+    file: Bio/SearchIO/blastxml.pm
+    version: '1.006924'
+  Bio::SearchIO::cross_match:
+    file: Bio/SearchIO/cross_match.pm
+    version: '1.006924'
+  Bio::SearchIO::erpin:
+    file: Bio/SearchIO/erpin.pm
+    version: '1.006924'
+  Bio::SearchIO::exonerate:
+    file: Bio/SearchIO/exonerate.pm
+    version: '1.006924'
+  Bio::SearchIO::fasta:
+    file: Bio/SearchIO/fasta.pm
+    version: '1.006924'
+  Bio::SearchIO::gmap_f9:
+    file: Bio/SearchIO/gmap_f9.pm
+    version: '1.006924'
+  Bio::SearchIO::hmmer:
+    file: Bio/SearchIO/hmmer.pm
+    version: '1.006924'
+  Bio::SearchIO::hmmer2:
+    file: Bio/SearchIO/hmmer2.pm
+    version: '1.006924'
+  Bio::SearchIO::hmmer3:
+    file: Bio/SearchIO/hmmer3.pm
+    version: '1.006924'
+  Bio::SearchIO::hmmer_pull:
+    file: Bio/SearchIO/hmmer_pull.pm
+    version: '1.006924'
+  Bio::SearchIO::infernal:
+    file: Bio/SearchIO/infernal.pm
+    version: '1.006924'
+  Bio::SearchIO::megablast:
+    file: Bio/SearchIO/megablast.pm
+    version: '1.006924'
+  Bio::SearchIO::psl:
+    file: Bio/SearchIO/psl.pm
+    version: '1.006924'
+  Bio::SearchIO::rnamotif:
+    file: Bio/SearchIO/rnamotif.pm
+    version: '1.006924'
+  Bio::SearchIO::sim4:
+    file: Bio/SearchIO/sim4.pm
+    version: '1.006924'
+  Bio::SearchIO::waba:
+    file: Bio/SearchIO/waba.pm
+    version: '1.006924'
+  Bio::SearchIO::wise:
+    file: Bio/SearchIO/wise.pm
+    version: '1.006924'
+  Bio::Seq:
+    file: Bio/Seq.pm
+    version: '1.006924'
+  Bio::Seq::BaseSeqProcessor:
+    file: Bio/Seq/BaseSeqProcessor.pm
+    version: '1.006924'
+  Bio::Seq::EncodedSeq:
+    file: Bio/Seq/EncodedSeq.pm
+    version: '1.006924'
+  Bio::Seq::LargeLocatableSeq:
+    file: Bio/Seq/LargeLocatableSeq.pm
+    version: '1.006924'
+  Bio::Seq::LargePrimarySeq:
+    file: Bio/Seq/LargePrimarySeq.pm
+    version: '1.006924'
+  Bio::Seq::LargeSeq:
+    file: Bio/Seq/LargeSeq.pm
+    version: '1.006924'
+  Bio::Seq::LargeSeqI:
+    file: Bio/Seq/LargeSeqI.pm
+    version: '1.006924'
+  Bio::Seq::Meta:
+    file: Bio/Seq/Meta.pm
+    version: '1.006924'
+  Bio::Seq::Meta::Array:
+    file: Bio/Seq/Meta/Array.pm
+    version: '1.006924'
+  Bio::Seq::MetaI:
+    file: Bio/Seq/MetaI.pm
+    version: '1.006924'
+  Bio::Seq::PrimaryQual:
+    file: Bio/Seq/PrimaryQual.pm
+    version: '1.006924'
+  Bio::Seq::PrimaryQual::Qual:
+    file: Bio/DB/Qual.pm
+    version: '1.006924'
+  Bio::Seq::PrimedSeq:
+    file: Bio/Seq/PrimedSeq.pm
+    version: '1.006924'
+  Bio::Seq::QualI:
+    file: Bio/Seq/QualI.pm
+    version: '1.006924'
+  Bio::Seq::Quality:
+    file: Bio/Seq/Quality.pm
+    version: '1.006924'
+  Bio::Seq::RichSeq:
+    file: Bio/Seq/RichSeq.pm
+    version: '1.006924'
+  Bio::Seq::RichSeqI:
+    file: Bio/Seq/RichSeqI.pm
+    version: '1.006924'
+  Bio::Seq::SeqBuilder:
+    file: Bio/Seq/SeqBuilder.pm
+    version: '1.006924'
+  Bio::Seq::SeqFactory:
+    file: Bio/Seq/SeqFactory.pm
+    version: '1.006924'
+  Bio::Seq::SeqFastaSpeedFactory:
+    file: Bio/Seq/SeqFastaSpeedFactory.pm
+    version: '1.006924'
+  Bio::Seq::SeqWithQuality:
+    file: Bio/Seq/SeqWithQuality.pm
+    version: '1.006924'
+  Bio::Seq::SequenceTrace:
+    file: Bio/Seq/SequenceTrace.pm
+    version: '1.006924'
+  Bio::Seq::SimulatedRead:
+    file: Bio/Seq/SimulatedRead.pm
+    version: '1.006924'
+  Bio::Seq::TraceI:
+    file: Bio/Seq/TraceI.pm
+    version: '1.006924'
+  Bio::SeqAnalysisParserI:
+    file: Bio/SeqAnalysisParserI.pm
+    version: '1.006924'
+  Bio::SeqEvolution::DNAPoint:
+    file: Bio/SeqEvolution/DNAPoint.pm
+    version: '1.006924'
+  Bio::SeqEvolution::EvolutionI:
+    file: Bio/SeqEvolution/EvolutionI.pm
+    version: '1.006924'
+  Bio::SeqEvolution::Factory:
+    file: Bio/SeqEvolution/Factory.pm
+    version: '1.006924'
+  Bio::SeqFeature::Amplicon:
+    file: Bio/SeqFeature/Amplicon.pm
+    version: '1.006924'
+  Bio::SeqFeature::AnnotationAdaptor:
+    file: Bio/SeqFeature/AnnotationAdaptor.pm
+    version: '1.006924'
+  Bio::SeqFeature::Collection:
+    file: Bio/SeqFeature/Collection.pm
+    version: '1.006924'
+  Bio::SeqFeature::CollectionI:
+    file: Bio/SeqFeature/CollectionI.pm
+    version: '1.006924'
+  Bio::SeqFeature::Computation:
+    file: Bio/SeqFeature/Computation.pm
+    version: '1.006924'
+  Bio::SeqFeature::FeaturePair:
+    file: Bio/SeqFeature/FeaturePair.pm
+    version: '1.006924'
+  Bio::SeqFeature::Gene::Exon:
+    file: Bio/SeqFeature/Gene/Exon.pm
+    version: '1.006924'
+  Bio::SeqFeature::Gene::ExonI:
+    file: Bio/SeqFeature/Gene/ExonI.pm
+    version: '1.006924'
+  Bio::SeqFeature::Gene::GeneStructure:
+    file: Bio/SeqFeature/Gene/GeneStructure.pm
+    version: '1.006924'
+  Bio::SeqFeature::Gene::GeneStructureI:
+    file: Bio/SeqFeature/Gene/GeneStructureI.pm
+    version: '1.006924'
+  Bio::SeqFeature::Gene::Intron:
+    file: Bio/SeqFeature/Gene/Intron.pm
+    version: '1.006924'
+  Bio::SeqFeature::Gene::NC_Feature:
+    file: Bio/SeqFeature/Gene/NC_Feature.pm
+    version: '1.006924'
+  Bio::SeqFeature::Gene::Poly_A_site:
+    file: Bio/SeqFeature/Gene/Poly_A_site.pm
+    version: '1.006924'
+  Bio::SeqFeature::Gene::Promoter:
+    file: Bio/SeqFeature/Gene/Promoter.pm
+    version: '1.006924'
+  Bio::SeqFeature::Gene::Transcript:
+    file: Bio/SeqFeature/Gene/Transcript.pm
+    version: '1.006924'
+  Bio::SeqFeature::Gene::TranscriptI:
+    file: Bio/SeqFeature/Gene/TranscriptI.pm
+    version: '1.006924'
+  Bio::SeqFeature::Gene::UTR:
+    file: Bio/SeqFeature/Gene/UTR.pm
+    version: '1.006924'
+  Bio::SeqFeature::Generic:
+    file: Bio/SeqFeature/Generic.pm
+    version: '1.006924'
+  Bio::SeqFeature::Lite:
+    file: Bio/SeqFeature/Lite.pm
+    version: '1.006924'
+  Bio::SeqFeature::PositionProxy:
+    file: Bio/SeqFeature/PositionProxy.pm
+    version: '1.006924'
+  Bio::SeqFeature::Primer:
+    file: Bio/SeqFeature/Primer.pm
+    version: '1.006924'
+  Bio::SeqFeature::SiRNA::Oligo:
+    file: Bio/SeqFeature/SiRNA/Oligo.pm
+    version: '1.006924'
+  Bio::SeqFeature::SiRNA::Pair:
+    file: Bio/SeqFeature/SiRNA/Pair.pm
+    version: '1.006924'
+  Bio::SeqFeature::Similarity:
+    file: Bio/SeqFeature/Similarity.pm
+    version: '1.006924'
+  Bio::SeqFeature::SimilarityPair:
+    file: Bio/SeqFeature/SimilarityPair.pm
+    version: '1.006924'
+  Bio::SeqFeature::SubSeq:
+    file: Bio/SeqFeature/SubSeq.pm
+    version: '1.006924'
+  Bio::SeqFeature::Tools::FeatureNamer:
+    file: Bio/SeqFeature/Tools/FeatureNamer.pm
+    version: '1.006924'
+  Bio::SeqFeature::Tools::IDHandler:
+    file: Bio/SeqFeature/Tools/IDHandler.pm
+    version: '1.006924'
+  Bio::SeqFeature::Tools::TypeMapper:
+    file: Bio/SeqFeature/Tools/TypeMapper.pm
+    version: '1.006924'
+  Bio::SeqFeature::Tools::Unflattener:
+    file: Bio/SeqFeature/Tools/Unflattener.pm
+    version: '1.006924'
+  Bio::SeqFeature::TypedSeqFeatureI:
+    file: Bio/SeqFeature/TypedSeqFeatureI.pm
+    version: '1.006924'
+  Bio::SeqFeatureI:
+    file: Bio/SeqFeatureI.pm
+    version: '1.006924'
+  Bio::SeqI:
+    file: Bio/SeqI.pm
+    version: '1.006924'
+  Bio::SeqIO:
+    file: Bio/SeqIO.pm
+    version: '1.006924'
+  Bio::SeqIO::FTHelper:
+    file: Bio/SeqIO/FTHelper.pm
+    version: '1.006924'
+  Bio::SeqIO::Handler::GenericRichSeqHandler:
+    file: Bio/SeqIO/Handler/GenericRichSeqHandler.pm
+    version: '1.006924'
+  Bio::SeqIO::MultiFile:
+    file: Bio/SeqIO/MultiFile.pm
+    version: '1.006924'
+  Bio::SeqIO::abi:
+    file: Bio/SeqIO/abi.pm
+    version: '1.006924'
+  Bio::SeqIO::ace:
+    file: Bio/SeqIO/ace.pm
+    version: '1.006924'
+  Bio::SeqIO::agave:
+    file: Bio/SeqIO/agave.pm
+    version: '1.006924'
+  Bio::SeqIO::alf:
+    file: Bio/SeqIO/alf.pm
+    version: '1.006924'
+  Bio::SeqIO::asciitree:
+    file: Bio/SeqIO/asciitree.pm
+    version: '1.006924'
+  Bio::SeqIO::bsml:
+    file: Bio/SeqIO/bsml.pm
+    version: '1.006924'
+  Bio::SeqIO::bsml_sax:
+    file: Bio/SeqIO/bsml_sax.pm
+    version: '1.006924'
+  Bio::SeqIO::chadoxml:
+    file: Bio/SeqIO/chadoxml.pm
+    version: '1.006924'
+  Bio::SeqIO::chaos:
+    file: Bio/SeqIO/chaos.pm
+    version: '1.006924'
+  Bio::SeqIO::chaosxml:
+    file: Bio/SeqIO/chaosxml.pm
+    version: '1.006924'
+  Bio::SeqIO::ctf:
+    file: Bio/SeqIO/ctf.pm
+    version: '1.006924'
+  Bio::SeqIO::embl:
+    file: Bio/SeqIO/embl.pm
+    version: '1.006924'
+  Bio::SeqIO::embldriver:
+    file: Bio/SeqIO/embldriver.pm
+    version: '1.006924'
+  Bio::SeqIO::entrezgene:
+    file: Bio/SeqIO/entrezgene.pm
+    version: '1.006924'
+  Bio::SeqIO::excel:
+    file: Bio/SeqIO/excel.pm
+    version: '1.006924'
+  Bio::SeqIO::exp:
+    file: Bio/SeqIO/exp.pm
+    version: '1.006924'
+  Bio::SeqIO::fasta:
+    file: Bio/SeqIO/fasta.pm
+    version: '1.006924'
+  Bio::SeqIO::fastq:
+    file: Bio/SeqIO/fastq.pm
+    version: '1.006924'
+  Bio::SeqIO::flybase_chadoxml:
+    file: Bio/SeqIO/flybase_chadoxml.pm
+    version: '1.006924'
+  Bio::SeqIO::game:
+    file: Bio/SeqIO/game.pm
+    version: '1.006924'
+  Bio::SeqIO::game::featHandler:
+    file: Bio/SeqIO/game/featHandler.pm
+    version: '1.006924'
+  Bio::SeqIO::game::gameHandler:
+    file: Bio/SeqIO/game/gameHandler.pm
+    version: '1.006924'
+  Bio::SeqIO::game::gameSubs:
+    file: Bio/SeqIO/game/gameSubs.pm
+    version: '1.006924'
+  Bio::SeqIO::game::gameWriter:
+    file: Bio/SeqIO/game/gameWriter.pm
+    version: '1.006924'
+  Bio::SeqIO::game::seqHandler:
+    file: Bio/SeqIO/game/seqHandler.pm
+    version: '1.006924'
+  Bio::SeqIO::gbdriver:
+    file: Bio/SeqIO/gbdriver.pm
+    version: '1.006924'
+  Bio::SeqIO::gbxml:
+    file: Bio/SeqIO/gbxml.pm
+    version: '1.006924'
+  Bio::SeqIO::gcg:
+    file: Bio/SeqIO/gcg.pm
+    version: '1.006924'
+  Bio::SeqIO::genbank:
+    file: Bio/SeqIO/genbank.pm
+    version: '1.006924'
+  Bio::SeqIO::interpro:
+    file: Bio/SeqIO/interpro.pm
+    version: '1.006924'
+  Bio::SeqIO::kegg:
+    file: Bio/SeqIO/kegg.pm
+    version: '1.006924'
+  Bio::SeqIO::largefasta:
+    file: Bio/SeqIO/largefasta.pm
+    version: '1.006924'
+  Bio::SeqIO::lasergene:
+    file: Bio/SeqIO/lasergene.pm
+    version: '1.006924'
+  Bio::SeqIO::locuslink:
+    file: Bio/SeqIO/locuslink.pm
+    version: '1.006924'
+  Bio::SeqIO::mbsout:
+    file: Bio/SeqIO/mbsout.pm
+    version: '1.006924'
+  Bio::SeqIO::metafasta:
+    file: Bio/SeqIO/metafasta.pm
+    version: '1.006924'
+  Bio::SeqIO::msout:
+    file: Bio/SeqIO/msout.pm
+    version: '1.006924'
+  Bio::SeqIO::nexml:
+    file: Bio/SeqIO/nexml.pm
+    version: '1.006924'
+  Bio::SeqIO::phd:
+    file: Bio/SeqIO/phd.pm
+    version: '1.006924'
+  Bio::SeqIO::pir:
+    file: Bio/SeqIO/pir.pm
+    version: '1.006924'
+  Bio::SeqIO::pln:
+    file: Bio/SeqIO/pln.pm
+    version: '1.006924'
+  Bio::SeqIO::qual:
+    file: Bio/SeqIO/qual.pm
+    version: '1.006924'
+  Bio::SeqIO::raw:
+    file: Bio/SeqIO/raw.pm
+    version: '1.006924'
+  Bio::SeqIO::scf:
+    file: Bio/SeqIO/scf.pm
+    version: '1.006924'
+  Bio::SeqIO::seqxml:
+    file: Bio/SeqIO/seqxml.pm
+    version: '1.006924'
+  Bio::SeqIO::strider:
+    file: Bio/SeqIO/strider.pm
+    version: '1.006924'
+  Bio::SeqIO::swiss:
+    file: Bio/SeqIO/swiss.pm
+    version: '1.006924'
+  Bio::SeqIO::swissdriver:
+    file: Bio/SeqIO/swissdriver.pm
+    version: '1.006924'
+  Bio::SeqIO::tab:
+    file: Bio/SeqIO/tab.pm
+    version: '1.006924'
+  Bio::SeqIO::table:
+    file: Bio/SeqIO/table.pm
+    version: '1.006924'
+  Bio::SeqIO::tigr:
+    file: Bio/SeqIO/tigr.pm
+    version: '1.006924'
+  Bio::SeqIO::tigrxml:
+    file: Bio/SeqIO/tigrxml.pm
+    version: '1.006924'
+  Bio::SeqIO::tinyseq:
+    file: Bio/SeqIO/tinyseq.pm
+    version: '1.006924'
+  Bio::SeqIO::tinyseq::tinyseqHandler:
+    file: Bio/SeqIO/tinyseq/tinyseqHandler.pm
+    version: '1.006924'
+  Bio::SeqIO::ztr:
+    file: Bio/SeqIO/ztr.pm
+    version: '1.006924'
+  Bio::SeqUtils:
+    file: Bio/SeqUtils.pm
+    version: '1.006924'
+  Bio::SimpleAlign:
+    file: Bio/SimpleAlign.pm
+    version: '1.006924'
+  Bio::SimpleAnalysisI:
+    file: Bio/SimpleAnalysisI.pm
+    version: '1.006924'
+  Bio::Species:
+    file: Bio/Species.pm
+    version: '1.006924'
+  Bio::Structure::Atom:
+    file: Bio/Structure/Atom.pm
+    version: '1.006924'
+  Bio::Structure::Chain:
+    file: Bio/Structure/Chain.pm
+    version: '1.006924'
+  Bio::Structure::Entry:
+    file: Bio/Structure/Entry.pm
+    version: '1.006924'
+  Bio::Structure::IO:
+    file: Bio/Structure/IO.pm
+    version: '1.006924'
+  Bio::Structure::IO::pdb:
+    file: Bio/Structure/IO/pdb.pm
+    version: '1.006924'
+  Bio::Structure::Model:
+    file: Bio/Structure/Model.pm
+    version: '1.006924'
+  Bio::Structure::Residue:
+    file: Bio/Structure/Residue.pm
+    version: '1.006924'
+  Bio::Structure::SecStr::DSSP::Res:
+    file: Bio/Structure/SecStr/DSSP/Res.pm
+    version: '1.006924'
+  Bio::Structure::SecStr::STRIDE::Res:
+    file: Bio/Structure/SecStr/STRIDE/Res.pm
+    version: '1.006924'
+  Bio::Structure::StructureI:
+    file: Bio/Structure/StructureI.pm
+    version: '1.006924'
+  Bio::Symbol::Alphabet:
+    file: Bio/Symbol/Alphabet.pm
+    version: '1.006924'
+  Bio::Symbol::AlphabetI:
+    file: Bio/Symbol/AlphabetI.pm
+    version: '1.006924'
+  Bio::Symbol::DNAAlphabet:
+    file: Bio/Symbol/DNAAlphabet.pm
+    version: '1.006924'
+  Bio::Symbol::ProteinAlphabet:
+    file: Bio/Symbol/ProteinAlphabet.pm
+    version: '1.006924'
+  Bio::Symbol::Symbol:
+    file: Bio/Symbol/Symbol.pm
+    version: '1.006924'
+  Bio::Symbol::SymbolI:
+    file: Bio/Symbol/SymbolI.pm
+    version: '1.006924'
+  Bio::Taxon:
+    file: Bio/Taxon.pm
+    version: '1.006924'
+  Bio::Taxonomy:
+    file: Bio/Taxonomy.pm
+    version: '1.006924'
+  Bio::Taxonomy::FactoryI:
+    file: Bio/Taxonomy/FactoryI.pm
+    version: '1.006924'
+  Bio::Taxonomy::Node:
+    file: Bio/Taxonomy/Node.pm
+    version: '1.006924'
+  Bio::Taxonomy::Taxon:
+    file: Bio/Taxonomy/Taxon.pm
+    version: '1.006924'
+  Bio::Taxonomy::Tree:
+    file: Bio/Taxonomy/Tree.pm
+    version: '1.006924'
+  Bio::Tools::AlignFactory:
+    file: Bio/Tools/AlignFactory.pm
+    version: '1.006924'
+  Bio::Tools::Alignment::Consed:
+    file: Bio/Tools/Alignment/Consed.pm
+    version: '1.006924'
+  Bio::Tools::Alignment::Trim:
+    file: Bio/Tools/Alignment/Trim.pm
+    version: '1.006924'
+  Bio::Tools::AmpliconSearch:
+    file: Bio/Tools/AmpliconSearch.pm
+    version: '1.006924'
+  Bio::Tools::Analysis::DNA::ESEfinder:
+    file: Bio/Tools/Analysis/DNA/ESEfinder.pm
+    version: '1.006924'
+  Bio::Tools::Analysis::Protein::Domcut:
+    file: Bio/Tools/Analysis/Protein/Domcut.pm
+    version: '1.006924'
+  Bio::Tools::Analysis::Protein::ELM:
+    file: Bio/Tools/Analysis/Protein/ELM.pm
+    version: '1.006924'
+  Bio::Tools::Analysis::Protein::GOR4:
+    file: Bio/Tools/Analysis/Protein/GOR4.pm
+    version: '1.006924'
+  Bio::Tools::Analysis::Protein::HNN:
+    file: Bio/Tools/Analysis/Protein/HNN.pm
+    version: '1.006924'
+  Bio::Tools::Analysis::Protein::Mitoprot:
+    file: Bio/Tools/Analysis/Protein/Mitoprot.pm
+    version: '1.006924'
+  Bio::Tools::Analysis::Protein::NetPhos:
+    file: Bio/Tools/Analysis/Protein/NetPhos.pm
+    version: '1.006924'
+  Bio::Tools::Analysis::Protein::Scansite:
+    file: Bio/Tools/Analysis/Protein/Scansite.pm
+    version: '1.006924'
+  Bio::Tools::Analysis::Protein::Sopma:
+    file: Bio/Tools/Analysis/Protein/Sopma.pm
+    version: '1.006924'
+  Bio::Tools::Analysis::SimpleAnalysisBase:
+    file: Bio/Tools/Analysis/SimpleAnalysisBase.pm
+    version: '1.006924'
+  Bio::Tools::AnalysisResult:
+    file: Bio/Tools/AnalysisResult.pm
+    version: '1.006924'
+  Bio::Tools::Blat:
+    file: Bio/Tools/Blat.pm
+    version: '1.006924'
+  Bio::Tools::CodonTable:
+    file: Bio/Tools/CodonTable.pm
+    version: '1.006924'
+  Bio::Tools::Coil:
+    file: Bio/Tools/Coil.pm
+    version: '1.006924'
+  Bio::Tools::ECnumber:
+    file: Bio/Tools/ECnumber.pm
+    version: '1.006924'
+  Bio::Tools::EMBOSS::Palindrome:
+    file: Bio/Tools/EMBOSS/Palindrome.pm
+    version: '1.006924'
+  Bio::Tools::EPCR:
+    file: Bio/Tools/EPCR.pm
+    version: '1.006924'
+  Bio::Tools::ERPIN:
+    file: Bio/Tools/ERPIN.pm
+    version: '1.006924'
+  Bio::Tools::ESTScan:
+    file: Bio/Tools/ESTScan.pm
+    version: '1.006924'
+  Bio::Tools::Eponine:
+    file: Bio/Tools/Eponine.pm
+    version: '1.006924'
+  Bio::Tools::Est2Genome:
+    file: Bio/Tools/Est2Genome.pm
+    version: '1.006924'
+  Bio::Tools::Fgenesh:
+    file: Bio/Tools/Fgenesh.pm
+    version: '1.006924'
+  Bio::Tools::FootPrinter:
+    file: Bio/Tools/FootPrinter.pm
+    version: '1.006924'
+  Bio::Tools::GFF:
+    file: Bio/Tools/GFF.pm
+    version: '1.006924'
+  Bio::Tools::Gel:
+    file: Bio/Tools/Gel.pm
+    version: '1.006924'
+  Bio::Tools::Geneid:
+    file: Bio/Tools/Geneid.pm
+    version: '1.006924'
+  Bio::Tools::Genemark:
+    file: Bio/Tools/Genemark.pm
+    version: '1.006924'
+  Bio::Tools::Genewise:
+    file: Bio/Tools/Genewise.pm
+    version: '1.006924'
+  Bio::Tools::Genomewise:
+    file: Bio/Tools/Genomewise.pm
+    version: '1.006924'
+  Bio::Tools::Genscan:
+    file: Bio/Tools/Genscan.pm
+    version: '1.006924'
+  Bio::Tools::Glimmer:
+    file: Bio/Tools/Glimmer.pm
+    version: '1.006924'
+  Bio::Tools::Grail:
+    file: Bio/Tools/Grail.pm
+    version: '1.006924'
+  Bio::Tools::GuessSeqFormat:
+    file: Bio/Tools/GuessSeqFormat.pm
+    version: '1.006924'
+  Bio::Tools::HMMER::Domain:
+    file: Bio/Tools/HMMER/Domain.pm
+    version: '1.006924'
+  Bio::Tools::HMMER::Results:
+    file: Bio/Tools/HMMER/Results.pm
+    version: '1.006924'
+  Bio::Tools::HMMER::Set:
+    file: Bio/Tools/HMMER/Set.pm
+    version: '1.006924'
+  Bio::Tools::Hmmpfam:
+    file: Bio/Tools/Hmmpfam.pm
+    version: '1.006924'
+  Bio::Tools::IUPAC:
+    file: Bio/Tools/IUPAC.pm
+    version: '1.006924'
+  Bio::Tools::Infernal:
+    file: Bio/Tools/Infernal.pm
+    version: '1.006924'
+  Bio::Tools::Lucy:
+    file: Bio/Tools/Lucy.pm
+    version: '1.006924'
+  Bio::Tools::MZEF:
+    file: Bio/Tools/MZEF.pm
+    version: '1.006924'
+  Bio::Tools::Match:
+    file: Bio/Tools/Match.pm
+    version: '1.006924'
+  Bio::Tools::OddCodes:
+    file: Bio/Tools/OddCodes.pm
+    version: '1.006924'
+  Bio::Tools::Phylo::Gerp:
+    file: Bio/Tools/Phylo/Gerp.pm
+    version: '1.006924'
+  Bio::Tools::Phylo::Gumby:
+    file: Bio/Tools/Phylo/Gumby.pm
+    version: '1.006924'
+  Bio::Tools::Phylo::Molphy:
+    file: Bio/Tools/Phylo/Molphy.pm
+    version: '1.006924'
+  Bio::Tools::Phylo::Molphy::Result:
+    file: Bio/Tools/Phylo/Molphy/Result.pm
+    version: '1.006924'
+  Bio::Tools::Phylo::PAML:
+    file: Bio/Tools/Phylo/PAML.pm
+    version: '1.006924'
+  Bio::Tools::Phylo::PAML::Codeml:
+    file: Bio/Tools/Phylo/PAML/Codeml.pm
+    version: '1.006924'
+  Bio::Tools::Phylo::PAML::ModelResult:
+    file: Bio/Tools/Phylo/PAML/ModelResult.pm
+    version: '1.006924'
+  Bio::Tools::Phylo::PAML::Result:
+    file: Bio/Tools/Phylo/PAML/Result.pm
+    version: '1.006924'
+  Bio::Tools::Phylo::Phylip::ProtDist:
+    file: Bio/Tools/Phylo/Phylip/ProtDist.pm
+    version: '1.006924'
+  Bio::Tools::Prediction::Exon:
+    file: Bio/Tools/Prediction/Exon.pm
+    version: '1.006924'
+  Bio::Tools::Prediction::Gene:
+    file: Bio/Tools/Prediction/Gene.pm
+    version: '1.006924'
+  Bio::Tools::Primer3:
+    file: Bio/Tools/Primer3.pm
+    version: '1.006924'
+  Bio::Tools::Primer::Assessor::Base:
+    file: Bio/Tools/Primer/Assessor/Base.pm
+    version: '1.006924'
+  Bio::Tools::Primer::AssessorI:
+    file: Bio/Tools/Primer/AssessorI.pm
+    version: '1.006924'
+  Bio::Tools::Primer::Feature:
+    file: Bio/Tools/Primer/Feature.pm
+    version: '1.006924'
+  Bio::Tools::Primer::Pair:
+    file: Bio/Tools/Primer/Pair.pm
+    version: '1.006924'
+  Bio::Tools::Prints:
+    file: Bio/Tools/Prints.pm
+    version: '1.006924'
+  Bio::Tools::Profile:
+    file: Bio/Tools/Profile.pm
+    version: '1.006924'
+  Bio::Tools::Promoterwise:
+    file: Bio/Tools/Promoterwise.pm
+    version: '1.006924'
+  Bio::Tools::PrositeScan:
+    file: Bio/Tools/PrositeScan.pm
+    version: '1.006924'
+  Bio::Tools::Protparam:
+    file: Bio/Tools/Protparam.pm
+    version: '1.006924'
+  Bio::Tools::Pseudowise:
+    file: Bio/Tools/Pseudowise.pm
+    version: '1.006924'
+  Bio::Tools::QRNA:
+    file: Bio/Tools/QRNA.pm
+    version: '1.006924'
+  Bio::Tools::RNAMotif:
+    file: Bio/Tools/RNAMotif.pm
+    version: '1.006924'
+  Bio::Tools::RandomDistFunctions:
+    file: Bio/Tools/RandomDistFunctions.pm
+    version: '1.006924'
+  Bio::Tools::RepeatMasker:
+    file: Bio/Tools/RepeatMasker.pm
+    version: '1.006924'
+  Bio::Tools::Run::GenericParameters:
+    file: Bio/Tools/Run/GenericParameters.pm
+    version: '1.006924'
+  Bio::Tools::Run::ParametersI:
+    file: Bio/Tools/Run/ParametersI.pm
+    version: '1.006924'
+  Bio::Tools::Run::RemoteBlast:
+    file: Bio/Tools/Run/RemoteBlast.pm
+    version: '1.006924'
+  Bio::Tools::Run::StandAloneBlast:
+    file: Bio/Tools/Run/StandAloneBlast.pm
+    version: '1.006924'
+  Bio::Tools::Run::StandAloneNCBIBlast:
+    file: Bio/Tools/Run/StandAloneNCBIBlast.pm
+    version: '1.006924'
+  Bio::Tools::Run::StandAloneWUBlast:
+    file: Bio/Tools/Run/StandAloneWUBlast.pm
+    version: '1.006924'
+  Bio::Tools::Run::WrapperBase:
+    file: Bio/Tools/Run/WrapperBase.pm
+    version: '1.006924'
+  Bio::Tools::Seg:
+    file: Bio/Tools/Seg.pm
+    version: '1.006924'
+  Bio::Tools::SeqPattern:
+    file: Bio/Tools/SeqPattern.pm
+    version: '1.006924'
+  Bio::Tools::SeqPattern::Backtranslate:
+    file: Bio/Tools/SeqPattern/Backtranslate.pm
+    version: '1.006924'
+  Bio::Tools::SeqStats:
+    file: Bio/Tools/SeqStats.pm
+    version: '1.006924'
+  Bio::Tools::SeqWords:
+    file: Bio/Tools/SeqWords.pm
+    version: '1.006924'
+  Bio::Tools::SiRNA:
+    file: Bio/Tools/SiRNA.pm
+    version: '1.006924'
+  Bio::Tools::SiRNA::Ruleset::saigo:
+    file: Bio/Tools/SiRNA/Ruleset/saigo.pm
+    version: '1.006924'
+  Bio::Tools::SiRNA::Ruleset::tuschl:
+    file: Bio/Tools/SiRNA/Ruleset/tuschl.pm
+    version: '1.006924'
+  Bio::Tools::Sigcleave:
+    file: Bio/Tools/Sigcleave.pm
+    version: '1.006924'
+  Bio::Tools::Signalp:
+    file: Bio/Tools/Signalp.pm
+    version: '1.006924'
+  Bio::Tools::Signalp::ExtendedSignalp:
+    file: Bio/Tools/Signalp/ExtendedSignalp.pm
+    version: '1.006924'
+  Bio::Tools::Sim4::Exon:
+    file: Bio/Tools/Sim4/Exon.pm
+    version: '1.006924'
+  Bio::Tools::Sim4::Results:
+    file: Bio/Tools/Sim4/Results.pm
+    version: '1.006924'
+  Bio::Tools::Spidey::Exon:
+    file: Bio/Tools/Spidey/Exon.pm
+    version: '1.006924'
+  Bio::Tools::Spidey::Results:
+    file: Bio/Tools/Spidey/Results.pm
+    version: '1.006924'
+  Bio::Tools::TandemRepeatsFinder:
+    file: Bio/Tools/TandemRepeatsFinder.pm
+    version: '1.006924'
+  Bio::Tools::TargetP:
+    file: Bio/Tools/TargetP.pm
+    version: '1.006924'
+  Bio::Tools::Tmhmm:
+    file: Bio/Tools/Tmhmm.pm
+    version: '1.006924'
+  Bio::Tools::dpAlign:
+    file: Bio/Tools/dpAlign.pm
+    version: '1.006924'
+  Bio::Tools::ipcress:
+    file: Bio/Tools/ipcress.pm
+    version: '1.006924'
+  Bio::Tools::isPcr:
+    file: Bio/Tools/isPcr.pm
+    version: '1.006924'
+  Bio::Tools::pICalculator:
+    file: Bio/Tools/pICalculator.pm
+    version: '1.006924'
+  Bio::Tools::pSW:
+    file: Bio/Tools/pSW.pm
+    version: '1.006924'
+  Bio::Tools::tRNAscanSE:
+    file: Bio/Tools/tRNAscanSE.pm
+    version: '1.006924'
+  Bio::Tree::AlleleNode:
+    file: Bio/Tree/AlleleNode.pm
+    version: '1.006924'
+  Bio::Tree::AnnotatableNode:
+    file: Bio/Tree/AnnotatableNode.pm
+    version: '1.006924'
+  Bio::Tree::Compatible:
+    file: Bio/Tree/Compatible.pm
+    version: '1.006924'
+  Bio::Tree::DistanceFactory:
+    file: Bio/Tree/DistanceFactory.pm
+    version: '1.006924'
+  Bio::Tree::Draw::Cladogram:
+    file: Bio/Tree/Draw/Cladogram.pm
+    version: '1.006924'
+  Bio::Tree::Node:
+    file: Bio/Tree/Node.pm
+    version: '1.006924'
+  Bio::Tree::NodeI:
+    file: Bio/Tree/NodeI.pm
+    version: '1.006924'
+  Bio::Tree::NodeNHX:
+    file: Bio/Tree/NodeNHX.pm
+    version: '1.006924'
+  Bio::Tree::RandomFactory:
+    file: Bio/Tree/RandomFactory.pm
+    version: '1.006924'
+  Bio::Tree::Statistics:
+    file: Bio/Tree/Statistics.pm
+    version: '1.006924'
+  Bio::Tree::Tree:
+    file: Bio/Tree/Tree.pm
+    version: '1.006924'
+  Bio::Tree::TreeFunctionsI:
+    file: Bio/Tree/TreeFunctionsI.pm
+    version: '1.006924'
+  Bio::Tree::TreeI:
+    file: Bio/Tree/TreeI.pm
+    version: '1.006924'
+  Bio::TreeIO:
+    file: Bio/TreeIO.pm
+    version: '1.006924'
+  Bio::TreeIO::NewickParser:
+    file: Bio/TreeIO/NewickParser.pm
+    version: '1.006924'
+  Bio::TreeIO::TreeEventBuilder:
+    file: Bio/TreeIO/TreeEventBuilder.pm
+    version: '1.006924'
+  Bio::TreeIO::cluster:
+    file: Bio/TreeIO/cluster.pm
+    version: '1.006924'
+  Bio::TreeIO::lintree:
+    file: Bio/TreeIO/lintree.pm
+    version: '1.006924'
+  Bio::TreeIO::newick:
+    file: Bio/TreeIO/newick.pm
+    version: '1.006924'
+  Bio::TreeIO::nexml:
+    file: Bio/TreeIO/nexml.pm
+    version: '1.006924'
+  Bio::TreeIO::nexus:
+    file: Bio/TreeIO/nexus.pm
+    version: '1.006924'
+  Bio::TreeIO::nhx:
+    file: Bio/TreeIO/nhx.pm
+    version: '1.006924'
+  Bio::TreeIO::pag:
+    file: Bio/TreeIO/pag.pm
+    version: '1.006924'
+  Bio::TreeIO::phyloxml:
+    file: Bio/TreeIO/phyloxml.pm
+    version: '1.006924'
+  Bio::TreeIO::svggraph:
+    file: Bio/TreeIO/svggraph.pm
+    version: '1.006924'
+  Bio::TreeIO::tabtree:
+    file: Bio/TreeIO/tabtree.pm
+    version: '1.006924'
+  Bio::UpdateableSeqI:
+    file: Bio/UpdateableSeqI.pm
+    version: '1.006924'
+  Bio::Variation::AAChange:
+    file: Bio/Variation/AAChange.pm
+    version: '1.006924'
+  Bio::Variation::AAReverseMutate:
+    file: Bio/Variation/AAReverseMutate.pm
+    version: '1.006924'
+  Bio::Variation::Allele:
+    file: Bio/Variation/Allele.pm
+    version: '1.006924'
+  Bio::Variation::DNAMutation:
+    file: Bio/Variation/DNAMutation.pm
+    version: '1.006924'
+  Bio::Variation::IO:
+    file: Bio/Variation/IO.pm
+    version: '1.006924'
+  Bio::Variation::IO::flat:
+    file: Bio/Variation/IO/flat.pm
+    version: '1.006924'
+  Bio::Variation::IO::xml:
+    file: Bio/Variation/IO/xml.pm
+    version: '1.006924'
+  Bio::Variation::RNAChange:
+    file: Bio/Variation/RNAChange.pm
+    version: '1.006924'
+  Bio::Variation::SNP:
+    file: Bio/Variation/SNP.pm
+    version: '1.006924'
+  Bio::Variation::SeqDiff:
+    file: Bio/Variation/SeqDiff.pm
+    version: '1.006924'
+  Bio::Variation::VariantI:
+    file: Bio/Variation/VariantI.pm
+    version: '1.006924'
+  Bio::WebAgent:
+    file: Bio/WebAgent.pm
+    version: '1.006924'
+  FeatureStore:
+    file: Bio/DB/GFF/Adaptor/berkeleydb.pm
+    version: '1.006924'
 recommends:
-  Algorithm::Munkres: 0
-  Array::Compare: 0
-  Clone: 0
-  Convert::Binary::C: 0
-  Error: 0
-  GD: 0
-  Graph: 0.5
-  GraphViz: 0
-  HTML::Entities: 0
-  HTML::HeadParser: 3
-  HTML::TableExtract: 0
-  HTTP::Request::Common: 0
-  LWP::UserAgent: 0
-  List::MoreUtils: 0
-  PostScript::TextBlock: 0
-  SOAP::Lite: 0
-  SVG: 2.26
-  SVG::Graph: 0.01
-  Set::Scalar: 0
-  Sort::Naturally: 0
-  Spreadsheet::ParseExcel: 0
-  Storable: 2.05
-  Text::ParseWords: 0
-  XML::Parser: 0
-  XML::Parser::PerlSAX: 0
-  XML::SAX: 0.15
-  XML::SAX::Writer: 0
-  XML::Simple: 0
-  XML::Twig: 0
-  XML::Writer: 0.4
-  YAML: 0
+  Algorithm::Munkres: '0'
+  Array::Compare: '0'
+  Bio::Phylo: '0'
+  Clone: '0'
+  Convert::Binary::C: '0'
+  DB_File: '0'
+  Error: '0'
+  GD: '0'
+  Graph: '0.5'
+  GraphViz: '0'
+  HTML::Entities: '0'
+  HTML::HeadParser: '3'
+  HTML::TableExtract: '0'
+  HTTP::Request::Common: '0'
+  IO::Scalar: '0'
+  LWP::UserAgent: '0'
+  List::MoreUtils: '0'
+  PostScript::TextBlock: '0'
+  SOAP::Lite: '0'
+  SVG: '2.26'
+  SVG::Graph: '0.01'
+  Set::Scalar: '0'
+  Sort::Naturally: '0'
+  Spreadsheet::ParseExcel: '0'
+  Storable: '2.05'
+  Text::ParseWords: '0'
+  XML::DOM: '0'
+  XML::DOM::XPath: '0'
+  XML::LibXML: '0'
+  XML::Parser: '0'
+  XML::Parser::PerlSAX: '0'
+  XML::SAX: '0.15'
+  XML::SAX::Writer: '0'
+  XML::Simple: '0'
+  XML::Twig: '0'
+  XML::Writer: '0.4'
+  YAML: '0'
 requires:
-  DB_File: 0
-  Data::Stag: 0.11
-  ExtUtils::Manifest: 1.52
-  IO::String: 0
-  Scalar::Util: 0
+  Data::Stag: '0.11'
+  ExtUtils::Manifest: '1.52'
+  IO::String: '0'
+  Scalar::Util: '0'
   perl: v5.6.1
 resources:
   license: http://dev.perl.org/licenses/
-version: 1.006923
+version: '1.006924'
@@ -25,7 +25,7 @@ o Contact info
 
  Project website : http://bioperl.org/
 
- Bug reports : https://redmine.open-bio.org/projects/bioperl/
+ Bug reports : https://github.com/bioperl/bioperl-live/issues
 
      Please send us bugs, in particular about documentation which you
      think is unclear or problems in installation. We are also very
@@ -128,7 +128,7 @@ o Caveats and warnings
  
  Not all scripts in the examples/ directory are correct and up-to-date.
  We need volunteers to help maintain these so if you find they do not
- submit a bug report to https://redmine.open-bio.org/projects/bioperl/
+ submit a bug report to https://github.com/bioperl/bioperl-live/issues
  and consider helping out in their maintenance.
 
  If you are confused about what modules are appropriate when you try
@@ -22,7 +22,7 @@ please write us, it could be undocumented or in process.
 
 * Project website : http://bioperl.org/
 
-* Bug reports : https://redmine.open-bio.org/projects/bioperl/
+* Bug reports : https://github.com/bioperl/bioperl-live/issues
 
 Please send us bugs, in particular about documentation which you think is
 unclear or problems in installation. We are also very interested in functions
@@ -128,7 +128,7 @@ to run the program you'd need to install it first.
 
 Not all scripts in the `examples/` directory are correct and up-to-date. We need
 volunteers to help maintain these so if you find they do not submit a bug report
-to https://redmine.open-bio.org/projects/bioperl/ and consider helping out in
+to https://github.com/bioperl/bioperl-live/issues and consider helping out in
 their maintenance.
 
 If you are confused about what modules are appropriate when you try and solve a
@@ -242,7 +242,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl
+  https://github.com/bioperl/bioperl-live/issues
 
 
 =head1 SEE ALSO
@@ -445,7 +445,7 @@ sub extract_pod {
 
     $stats{'files'}++;
 
-    open my $fh, $File::Find::name or die "deob_index.pl: couldn't open $file:$!\n";
+    open my $fh, '<', $File::Find::name or die "deob_index.pl: could not read file '$file': $!\n";
 
     # these have to be done in order
     my ( $pkg_name, $short_desc ) = get_pkg_name($fh);
@@ -31,7 +31,7 @@ the bugs and their resolution.  Bug reports can be submitted via the
 web:</p>
 
 <ul>
-<li><a href="https://redmine.open-bio.org/projects/bioperl/">Redmine issue tracker</a>
+<li><a href="https://github.com/bioperl/bioperl-live/issues">GitHub issue tracker</a>
 </ul>
 
 <h2>Credits</h2>
@@ -158,7 +158,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 
 =head1 SEE ALSO
@@ -249,8 +249,8 @@ my $style4
 my $style5 = qq{style="font-family:verdana;font-size:14px;padding:3"};
 
 # Open file containing all Bioperl package names
-open( MODS, $PERLMODULES )
-    or die "Can't open list of Perl module names $PERLMODULES: $!\n";
+open my $MODS, '<', $PERLMODULES
+    or die "Could not read list of Perl module names '$PERLMODULES': $!\n";
 
 # Open BerkeleyDB by getting hash references
 $ref_BerkeleyDB_packages = Deobfuscator::open_db($BerkeleyDB_packages);
@@ -261,7 +261,7 @@ my $pattern = param('search_string') ? param('search_string') : ' ';
 $pattern =~ s/\s//g;
 
 # Filter file names with user search string if one has been entered
-while (<MODS>) {
+while (<$MODS>) {
     if (/\S+/) {    # capture list of all module names in case there are no
                     # matches found to user input string
         push @all_modules, $_;
@@ -282,7 +282,7 @@ while (<MODS>) {
 if ( scalar @available_modules < 1 ) {
     @available_modules = @all_modules;
 }
-close MODS or die "Can't close list of Perl module names $PERLMODULES: $!";
+close $MODS or die "Could not close list of Perl module names $PERLMODULES: $!\n";
 
 # grab BioPerl version string
 my $version_string = '__BioPerl_Version'; # specified in deob_index.pl
@@ -4,9 +4,9 @@
 
 my $strider = $ARGV[0]; #commercial_version_rebase_strider_format
 
-open (FILEIN,"$strider") or die "can't open $strider: $!\n";
+open my $FILEIN, '<', $strider or die "Could not read file '$strider': $!\n";
 
-while (<FILEIN>){
+while (<$FILEIN>){
    chomp;
    if ( /^[A-Z]\S+,\S+/ ){
       ($enzyme,$cutsite)=split(',');
@@ -18,5 +18,4 @@ while (<FILEIN>){
       print " \'$enzyme\'\t=> \'".$seqfixed." ".$match."\'\,\n";
    }
 }
-
-
+close $FILEIN;
@@ -39,11 +39,12 @@ my $seqout = Bio::SeqIO->new( '-format' => $format, '-fh' => \*STDOUT);
 my @ids;
 
 if( defined $file ) {
-  open(F,$file) || die "cannot open $file $!";
-  while( <F> ) {
+  open my $F, '<', $file or die "Could not read file '$file': $!\n";
+  while( <$F> ) {
     my ($id) = split;
     push(@ids,$id);
   }
+  close $F;
 } else {
   @ids = @ARGV;
 }
@@ -137,7 +137,7 @@ sub open_readfile {
 	chomp ($filename=<STDIN>);
     }
     unless (-e $filename) { die "$filename not found\n"; }
-    open($filehandle,$filename) or die "Couldn't open $filename\n";
+    open $filehandle,'<', $filename or die "Could not read file '$filename': $!\n";
     $filehandle = '';
     $filetype = '';
     $filename = '';
@@ -159,9 +159,9 @@ sub open_writefile {
 	    chomp ($_ = <STDIN>);
 	}
 	if (/n/i) { die "$filename not overwritten.\n"; }
-	else { open($filehandle, ">$filename") or die "Couldn't open $filename\n"; }
+	else { open $filehandle, '>', $filename or die "Could nott write file '$filename':·$!\n"; }
     }
-    else { open($filehandle, ">$filename") or die "Couldn't open $filename\n"; }
+    else { open $filehandle, '>', $filename or die "Could not write file '$filename': $!\n"; }
     $filehandle = '';
     $filetype = '';
     $filename = '';
@@ -39,8 +39,8 @@ sub data {
     my ($self, $data) = @_;
     print "Setting test data ($data)\n" if $data && $self->verbose;
     $self->{'data'} = $data if $data;
- 
-   return $self->{'data'} 
+
+   return $self->{'data'}
 }
 
 sub bar {
@@ -53,7 +53,7 @@ sub bar {
     my $message = "A Test error";
 
     # Bio::Root::Root::throw() will make use of Error.pm if present.
-    # The type of Error is specified with a -class parameter. 
+    # The type of Error is specified with a -class parameter.
     # If -class is not supplied, a Bio::Root::Exception is throw.
     # In this case, the argument can consist of a simple string.
 
@@ -64,13 +64,13 @@ sub print_results {
   
   # Now we parse the FASTA file which was just generated, and perform
   # some simple conversions to HTML.   
-  open (TEMPORARY, "<$filename") or die "unable to open temporary file $filename\n";
+  open my $TEMPORARY, '<', $filename or die "Could not read temporary file '$filename': $!\n";
   print "<tt>\n";
-  while (<TEMPORARY>) {
+  while (<$TEMPORARY>) {
     print $_;
     print "<br>\n";
   }
-  close TEMPORARY;
+  close $TEMPORARY;
   print "</tt>\n";
   unlink $filename;
 }
@@ -86,15 +86,17 @@ my $db = Bio::DB::Fasta->new($name, -makeid => \&make_my_id);
 unless (-e $storedHash) {
 	my $ref;
 	# extract species-specific information from gene2accession
-	open MYIN,"gene2accession" or die "No gene2accession file\n";
-	while (<MYIN>) {
-		my @arr = split "\t",$_;
+	my $file = 'gene2accession';
+	open my $MYIN, '<', $file or die "Could not read file '$file': $!\n";
+	while (my $line = <$MYIN>) {
+		my @arr = split "\t", $line;
 		if ($arr[0] == $species{$name} && $arr[9] =~ /\d+/ && $arr[10] =~ /\d+/) {
 			($ref->{$arr[1]}->{"start"}, $ref->{$arr[1]}->{"end"}, 
 			 $ref->{$arr[1]}->{"strand"}, $ref->{$arr[1]}->{"id"}) =	
 				($arr[9], $arr[10], $arr[11], $arr[7]);
 		}
 	}
+	close $MYIN;
 	# save species-specific information using Storable
 	store $ref, $storedHash;
 } 
@@ -32,7 +32,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -201,7 +201,7 @@
     "of the bugs and their resolution. Bug reports can be submitted via" \N
     "the web:" \N
     \N
-    "  https://redmine.open-bio.org/projects/bioperl/" \N 
+    "  https://github.com/bioperl/bioperl-live/issues" \N 
     \N
     "=head1 AUTHOR - " v1 \N
     \N
@@ -39,7 +39,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
   
 =head1 AUTHOR - [[%ask2]]
 
@@ -85,17 +85,17 @@ my @dirs = qw( ../Bio/ ../scripts . );
 #
 
 
-open (F, $authorsfile) || die "can't open file $authorsfile: $!";
+open my $F, '<', $authorsfile or die "Could not read file '$authorsfile': $!\n";
 
 
-while (<F>) {
-    my ($email) = /([\.\w_-]+ at [\.\w_-]+)/;
+while (my $line = <$F>) {
+    my ($email) = ($line =~/([\.\w_-]+ at [\.\w_-]+)/);
     next unless $email;
     #print $email, "\n";
     $email =~ s/ at /@/;
     $AUTHORS{$email} = 1;
 }
-close F;
+close $F;
 
 
 #
@@ -124,22 +124,25 @@ print Dumper \%NEWAUTHORS;
 # this is where the action is
 #
 sub findauthors {
-    return unless /\.PLS$/ or /\.p[ml]$/ ;
-    return unless -e $_;
-    print "$_\n" if $verbose;
-    my $filename = $_;
+    my ($filename) = @_;
+    return unless ($filename =~ /\.PLS$/ or $filename =~ /\.p[ml]$/);
+    return unless -e $filename;
+
+    print "$filename\n" if $verbose;
     #local $/=undef;
-    open F, $_ || die "Could not open file $_";
-    while (<F>) {
-        #print;
-        last if /=head1 +AUTHOR/;
+    open my $F, '<', $filename or die "Could not read file '$filename': $!\n";
+    while (my $line = <$F>) {
+        #print $line;
+        last if $line =~ /=head1 +AUTHOR/;
     }
     my $authorblock;
-    while (<F>) {
-        last if /=head/ and not /CONTRIBUTORS/;
-        $authorblock .= $_;
+    while (my $line = <$F>) {
+        last if $line =~ /=head/ and $line !~ /CONTRIBUTORS/;
+        $authorblock .= $line;
     }
+    close $F;
     return unless $authorblock;
+
     while ( $authorblock =~ /([\.\w_-]+@[\.a-z_-]+)/g) {
         #my $email = $1;
         #$email =~ //
@@ -147,7 +150,6 @@ sub findauthors {
         #print "$filename\t$1\n";
 
         push @{$NEWAUTHORS{$1}}, $filename;
-
     }
 }
 
@@ -172,18 +174,19 @@ feeling too lazy to change the code.
 =cut
 
 sub blankline {
-    return unless /\.PLS$/ or /\.p[ml]$/ ;
-    return unless -e $_;
-    my $file = $_;
-    open (F, $_) or warn "can't open file $_: $!" && return;
-    local $/="";
-    while (<F>) {
-        print "$file: +|$1|\n" if /[ \t]\n(=[a-z][^\n]+$)/m and $verbose;
-        print "$file: ++|$1|\n" if /\w\n(=[a-z][^\n]+$)/m and $verbose;
-        print "$file:|$1|+\n" if /(^=[a-z][^\n]+)\n[\t ]/m;
+    my ($file) = @_;
+    return unless ($file =~ /\.PLS$/ or $file =~ /\.p[ml]$/);
+    return unless -e $file;
+
+    open my $F, '<', $file or warn "Could not read file '$file': $!\n" && return;
+    local $/ = "";
+    while (my $line = <$F>) {
+        print "$file: +|$1|\n"  if $line =~ /[ \t]\n(=[a-z][^\n]+$)/m and $verbose;
+        print "$file: ++|$1|\n" if $line =~ /\w\n(=[a-z][^\n]+$)/m    and $verbose;
+        print "$file:|$1|+\n"   if $line =~ /(^=[a-z][^\n]+)\n[\t ]/m;
         #print "$file:|$1|++\n" if /(^=[^\n]+)\n\w/m;
     }
-    close F;
+    close $F;
 }
 
 __END__
@@ -215,7 +218,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Heikki Lehvaslaiho
 
@@ -110,7 +110,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Torsten Seemann
 
@@ -53,7 +53,7 @@ GetOptions(
 my $fh;
 
 if (defined $file) {
-    open($fh, '>', $file) || die "Can't open file : $!";
+    open $fh, '>', $file or die "Could not write file '$file': $!\n";
 } else {
     $fh = \*STDOUT;
 }
@@ -147,7 +147,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Torsten Seemann
 
@@ -1305,34 +1305,36 @@ my $self = shift; my $class = ref $self;
             # don't append the most recent entry, since it's already in the
             # new log due to CVS's idiosyncratic interpretation of "log -d".
             if ($Cumulative && -f $logfile_here) {
-              open NEW_LOG, ">>$tmpfile"
-                or die "trouble appending to $tmpfile ($!)";
-            
-              open OLD_LOG, "<$logfile_here"
-                or die "trouble reading from $logfile_here ($!)";
-                
-              my $started_first_entry = 0;
-              my $passed_first_entry = 0;
-              while (<OLD_LOG>) {
-                if ( ! $passed_first_entry ) {
-                  if ( ( ! $started_first_entry )
-                      and /^(\d\d\d\d-\d\d-\d\d\s+(\w+\s+)?\d\d:\d\d)/ ) {
-                    $started_first_entry = 1;
-                  } elsif ( /^(\d\d\d\d-\d\d-\d\d\s+(\w+\s+)?\d\d:\d\d)/ ) {
-                    $passed_first_entry = 1;
-                    print NEW_LOG $_;
-                  }
-                } else {
-                  print NEW_LOG $_;
+                open $NEW_LOG, '>>', $tmpfile
+                  or die "Could not append to file '$tmpfile': $!\n";
+              
+                open $OLD_LOG, '<', $logfile_here
+                  or die "Could not read file '$logfile_here': $!";
+                  
+                my $started_first_entry = 0;
+                my $passed_first_entry = 0;
+                while (<$OLD_LOG>) {
+                    if ( ! $passed_first_entry ) {
+                        if (   ( ! $started_first_entry )
+                            and /^(\d\d\d\d-\d\d-\d\d\s+(\w+\s+)?\d\d:\d\d)/
+                            ) {
+                            $started_first_entry = 1;
+                        }
+                        elsif ( /^(\d\d\d\d-\d\d-\d\d\s+(\w+\s+)?\d\d:\d\d)/ ) {
+                            $passed_first_entry = 1;
+                            print $NEW_LOG $_;
+                        }
+                    }
+                    else {
+                        print $NEW_LOG $_;
+                    }
                 }
-              }
-            
-              close NEW_LOG;
-              close OLD_LOG;
+                close $NEW_LOG;
+                close $OLD_LOG;
             }
             
             if ( -f $logfile_here ) {
-              rename $logfile_here, $logfile_bak;
+                rename $logfile_here, $logfile_bak;
             }
             rename $tmpfile, $logfile_here;
         }
@@ -1957,7 +1959,7 @@ sub read_changelog {
     &main::debug ("(run \"@$command\")\n");
   }
   else {
-    open READER, '-' or die "unable to open stdin for reading";
+    open READER, '-' or die "Unable to open stdin for reading";
   }
 
   binmode READER;
@@ -3232,4 +3234,3 @@ Boston, MA 02111-1307, USA.
 =head1 SEE ALSO
 
 cvs(1)
-
@@ -99,7 +99,7 @@ for my $key (sort keys %dependencies) {
     }
 }
 
-open (my $dfile, '>', $depfile) || die "Can't open dependency file :$!\n";
+open my $dfile, '>', $depfile or die "Could not write dependency file '$depfile': $!\n";
 
 print $dfile $dep_header;
 
@@ -157,7 +157,7 @@ sub parse_core {
     my $file = $_;
     return unless $file =~ /\.PLS$/ || $file =~ /\.p[ml]$/ ;
     return unless -e $file;
-    open my $F, $file || die "Could not open file $file";
+    open my $F, '<', $file or die "Could not read file '$file': $!\n";
     my $pod = '';
     MODULE_LOOP:
     while (my $line = <$F>) {
@@ -282,7 +282,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Chris Fields
 
@@ -41,7 +41,7 @@ my @dep_data;
 
 # parse DEPRECATED file
 
-open my $DFILE, '<', $depfile || die "Can't open $depfile: $!";
+open my $DFILE, '<', $depfile or die "Could not read file '$depfile': $!\n";
 my $seen_top;
 while (my $data = <$DFILE>) {
     if ($data =~ /^-+$/) {
@@ -65,7 +65,6 @@ while (my $data = <$DFILE>) {
                      remove => $rem,
                      note => $note}
 }
-
 close $DFILE;
 
 for my $new (@$new) {
@@ -96,7 +95,7 @@ if ($dir) {
 
 if ($write || @$new) {
 
-open (my $NEWDEP, '>', $outfile) || croak "Can't open $outfile :$!";
+open my $NEWDEP, '>', $outfile or croak "Could not write file '$outfile': $!\n";
 
 print $NEWDEP <<HEAD;
 # These are modules which are deprecated and later removed from the toolkit
@@ -135,7 +134,7 @@ sub parse_core {
     my $file = $_;
     return unless $file =~ /\.PLS$/ || $file =~ /\.p[ml]$/ ;
     return unless -e $file;
-    open my $F, $file || die "Could not open file $file";
+    open my $F, '<', $file or die "Could not read file '$file': $!\n";
     while (my $line = <$F>) {
         if ($line =~ /(?:['"])?\b(use|require)\s+([A-Za-z0-9:_\.\(\)]+)\s*([^;'"]+)?(?:['"])?\s*;/) {
             my ($use, $mod) = ($1, $2);
@@ -222,7 +221,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Chris Fields
 
@@ -162,7 +162,7 @@ sub find_deps {
     my ( $file ) = @_;
 
     my $nopod;
-    { open my $p, '<', $file or die "$! reading $file\n";
+    { open my $p, '<', $file or die "Could not read file '$file': $!\n";
       local $/;
       my $code = <$p>;
       my $strip = Pod::Strip->new;
@@ -213,7 +213,7 @@ sub find_deps {
 
                 next unless $p_modfile && -f $p_modfile;
 
-                open my $p, '<', $p_modfile or die "$! opening $p_modfile\n";
+                open my $p, '<', $p_modfile or die "Could not read file '$p_modfile': $!\n";
                 while( <$p> ) {
                     next MODNAME if /^\s*package\s+$p\b/;
                 }
@@ -232,9 +232,9 @@ sub modules {
     return unless /\.pm$/ ;
     #return unless -e $_;
     #print "file: $_\n" if $verbose;
-    open (F, $_) or warn "can't open file $_: $!" && return;
+    open my $F, '<', $_ or warn "Could not read file '$_': $!\n" && return;
     my $class;
-    while (<F>) {
+    while (<$F>) {
         if (/^package\s+([\w:]+)\s*;/) {
             #print $1, "\n" if $verbose;
             $_ = $1;
@@ -273,7 +273,7 @@ sub modules {
             }
         }
     }
-    close F;
+    close $F;
 }
 
 =head1 OPTIONS
@@ -469,10 +469,10 @@ sub synopsis {
         next if $c->name eq 'Bio::Tools::HMM';
 
         my $synopsis = '';
-        open (F, $c->path) or warn "can't open file ".$c->name.": $!" && return;
+        open my $F, '<', $c->path or warn "Could not read file '".$c->name."': $!\n" && return;
 
         my $flag = 0;
-        while (<F>) {
+        while (<$F>) {
             last if $flag && /^=/;
             $synopsis .= $_ if $flag;
             $flag = 1 if /^=head1 +SYNOPSIS/;
@@ -492,7 +492,7 @@ sub synopsis {
         print $res;
         print "-" x 70, "\n"; 
         # print "SYNOPSIS not runnable\n";
-        close F;
+        close $F;
     }
 }
 
@@ -552,7 +552,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -563,6 +563,3 @@ Heikki Lehvaslaiho, heikki-at-bioperl-dot-org
 Albert Vilella, avilella-AT-gmail-DOT-com
 
 =cut
-
-
-
@@ -159,7 +159,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Heikki Lehvaslaiho
 
@@ -87,7 +87,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Sendu Bala
 
@@ -251,13 +251,14 @@ elsif ($accFILE){
     my $filename = shift;
     die "you must supply a filename after the --accFILE command line flag\n" unless $filename;
     die "file $filename does not exist\n" unless (-e $filename && !(-d $filename));
-    open IN, "$filename" || die "Can't open file $filename for reading accession numbers: $!\n";
-    while (<IN>){
-        chomp;
-	status(loading => $_);
-        my $result = $db->load_from_embl(/^NC_/?'refseq':'embl' => $_);
+    open my $IN, '<', $filename or die "Could not read file '$filename' for reading accession numbers: $!\n";
+    while (my $line = <$IN>){
+        chomp $line;
+	status(loading => $line);
+        my $result = $db->load_from_embl(/^NC_/?'refseq':'embl' => $line);
 	status(done => $result);
     }
+    close $IN;
     exit 1;
 }
 
@@ -445,12 +445,12 @@ for my $file ( @files ) {
     
     # open input file, unzip if req'd
     if ($stdin) {
-       *FH= *STDIN;   
+       *FH = *STDIN;
     } elsif ( $file =~ /\.gz/ ) {
         open FH, "gunzip -c $file |";
     }
     else {
-        open FH, "<$file";
+        open FH, '<', $file;
     }
 
     my $in = Bio::SeqIO->new(-fh => \*FH, -format => $FORMAT, -debug=>$DEBUG);
@@ -102,20 +102,24 @@ sub dump_symbol {
 
 sub process_fasta {
   my $file = shift @ARGV;
-  open F,$file or die "Can't open $file: $!";
+  open my $F, '<', $file or die "Could not read file '$file': $!\n";
   print STDERR "Reading big FASTA file, please be patient...\n";
   my ($current_id,%lengths);
-  while (<F>) {
-    if (/^>(\S+)/) {
+  while (my $line = <$F>) {
+    if ($line =~ /^>(\S+)/) {
       $current_id = $1;
       next;
     }
     die "this doesn't look like a fasta file to me" unless $current_id;
-    chomp;
-    $lengths{$current_id} += length;
+    chomp $line;
+    $lengths{$current_id} += length $line;
   }
-  foreach (sort keys %lengths) {
-    print join("\t",$_,'arm','Component',1,$lengths{$_},'.','+','.',qq(Sequence "$_")),"\n";
+  close $F;
+
+  foreach my $id (sort keys %lengths) {
+    print join("\t", $id, 'arm', 'Component', 1, $lengths{$id},
+                     '.', '+', '.', qq(Sequence "$id")
+               ), "\n";
   }
 }
 
@@ -305,7 +305,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Heikki Lehvaslaiho
 
@@ -141,7 +141,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Mark A. Jensen
 
@@ -412,11 +412,11 @@ END
 # directory.  Used primarily for testing.
 sub stylesheet {
   ok_header();
-  open(STYLE, "style.xml");
-  while(<STYLE>) {
+  open my $STYLE, '<', "style.xml" or die "Could not read file 'style.xml': $!\n";
+  while(<$STYLE>) {
     print $_;
   }
-  close STYLE;
+  close $STYLE;
 }
 
 # really, really bad shit
@@ -109,7 +109,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -86,7 +86,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Ewan Birney
 
@@ -81,7 +81,7 @@ my %LD_matrix = $stats->composite_LD($pop);
 my @sites;
 my $out;
 if( $outfile ) { 
-    open($out, ">$outfile") || die("$outfile: $!");
+    open $out, '>', $outfile or die "Could not write file '$outfile': $!\n";
 } else { 
     $out = \*STDOUT;
 }
@@ -102,6 +102,3 @@ if( $sortbyld ) {
 	print $out "$site1,$site2 - LD=$ld, chisq=$chisq\n";
     }
 }
-
-
-
@@ -67,7 +67,7 @@ GetOptions(
 
 my $outfh;
 if( $outfile ) { 
-    open($outfh, ">$outfile") || die("$outfile: $!");
+    open $outfh, '>', $outfile or die "Could not write file '$outfile': $!\n";
 } else { 
     $outfh = \*STDOUT; 
 }
@@ -34,7 +34,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 email or the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -52,7 +52,7 @@ GetOptions(
 
 my $outfh;
 if( $outfile ) { 
-    open($outfh, ">$outfile") || die("$outfile: $!");
+    open $outfh, '>', $outfile or die "Could not write file '$outfile': $!\n";
 } else { 
     $outfh = \*STDOUT; 
 }
@@ -45,7 +45,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -92,11 +92,11 @@ if ($opt_s) {
 } elsif ($opt_m) {
 
     # Opens the INDEX file sent as input
-    open(FH, "<", $opt_m) or die("Unable to open INDEX file: $opt_m ($!)");
+    open my $FH, '<', $opt_m or die "Could not read INDEX file '$opt_m': $!\n";
 
     # Cycle that extracts one line for every loop until finding the
     # end of file
-    while (my $line = <FH>) {
+    while (my $line = <$FH>) {
 
         # Deletes the new line characters from the line
         chomp $line;
@@ -111,7 +111,7 @@ if ($opt_s) {
     print "Total domain positive scores: $pos_scores\n" if $opt_ps;
 
     # Closes INDEX files
-    close(FH);
+    close $FH;
 }
 
 # Exits the program
@@ -29,7 +29,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 email or the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -57,7 +57,7 @@ my $in = Bio::SearchIO->new(-format => $format,
 			    -file   => $file);
 my $out;
 if( $output ) { 
-    open($out,">$output") || die "cannot open $output for writing";
+    open $out, '>', $output or die "Could not write file '$output': $!\n";
 } else { 
     $out = \*STDOUT;
 }
@@ -57,7 +57,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 email or the web:
 
-  L<https://redmine.open-bio.org/projects/bioperl/>
+  L<https://github.com/bioperl/bioperl-live/issues>
 
 =head1 AUTHOR
 
@@ -76,7 +76,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Philip Lijnzaad
 
@@ -44,7 +44,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 email or the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 EDIT HISTORY
 
@@ -41,7 +41,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 email or the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 EDIT HISTORY
 
@@ -36,7 +36,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 email or the web:
 
-https://redmine.open-bio.org/projects/bioperl/
+https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -44,7 +44,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHORS
 
@@ -102,9 +102,10 @@ while (my $seq = $in->next_seq()) {
     mkdir("split", 0755) unless -e "split" and -d "split";
 
     # Creates the INDEX file if the option was given
+    my $FH;
     if ($opt_i) {
         $index_file = "$id.c$opt_c.o$offset.INDEX";
-        open(FH, ">", $index_file) or die("Unable to create file: $index_file ($!)");
+        open $FH, '>', $index_file or die "Could not write file '$index_file': $!\n";
     }
 
     # Loops through the sequence
@@ -125,7 +126,7 @@ while (my $seq = $in->next_seq()) {
         print "==> Sequence chunk:\t$seq_range\tstored in file:\tsplit/$id.faa\n";
 
         # Prints the current file name into the INDEX file if the option was given
-        print FH "split/$id.faa\n" if $opt_i;
+        print $FH "split/$id.faa\n" if $opt_i;
 
         # Decreases the $i value with the offset value
         $i -= $offset;
@@ -134,7 +135,7 @@ while (my $seq = $in->next_seq()) {
     # Closes the INDEX file if the option was given
     if ($opt_i) {
         print "==> INDEX stored in file:\t\t\t$index_file\n";
-        close(FH);
+        close $FH;
     }
 }
 
@@ -31,7 +31,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 email or the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -156,7 +156,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 email or the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -119,7 +119,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -83,11 +83,12 @@ for( my $i = 1; $i <= $len; $i++ ) {
 
     $img->setPixel($x * $width,$y * $height, $black);
 }
-open(OUT, ">$output");
-binmode OUT;
+open my $OUT, '>', $output or die "Could not write file '$output': $!\n";
+binmode $OUT;
 $graph =~ s/jpg/jpeg/;
 
-print OUT $img->$graph();
+print $OUT $img->$graph();
+close $OUT;
 
 
 __END__
@@ -148,7 +149,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -165,4 +166,3 @@ UK) rd@mrc-lmba.cam.ac.uk, and Jean Thierry-Mieg (CRBM du CNRS,
 France) mieg@crbm1.cnusc.fr
 
 =cut
-
@@ -133,7 +133,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -122,17 +122,19 @@ while (my $seq = $in->next_seq() ) {
     $seqnumber++;
 }
 
+my $OUTFILE;
 if ($outfile) {
-    open(OUTFILE, ">$outfile") or die "Can't open $outfile\n";
+    open $OUTFILE, '>', $outfile or die "Could not open file '$outfile': $!\n";
 } else {
-    open OUTFILE, '>-'; # STDOUT
+    open $OUTFILE, '>-'; # STDOUT
 }
-print OUTFILE "$seqnumber sequences analyzed\n";
-print OUTFILE "$oligocounts total $oligomerlength-mers counted\n";
-print OUTFILE "$oligomerlength-mer\tNumber\tFrequency\n";
+print $OUTFILE "$seqnumber sequences analyzed\n";
+print $OUTFILE "$oligocounts total $oligomerlength-mers counted\n";
+print $OUTFILE "$oligomerlength-mer\tNumber\tFrequency\n";
 foreach my $key (sort keys %oligos) {
-    print OUTFILE "$key\t$oligos{$key}\t", $oligos{$key}/$oligocounts, "\n";
+    print $OUTFILE "$key\t$oligos{$key}\t", $oligos{$key}/$oligocounts, "\n";
 }
+close $OUTFILE;
 
 if ($exception) {
     if ($exception == 1) {
@@ -232,7 +234,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Charles C. Kim
 
@@ -84,7 +84,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -121,16 +121,16 @@ foreach my $aln ( @alns ) {
     
     my $matrix = $dist_factory->create_distance_matrix($aln);
     my @seqnames = keys %$matrix; 
-    open(MATRIX, ">Group$count.dist");
-    printf MATRIX "%4d\n",scalar @seqnames;
+    open my $MATRIX, '>', "Group$count.dist" or die "Could not write file 'Group$count.dist': $!\n";
+    printf $MATRIX "%4d\n",scalar @seqnames;
     for(my $i =0; $i< (scalar @seqnames  - 1); $i++ ) {
-	printf MATRIX "%-12s     ", $seqnames[$i];
+	printf $MATRIX "%-12s     ", $seqnames[$i];
 	for( my $j = $i+1; $j < scalar @seqnames; $j++ ) {
-	    print MATRIX $matrix->{$seqnames[$i]}->{$seqnames[$j]},"  ";
+	    print $MATRIX $matrix->{$seqnames[$i]}->{$seqnames[$j]},"  ";
 	}
-	print MATRIX "\n";
+	print $MATRIX "\n";
     }
-    close MATRIX;
+    close $MATRIX;
 
     my $tree = $tree_factory->create_tree("Group$count.dist");
     $outtrees->write_tree($tree);   
@@ -47,7 +47,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via
 the web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -93,16 +93,17 @@ if( $options{'-db'} eq 'protein' ) {
 my $query;
 if( $gifile ) {
 	my @ids;
-	open( my $fh => $gifile ) || die $!;
+	open my $fh, '<', $gifile or die "Could not read file '$gifile': $!\n";
 	while(<$fh>) {
 		push @ids, split;
 	}
-	close($fh);	
+	close $fh;
 	while( @ids ) {
 		my @mini_ids = splice(@ids, 0, $options{'-maxids'});
-		$query = Bio::DB::Query::GenBank->new(%options,
-														  -ids => \@mini_ids,
-														 );
+		$query = Bio::DB::Query::GenBank->new(%options, 
+						      -verbose =>$debug,
+					              -ids => \@mini_ids,
+						     );
 		my $stream = $dbh->get_Stream_by_query($query);
 		while( my $seq = $stream->next_seq ) {
 			$out->write_seq($seq);
@@ -110,15 +111,15 @@ if( $gifile ) {
 	}
 	exit;
 } elsif( $options{'-query'}) {
-	$query = Bio::DB::Query::GenBank->new(%options);
+	$query = Bio::DB::Query::GenBank->new(%options,-verbose => $debug);
 } elsif( $queryfile ) {
-	open(my $fh => $queryfile) || die $!;
-	while(<$queryfile>) {
+	open my $fh, '<', $queryfile or die "Could not read file '$queryfile': $!\n";
+	while(<$fh>) {
 		chomp;
 		$options{'-query'} .= $_;
 	}
-	$query = Bio::DB::Query::GenBank->new(%options);
-	close($fh);
+	$query = Bio::DB::Query::GenBank->new(%options,-verbose => $debug);
+	close $fh;
 } else {
 	die("no query string or gifile\n");
 }
@@ -40,7 +40,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -268,7 +268,8 @@ CPAN::Shell->install('Bio::Graphics');
 exit 0;
 
 END {
-  open STDERR,">/dev/null"; # windows has an annoying message when cleaning up temp file
+  my $null = ($^O =~ m/mswin/i) ? 'NUL' : '/dev/null';
+  open STDERR,">$null"; # windows has an annoying message when cleaning up temp file
 }
 
 sub do_install {
@@ -353,14 +354,14 @@ sub determine_filename {
       unless ($rc == RC_OK or $rc == RC_NOT_MODIFIED);
 
   my $filename; 
-  open LIST, $listing or die "unable to open $listing: $!\n";
-  while (<LIST>) {
-    if (/href="(bioperl-live.*?\.tar\.gz)"/) {
+  open my $LIST, '<', $listing or die "Could not read file '$listing': $!\n";
+  while (my $line = <$LIST>) {
+    if ($line =~ /href="(bioperl-live.*?\.tar\.gz)"/) {
       $filename = $1;
       last;
     }
   }
-  close LIST;
+  close $LIST;
   unlink $listing; 
   return $filename;
 }
@@ -386,14 +387,14 @@ sub extract_tarball {
 
 # make sure ppm repositories are correct!
 sub setup_ppm {
-  open S,"ppm repo list --csv|" or die "Couldn't open ppm for listing: $!";
+  open my $S, "ppm repo list --csv|" or die "Could not open ppm for listing: $!\n";
   my %repository;
-  while (<S>) {
-     chomp;
-     my($index,$package_count,$name) = split /,/;
+  while (my $line = <$S>) {
+     chomp $line;
+     my ($index, $package_count, $name) = split /,/, $line;
      $repository{$name} = $index;
   }
-  close S;
+  close $S;
   print STDERR "Adding needed PPM repositories. This may take a while....\n";
   for my $name (keys %REPOSITORIES) {
      next if $repository{$name};
@@ -403,25 +404,24 @@ sub setup_ppm {
 
 sub find_bioperl_ppm {
   print STDERR "Finding most recent bioperl...";
-  open S,"ppm search bioperl |" or die "Couldn't open ppm for listing: $!";
+  open my $S,"ppm search bioperl |" or die "Could not open ppm for listing: $!\n";
   local $/ = ''; # paragraph mode
-  my ($blessed_one,$blessed_version);
+  my ($blessed_one, $blessed_version);
   my $best = 0;
-  while (<S>) {
-    chomp;
-    my ($number)     = /^(\d+): bioperl/m;
-    my ($version)    = /^\s+Version: (.+)/m;
-    my ($repository) = /^\s+Repo: (.+)/m;
+  while (my $line = <$S>) {
+    chomp $line;
+    my ($number)     = ($line =~ /^(\d+): bioperl/m);
+    my ($version)    = ($line =~ /^\s+Version: (.+)/m);
+    my ($repository) = ($line =~ /^\s+Repo: (.+)/m);
     my $multiplier = 10000000;
     my $magnitude  = 0;
     # this dumb thing converts 1.5.1 into a real number
-    foreach (split /[._]/,$version) {
-      $magnitude += $_ * ($multiplier/=10);
+    foreach my $piece (split /[._]/, $version) {
+      $magnitude += $piece * ($multiplier/=10);
     }
     ($blessed_one,$best,$blessed_version) = ($number,$magnitude,$version) if $best < $magnitude;
   }
-  close S;
+  close $S;
   print STDERR $blessed_version ? "found $blessed_version\n" : "not found\n";
   return $blessed_one;
 }
-
@@ -45,7 +45,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR
 
@@ -167,7 +167,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 the bugs and their resolution.  Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -49,7 +49,7 @@ GetOptions( "h|help" => \$help, "i|infile:s" => \$infile );
 
 # Parse command line arguments.
 unless (defined $infile) { $infile = '-' };
-open( my $fh, "<$infile" ) or die "Couldn't open file $infile: $!\n";
+open my $fh, '<', $infile or die "Could not read file '$infile': $!\n";
 
 if ($help) { pod2usage(-verbose => 3) };
 
@@ -67,7 +67,7 @@ GetOptions(
 
 my $outfh;
 if( $output ) { 
-    open($outfh, ">$output") || die("Error opening output file $output. $!");
+    open $outfh, '>', $output or die "Could not write output file '$output': $!\n";
 } else {
     $outfh = *STDOUT;
 }
@@ -35,7 +35,7 @@ Report bugs to the Bioperl bug tracking system to help us keep track
 of the bugs and their resolution. Bug reports can be submitted via the
 web:
 
-  https://redmine.open-bio.org/projects/bioperl/
+  https://github.com/bioperl/bioperl-live/issues
 
 =head1 AUTHOR - Jason Stajich
 
@@ -115,7 +115,7 @@ $stats->verbose($debug);
 # now test Protein Distances
 my $pstats = Bio::Align::ProteinStatistics->new();
 $in = Bio::AlignIO->new(-format => 'clustalw',
-			-file   => test_input_file('testaln.aln'));
+			-file   => test_input_file('testaln.clustalw'));
 $alnobj = $in->next_aln();
 isa_ok($alnobj,'Bio::Align::AlignI');
 $result = $pstats->distance(-method => 'Kimura',
@@ -135,7 +135,7 @@ like($@, qr/not integral number of codons/);
 
 # bug 2901
 $in = Bio::AlignIO->new(-file => test_input_file('bug2901.fa'),
-                        -formay => 'fasta');
+                        -format => 'fasta');
 
 $stats = Bio::Align::DNAStatistics->new(-verbose => 2);
 $aln = $in->next_aln();
@@ -300,7 +300,7 @@ SKIP: {
     is $b->consensus_string, "aaaaatttt", 'remove_gaps all_gaps_only';
 
     # test set_new_reference:
-    $str = Bio::AlignIO->new( -file => test_input_file('testaln.aln') );
+    $str = Bio::AlignIO->new( -file => test_input_file('testaln.clustalw') );
     $aln = $str->next_aln();
     my $new_aln = $aln->set_new_reference(3);
     $a       = $new_aln->get_seq_by_pos(1)->display_id;
@@ -450,7 +450,7 @@ is $restored_aln->get_seq_by_pos(3)->display_id, 'Smik_Contig1103.1',
   'restored display id ok';
 
 # test sort_by_list:
-$str = Bio::AlignIO->new( -file => test_input_file('testaln.aln') );
+$str = Bio::AlignIO->new( -file => test_input_file('testaln.clustalw') );
 my $list_file = test_input_file('testaln.list');
 $aln     = $str->next_aln();
 $new_aln = $aln->sort_by_list($list_file);
@@ -738,7 +738,7 @@ foreach my $seq ( $removed->each_seq ) {
 # work out mask_columns(), see bug 2842
 SKIP: {
     test_skip(-tests => 6, -requires_module => 'IO::String');
-    my $io = Bio::AlignIO->new( -file => test_input_file("testaln.aln") );
+    my $io = Bio::AlignIO->new( -file => test_input_file("testaln.clustalw") );
     my $aln = $io->next_aln();
     isa_ok( $aln, 'Bio::SimpleAlign' );
     my $consensus = <<EOU;
@@ -7,7 +7,8 @@ BEGIN {
     use lib '.';
     use Bio::Root::Test;
 
-    test_begin(-tests => 29);
+    test_begin(-tests           => 29,
+               -requires_module => 'Data::Stag');
 
     use_ok('Bio::AlignIO');
 }
@@ -30,7 +31,7 @@ my %files = (
     'testaln.selex'     => ['selex',      1, 1],
     'testaln.mase'      => ['mase',       1, 0],
     'testaln.prodom'    => ['prodom',     1, 0],
-    'testaln.aln'       => ['clustalw',   1, 1],
+    'testaln.clustalw'  => ['clustalw',   1, 1],
     'testaln.metafasta' => ['metafasta',  1, 1],
     'testaln.nexus'     => ['nexus',      1, 1],
     'testaln.po'        => ['po',         1, 1],
@@ -68,7 +69,7 @@ while (my ($file, $fdata) = each %files) {
     if ($out) {
         my $status = 0;
         my $fhin = Bio::AlignIO->newFh(
-           '-file' => test_input_file('testaln.aln'),
+           '-file' => test_input_file('testaln.clustalw'),
                         '-format' => 'clustalw');
         my $fhout = Bio::AlignIO->newFh(
            '-file'  => '>'.test_output_file(),
@@ -7,7 +7,8 @@ BEGIN {
 	use lib '.';
     use Bio::Root::Test;
     
-    test_begin(-tests => 48);
+    test_begin(-tests           => 48,
+               -requires_module => 'Data::Stag');
 	
 	use_ok('Bio::AlignIO::arp');
 }
@@ -90,4 +91,3 @@ is(keys %nodes, 6);
 is($nodes{'024'}, 1);
 is(($coll->get_Annotations('DataType'))[0]->value, 'DNA');
 is(($coll->get_Annotations('SampleSize'))[0]->value, 6);
-
@@ -18,7 +18,7 @@ my ($str,$aln,$strout,$status);
 
 # CLUSTAL
 my $io = Bio::AlignIO->new(
-   -file => test_input_file("testaln.aln") );
+   -file => test_input_file("testaln.clustalw") );
 $aln = $io->next_aln();
 isa_ok($aln,'Bio::Align::AlignI');
 is $aln->consensus_string, "MNEGEHQIKLDELFEKLLRARKIFKNKDVLRHSWEPKDLPHRHEQIEA".
@@ -34,11 +34,11 @@ $strout = Bio::AlignIO->new(
    '-file' => ">$outfile", 
 			      '-format' => 'clustalw');
 $status = $strout->write_aln($aln);
-is $status, 1, "clustalw (.aln) output test";
+is $status, 1, "clustalw output test";
 undef $strout;
 $str = Bio::AlignIO->new(
    '-file'=> $outfile, 
 			   '-format' => 'clustalw');
 $aln = $str->next_aln($aln);
 isa_ok($aln,'Bio::Align::AlignI');
-is $aln->get_seq_by_pos(1)->get_nse, 'P84139/1-420', "clustalw (.aln) input test";
+is $aln->get_seq_by_pos(1)->get_nse, 'P84139/1-420', "clustalw input test";
@@ -18,7 +18,7 @@ my ($str,$aln,$strout,$status);
 
 # MEGA
 $str = Bio::AlignIO->new('-format' => 'mega',
-  	'-file'   => test_input_file("hemoglobinA.meg"));
+  	'-file'   => test_input_file("testaln.mega"));
 
 $aln = $str->next_aln();
 isa_ok($aln,'Bio::Align::AlignI');
@@ -35,7 +35,7 @@ SKIP: {
 	
 	# output is? i.e. does conversion from clustalw to po give the same alignment?
 	$str = Bio::AlignIO->new(
-		  '-file'   => test_input_file('testaln.aln'),
+		  '-file'   => test_input_file('testaln.clustalw'),
 		  '-format' => 'clustalw');
 	isa_ok($str,'Bio::AlignIO');
 	$aln = $str->next_aln();
@@ -7,7 +7,8 @@ BEGIN {
     use lib '.';
     use Bio::Root::Test;
 
-    test_begin(-tests => 152);
+    test_begin(-tests           => 152,
+               -requires_module => 'Data::Stag');
 
     use_ok('Bio::Annotation::Collection');
     use_ok('Bio::Annotation::DBLink');
@@ -4,7 +4,8 @@ BEGIN {
     use lib '.';
     use Bio::Root::Test;
     test_begin( -tests            => 239,
-                -requires_modules => [ qw(Bio::Assembly::Tools::ContigSpectrum)] );
+                -requires_modules => [ 'DB_File',
+                                       qw(Bio::Assembly::Tools::ContigSpectrum)] );
     use_ok 'Bio::Assembly::IO';
     use_ok 'Bio::Assembly::Tools::ContigSpectrum';
 }
@@ -316,8 +317,8 @@ SKIP: {
    ok $large_csp->avg_overlap >= 88.7692;
    ok $large_csp->avg_overlap <= 88.8077;
    float_is $large_csp->min_identity, 33.3333;
-   cmp_ok($large_csp->avg_identity, '>=', 74.7, $large_csp->avg_identity);
-   cmp_ok($large_csp->avg_identity, '<=', 74.9, $large_csp->avg_identity);
+   cmp_ok($large_csp->avg_identity, '>=', 70, $large_csp->avg_identity);
+   cmp_ok($large_csp->avg_identity, '<=', 80, $large_csp->avg_identity);
 
    ok my $large_xcsp = Bio::Assembly::Tools::ContigSpectrum->new(
       -cross          => $large_csp,
@@ -371,4 +372,3 @@ SKIP: {
    float_is $csp->min_identity, 96.8421;
    float_is $csp->avg_identity, 98.8826;
 }
-
@@ -6,14 +6,14 @@ BEGIN {
     use lib '.';
     use Bio::Root::Test;
 
-    test_begin( -tests => 890,
+    test_begin( -tests => 892,
                 -requires_module => 'DB_File' );
 
-    use_ok('Bio::Seq');
-    use_ok('Bio::LocatableSeq');
-    use_ok('Bio::Seq::Quality');
-    use_ok('Bio::Assembly::IO');
-    use_ok('Bio::Assembly::Singlet');
+    use_ok 'Bio::Seq';
+    use_ok 'Bio::LocatableSeq';
+    use_ok 'Bio::Seq::Quality';
+    use_ok 'Bio::Assembly::IO';
+    use_ok 'Bio::Assembly::Singlet';
 }
 use Bio::Root::IO;
 
@@ -106,17 +106,19 @@ is $aio->variant, '454';
 # Some PHRAP input
 #
 
-my $in = Bio::Assembly::IO->new
-    (-file => test_input_file('consed_project','edit_dir','test_project.phrap.out'),
-     -verbose => -1);
+my $in = Bio::Assembly::IO->new(
+    -file    => test_input_file('consed_project','edit_dir','test_project.phrap.out'),
+    -verbose => -1,
+);
 isa_ok $in, 'Bio::Assembly::IO';
 while (my $contig = $in->next_contig) {
-    isa_ok($contig, 'Bio::Assembly::Contig');
+    isa_ok $contig, 'Bio::Assembly::Contig';
 }
 
-$in = Bio::Assembly::IO->new
-    (-file => test_input_file('consed_project','edit_dir','test_project.phrap.out'),
-     -verbose => -1);
+$in = Bio::Assembly::IO->new(
+    -file    => test_input_file('consed_project','edit_dir','test_project.phrap.out'),
+    -verbose => -1,
+);
 isa_ok $in, 'Bio::Assembly::IO';
 my $sc;
 TODO: {
@@ -127,9 +129,10 @@ TODO: {
 }
 
 $in->verbose(-1);
-$in = Bio::Assembly::IO->new
-    (-file => test_input_file('consed_project','edit_dir','test_project.phrap.out'),
-     -verbose => -1);
+$in = Bio::Assembly::IO->new(
+    -file    => test_input_file('consed_project','edit_dir','test_project.phrap.out'),
+    -verbose => -1,
+);
 ok $sc = $in->next_assembly;
 isa_ok $sc, 'Bio::Assembly::Scaffold';
 
@@ -141,7 +144,7 @@ isa_ok $sc, 'Bio::Assembly::Scaffold';
 is $sc->id, "NoName";
 is $sc->id('test'), "test";
 
-isa_ok($sc->annotation, 'Bio::AnnotationCollectionI');
+isa_ok $sc->annotation, 'Bio::AnnotationCollectionI';
 is $sc->annotation->get_all_annotation_keys, 0,"no annotations in Annotation collection?";
 is $sc->get_nof_contigs, 1;
 is $sc->get_nof_sequences_in_contigs, 2;
@@ -192,7 +195,7 @@ is @all_seq_ids, 4;
 # ACE Consed variant (default)
 $aio = Bio::Assembly::IO->new(
     -file   => test_input_file('consed_project','edit_dir','test_project.fasta.screen.ace.2'),
-    -format => 'ace'
+    -format => 'ace',
 );
 
 my $assembly = $aio->next_assembly();
@@ -211,7 +214,7 @@ my @annotations = $features->get_features_by_type('Annotation');
 is @annotations, 2;
 
 my $had_tag = 0;
-foreach my $an (@annotations) {
+for my $an (@annotations) {
     if ($an->has_tag('extra_info')) {
         $had_tag++;
         is (($an->get_tag_values('extra_info'))[0], "contig extra\ninfo\n");
@@ -279,18 +282,18 @@ ok @all_seq_ids = $assembly->get_all_seq_ids, "get_all_seq_ids";
 for my $seq_id (@all_seq_ids) {
   ok not $seq_id =~ m/contig/i;
 }
-is(@all_seq_ids, 39);
+is @all_seq_ids, 39;
 
 # bug 2758
 ok $aio = Bio::Assembly::IO->new(
-    -file=>test_input_file('singlet_w_CT.ace'),
-    -format=>'ace'
+    -file   => test_input_file('singlet_w_CT.ace'),
+    -format => 'ace',
 );
 
 # ACE 454 variant
 $aio = Bio::Assembly::IO->new(
-    -file=>test_input_file('27-contig_Newbler.ace'),
-    -format=>'ace-454'
+    -file   => test_input_file('27-contig_Newbler.ace'),
+    -format => 'ace-454',
 );
 $assembly = $aio->next_assembly();
 @contigs = $assembly->all_contigs();
@@ -304,7 +307,7 @@ for my $read ($contig->each_seq) {
       $min_aln_coord = $aln_coord_start;
    }
 }
-is ($min_aln_coord, 1, '454 ACE variant coordinates check');
+is $min_aln_coord, 1, '454 ACE variant coordinates check';
 # The ends of the consensus should be padded
 my $left_pad_length  = 29;
 my $sequence_length  = 203;
@@ -326,7 +329,7 @@ ok defined $2;
 
 # Writing ACE files
 my $asm_infile  = '27-contig_Newbler.ace';
-my $asm_outfile = test_output_file().'.ace';
+my $asm_outfile = test_output_file();
 my $asm_out = Bio::Assembly::IO->new(
     -file    => ">$asm_outfile",
     -format  =>'ace',
@@ -361,16 +364,16 @@ ok $asm_out->write_assembly( -scaffold => $asm_in, -singlets => 1  );
 # Importing an assembly
 
 $asm_in = Bio::Assembly::IO->new(
-    -file => test_input_file("sample_dataset.tigr "),
-    -format=>'tigr'
+    -file   => test_input_file("sample_dataset.tigr"),
+    -format => 'tigr',
 );
 while (my $obj = $asm_in->next_contig) {
     isa_ok $obj, 'Bio::Assembly::Contig'; # Singlets are contigs too
 }
 
 $asm_in = Bio::Assembly::IO->new(
-    -file => test_input_file("sample_dataset.tigr "),
-    -format=>'tigr'
+    -file   => test_input_file("sample_dataset.tigr"),
+    -format => 'tigr',
 );
 
 my $scaf_in = $asm_in->next_assembly;
@@ -421,8 +424,8 @@ is $scaf_in->annotation->get_all_annotation_keys, 0, "no annotations in Annotati
 # Exporting an assembly
 $asm_outfile = test_output_file();
 $asm_out = Bio::Assembly::IO->new(
-    -file=> ">$asm_outfile",
-    -format=>'tigr'
+    -file   =>  ">$asm_outfile",
+    -format => 'tigr',
 );
 ok $asm_out->write_assembly( -scaffold => $scaf_in), 'writing in the TIGR format';
 
@@ -432,8 +435,10 @@ ok $asm_out->write_assembly( -scaffold => $scaf_in), 'writing in the TIGR format
 # /maj
 #
 my $file = 'test.maq';
-ok $aio = Bio::Assembly::IO->new( -file => test_input_file($file),
-                                  -format => 'maq' ), "init maq IO object";
+ok $aio = Bio::Assembly::IO->new(
+    -file   => test_input_file($file),
+    -format => 'maq',
+), "init maq IO object";
 ok $assembly = $aio->next_assembly, "get maq assy";
 is $assembly->get_nof_contigs, 11, "got all contigs";
 ok open(my $tf, test_input_file($file)), "read test file as text";
@@ -452,8 +457,10 @@ while (my $contig = $aio->next_contig) {
 # Testing maq with singlets
 #
 $file = 'test_singlets.maq';
-ok $aio = Bio::Assembly::IO->new( -file => test_input_file($file),
-                                  -format => 'maq' );
+ok $aio = Bio::Assembly::IO->new(
+    -file   => test_input_file($file),
+    -format => 'maq',
+);
 ok $assembly = $aio->next_assembly, "get maq assy";
 isa_ok $aio, 'Bio::Assembly::IO';
 
@@ -482,10 +489,22 @@ for my $seq_id (@all_seq_ids) {
 }
 is @all_seq_ids, 250;
 
-ok $aio = Bio::Assembly::IO->new( -file => test_input_file($file),
-                                  -format => 'maq' );
+ok $aio = Bio::Assembly::IO->new(
+    -file   => test_input_file($file),
+    -format => 'maq',
+);
 while (my $contig = $aio->next_contig) {
     isa_ok $contig, 'Bio::Assembly::Contig';
 }
 
+##############################################
+# test format() and variant() in Bio::RootIO
+##############################################
+
+$in = Bio::Assembly::IO->new(
+   -file   => test_input_file('assembly_with_singlets.ace'),
+);
+is $in->format, 'ace';
+is $in->variant, 'consed';
+
 exit;
@@ -7,7 +7,8 @@ BEGIN {
     use lib '.';
     use Bio::Root::Test;
 
-    test_begin(-tests => 17);
+    test_begin(-tests           => 17,
+               -requires_module => 'Data::Stag');
 
     use_ok('Bio::SeqIO');
     use_ok('Bio::Cluster::SequenceFamily');
@@ -1,15 +1,14 @@
-
 ## Test for a suspected bug and tests for debugging.
 
 use strict;
+use warnings;
 use Data::Dumper;
 
 BEGIN {
-  use lib '.';
   use Bio::Root::Test;
-  
+
   test_begin( -tests => 174 );
-  
+
   use_ok('Bio::Location::Simple');
   use_ok('Bio::Coordinate::Pair');
 }
@@ -1,31 +1,28 @@
-# -*-Perl-*- Test Harness script for Bioperl
-# $Id$
-
 use strict;
+use warnings;
+
+BEGIN {
+    use Bio::Root::Test;
+
+    test_begin(-tests => 7);
 
-BEGIN { 
-    use lib '.';
-	use Bio::Root::Test;
-	
-	test_begin(-tests => 7);
-    
-	use_ok('Bio::Coordinate::Graph');
+    use_ok('Bio::Coordinate::Graph');
 }
 
 ok my $graph = Bio::Coordinate::Graph->new();
 
 # graph structure
 my $dag = {
-	   9  => [],
-	   8  => [9],
-	   7  => [],
-	   6  => [7, 8],
-	   5  => [],
-	   4  => [5],
-	   3  => [6],
-	   2  => [3, 4, 6],
-	   1  => [2]
-	  };
+           9  => [],
+           8  => [9],
+           7  => [],
+           6  => [7, 8],
+           5  => [],
+           4  => [5],
+           3  => [6],
+           2  => [3, 4, 6],
+           1  => [2]
+          };
 
 ok $graph->hash_of_arrays($dag);
 
@@ -1,20 +1,17 @@
-# -*-Perl-*- Test Harness script for Bioperl
-# $Id$
-
 use strict;
+use warnings;
+
+BEGIN {
+    use Bio::Root::Test;
+
+    test_begin(-tests => 175);
 
-BEGIN { 
-    use lib '.';
-	use Bio::Root::Test;
-	
-	test_begin(-tests => 175);
-	
-	use_ok('Bio::Location::Simple');
-	use_ok('Bio::Coordinate::Pair');
-	use_ok('Bio::Coordinate::Result::Match');
-	use_ok('Bio::Coordinate::Result::Gap');
-	use_ok('Bio::Coordinate::Chain');
-	use_ok('Bio::Coordinate::Collection');
+    use_ok('Bio::Location::Simple');
+    use_ok('Bio::Coordinate::Pair');
+    use_ok('Bio::Coordinate::Result::Match');
+    use_ok('Bio::Coordinate::Result::Gap');
+    use_ok('Bio::Coordinate::Chain');
+    use_ok('Bio::Coordinate::Collection');
 }
 
 my ($c, $value);
@@ -23,16 +20,16 @@ ok $c = Bio::Coordinate::Result::Match-> new;
 ok $c = Bio::Coordinate::Result::Gap-> new;
 
 # propepide
-my $match1 = Bio::Location::Simple->new 
+my $match1 = Bio::Location::Simple->new
     (-seq_id => 'propeptide', -start => 21, -end => 40, -strand=>1 );
 # peptide
 my $match2 = Bio::Location::Simple->new
     (-seq_id => 'peptide', -start => 1, -end => 20, -strand=>1 );
 
 ok my $pair = Bio::Coordinate::Pair->new(-in => $match1,
-					 -out => $match2,
-					 -negative => 0, # false, default
-					);
+                                         -out => $match2,
+                                         -negative => 0, # false, default
+                                        );
 
 ok $pair->test;
 is $pair->strand(), 1; #  = in->strand * out->strand
@@ -45,7 +42,7 @@ my ($count, $pos, $pos2, $res, $match, $res2);
 #
 # match within
 #
-$pos = Bio::Location::Simple->new 
+$pos = Bio::Location::Simple->new
     (-start => 25, -end => 25, -strand=> -1 );
 
 # results are in Bio::Coordinate::Result
@@ -179,8 +176,8 @@ $match1 = Bio::Location::Simple->new
 $match2 = Bio::Location::Simple->new
     (-seq_id => 'to', -start => 2, -end => 11, -strand=>-1 );
 $pair = Bio::Coordinate::Pair->new(-in => $match1,
-				   -out => $match2
-				  );
+                                   -out => $match2
+                                  );
 #
 # match within
 #
@@ -232,7 +229,7 @@ is $res->match->end, 11;
 is $res->match->strand, 1;
 
 #
-# partial match2 =  match & gap 
+# partial match2 =  match & gap
 #
 
 $pos = Bio::Location::Simple->new
@@ -271,15 +268,15 @@ is $gap2->strand, -1;
 #
 
 # propepide
-$match1 = Bio::Location::Simple->new 
+$match1 = Bio::Location::Simple->new
     (-seq_id => 'propeptide', -start => 5, -end => 40, -strand=>1 );
 # peptide
 $match2 = Bio::Location::Simple->new
     (-seq_id => 'peptide', -start => 1, -end => 36, -strand=>1 );
 
 ok $pair = Bio::Coordinate::Pair->new(-in => $match1,
-					 -out => $match2
-					);
+                                      -out => $match2
+                                      );
 
 
 ok my $chain = Bio::Coordinate::Chain->new;
@@ -310,25 +307,25 @@ is $match->strand, 1;
 #         pair1     pair2
 
 # gene
-$match1 = Bio::Location::Simple->new 
+$match1 = Bio::Location::Simple->new
     (-seq_id => 'gene', -start => 5, -end => 9, -strand=>1 );
 # exon2
 $match2 = Bio::Location::Simple->new
     (-seq_id => 'exon1', -start => 1, -end => 5, -strand=>1 );
 
 ok my $pair1 = Bio::Coordinate::Pair->new(-in => $match1,
-					  -out => $match2,
-					);
+                                          -out => $match2,
+                                        );
 # gene
-my $match3 = Bio::Location::Simple->new 
+my $match3 = Bio::Location::Simple->new
     (-seq_id => 'gene', -start => 15, -end => 19, -strand=>1 );
 # exon
 my $match4 = Bio::Location::Simple->new
     (-seq_id => 'exon2', -start => 6, -end => 10, -strand=>1 );
 
 ok my $pair2 = Bio::Coordinate::Pair->new(-in => $match3,
-					  -out => $match4,
-					 );
+                                          -out => $match4,
+                                         );
 
 ok my $transcribe = Bio::Coordinate::Collection->new;
 ok $transcribe->add_mapper($pair1);
@@ -377,15 +374,15 @@ is $res->each_match, 2;
 #
 # create the third pair
 # gene
-my $match5 = Bio::Location::Simple->new 
+my $match5 = Bio::Location::Simple->new
     (-seq_id => 'gene', -start => 25, -end => 29, -strand=>1 );
 # exon
 my $match6 = Bio::Location::Simple->new
     (-seq_id => 'exon3', -start => 11, -end => 15, -strand=>1 );
 
 my $pair3 = Bio::Coordinate::Pair->new(-in => $match5,
-				       -out => $match6
-				      );
+                                       -out => $match6
+                                      );
 
 # create a new collection in wrong order
 $transcribe = Bio::Coordinate::Collection->new;
@@ -408,8 +405,8 @@ load_data($mapper, undef );
 
 # transform a segment entirely within the first rawcontig
 #test_transform ($mapper,
-#		[627012, 2, 5, -1, "rawcontig"],
-#		["chr1", 2, 5, -1]);
+#               [627012, 2, 5, -1, "rawcontig"],
+#               ["chr1", 2, 5, -1]);
 $pos = Bio::Location::Simple->new (-start => 2, -end => 5, -strand => -1);
 $res = $mapper->map($pos);
 is $res->match->start, 2;
@@ -419,9 +416,9 @@ is $res->match->seq_id, '627012';
 
 ## now a split coord
 my @testres = (
-	     [314696, 31917, 31937, -1],
-	     [341, 126, 59773, -1],
-	     [315843, 5332, 5963, +1]
+             [314696, 31917, 31937, -1],
+             [341, 126, 59773, -1],
+             [315843, 5332, 5963, +1]
 );
 $pos = Bio::Location::Simple->new (-start => 383700, -end => 444000, -strand => 1);
 $res = $mapper->map($pos);
@@ -432,9 +429,9 @@ compare (shift @res, shift @testres);
 
 ## now a simple gap
 @testres = (
-	    [627011, 7447, 7507, +1],
-	    ["chr1", 273762, 273781, 1]
-	   );
+            [627011, 7447, 7507, +1],
+            ["chr1", 273762, 273781, 1]
+           );
 $pos = Bio::Location::Simple->new (-start => 273701, -end => 273781, -strand => 1);
 $res = $mapper->map($pos);
 is $res->each_match, 1;
@@ -444,7 +441,7 @@ compare (shift @res, shift @testres);
 compare (shift @res, shift @testres);
 
 ok $mapper->swap;
-$pos = Bio::Location::Simple->new 
+$pos = Bio::Location::Simple->new
     (-start => 2, -end => 5, -strand => -1, -seq_id => '627012');
 $res = $mapper->map($pos);
 is $res->match->start, 2;
@@ -457,14 +454,14 @@ is $res->match->seq_id, 'chr1';
 #
 
 # testing a  simple pair
-$match1 = Bio::Location::Simple->new 
+$match1 = Bio::Location::Simple->new
     (-seq_id => 'a', -start => 5, -end => 17, -strand=>1 );
 $match2 = Bio::Location::Simple->new
     (-seq_id => 'b', -start => 1, -end => 13, -strand=>-1 );
 
 $pair = Bio::Coordinate::Pair->new(-in => $match1,
-					 -out => $match2,
-					);
+                                   -out => $match2,
+                                  );
 
 # split location
 
@@ -503,17 +500,17 @@ my $string;
 #BBB/1-7     -aaaat-tt-
 
 my $s1 = Bio::LocatableSeq->new(-id => 'AAA',
-			    -seq => '--wtatgtng',
-			    -start => 3,
-			    -end => 10,
-  			    -alphabet => 'dna'
-			    );
+                                -seq => '--wtatgtng',
+                                -start => 3,
+                                -end => 10,
+                                -alphabet => 'dna'
+                               );
 my $s2 = Bio::LocatableSeq->new(-id => 'BBB',
-			    -seq => '-aaaat-tt-',
-			    -start => 1,
-			    -end => 7,
-  			    -alphabet => 'dna'
-			    );
+                                -seq => '-aaaat-tt-',
+                                -start => 1,
+                                -end => 7,
+                                -alphabet => 'dna'
+                               );
 $a = Bio::SimpleAlign->new();
 $a->add_seq($s1);
 $a->add_seq($s2);
@@ -526,7 +523,7 @@ is $mapper->return_match, 1;
 is $mapper->return_match(1), 1;
 
 
-$pos = Bio::Location::Simple->new 
+$pos = Bio::Location::Simple->new
     (-start => 4, -end => 8, -strand => 1);
 $res = $mapper->map($pos);
 #print Dumper $res;
@@ -541,7 +538,7 @@ sub compare_arrays {
 
     return 0 unless @$first == @$second;
     for (my $i = 0; $i < @$first; $i++) {
-	return 0 if $first->[$i] ne $second->[$i];
+        return 0 if $first->[$i] ne $second->[$i];
     }
     return 1;
 }
@@ -550,7 +547,7 @@ sub compare_arrays {
 sub compare {
     my ($match, $test) = @_;
     is $match->seq_id eq $test->[0], 1,
-	"Match: |". $match->seq_id. "| Test: ". $test->[0]. "|";
+        "Match: |". $match->seq_id. "| Test: ". $test->[0]. "|";
     is $match->start, $test->[1];
     is $match->end, $test->[2];
     is $match->strand, $test->[3];
@@ -664,26 +661,26 @@ chr1	625357	1189804	1213915	1	24112	1
 chr1	625359	1214016	1216330	1	2315	1
 } );
     # test the auto-sorting feature
-    #	@sgp_dump = reverse (@sgp_dump) if defined $reverse; 
+    #	@sgp_dump = reverse (@sgp_dump) if defined $reverse;
 
     my $first = 1;
     for my $line ( @sgp_dump ) {
-	if( $first ) { $first = 0; next; }
-	my ( $chr_name, $contig_id, $chr_start, $chr_end,
-	     $contig_start, $contig_end, $contig_strand ) =
-		 split ( /\t/, $line );
-
-	my $match1 = Bio::Location::Simple->new
-	    (-seq_id => $chr_name, -start => $chr_start,
-	     -end => $chr_end, -strand=>1 );
-	my $match2 = Bio::Location::Simple->new
-	    (-seq_id => $contig_id, -start => $contig_start,
-	     -end => $contig_end, -strand=>$contig_strand );
-
-	my $pair = Bio::Coordinate::Pair->new(-in => $match1,
-					      -out => $match2,
-					     );
-	$map->add_mapper($pair);
+        if( $first ) { $first = 0; next; }
+        my ( $chr_name, $contig_id, $chr_start, $chr_end,
+             $contig_start, $contig_end, $contig_strand ) =
+                 split ( /\t/, $line );
+
+        my $match1 = Bio::Location::Simple->new
+            (-seq_id => $chr_name, -start => $chr_start,
+             -end => $chr_end, -strand=>1 );
+        my $match2 = Bio::Location::Simple->new
+            (-seq_id => $contig_id, -start => $contig_start,
+             -end => $contig_end, -strand=>$contig_strand );
+
+        my $pair = Bio::Coordinate::Pair->new(-in => $match1,
+                                              -out => $match2,
+                                             );
+        $map->add_mapper($pair);
     }
     return $map;
 }
@@ -1,18 +1,15 @@
-# -*-Perl-*- Test Harness script for Bioperl
-# $Id$
-
 use strict;
+use warnings;
 
-BEGIN { 
-    use lib '.';
+BEGIN {
     use Bio::Root::Test;
-    
+
     test_begin(-tests => 116);
-	
+
     use_ok('Bio::Location::Simple');
     use_ok('Bio::Coordinate::Pair');
     use_ok('Bio::Coordinate::ExtrapolatingPair');
-	use_ok('Bio::Coordinate::GeneMapper');
+    use_ok('Bio::Coordinate::GeneMapper');
 }
 
 #
@@ -29,10 +26,10 @@ my $inr = Bio::Location::Simple->new(-start=>2, -end=>5, -strand=>1);
 my $outr = Bio::Location::Simple->new(-start=>10, -end=>13, -strand=>-1);
 ok my $pairr = Bio::Coordinate::ExtrapolatingPair->
     new(-in => $inr,
-	-out => $outr
+        -out => $outr
        );
 
-my $posr = Bio::Location::Simple->new 
+my $posr = Bio::Location::Simple->new
     (-start => 3, -end => 4, -strand=> 1 );
 my $resr = $pairr->map($posr);
 is $resr->start, 11;
@@ -42,7 +39,7 @@ is $resr->strand, -1;
 
 
 # propepide
-my $match1 = Bio::Location::Simple->new 
+my $match1 = Bio::Location::Simple->new
     (-seq_id => 'propeptide', -start => 21, -end => 40, -strand=>1 );
 # peptide
 my $match2 = Bio::Location::Simple->new
@@ -50,8 +47,8 @@ my $match2 = Bio::Location::Simple->new
 
 ok my $pair = Bio::Coordinate::ExtrapolatingPair->
     new(-in => $match1,
-	-out => $match2,
-	-strict => 1
+        -out => $match2,
+        -strict => 1
        );
 
 ok $pair->test;
@@ -62,7 +59,7 @@ is $pair->strict(), 1;
 my ($count, $pos, $pos2, $res, $match, $res2);
 
 # match within
-$pos = Bio::Location::Simple->new 
+$pos = Bio::Location::Simple->new
     (-start => 25, -end => 25, -strand=> -1 );
 $res = $pair->map($pos);
 
@@ -114,7 +111,7 @@ is $res->end, 20;
 #
 
 # chr
-$match1 = Bio::Location::Simple->new 
+$match1 = Bio::Location::Simple->new
     (-seq_id => 'chr', -start => 21, -end => 40, -strand=>1 );
 # gene
 $match2 = Bio::Location::Simple->new
@@ -123,18 +120,18 @@ $match2 = Bio::Location::Simple->new
  $pair = Bio::Coordinate::ExtrapolatingPair->
 #my $pair = Bio::Coordinate::Pair->
     new(-in => $match1,
-	-out => $match2,
-	-strict => 0
+        -out => $match2,
+        -strict => 0
        );
 
-$pos = Bio::Location::Simple->new 
+$pos = Bio::Location::Simple->new
     (-start => 38, -end => 40, -strand=> 1 );
 $res = $pair->map($pos);
 is $res->start, 1;
 is $res->end, 3;
 is $res->strand, -1;
 
-$pos = Bio::Location::Simple->new 
+$pos = Bio::Location::Simple->new
     (-start => 1, -end => 3, -strand=> 1 );
 $res = $pair->map($pos);
 is $res->start, 38;
@@ -149,14 +146,14 @@ is $res->strand, -1;
 #
 
 ok my $m = Bio::Coordinate::GeneMapper->new(-in => 'propeptide',
-					   -out => 'peptide');
+                                            -out => 'peptide');
 #$m->verbose(2);
 
 is $m->peptide_offset(5), 5;
 
 
 # match within
-$pos = Bio::Location::Simple->new 
+$pos = Bio::Location::Simple->new
     (-start => 25, -end => 25, -strand=> 1 );
 $res = $m->map($pos);
 
@@ -171,7 +168,7 @@ is $res->seq_id, 'peptide';
 #
 
 # match within
-$pos = Bio::Location::Simple->new 
+$pos = Bio::Location::Simple->new
     (-start => 4, -end => 5, -strand=> 1 );
 $res = $m->map($pos);
 is $res->start, -1;
@@ -186,7 +183,7 @@ is $m->nozero(0), 0;
 
 
 ok $m->swap;
-$pos = Bio::Location::Simple->new 
+$pos = Bio::Location::Simple->new
     (-start => 5, -end => 5, -strand=> 1 );
 $res = $m->map($pos);
 is $res->start, 10;
@@ -203,7 +200,7 @@ ok $res = $m->_reverse_translate($pos);
 is $res->start, 13;
 is $res->end, 15;
 
-$pos = Bio::Location::Simple->new 
+$pos = Bio::Location::Simple->new
     (-start => 26, -end => 26, -strand=> 1 );
 $m->out('peptide');
 $res = $m->map($pos);
@@ -214,7 +211,7 @@ is $res->start, 4;
 # frame
 #
 
-$pos = Bio::Location::Simple->new 
+$pos = Bio::Location::Simple->new
     (-start => 1, -end => 3, -strand=> 1 );
 $res = $m->_frame($pos);
 is $res->start, 1;
@@ -232,11 +229,11 @@ is $res->end, 3;
 #         pair1     pair2     pair3
 
 # gene
-my $e1 = Bio::Location::Simple->new 
+my $e1 = Bio::Location::Simple->new
     (-seq_id => 'gene', -start => 5, -end => 9, -strand=>1 );
-my $e2 = Bio::Location::Simple->new 
+my $e2 = Bio::Location::Simple->new
     (-seq_id => 'gene', -start => 15, -end => 19, -strand=>1 );
-my $e3 = Bio::Location::Simple->new 
+my $e3 = Bio::Location::Simple->new
     (-seq_id => 'gene', -start => 25, -end => 29, -strand=>1 );
 my @cexons = ($e1, $e2, $e3);
 
@@ -257,7 +254,7 @@ is $res->start, 2;
 is $res->end, 3;
 
 $m->out('negative_intron');
-$pos = Bio::Location::Simple->new 
+$pos = Bio::Location::Simple->new
     (-start => 12, -end => 14, -strand=> 1 );
 $res = $m->map($pos);
 is $res->start, -3;
@@ -335,12 +332,12 @@ is $m->exons(@cexons), 3;
 
 # testing parameter handling in the constructor
 ok $m = Bio::Coordinate::GeneMapper->new(-in => 'gene',
-					-out => 'peptide',
-					-cds => 3,
-					-exons => @cexons,
-					-utr => 7,
-					-peptide_offset => 5
-				       );
+                                         -out => 'peptide',
+                                         -cds => 3,
+                                         -exons => @cexons,
+                                         -utr => 7,
+                                         -peptide_offset => 5
+                                        );
 
 
 #
@@ -427,13 +424,13 @@ $g2->exons(@exons);
 #map_snps($g2, @snp_dump);
 
 
-$match1 = Bio::Location::Simple->new 
+$match1 = Bio::Location::Simple->new
     (-seq_id => 'a', -start => 5, -end => 17, -strand=>1 );
 $match2 = Bio::Location::Simple->new
     (-seq_id => 'b', -start => 1, -end => 13, -strand=>-1 );
 ok $pair = Bio::Coordinate::Pair->new(-in => $match1,
-					 -out => $match2,
-					);
+                                      -out => $match2,
+                                     );
 
 #
 # split location
@@ -472,7 +469,7 @@ is $sublocs[1]->end, 12;
 # gene
 $e1 = Bio::Location::Simple->new
     (-seq_id => 'gene', -start => 5, -end => 9, -strand=>-1 );
-$e2 = Bio::Location::Simple->new 
+$e2 = Bio::Location::Simple->new
     (-seq_id => 'gene', -start => 15, -end => 19, -strand=>-1 );
 @cexons = ($e1, $e2);
 my $cds= Bio::Location::Simple->new
@@ -502,7 +499,7 @@ is $sublocs[1]->end, 16;
 $m->in('gene');
 $m->out('inex');
 
-$pos = Bio::Location::Simple->new 
+$pos = Bio::Location::Simple->new
     (-seq_id => 'gene', -start => 2, -end => 10, -strand=> 1 );
 
 $res = $m->map($pos);
@@ -542,34 +539,34 @@ sub read_gene_data {
     my ($first, $first_line);
     for my $line ( @gene_dump ) {
 
-	my ($geneid, $exon_start, $exon_end, $exon_cstart,
-	    $exon_cend, $exon_strand) = split /\t/, $line;
+        my ($geneid, $exon_start, $exon_end, $exon_cstart,
+            $exon_cend, $exon_strand) = split /\t/, $line;
 
-	$strand = $exon_strand if $exon_strand;
-	#print join (' ', $geneid, $exon_start, $exon_strand), "\n";
+        $strand = $exon_strand if $exon_strand;
+        #print join (' ', $geneid, $exon_start, $exon_strand), "\n";
 
-	# CDS location in chromosome coordinates
-	$cds_start = $exon_cstart if !$cds_start and $exon_cstart;
-	$cds_end = $exon_cend if $exon_cend;
+        # CDS location in chromosome coordinates
+        $cds_start = $exon_cstart if !$cds_start and $exon_cstart;
+        $cds_end = $exon_cend if $exon_cend;
 
 
-	if ($exon_start > $exon_end) {
-	    ($exon_start, $exon_end) = ($exon_end, $exon_start);
-	}
+        if ($exon_start > $exon_end) {
+            ($exon_start, $exon_end) = ($exon_end, $exon_start);
+        }
 
-	my $exon = Bio::Location::Simple->new
-	    (-seq_id => 'gene', -start => $exon_start,
-	     -end => $exon_end, -strand=>$strand, -verbose=>2);
-	push @exons, $exon;
-    }
+        my $exon = Bio::Location::Simple->new
+            (-seq_id => 'gene', -start => $exon_start,
+             -end => $exon_end, -strand=>$strand, -verbose=>2);
+        push @exons, $exon;
+        }
 
     if ($cds_start > $cds_end) {
-	($cds_start, $cds_end) = ($cds_end, $cds_start);
+        ($cds_start, $cds_end) = ($cds_end, $cds_start);
     }
 
     my $cdsr = Bio::Location::Simple->new (-start => $cds_start,
-					   -end => $cds_end,
-					   -strand=> $strand);
+                                           -end => $cds_end,
+                                           -strand=> $strand);
 
     return ($cdsr, @exons);
 }
@@ -580,26 +577,26 @@ sub map_snps {
     $mapper->in('chr');
     $mapper->out('cds');
     foreach my $line (@snps) {
-	$mapper->out('cds');
-
-	my ($chr, $start, $strand, $id) = split /\t/, $line;
-	my $loc = Bio::Location::Simple->new
-	    ( -start => $start,
-	     -end => $start, -strand=>$strand );
-
-	my $res = $mapper->map($loc);
-	my $cds_start = 0;
-	$cds_start = $res->start if defined $res;#defined $res->start;
-	print $id, "\t", $cds_start, "\n";
-
-	# coding
-	if ($cds_start) {
-	    $mapper->out('propeptide');
-	    my $frame_obj = $mapper->_frame($res);
-	    my $res = $mapper->map($loc);
-	    my $cds_start = 0;
-	    $cds_start = $res->start if defined $res;#defined $res->start;
-	    print  "\t\t", $cds_start, " (", $frame_obj->start, ")\n";
-	}
+        $mapper->out('cds');
+
+        my ($chr, $start, $strand, $id) = split /\t/, $line;
+        my $loc = Bio::Location::Simple->new
+            ( -start => $start,
+             -end => $start, -strand=>$strand );
+
+        my $res = $mapper->map($loc);
+        my $cds_start = 0;
+        $cds_start = $res->start if defined $res;#defined $res->start;
+        print $id, "\t", $cds_start, "\n";
+
+        # coding
+        if ($cds_start) {
+            $mapper->out('propeptide');
+            my $frame_obj = $mapper->_frame($res);
+            my $res = $mapper->map($loc);
+            my $cds_start = 0;
+            $cds_start = $res->start if defined $res;#defined $res->start;
+            print  "\t\t", $cds_start, " (", $frame_obj->start, ")\n";
+        }
     }
 }
@@ -156,7 +156,14 @@ my $test_files = [
         $count++;
     }
     is $count, 5;
-    unlink "$test_file.index";
+
+    # ActivePerl will not allow deletion if the tie-hash is still active
+    $db->DESTROY;
+    # Strawberry Perl temporary file
+    unlink "$test_file.index" if -e "$test_file.index";
+    # ActivePerl temporary files
+    unlink "$test_file.index.dir" if -e "$test_file.index.dir";
+    unlink "$test_file.index.pag" if -e "$test_file.index.pag";
 }
 
 
@@ -172,9 +179,22 @@ my $test_files = [
     is $db3->file('AW057336'), '3.fa';
     is $db1->file('AW057231'), '1.fa';
     is $db4->file('AW057410'), '3.fa';
-    unlink $db1->index_name;
-    unlink $db2->index_name;
-    unlink $db3->index_name;
+
+    # ActivePerl will not allow deletion if the tie-hash is still active
+    $db1->DESTROY;
+    $db2->DESTROY;
+    $db3->DESTROY;
+    # Strawberry Perl temporary file
+    unlink $db1->index_name if -e $db1->index_name;
+    unlink $db2->index_name if -e $db2->index_name;
+    unlink $db3->index_name if -e $db3->index_name;
+    # ActivePerl temporary files
+    unlink $db1->index_name().'.dir' if -e $db1->index_name().'.dir';
+    unlink $db2->index_name().'.dir' if -e $db2->index_name().'.dir';
+    unlink $db3->index_name().'.dir' if -e $db3->index_name().'.dir';
+    unlink $db1->index_name().'.pag' if -e $db1->index_name().'.pag';
+    unlink $db2->index_name().'.pag' if -e $db2->index_name().'.pag';
+    unlink $db3->index_name().'.pag' if -e $db3->index_name().'.pag';
 }
 
 
@@ -185,10 +205,25 @@ my $test_files = [
         -reindex => 1, -index_name => $name, -clean => 1,
     );
     is $db->index_name, $name;
-    ok -f $name;
-    unlink $name;
+
+    # Tied-hash in Strawberry Perl produce $name,
+    # while in ActivePerl produce "$name.dir" and "$name.pag"
+    if (-e "$name.pag") {
+        ok -f "$name.pag";
+        # ActivePerl will not allow deletion if the tie-hash is still active
+        $db->DESTROY;
+        unlink "$name.dir" if -e "$name.dir";
+        unlink "$name.pag" if -e "$name.pag";
+        ok ! -f "$name.pag";
+    }
+    else {
+        ok -f $name;
+        # ActivePerl will not allow deletion if the tie-hash is still active
+        $db->DESTROY;
+        unlink $name if -e $name;
+        ok ! -f $name;
+    }
     undef $db;
-    ok ! -f $name;
 }
 
 
@@ -265,7 +300,15 @@ my $test_files = [
         gi|61679760|pdb|1Y4P|B
     )];
     like $db->index_name, qr/^fileset_.+\.index$/;
-    unlink $db->index_name;
+
+    my $index = $db->index_name;
+    # ActivePerl will not allow deletion if the tie-hash is still active
+    $db->DESTROY;
+    # Strawberry Perl temporary file
+    unlink $index if -e $index;
+    # ActivePerl temporary files
+    unlink "$index.dir" if -e "$index.dir";
+    unlink "$index.pag" if -e "$index.pag";
 }
 
 
@@ -298,14 +341,19 @@ my $test_files = [
 
     # Remove temporary test file
     my $outfile = test_input_file('spaced_fasta.fa').'.index';
-    unlink $outfile;
-}
 
+    # ActivePerl will not allow deletion if the tie-hash is still active
+    $db->DESTROY;
+    # Strawberry Perl temporary file
+    unlink $outfile if -e $outfile;
+    # ActivePerl temporary files
+    unlink "$outfile.dir" if -e "$outfile.dir";
+    unlink "$outfile.pag" if -e "$outfile.pag";
+}
 
 exit;
 
 
-
 sub extract_gi {
     # Extract GI from RefSeq
     my $header = shift;
@@ -15,8 +15,6 @@ BEGIN {
 	use_ok('Bio::Index::Blast');
 }
 
-END {  unlink qw( Wibbl Wibbl.pag Wibbl.dir Wibbl.index); }
-
 # BLASTP
 
 my $index = Bio::Index::Blast->new(-filename => 'Wibbl',
@@ -41,6 +39,9 @@ foreach my $id ( qw(CATH_RAT PAPA_CARPA) ) {
 	
 	like( $index->fetch_report($id)->query_name, qr/$id/);
 }
+# ActivePerl will not allow deletion if the tie-hash is still active
+$index->DESTROY;
+unlink qw( Wibbl Wibbl.pag Wibbl.dir );
 
 # RPS-BLAST
 
@@ -63,3 +64,6 @@ foreach my $id ( qw(orf20 orf40) ) {
 	
 	like( $index->fetch_report($id)->query_name, qr/$id/);
 }
+# ActivePerl will not allow deletion if the tie-hash is still active
+$index->DESTROY;
+unlink qw( Wibbl.index Wibbl.index.pag Wibbl.index.dir );
@@ -41,6 +41,8 @@ for my $file (@test_cases) {
         
         like( $index->fetch_report($id)->query_name, qr/$id/);
     }
+    # ActivePerl will not allow deletion if the tie-hash is still active
+    $index->DESTROY;
     unlink qw( Wibbl Wibbl.pag Wibbl.dir Wibbl.index);
 }
 
@@ -52,4 +54,3 @@ sub my_id_parser {
         return;
     }
 }
-
@@ -7,7 +7,7 @@ BEGIN {
    use lib '.';
    use Bio::Root::Test;
    
-   test_begin(-tests => 69,
+   test_begin(-tests => 73,
               -requires_modules => [qw(DB_File
                                        Storable
                                        Fcntl)]);
@@ -19,6 +19,7 @@ BEGIN {
    use_ok('Bio::Index::GenBank');
    use_ok('Bio::Index::Stockholm');
    use_ok('Bio::Index::Swissprot');
+   use_ok('Bio::Index::Hmmer');
    use_ok('Bio::DB::InMemoryCache');
    use_ok('Bio::DB::InMemoryCache');
 }
@@ -188,6 +189,16 @@ ok ( -e "Wibbl6" );
 my $aln = $st_ind->fetch_aln('PF00244');
 isa_ok($aln,'Bio::SimpleAlign');
 
+# test Hmmer
+my $hmmer_ind = Bio::Index::Hmmer->new(-filename => 'Wibbl7',
+                                       -write_flag => 1,
+                                       -verbose    => 0);
+isa_ok $hmmer_ind, 'Bio::Index::Hmmer';
+$hmmer_ind->make_index(test_input_file('hmmpfam_multiresult.out'));
+ok ( -e "Wibbl7" );
+my $hmm_result = $hmmer_ind->fetch_report('lcl|gi|340783625|Plus1');
+is ($hmm_result->query_description, 'megaplasmid, complete sequence [UNKNOWN]');
+
 
 
 
@@ -202,7 +213,7 @@ END {
 }
 
 sub cleanup {
-   for my $root ( qw( Wibbl Wibbl2 Wibbl3 Wibbl4 Wibbl5 Wibbl6
+   for my $root ( qw( Wibbl Wibbl2 Wibbl3 Wibbl4 Wibbl5 Wibbl6 Wibbl7
                       multifa_index multifa_qual_index ) ) {
       unlink $root if( -e $root );
       unlink "$root.pag" if( -e "$root.pag");
@@ -8,7 +8,8 @@ BEGIN {
     use lib '.','..','./t/lib';
     use Bio::Root::Test;
 
-    test_begin(-tests => TEST_COUNT);
+    test_begin(-tests           => TEST_COUNT,
+               -requires_module => 'DB_File');
 
     $ENV{ORACLE_HOME} ||= '/home/oracle/Home';
     use_ok('Bio::SeqFeature::Generic');
@@ -4,7 +4,8 @@ use warnings;
 BEGIN {
 	use lib '.';
     use Bio::Root::Test;
-    test_begin(-tests => 115);
+    test_begin(-tests           => 115,
+               -requires_module => 'DB_File');
     
     use_ok('Bio::Matrix::PSM::IO');
     use_ok('Bio::DB::TFBS');
@@ -94,12 +94,9 @@ sub test_markers
     is scalar (keys %grps), 4;
     is $pos, 36;
     is @ctgpos, 165;
-    TODO: {
-        local $TODO = "Possible hash randomization-related bug, sum of contig pos values sometimes fails with off-by-one";
-        my $sum = 0;
-        $sum += $_ for @ctgpos;
-        is $sum, 1249;
-    }
+    my $sum = 0;
+    $sum += $_ for @ctgpos;
+    is $sum, 1177;
 }
 
 #########################################################
@@ -4,25 +4,24 @@
 use strict;
 
 BEGIN {
-	use lib '.';
+    use lib '.';
     use Bio::Root::Test;
-    
+
     test_begin(-tests => 69,
-			   -requires_modules => [qw(XML::Parser::PerlSAX
-									    XML::Parser
-										Graph::Directed)]);
-	
-	use_ok('Bio::OntologyIO');
+               -requires_modules => [qw(XML::Parser::PerlSAX
+                                        XML::Parser
+                                        Graph::Directed)]);
+    use_ok('Bio::OntologyIO');
 }
 use Data::Dumper;
 
-my $ipp = Bio::OntologyIO->new( -format => 'interpro',
-										  -file => test_input_file('interpro_short.xml'),
-										  -ontology_engine => 'simple' );
+my $ipp = Bio::OntologyIO->new( -format          => 'interpro',
+                                -file            => test_input_file('interpro_short.xml'),
+                                -ontology_engine => 'simple' );
 isa_ok ($ipp, 'Bio::OntologyIO::InterProParser');
 
 my $ip;
-while(my $ont = $ipp->next_ontology()) {
+while(my $ont = $ipp->next_ontology) {
     # there should be only one ontology
     is ($ip, undef);
     $ip = $ont;
@@ -30,24 +29,23 @@ while(my $ont = $ipp->next_ontology()) {
 # we grep for defined values because we don't want a list of undefined values to be pass any test
 my @leaves = $ip->get_leaf_terms;
 ok( ( grep { defined } map { $_->get_dbxrefs } @leaves), 'get_dbxrefs on leaf terms is non-empty');
-ok( ( grep { defined } map { $_->get_dbxrefs('member_list') } @leaves), 'get_dbxrefs(member_list) on leaf terms is non-empty');
-ok( ( grep { defined } map { $_->get_dbxrefs('sec_list') } @leaves),    'get_dbxrefs(sec_list) on leaf terms is non-empty');
-ok( ( grep { defined } map { $_->get_dbxrefs('class_list') } @leaves),  'get_dbxrefs(class_list) on leaf terms is non-empty');
-ok( ( grep { defined } map { $_->get_dbxrefs('pub_list') } @leaves),    'get_dbxrefs(pub_list) on leaf terms is non-empty');
-ok( ( grep { defined } map { $_->get_dbxrefs('example_list') } @leaves),'get_dbxrefs(example_list) on leaf terms is non-empty');
+ok( ( grep { defined } map { $_->get_dbxrefs('member_list') }       @leaves), 'get_dbxrefs(member_list) on leaf terms is non-empty');
+ok( ( grep { defined } map { $_->get_dbxrefs('sec_list') }          @leaves), 'get_dbxrefs(sec_list) on leaf terms is non-empty');
+ok( ( grep { defined } map { $_->get_dbxrefs('class_list') }        @leaves), 'get_dbxrefs(class_list) on leaf terms is non-empty');
+ok( ( grep { defined } map { $_->get_dbxrefs('pub_list') }          @leaves), 'get_dbxrefs(pub_list) on leaf terms is non-empty');
+ok( ( grep { defined } map { $_->get_dbxrefs('example_list') }      @leaves), 'get_dbxrefs(example_list) on leaf terms is non-empty');
 ok( ( grep { defined } map { $_->get_dbxrefs('external_doc_list') } @leaves), 'get_dbxrefs(external_doc_list) on leaf terms is non-empty');
 
-ok( ( grep { defined } map { $_->get_members } @leaves), 'get_members on leaf terms is non-empty');
-ok( ( grep { defined } map { $_->class_list } @leaves), 'class_list on leaf terms is non-empty');
-ok( ( grep { defined } map { $_->get_examples } @leaves), 'get_examples on leaf terms is non-empty');
+ok( ( grep { defined } map { $_->get_members }            @leaves), 'get_members on leaf terms is non-empty');
+ok( ( grep { defined } map { $_->class_list }             @leaves), 'class_list on leaf terms is non-empty');
+ok( ( grep { defined } map { $_->get_examples }           @leaves), 'get_examples on leaf terms is non-empty');
 ok( ( grep { defined } map { $_->get_external_documents } @leaves), 'get_external_documents on leaf terms is non-empty');
-ok( ( grep { defined } map { $_->get_references } @leaves), 'get_references on leaf terms is non-empty');
-ok( ( grep { defined } map { $_->protein_count } @leaves), 'protein_count on leaf terms is non-empty');
+ok( ( grep { defined } map { $_->get_references }         @leaves), 'get_references on leaf terms is non-empty');
+ok( ( grep { defined } map { $_->protein_count }          @leaves), 'protein_count on leaf terms is non-empty');
 
-# this could greatly be improved
+# this could greatly be improved (note: @leaves elements currently come in random order)
 like( $leaves[0]->to_string, qr/-- InterPro id:/, 'to_string looks reasonable');
 
-
 # there should be 8 root terms: InterPro Domain, InterPro Family,
 # InterPro Repeat, and InterPro PTM (Post Translational Modification),
 # Active_site, Binding_site, Conserved_site and Region
@@ -56,34 +54,34 @@ my @rt = sort { $a->name cmp $b->name; } $ip->get_root_terms();
 is (scalar(@rt), 8, 'There are 8 root InterPro terms');
 
 # every InterPro term should have an ontology,
-foreach ($ip->get_leaf_terms, @rt) {
-	isa_ok ($_->ontology, 'Bio::Ontology::Ontology');
-	is ($_->ontology->name, "InterPro",
-		 "term ".$_->name." in ontology InterPro");
+foreach my $term ($ip->get_leaf_terms, @rt) {
+    isa_ok ($term->ontology, 'Bio::Ontology::Ontology');
+    is ($term->ontology->name, "InterPro", "term ".$term->name." in ontology InterPro");
 }
 
 # there are 10 fully instantiated InterPro terms in total, which should be returned as the leafs
-is (scalar($ip->get_leaf_terms()), 10);
+is (scalar($ip->get_leaf_terms), 10);
 # roots and leafs together:
-is (scalar($ip->get_all_terms()), 15);
+is (scalar($ip->get_all_terms), 15);
 
 # descendants and children (synonymous here because of depth 1)
 # note that the sort should have placed Domain first and Family second
 is (scalar($ip->get_descendant_terms($rt[3])), 4); # 4 InterPro Domains
-is (scalar($ip->get_child_terms($rt[3])), 4);      # dto.
+is (scalar($ip->get_child_terms($rt[3])),      4); # dto.
 is (scalar($ip->get_descendant_terms($rt[4])), 3); # 3 Interpro Family
-is (scalar($ip->get_child_terms($rt[4])), 3);      # dto.
+is (scalar($ip->get_child_terms($rt[4])),      3); # dto.
 
 # test for ancestors and parents (synonymous here because of depth 1)
 foreach my $t ($ip->get_leaf_terms) {
-	# every InterPro term has exactly one parent - namely either 
-	# Domain, Region, Family, Repeat, or PTM(Post Transl. Modification)
+    # every InterPro term has exactly one parent - namely either
+    # Domain, Region, Family, Repeat, or PTM(Post Transl. Modification)
 
-	if (!($t->identifier eq "Repeat" || $t->identifier eq "PTM" || $t->identifier eq "Region"
-			|| $t->identifier =~ '_site' )) {
-		is (scalar($ip->get_parent_terms($t)), 1, $t->name . " term has one parent");
-		is (scalar($ip->get_ancestor_terms($t)), 1, $t->name . " term has one ancestor");
-	}
+    if (not (   $t->identifier eq "Repeat" or $t->identifier eq "PTM"
+             or $t->identifier eq "Region" or $t->identifier =~ '_site' )
+        ) {
+        is (scalar($ip->get_parent_terms($t)),   1, $t->name . " term has one parent");
+        is (scalar($ip->get_ancestor_terms($t)), 1, $t->name . " term has one ancestor");
+    }
 }
 
 # test for secondary accession map
@@ -3,15 +3,16 @@
 
 use strict;
 
-BEGIN { 
+BEGIN {
     use lib '.';
     use Bio::Root::Test;
-    
-    test_begin(-tests => 36,
-			   -requires_modules => [qw(IO::String LWP::UserAgent)],
-			   -requires_networking => 1);
-	
-	use_ok('Bio::DB::BioFetch');
+
+    test_begin(-tests               => 36,
+               -requires_modules    => [qw(IO::String
+                                           LWP::UserAgent)],
+               -requires_networking => 1);
+
+    use_ok('Bio::DB::BioFetch');
 }
 
 my $verbose = test_debug();
@@ -21,114 +22,115 @@ my $dbwarn = "Warning: Couldn't connect to EMBL with Bio::DB::BioFetch!\n";
 my ($db,$db2,$seq,$seqio);
 
 SKIP :{
-	# get a single seq
-	ok defined($db = Bio::DB::BioFetch->new(-verbose => $verbose));
-	# get a RefSeq entry
-	ok $db->db('refseq');
-	eval {
-		$seq = $db->get_Seq_by_acc('NM_006732'); # RefSeq VERSION
-	};
-	skip($dbwarn, 4) if $@;
-	isa_ok($seq, 'Bio::SeqI');
-	is($seq->accession_number,'NM_006732');
-	is($seq->accession_number,'NM_006732');
-	is( $seq->length, 3776);
+    # get a single seq
+    ok defined($db = Bio::DB::BioFetch->new(-verbose => $verbose));
+    # get a RefSeq entry
+    ok $db->db('refseq');
+    eval {
+        $seq = $db->get_Seq_by_acc('NM_006732'); # RefSeq VERSION
+    };
+    skip($dbwarn, 4) if $@;
+    isa_ok($seq, 'Bio::SeqI');
+    is($seq->accession_number,'NM_006732');
+    is($seq->accession_number,'NM_006732');
+    is( $seq->length, 3776);
 }
 
 SKIP: {
-	# EMBL
-	$db->db('embl');
-	eval {
-		$seq = $db->get_Seq_by_acc('J02231');    
-	};
-	skip($dbwarn, 3) if $@;
-	isa_ok($seq, 'Bio::SeqI');
-	is($seq->id, 'J02231');
-	is($seq->length, 200);
+    # EMBL
+    $db->db('embl');
+    eval {
+        $seq = $db->get_Seq_by_acc('J02231');
+    };
+    skip($dbwarn, 3) if $@;
+    isa_ok($seq, 'Bio::SeqI');
+    is($seq->id, 'J02231');
+    is($seq->length, 200);
 }
 
 SKIP: {
-	eval {
-		$seqio = $db->get_Stream_by_id(['AEE33958']);
-	};
-	skip($dbwarn, 3) if $@;
-	undef $db; # testing to see if we can remove gb
-	$seq = $seqio->next_seq();
-	isa_ok($seqio, 'Bio::SeqIO');
-	isa_ok($seq, 'Bio::SeqI');
-	cmp_ok( $seq->length, '>=', 1);
+    eval {
+        $seqio = $db->get_Stream_by_id(['AEE33958']);
+    };
+    skip($dbwarn, 3) if $@;
+    undef $db; # testing to see if we can remove gb
+    $seq = $seqio->next_seq();
+    isa_ok($seqio, 'Bio::SeqIO');
+    isa_ok($seq, 'Bio::SeqI');
+    cmp_ok( $seq->length, '>=', 1);
 }
 
 SKIP: {
-	#swissprot
-	ok $db2 = Bio::DB::BioFetch->new(-db => 'swissprot');
-	eval {
-		$seq = $db2->get_Seq_by_id('YNB3_YEAST');
-	};
-	skip($dbwarn, 5) if $@;
-	isa_ok($seq, 'Bio::SeqI');
-	is($seq->length, 125);
-	is($seq->division, 'YEAST');
-	$db2->request_format('fasta');
-	eval {
-		$seq = $db2->get_Seq_by_acc('P43780');
-	};
-	skip($dbwarn, 2) if $@;
-	isa_ok($seq, 'Bio::SeqI');
-	is($seq->length,103);
+    #swissprot
+    ok $db2 = Bio::DB::BioFetch->new(-db => 'swissprot');
+    eval {
+        $seq = $db2->get_Seq_by_id('YNB3_YEAST');
+    };
+    skip($dbwarn, 5) if $@;
+    isa_ok($seq, 'Bio::SeqI');
+    is($seq->length, 125);
+    is($seq->division, 'YEAST');
+    $db2->request_format('fasta');
+    eval {
+        $seq = $db2->get_Seq_by_acc('P43780');
+    };
+    skip($dbwarn, 2) if $@;
+    isa_ok($seq, 'Bio::SeqI');
+    is($seq->length,103);
 }
 
 $seq = $seqio = undef;
 
 SKIP: {
-	ok $db = Bio::DB::BioFetch->new(-retrievaltype => 'tempfile',
-					 -format => 'fasta',
-					 -verbose => $verbose
-					);
-	$db->db('embl');
-	eval {
-		$seqio = $db->get_Stream_by_id('J00522 AF303112 J02231');
-	};
-	skip($dbwarn, 7) if $@;
-	my %seqs;
-	# don't assume anything about the order of the sequences
-	while ( my $s = $seqio->next_seq ) {
-		isa_ok($s, 'Bio::SeqI');
-		my ($type,$x,$name) = split(/\|/,$s->display_id);
-		$seqs{$x} = $s->length;
-	}
-	isa_ok($seqio, 'Bio::SeqIO');
-	is($seqs{'J00522'},408);
-	is($seqs{'AF303112'},1611);
-	is($seqs{'J02231'},200);
+    ok $db = Bio::DB::BioFetch->new(-retrievaltype => 'tempfile',
+                                    -format        => 'fasta',
+                                    -verbose       => $verbose
+                                    );
+    $db->db('embl');
+    eval {
+        $seqio = $db->get_Stream_by_id('J00522 AF303112 J02231');
+    };
+    skip($dbwarn, 7) if $@;
+    my %seqs;
+    # don't assume anything about the order of the sequences
+    while ( my $s = $seqio->next_seq ) {
+        isa_ok($s, 'Bio::SeqI');
+        my ($type,$x,$name) = split(/\|/,$s->display_id);
+        $seqs{$x} = $s->length;
+    }
+    isa_ok($seqio, 'Bio::SeqIO');
+    is($seqs{'J00522'},408);
+    is($seqs{'AF303112'},1611);
+    is($seqs{'J02231'},200);
 }
 
 SKIP: {
-	ok $db = Bio::DB::BioFetch->new(-db => 'embl', -verbose => $verbose ? $verbose : -1);
-	
-	# check contig warning (WebDBSeqI)
-	eval {
-		$seq = $db->get_Seq_by_acc('NT_006732');
-	};
-	like($@, qr{contigs are whole chromosome files}, 'contig warning');
-	eval {
-		$seq = $db->get_Seq_by_acc('NM_006732');
-	};
-	skip($dbwarn, 3) if $@;
-	isa_ok($seq, 'Bio::SeqI');
-	is($seq->length,3776);
+    ok $db = Bio::DB::BioFetch->new(-db      => 'embl',
+                                    -verbose => $verbose ? $verbose : -1);
+
+    # check contig warning (WebDBSeqI)
+    eval {
+        $seq = $db->get_Seq_by_acc('NT_006732');
+    };
+    like($@, qr{contigs are whole chromosome files}, 'contig warning');
+    eval {
+        $seq = $db->get_Seq_by_acc('NM_006732');
+    };
+    skip($dbwarn, 2) if $@;
+    isa_ok($seq, 'Bio::SeqI');
+    is($seq->length,3776);
 }
-    
+
 # unisave
 SKIP: {
-	ok $db = Bio::DB::BioFetch->new(-db => 'unisave',
-				   -verbose => $verbose);
-	eval {
-		$seq = $db->get_Seq_by_acc('LAM1_MOUSE');
-	};
-	skip($dbwarn, 3) if $@;
-	isa_ok($seq, 'Bio::SeqI');
-	is($seq->display_id, 'LAM1_MOUSE');
-	is($seq->accession, 'P14733');   
-	is($seq->length, 587);   
+    ok $db = Bio::DB::BioFetch->new(-db      => 'unisave',
+                                    -verbose => $verbose);
+    eval {
+        $seq = $db->get_Seq_by_acc('LAM1_MOUSE');
+    };
+    skip($dbwarn, 4) if $@;
+    isa_ok($seq, 'Bio::SeqI');
+    is($seq->display_id, 'LAM1_MOUSE');
+    is($seq->accession, 'P14733');
+    is($seq->length, 587);
 }
@@ -30,12 +30,9 @@ throws_ok {$tobj->hiv_query(bless({},"narb"))} qr/BadParameter/, "bad type set e
 
 #stream tests
 my $fas = test_output_file();
-open( FAS, ">", $fas ) or die;
-print FAS ">goob\natcg\n";
-close(FAS);
+open my $FAS, '>', $fas or die "Could not write file '$fas': $!\n";
+print $FAS ">goob\natcg\n";
+close $FAS;
 ok( $tobj->source_stream(new Bio::SeqIO(-file=>$fas, -format=>'fasta')), "attach stream");
 throws_ok {$tobj->write_seq(new Bio::Seq(-sequence=>"atcg"))} qr/IOException/, "write exception";
 ok( $tobj->next_seq, "access stream");
-
-
-
@@ -103,14 +103,17 @@ SKIP: {
 	my $hlpf = test_output_file();
 	my $a = 0;
 	my $html = 0;
-	my $h = HTML::Parser->new( empty_element_tags=>1, start_h => [sub {$a++; (shift eq 'html') && ($a==1) && $html++}, "tagname"], end_h => [sub {$a--; (shift eq 'html') && ($a==0) && $html++;}, "tagname"] );
+	my $h = HTML::Parser->new(empty_element_tags => 1,
+				  start_h => [sub {$a++; (shift eq 'html') && ($a==1) && $html++;}, "tagname"],
+				  end_h   => [sub {$a--; (shift eq 'html') && ($a==0) && $html++;}, "tagname"] );
 	ok($tobj->help($hlpf), "help html to file");
 	{
 		local $/;
 		undef $/;
-		open HP, $hlpf;
-		$h->parse(<HP>);
+		open my $HP, '<', $hlpf or die "Could not read file '$hlpf': $!\n";
+		$h->parse(<$HP>);
 		is_deeply([$a, $html], [0, 2], "help html parsed");
+		close $HP; # Always explicitly close filehandles
 		1;
 	}
 
@@ -27,6 +27,6 @@ SKIP: {
     is $t->each_twig(), 2;
     eval {$t = $mesh->get_exact_term("Sinus Thrombosis, Intracranial");};
     skip "Couldn't connect to MeSH with Bio::DB::MeSH. Skipping those tests", 2 if $@;
-    is $t->description, "Thrombus formation in an intracranial venous sinus, including the superior sagittal, cavernous, lateral, and petrous sinuses. Etiologies include thrombosis due to infection,  DEHYDRATION, coagulation disorders (see  THROMBOPHILIA), and  CRANIOCEREBRAL TRAUMA.";
+    is $t->description, "Formation or presence of a blood clot (THROMBUS) in the CRANIAL SINUSES, large endothelium-lined venous channels situated within the SKULL. Intracranial sinuses, also called cranial venous sinuses, include the superior sagittal, cavernous, lateral, petrous sinuses, and many others. Cranial sinus thrombosis can lead to severe HEADACHE; SEIZURE; and other neurological defects.";
     is $t->id, "D012851";
 }
@@ -4,28 +4,28 @@
 use strict;
 
 BEGIN {
-	use lib '.';
-	use Bio::Root::Test;
+    use lib '.';
+    use Bio::Root::Test;
 
-	test_begin(-tests => 23,
-			   -requires_modules => [qw(IO::String
-									    LWP::UserAgent
-										HTTP::Request::Common)],
-			   -requires_networking => 1);
+    test_begin(-tests               => 23,
+               -requires_modules    => [qw(IO::String
+                                           LWP::UserAgent
+                                           HTTP::Request::Common)],
+               -requires_networking => 1);
 
-	use_ok('Bio::DB::SwissProt');
+    use_ok('Bio::DB::SwissProt');
 }
 
-ok my $gb = Bio::DB::SwissProt->new(-retrievaltype =>'pipeline',
-                                 -delay => 0);
+ok my $gb = Bio::DB::SwissProt->new(-retrievaltype => 'pipeline',
+                                    -delay         => 0);
 
 my %expected_lengths = (
-                        'NDP_MOUSE' => 131,
-                        'NDP_HUMAN' => 133,
-                        'BOLA_HAEIN'=> 103,
-                        'YNB3_YEAST'=> 125,
-                        'O39869'    => 56,
-                        'DEGP_CHLTR'=> 497,
+                        'NDP_MOUSE'   => 131,
+                        'NDP_HUMAN'   => 133,
+                        'BOLA_HAEIN'  => 103,
+                        'YNB3_YEAST'  => 125,
+                        'O39869'      => 56,
+                        'DEGP_CHLTR'  => 497,
                         'DEGPL_CHLTR' => 497
                         );
 
@@ -64,18 +64,18 @@ SKIP: {
 }
 
 # test idtracker() method
-ok $gb = Bio::DB::SwissProt->new(-retrievaltype =>'pipeline',
-                                 -delay => 0,
-                                 -verbose   => 2);
+ok $gb = Bio::DB::SwissProt->new(-retrievaltype => 'pipeline',
+                                 -delay         => 0,
+                                 -verbose       => 2);
 
 SKIP: {
     my $map;
     # check old ID
     eval {$map = $gb->id_mapper(-from => 'ACC+ID',
-                                  -to   => 'ACC',
-                                  -ids  => [qw(MYOD1_PIG PYRC_YEAST)])
-                                  };
-    skip("Problem with idtracker(), skipping these tests: $@", 3) if $@;
+                                -to   => 'ACC',
+                                -ids  => [qw(MYOD1_PIG PYRC_YEAST)]
+                                )};
+    skip("Problem with idtracker(), skipping these tests: $@", 6) if $@;
 
     cmp_ok(@{$map->{MYOD1_PIG}}, '>=', 1);
     is($map->{MYOD1_PIG}[0], 'P49811');
@@ -84,9 +84,9 @@ SKIP: {
 
     eval {$map = $gb->id_mapper(-from => 'ACC+ID',
                                 -to   => 'EMBL',
-                                -ids  => [qw(PYRC_YEAST)])
-                                  };
-    skip("Problem with idtracker(), skipping these tests: $@", 1) if $@;
+                                -ids  => [qw(PYRC_YEAST)]
+                                )};
+    skip("Problem with idtracker(), skipping these tests: $@", 2) if $@;
 
     cmp_ok(@{$map->{PYRC_YEAST}}, '>=', 2);
     like($map->{PYRC_YEAST}[0], qr/^[A-Z0-9]/);
@@ -8,8 +8,9 @@ BEGIN {
     use Bio::Root::Test;
 
     test_begin(
-        -tests => 191,
-        -requires_module => 'XML::Twig'
+        -tests            => 191,
+        -requires_modules => [ 'DB_File',
+                               'XML::Twig' ]
     );
 
     use_ok('Bio::DB::Taxonomy');
@@ -408,4 +409,3 @@ ok $node2 = $db_list->get_taxon( -names => [ 'o__Chroococcales', 'g__Microcoleus
 is $node2->scientific_name, $node1->scientific_name;
 is $node2->id, $node1->id;
 is $node2->internal_id, $node1->internal_id;
-
@@ -4,20 +4,20 @@
 use strict;
 
 BEGIN {
-	eval {require Error;};
-	
-	use lib '.';
-	use Bio::Root::Test;
-	
-	test_begin(-tests => 8,
-			   -requires_module => 'Error');
-	
-	use lib './examples/root/lib';
-	use_ok('TestObject');
+    eval {require Error;};
+
+    use lib '.';
+    use Bio::Root::Test;
+
+    test_begin(-tests => 8,
+               -requires_module => 'Error');
+
+    use lib './examples/root/lib';
+    use_ok('TestObject');
 }
 
 use Error qw(:try);
-$Error::Debug = test_debug(); 
+$Error::Debug = test_debug();
 
 # Set up a tester object.
 ok my $test = TestObject->new(-verbose => test_debug());
@@ -27,17 +27,17 @@ is $test->data('Eeny meeny miney moe.'), 'Eeny meeny miney moe.';
 # This demonstrates what will happen if a method defined in an
 # interface that is not implemented in the implementating object.
 
-eval { 
+eval {
     try {
-		$test->foo();
+        $test->foo();
     }
     catch Bio::Root::NotImplemented with {
-		my $err = shift;
-		is ref $err, 'Bio::Root::NotImplemented';
+        my $err = shift;
+        is ref $err, 'Bio::Root::NotImplemented';
     };
 };
 
-# TestObject::bar() deliberately throws a Bio::TestException, 
+# TestObject::bar() deliberately throws a Bio::TestException,
 # which is defined in TestObject.pm
 try {
     $test->bar;
@@ -63,9 +63,9 @@ catch Bio::Root::Exception with {
 # capture it. Handy eh?
 
 try {
-	$test->foobar();
+    $test->foobar();
 }
 otherwise {
-	my $err = shift;
-	is ref $err, 'Error::Simple';
-}; 
+    my $err = shift;
+    is ref $err, 'Error::Simple';
+};
@@ -87,7 +87,7 @@ is_deeply([Bio::Root::HTTPget->authentication], [undef, undef]);
 Bio::Root::HTTPget::proxy('http', $TEST_PROXY);
 Bio::Root::HTTPget::authentication(@TEST_AUTHENTICATION);
 is (Bio::Root::HTTPget::proxy('http'), $TEST_PROXY);
-is_deeply([Bio::Root::HTTPget::authentication], \@TEST_AUTHENTICATION);
+is_deeply([Bio::Root::HTTPget->authentication], \@TEST_AUTHENTICATION);
 
 # check to make sure new instance attributes are not polluted by class attrbutes
 # from previous tests
@@ -0,0 +1,424 @@
+# -*-Perl-*- Test Harness script for Bioperl
+
+use strict;
+use warnings;
+
+BEGIN {
+    use lib '.';
+    use Bio::Root::Test;
+    test_begin(-tests => 154);
+    use_ok 'Bio::Root::IO';
+}
+
+
+ok my $obj = Bio::Root::IO->new();
+isa_ok $obj, 'Bio::Root::IO';
+
+
+#############################################
+# tests for exceptions/debugging/verbosity
+#############################################
+
+throws_ok { $obj->throw('Testing throw') } qr/Testing throw/, 'Throw';
+
+$obj->verbose(-1);
+throws_ok { $obj->throw('Testing throw') } qr/Testing throw/;
+
+eval { $obj->warn('Testing warn') };
+ok !$@, 'Warn';
+
+$obj->verbose(1);
+throws_ok { $obj->throw('Testing throw') } qr/Testing throw/;
+
+ok my @stack = $obj->stack_trace(), 'Stack trace';
+is scalar @stack, 2;
+
+ok my $verbobj = Bio::Root::IO->new( -verbose => 1, -strict => 1 ), 'Verbosity';
+is $verbobj->verbose(), 1;
+
+ok $obj->verbose(-1);
+
+
+#############################################
+# tests for finding executables
+#############################################
+
+ok my $io = Bio::Root::IO->new();
+
+# An executable file
+my $out_file = 'test_file.txt';
+my $out_fh;
+open  $out_fh, '>', $out_file or die "Could not write file '$out_file': $!\n";
+print $out_fh 'test';
+close $out_fh;
+# -X test file will fail in Windows regardless of chmod,
+# because it looks for the executable suffix (like ".exe")
+if ($^O =~ m/mswin/i) {
+    # An executable file
+    my $exec_file = 'test_exec.exe';
+    open my $exe_fh, '>', $exec_file or die "Could not write file '$exec_file': $!\n";
+    close $exe_fh;
+    ok $obj->exists_exe($exec_file), 'executable file';
+    unlink $exec_file or die "Could not delete file '$exec_file': $!\n";
+
+    # A not executable file
+    ok (! $obj->exists_exe($out_file), 'non-executable file');
+    unlink $out_file  or die "Could not delete file '$out_file': $!\n";
+}
+else {
+    # An executable file
+    chmod 0777, $out_file or die "Could not change permission of file '$out_file': $!\n";
+    ok $obj->exists_exe($out_file), 'executable file';
+
+    # A not executable file
+    chmod 0444, $out_file or die "Could not change permission of file '$out_file': $!\n";
+    ok (! $obj->exists_exe($out_file), 'non-executable file');
+    unlink $out_file or die "Could not delete file '$out_file': $!\n";
+}
+
+# An executable dir
+my $out_dir = 'test_dir';
+mkdir $out_dir or die "Could not write dir '$out_dir': $!\n";
+chmod 0777, $out_dir or die "Could not change permission of dir '$out_dir': $!\n";
+ok (! $obj->exists_exe($out_dir), 'executable dir');
+rmdir $out_dir or die "Could not delete dir '$out_dir': $!\n";
+
+
+#############################################
+# tests for handle read and write abilities
+#############################################
+
+# Test catfile
+
+ok my $in_file = Bio::Root::IO->catfile(qw(t data test.waba));
+is $in_file, test_input_file('test.waba');
+
+ok my $in_file_2 = Bio::Root::IO->catfile(qw(t data test.txt));
+
+$out_file = test_output_file();
+
+
+# Test with files
+
+ok my $rio = Bio::Root::IO->new( -input => $in_file ), 'Read from file';
+is $rio->file, $in_file;
+is_deeply [$rio->cleanfile], [undef, $in_file];
+is $rio->mode, 'r';
+ok $rio->close;
+
+ok $rio = Bio::Root::IO->new( -file => '<'.$in_file );
+is $rio->file, '<'.$in_file;
+is_deeply [$rio->cleanfile], ['<', $in_file];
+1 while $rio->_readline; # read entire file content
+is $rio->mode, 'r';
+ok $rio->close;
+
+ok my $wio = Bio::Root::IO->new( -file => ">$out_file" ), 'Write to file';
+is $wio->file, ">$out_file";
+is_deeply [$wio->cleanfile], ['>', $out_file];
+is $wio->mode, 'w';
+ok $wio->close;
+
+ok $rio = Bio::Root::IO->new( -file => "+>$out_file" ), 'Read+write to file';
+is $rio->file, "+>$out_file";
+is_deeply [$rio->cleanfile], ['+>', $out_file];
+is $rio->mode, 'rw';
+ok $rio->close;
+
+
+# Test with handles
+
+my $in_fh;
+open $in_fh , '<', $in_file  or die "Could not read file '$in_file': $!\n", 'Read from GLOB handle';
+ok $rio = Bio::Root::IO->new( -fh => $in_fh );
+is $rio->_fh, $in_fh;
+is $rio->mode, 'r';
+close $in_fh;
+
+open $out_fh, '>', $out_file or die "Could not write file '$out_file': $!\n", 'Write to GLOB handle';
+ok $wio = Bio::Root::IO->new( -fh => $out_fh );
+is $wio->_fh, $out_fh;
+is $wio->mode, 'w';
+close $out_fh;
+
+SKIP: {
+    eval { require File::Temp; }
+       or skip 'could not create File::Temp object, maybe your File::Temp is 10 years old', 4;
+
+    $out_fh = File::Temp->new;
+    ok $wio = Bio::Root::IO->new( -fh => $out_fh ), 'Read from File::Temp handle';
+    isa_ok $wio, 'Bio::Root::IO';
+    is $wio->mode, 'rw', 'is a write handle';
+    warnings_like sub { $wio->close }, '', 'no warnings in ->close()';
+    ok $wio->close;
+}
+
+
+# Exclusive arguments
+open $in_fh , '<', $in_file  or die "Could not read file '$in_file': $!\n", 'Read from GLOB handle';
+throws_ok {$rio = Bio::Root::IO->new( -input => $in_file, -fh     => $in_fh     )} qr/Providing both a file and a filehandle for reading/, 'Exclusive arguments';
+throws_ok {$rio = Bio::Root::IO->new( -input => $in_file, -file   => $in_file_2 )} qr/Input file given twice/;
+throws_ok {$rio = Bio::Root::IO->new( -input => $in_file, -string => 'abcedf'   )} qr/File or filehandle provided with -string/;
+throws_ok {$rio = Bio::Root::IO->new( -fh    => $in_fh  , -file   => $in_file   )} qr/Providing both a file and a filehandle for reading/;
+throws_ok {$rio = Bio::Root::IO->new( -fh    => $in_fh  , -string => 'abcedf'   )} qr/File or filehandle provided with -string/;
+throws_ok {$rio = Bio::Root::IO->new( -file  => $in_file, -string => 'abcedf'   )} qr/File or filehandle provided with -string/;
+close $in_fh;
+
+lives_ok  {$rio = Bio::Root::IO->new( -input => $in_file, -file   => $in_file   )} 'Same file';
+
+
+##############################################
+# tests _pushback for multi-line buffering
+##############################################
+
+ok $rio = Bio::Root::IO->new( -file => $in_file ), 'Pushback';
+
+ok my $line1 = $rio->_readline;
+ok my $line2 = $rio->_readline;
+
+ok $rio->_pushback($line2);
+ok $rio->_pushback($line1);
+
+ok my $line3 = $rio->_readline;
+ok my $line4 = $rio->_readline;
+ok my $line5 = $rio->_readline;
+
+is $line1, $line3;
+is $line2, $line4;
+isnt $line5, $line4;
+
+ok $rio->close;
+
+
+##############################################
+# test _print and _insert
+##############################################
+
+ok my $fio = Bio::Root::IO->new( -file => ">$out_file" );
+ok $fio->_print("line 1\n"), '_print';
+ok $fio->_print("line 2\n");
+ok $fio->_insert("insertion at line 2\n",2), '_insert at middle of file';
+ok $fio->_print("line 3\n");
+ok $fio->_print("line 4\n");
+ok $fio->close;
+
+open my $checkio, '<', $out_file or die "Could not read file '$out_file': $!\n";
+my @content = <$checkio>;
+close $checkio;
+is_deeply \@content, ["line 1\n","insertion at line 2\n","line 2\n","line 3\n","line 4\n"];
+
+ok $fio = Bio::Root::IO->new(-file=>">$out_file");
+ok $fio->_insert("insertion at line 1\n",1), '_insert in empty file';
+ok $fio->close;
+
+open $checkio, '<', $out_file or die "Could not read file '$out_file': $!\n";
+@content = <$checkio>;
+close $checkio;
+is_deeply \@content, ["insertion at line 1\n"];
+
+
+##############################################
+# test Win vs UNIX line ending
+##############################################
+
+{
+    ok my $unix_rio = Bio::Root::IO->new(-file => test_input_file('U71225.gb.unix'));
+    ok my $win_rio  = Bio::Root::IO->new(-file => test_input_file('U71225.gb.win' ));
+    ok my $mac_rio  = Bio::Root::IO->new(-file => test_input_file('U71225.gb.mac' ));
+
+    my $expected = "LOCUS       U71225                  1164 bp    DNA     linear   VRT 27-NOV-2001\n";
+    is $unix_rio->_readline, $expected;
+    is $win_rio->_readline , $expected;
+    like $mac_rio->_readline, qr#^LOCUS.*//\n$#ms;
+    # line spans entire file because lines end with "\r" but $/ is "\n"
+
+    $expected = "DEFINITION  Desmognathus quadramaculatus 12S ribosomal RNA gene, partial\n";
+    is $unix_rio->_readline, $expected;
+    is $win_rio->_readline , $expected;
+    is $mac_rio->_readline , undef;
+
+    $expected = "            sequence; tRNA-Val gene, complete sequence; and 16S ribosomal RNA\n";
+    is $unix_rio->_readline, $expected;
+    is $win_rio->_readline , $expected;
+    is $mac_rio->_readline , undef;
+
+    $expected = "            gene, partial sequence, mitochondrial genes for mitochondrial RNAs.\n";
+    is $unix_rio->_readline, $expected;
+    is $win_rio->_readline , $expected;
+    is $mac_rio->_readline , undef;
+
+    $expected = "ACCESSION   U71225\n";
+    is $unix_rio->_readline, $expected;
+    is $win_rio->_readline , $expected;
+    is $mac_rio->_readline , undef;
+
+    # In Windows the "-raw" parameter has no effect, because Perl already discards
+    # the '\r' from the line when reading in text mode from the filehandle
+    # ($line = <$fh>), and put it back automatically when printing
+    if ($^O =~ m/mswin/i) {
+        is $win_rio->_readline( -raw => 1) , "VERSION     U71225.1  GI:2804359\n";
+    }
+    else {
+        is $win_rio->_readline( -raw => 1) , "VERSION     U71225.1  GI:2804359\r\n";
+    }
+    is $win_rio->_readline( -raw => 0) , "KEYWORDS    .\n";
+}
+
+
+##############################################
+# test Win vs UNIX line ending using PerlIO::eol
+##############################################
+
+SKIP: {
+    test_skip(-tests => 20, -requires_module => 'PerlIO::eol');
+
+    local $Bio::Root::IO::HAS_EOL = 1;
+    ok my $unix_rio = Bio::Root::IO->new(-file => test_input_file('U71225.gb.unix'));
+    ok my $win_rio  = Bio::Root::IO->new(-file => test_input_file('U71225.gb.win' ));
+    ok my $mac_rio  = Bio::Root::IO->new(-file => test_input_file('U71225.gb.mac' ));
+
+    my $expected = "LOCUS       U71225                  1164 bp    DNA     linear   VRT 27-NOV-2001\n";
+    is $unix_rio->_readline, $expected;
+    is $win_rio->_readline , $expected;
+    is $mac_rio->_readline , $expected;
+
+    $expected = "DEFINITION  Desmognathus quadramaculatus 12S ribosomal RNA gene, partial\n";
+    is $unix_rio->_readline, $expected;
+    is $win_rio->_readline , $expected;
+    is $mac_rio->_readline , $expected;
+
+    $expected = "            sequence; tRNA-Val gene, complete sequence; and 16S ribosomal RNA\n";
+    is $unix_rio->_readline, $expected;
+    is $win_rio->_readline , $expected;
+    is $mac_rio->_readline , $expected;
+
+    $expected = "            gene, partial sequence, mitochondrial genes for mitochondrial RNAs.\n";
+    is $unix_rio->_readline, $expected;
+    is $win_rio->_readline , $expected;
+    is $mac_rio->_readline , $expected;
+
+    $expected = "ACCESSION   U71225\n";
+    is $unix_rio->_readline, $expected;
+    is $win_rio->_readline , $expected;
+    is $mac_rio->_readline , $expected;
+
+    # $HAS_EOL ignores -raw
+    is $win_rio->_readline( -raw => 1) , "VERSION     U71225.1  GI:2804359\n";
+    is $win_rio->_readline( -raw => 0) , "KEYWORDS    .\n";
+}
+
+
+##############################################
+# test Path::Class support
+##############################################
+
+SKIP: {
+    test_skip(-tests => 2, -requires_module => 'Path::Class');
+    my $f = sub { Bio::Root::IO->new( -file => Path::Class::file(test_input_file('U71225.gb.unix') ) ) };
+    lives_ok(sub { $f->() } , 'Bio::Root::IO->new can handle a Path::Class object');
+    isa_ok($f->(), 'Bio::Root::IO');
+}
+
+
+##############################################
+# test -string
+##############################################
+
+my $teststring = "Foo\nBar\nBaz";
+ok $rio = Bio::Root::IO->new(-string => $teststring), 'Read string';
+
+is $rio->mode, 'r';
+
+ok $line1 = $rio->_readline;
+is $line1, "Foo\n";
+
+ok $line2 = $rio->_readline;
+is $line2, "Bar\n";
+ok $rio->_pushback($line2);
+
+ok $line3 = $rio->_readline;
+is $line3, "Bar\n";
+ok $line3 = $rio->_readline;
+is $line3, 'Baz';
+
+
+##############################################
+# test tempfile()
+##############################################
+{
+ok my $obj = Bio::Root::IO->new(-verbose => 0);
+
+isa_ok $obj, 'Bio::Root::IO';
+
+my $TEST_STRING = "Bioperl rocks!\n";
+
+my ($tfh,$tfile);
+
+eval {
+    ($tfh, $tfile) = $obj->tempfile();
+    isa_ok $tfh, 'GLOB';
+    print $tfh $TEST_STRING;
+    close $tfh;
+    open my $IN, '<', $tfile or die "Could not read file '$tfile': $!\n";
+    my $val = join '', <$IN>;
+    is $val, $TEST_STRING;
+    close $IN;
+    ok -e $tfile;
+    undef $obj;
+};
+undef $obj;
+if ( $@ ) {
+    ok 0;
+} else {
+    ok ! -e $tfile, 'auto UNLINK => 1';
+}
+
+$obj = Bio::Root::IO->new();
+
+eval {
+    my $tdir = $obj->tempdir(CLEANUP=>1);
+    ok -d $tdir;
+    ($tfh, $tfile) = $obj->tempfile(dir => $tdir);
+    close $tfh;
+    ok -e $tfile;
+    undef $obj; # see Bio::Root::IO::_io_cleanup
+};
+
+if ( $@ ) {
+    ok 0;
+} else {
+    ok ! -e $tfile, 'tempfile deleted';
+}
+
+eval {
+    $obj = Bio::Root::IO->new(-verbose => 0);
+    ($tfh, $tfile) = $obj->tempfile(UNLINK => 0);
+    isa_ok $tfh, 'GLOB';
+    close $tfh;
+    ok -e $tfile;
+    undef $obj; # see Bio::Root::IO::_io_cleanup
+};
+
+if ( $@ ) {
+   ok 0;
+} else {
+   ok -e $tfile, 'UNLINK => 0';
+}
+
+ok unlink( $tfile) == 1 ;
+
+
+ok $obj = Bio::Root::IO->new;
+
+# check suffix is applied
+my ($fh1, $fn1) = $obj->tempfile(SUFFIX => '.bioperl');
+isa_ok $fh1, 'GLOB';
+like $fn1, qr/\.bioperl$/, 'tempfile suffix';
+ok close $fh1;
+
+# check single return value mode of File::Temp
+my $fh2 = $obj->tempfile;
+isa_ok $fh2, 'GLOB';
+ok $fh2, 'tempfile() in scalar context';
+ok close $fh2;
+}
@@ -6,15 +6,14 @@ use strict;
 BEGIN {
     use lib '.';
     use Bio::Root::Test;
-    
-    test_begin(-tests => 63);
-	
-	use_ok('Bio::Root::Root');
-    use_ok('Bio::Seq');
+
+    test_begin(-tests => 62);
+
+    use_ok 'Bio::Root::Root';
 }
 
 ok my $obj = Bio::Root::Root->new();
-isa_ok($obj, 'Bio::Root::RootI');
+isa_ok $obj, 'Bio::Root::RootI';
 
 throws_ok { $obj->throw('Testing throw') } qr/Testing throw/;# 'throw failed';
 
@@ -29,7 +28,7 @@ throws_ok { $obj->throw_not_implemented() } qr/EXCEPTION: Bio::Root::NotImplemen
             my $self = {};
             bless $self, ref($class) || $class;
             return $self;
-	};
+    };
 }
 $obj = Bio::FooI->new();
 throws_ok { $obj->throw_not_implemented() } qr/EXCEPTION /;
@@ -41,8 +40,8 @@ $obj = Bio::Root::Root->new();
 #    my ($tfh,$tfile) = $obj->tempfile();
 #    local * STDERR = $tfh;
 #    $obj->warn('Testing warn');
-#    close $tfh;    
-#    open(IN, $tfile) or die("cannot open $tfile");    
+#    close $tfh;
+#    open(IN, $tfile) or die("cannot open $tfile");
 #    $val = join("", <IN>) ;
 #    close IN;
 #    unlink $tfile;
@@ -65,7 +64,7 @@ throws_ok { $obj->throw('Testing throw') } qr/Testing throw/;# 'verbose(1) throw
 #    local * STDERR = $tfh;
 #    $obj->warn('Testing warn');
 #    close $tfh;
-#    open(IN, $tfile) or die("cannot open $tfile");    
+#    open(IN, $tfile) or die("cannot open $tfile");
 #    $val = join("", <IN>);
 #    close IN;
 #    unlink $tfile;
@@ -79,49 +78,54 @@ my $verbobj = Bio::Root::Root->new(-verbose=>1,-strict=>1);
 is $verbobj->verbose(), 1;
 
 $Bio::Root::Root::DEBUG = 1;
-my $seq = Bio::Seq->new();
+my $seq = Bio::Root::Root->new();
 is $seq->verbose, 1;
 
 # test for bug #1343
-my @vals = Bio::Root::RootI->_rearrange([qw(apples pears)], 
-					-apples => 'up the',
-					-pears  => 'stairs');
+my @vals = Bio::Root::RootI->_rearrange([qw(apples pears)],
+                                        -apples => 'up the',
+                                        -pears  => 'stairs');
 is shift @vals, 'up the';
 is shift @vals, 'stairs';
 
 # test deprecated()
 
 # class method
-warning_like{ Bio::Root::Root->deprecated('Test1') } qr/Test1/, 'simple';
-warning_like{ Bio::Root::Root->deprecated(-message => 'Test2') } qr/Test2/, 'simple';
-warning_like{ Bio::Root::Root->deprecated('Test3', 999.999) } qr/Test3/,
-	'warns for versions below current version '.$Bio::Root::Version::VERSION;
-warning_like{ Bio::Root::Root->deprecated(-message => 'Test4',
-								-version => 999.999) } qr/Test4/,
-	'warns for versions below current version '.$Bio::Root::Version::VERSION;
-throws_ok{ Bio::Root::Root->deprecated('Test5', 0.001) } qr/Test5/,
-	'throws for versions above '.$Bio::Root::Version::VERSION;
-throws_ok{ Bio::Root::Root->deprecated(-message => 'Test6',
-								-version => 0.001) } qr/Test6/,
-	'throws for versions above '.$Bio::Root::Version::VERSION;
-throws_ok{ Bio::Root::Root->deprecated(-message => 'Test6',
-								-version => $Bio::Root::Version::VERSION) } qr/Test6/,
-	'throws for versions equal to '.$Bio::Root::Version::VERSION;
-
-# object method
-my $root = Bio::Root::Root->new();
-warning_like{ $root->deprecated('Test1') } qr/Test1/, 'simple';
-warning_like{ $root->deprecated(-message => 'Test2') } qr/Test2/, 'simple';
-warning_like{ $root->deprecated('Test3', 999.999) } qr/Test3/,
-	'warns for versions below current version '.$Bio::Root::Version::VERSION;
-warning_like{ $root->deprecated(-message => 'Test4',
-								-version => 999.999) } qr/Test4/,
-	'warns for versions below current version '.$Bio::Root::Version::VERSION;
-throws_ok{ $root->deprecated('Test5', 0.001) } qr/Test5/,
-	'throws for versions above '.$Bio::Root::Version::VERSION;
-throws_ok{ $root->deprecated(-message => 'Test6',
-								-version => 0.001) } qr/Test6/,
-	'throws for versions above '.$Bio::Root::Version::VERSION;
+{
+    local $Bio::Root::Root::VERSION = 8.9;
+    warning_like{ Bio::Root::Root->deprecated('Test1') } qr/Test1/, 'simple';
+    warning_like{ Bio::Root::Root->deprecated(-message => 'Test2') } qr/Test2/;
+    warning_like{ Bio::Root::Root->deprecated('Test3', 999.999) } qr/Test3/,
+        'warns for versions below current version';
+    warning_like{ Bio::Root::Root->deprecated(-message => 'Test4',
+                                              -version => 999.999) } qr/Test4/,
+        'warns for versions below current version';
+    throws_ok{ Bio::Root::Root->deprecated('Test5', 0.001) } qr/Test5/,
+        'throws for versions above current version';
+    throws_ok{ Bio::Root::Root->deprecated(-message => 'Test6',
+                                       -version => 0.001) } qr/Test6/,
+        'throws for versions above current version';
+
+    throws_ok{ Bio::Root::Root->deprecated(-message => 'Test6',
+                                           -version => $Bio::Root::Root::VERSION) } qr/Test6/,
+        'throws for versions equal to current version';
+
+    # object method
+    my $root = Bio::Root::Root->new();
+    warning_like{ $root->deprecated('Test1') } qr/Test1/, 'simple';
+    warning_like{ $root->deprecated(-message => 'Test2') } qr/Test2/, 'simple';
+    warning_like{ $root->deprecated('Test3', 999.999) } qr/Test3/,
+        'warns for versions below current version';
+    warning_like{ $root->deprecated(-message => 'Test4',
+                                    -version => 999.999) } qr/Test4/,
+                                'warns for versions below current version';
+    throws_ok{ $root->deprecated('Test5', 0.001) } qr/Test5/,
+      'throws for versions above current version';
+    throws_ok{ $root->deprecated(-message => 'Test6',
+                                 -version => 0.001) } qr/Test6/,
+                             'throws for versions above current version';
+
+}
 
 # tests for _set_from_args()
 # Let's not pollute Bio::Root::Root namespace if possible
@@ -131,15 +135,16 @@ throws_ok{ $root->deprecated(-message => 'Test6',
 
     package Bio::Foo1;
     use base qw(Bio::Root::Root);
+    our $VERSION = '2.00';
     sub new {
         my $class = shift;
         my $self = {};
         bless $self, ref($class) || $class;
-    
+
         $self->_set_from_args(\@_);
-        
+
         return $self;
-	};
+    };
 }
 
 $obj = Bio::Foo1->new(-verbose => 1, t1 => 1, '--Test-2' => 2);
@@ -150,14 +155,14 @@ $obj = Bio::Foo1->new(-verbose => 1, t1 => 1, '--Test-2' => 2);
     package Bio::Foo2;
     use base qw(Bio::Root::Root);
     sub new {
-		my $class = shift;
-		my $self = {};
-		bless $self, ref($class) || $class;
-	
-		$self->_set_from_args(\@_, -create => 1);
-		
-		return $self;
-	};
+        my $class = shift;
+        my $self = {};
+        bless $self, ref($class) || $class;
+
+        $self->_set_from_args(\@_, -create => 1);
+
+        return $self;
+    };
 
 }
 
@@ -166,7 +171,7 @@ ok $obj->can('t3'), 'arg callable since method was created';
 ok $obj->can('test_4'), 'mal-formed arg callable since method was created with good name';
 for my $m (qw(t3 test_4)) {
     can_ok('Bio::Foo2',$m);
-    ok (!Bio::Root::Root->can($m), "Methods don't pollute original Bio::Root::Root namespace");
+    ok ! Bio::Root::Root->can($m), "Methods don't pollute original Bio::Root::Root namespace";
 }
 
 {
@@ -176,19 +181,19 @@ for my $m (qw(t3 test_4)) {
         my $class = shift;
         my $self = {};
         bless $self, ref($class) || $class;
-    
+
         $self->_set_from_args(\@_, -methods => ['verbose', 't5'], -create => 1);
-        
+
         return $self;
     };
 }
 
 $obj = Bio::Foo3->new(-verbose => 1, t5 => 1, '--Test-6' => 2);
-can_ok($obj, 't5');
+can_ok $obj, 't5';
 ok ! $obj->can('test_6'), 'arg not in method list not created';
 
 can_ok ('Bio::Foo3','t5');
-ok (!UNIVERSAL::can('Bio::Root::Root','t5'), "Methods don't pollute original Bio::Root::Root namespace");
+ok ! UNIVERSAL::can('Bio::Root::Root','t5'), "Methods don't pollute original Bio::Root::Root namespace";
 
 {
     package Bio::Foo4;
@@ -197,16 +202,16 @@ ok (!UNIVERSAL::can('Bio::Root::Root','t5'), "Methods don't pollute original Bio
             my $class = shift;
             my $self = {};
             bless $self, ref($class) || $class;
-            
+
             my %args = @_;
-            
+
             $self->_set_from_args(\%args, -methods => {(verbose => 'v',
                                                         test7 => 't7',
                                                         test_8 => 't8')},
                                           -create => 1);
-            
+
             return $self;
-	};
+    };
 }
 
 # with synonyms
@@ -219,55 +224,58 @@ is $obj->test_8, 2, 'mal-formed arg correctly resolved to created method';
 is $obj->t8, 2, 'synonym of set method was set correctly';
 
 for my $m (qw(t7 test7 test_8 t8)) {
-    can_ok('Bio::Foo4',$m);
-    ok(!UNIVERSAL::can('Bio::Root::Root','t7'), "Methods don't pollute original Bio::Root::Root namespace");
+    can_ok 'Bio::Foo4', $m;
+    ok ! UNIVERSAL::can('Bio::Root::Root','t7'), "Methods don't pollute original Bio::Root::Root namespace";
 }
 
 # test basic Root::clone()
 
 my $clone = $obj->clone;
 
-is($clone->t7, $obj->t7, 'clone');
-is($clone->test7, $obj->test7, 'clone');
-is($clone->test_8, $obj->test_8, 'clone');
+is $clone->t7, $obj->t7, 'clone';
+is $clone->test7, $obj->test7, 'clone';
+is $clone->test_8, $obj->test_8, 'clone';
 $clone->test_8('xyz');
-isnt($clone->test_8, $obj->test_8, 'clone changed, original didn\'t');
+isnt $clone->test_8, $obj->test_8, 'clone changed, original didn\'t';
 
 # test Root::clone() with parameter passing, only works for methods
 # (introspection via can())
 
 my $clone2 = $obj->clone(-t7 => 'foo');
 
-is($clone2->t7, 'foo', 'parameters passed to clone() modify object');
-is($obj->t7, 1, 'original is not modified');
+is $clone2->t7, 'foo', 'parameters passed to clone() modify object';
+is $obj->t7, 1, 'original is not modified';
+
+
 
 # test deprecations using start_version
 {
     package Bio::Foo5;
     use base qw(Bio::Root::Root);
-    
-    our $v = $Bio::Root::Version::VERSION;
-    
+
+    our $v = '18.001';
+    our $VERSION = $v;
+
     sub not_good {
         my $self = shift;
         $self->deprecated(-message => 'This is not good',
                           -warn_version  => $v,
                           -throw_version => $v + 0.001);
     }
-    
+
     sub not_good2 {
         my $self = shift;
         # note, due to _rearrange, ordering is throw version, then warn version
         $self->deprecated('This is not good',$v + 0.001,$v);
     }
-    
+
     sub really_not_good {
         my $self = shift;
         $self->deprecated(-message => 'This is really not good',
                           -warn_version  => $v - 0.001,
                           -throw_version => $v,);
     }
-    
+
     # version is the same as throw_version (and vice versa)
     sub still_very_bad {
         my $self = shift;
@@ -275,14 +283,14 @@ is($obj->t7, 1, 'original is not modified');
                           -warn_version  => $v - 0.001,
                           -version => $v);
     }
-    
+
     sub okay_for_now {
         my $self = shift;
         $self->deprecated(-message => 'This is okay for now',
                           -warn_version  => $v + 0.001,
                           -throw_version => $v + 0.002);
     }
-    
+
     sub plain_incorrect {
         my $self = shift;
         $self->deprecated(-message => 'This is not going to work',
@@ -294,19 +302,19 @@ is($obj->t7, 1, 'original is not modified');
 my $foo = Bio::Foo5->new();
 
 throws_ok { $foo->plain_incorrect } qr/Version must be numerical/,
-	'must use proper versioning scheme';
+    'must use proper versioning scheme';
 
 warning_like{ $foo->not_good } qr/This is not good/,
-	'warns for versions >= '.$Bio::Root::Version::VERSION;
+    'warns for versions >= current version';
 # this tests the three-arg (non-named) form just to make sure it works, even
 # though we probably won't support it
 warning_like{ $foo->not_good2 } qr/This is not good/,
-	'warns for versions >= '.$Bio::Root::Version::VERSION;
-	
+    'warns for versions >= current version';
+
 throws_ok { $foo->really_not_good } qr/This is really not good/,
-	'throws for versions >= '.$Bio::Root::Version::VERSION;
+    'throws for versions >= current version';
 throws_ok { $foo->still_very_bad } qr/This is still very bad/,
-	'throws for versions >= '.$Bio::Root::Version::VERSION;
-lives_ok { $foo->okay_for_now } 'No warnings/exceptions below '.$Bio::Root::Version::VERSION;
+    'throws for versions >= current version';
+lives_ok { $foo->okay_for_now } 'No warnings/exceptions below current version';
 
 
@@ -1,270 +0,0 @@
-# -*-Perl-*- Test Harness script for Bioperl
-
-use strict;
-use warnings;
-
-BEGIN {
-    use lib '.';
-    use Bio::Root::Test;
-
-    test_begin(-tests => 77);
-
-    use_ok('Bio::Root::IO');
-    use_ok('Bio::SeqIO');
-    use_ok('Bio::Assembly::IO');
-}
-
-my $obj = Bio::Root::IO->new();
-ok defined($obj) && $obj->isa('Bio::Root::IO');
-
-
-#############################################
-# tests for exceptions/debugging/verbosity
-#############################################
-
-eval { $obj->throw('Testing throw') };
-like $@, qr/Testing throw/, 'throw()'; # 'throw failed';
-
-$obj->verbose(-1);
-eval { $obj->throw('Testing throw') };
-like $@, qr/Testing throw/, 'throw() verbose(-1)'; # 'verbose(-1) throw did not work properly' . $@;
-
-eval { $obj->warn('Testing warn') };
-ok !$@, 'warn()';
-
-$obj->verbose(1);
-eval { $obj->throw('Testing throw') };
-like $@, qr/Testing throw/, 'throw() verbose(1)'; # 'verbose(1) throw did not work properly' . $@;
-
-my @stack = $obj->stack_trace();
-is scalar @stack, 2, 'stack_trace()';
-
-my $verbobj = Bio::Root::IO->new(-verbose=>1,-strict=>1);
-is $verbobj->verbose(), 1, 'set verbosity to 1';
-
-ok $obj->verbose(-1);
-
-
-#############################################
-# tests for finding executables
-#############################################
-
-ok(my $io = Bio::Root::IO->new());
-# An executable file
-my $test_file = 'test_file.txt';
-open FILE, '>', $test_file or die "Could not write file '$test_file': $!\n";
-print FILE 'test';
-close FILE;
-chmod 0777, $test_file or die "Could not change permission of file '$test_file': $!\n";
-ok ($obj->exists_exe($test_file), 'executable file');
-# A not executable file
-chmod 0444, $test_file or die "Could not change permission of file '$test_file': $!\n";
-ok (! $obj->exists_exe($test_file), 'non-executable file');
-unlink $test_file or die "Could not delete file '$test_file': $!\n";
-# An executable dir
-my $test_dir = 'test_dir';
-mkdir $test_dir or die "Could not write dir '$test_dir': $!\n";
-chmod 0777, $test_dir or die "Could not change permission of dir '$test_dir': $!\n";
-ok (! $obj->exists_exe($test_dir), 'executable dir');
-rmdir $test_dir or die "Could not delete dir '$test_dir': $!\n";
-
-
-#############################################
-# tests for handle read and write abilities
-#############################################
-
-ok my $TESTINFILE = Bio::Root::IO->catfile(qw(t data test.waba));
-
-my($handle,$file) = $obj->tempfile;
-ok $handle;
-ok $file;
-
-#test with files
-
-ok my $rio = Bio::Root::IO->new(-file=>$TESTINFILE);
-is $rio->file, $TESTINFILE;
-is $rio->mode, 'r', 'filename, read';
-
-ok my $wio = Bio::Root::IO->new(-file=>">$file");
-is $wio->file, ">$file";
-is $wio->mode, 'w', 'filename, write';
-
-# test with handles
-
-ok open(my $I, $TESTINFILE);
-ok open(my $O, '>', $file);
-
-ok $rio = Bio::Root::IO->new(-fh=>$I);
-is $rio->_fh, $I;
-is $rio->mode, 'r', 'handle, read';
-
-ok $wio = Bio::Root::IO->new(-fh=>$O);
-is $wio->_fh, $O;
-is $wio->mode, 'w', 'handle, write';
-
-SKIP: {
-    my $tempfile = eval { require File::Temp; File::Temp->new }
-       or skip 'could not create File::Temp object, maybe your File::Temp is 10 years old', 3;
-
-    my $temp_io = Bio::Root::IO->new( -fh => $tempfile );
-    isa_ok($temp_io, 'Bio::Root::IO');
-    is $temp_io->mode, 'w', 'is a write handle';
-    warnings_like sub { $temp_io->close }, '', 'no warnings in ->close call';
-}
-
-
-##############################################
-# tests _pushback for multi-line buffering
-##############################################
-
-my $rio1 = 
-
-my $line1 = $rio->_readline;
-my $line2 = $rio->_readline;
-
-ok $rio->_pushback($line2);
-ok $rio->_pushback($line1);
-
-my $line3 = $rio->_readline;
-my $line4 = $rio->_readline;
-my $line5 = $rio->_readline;
-
-is $line1, $line3;
-is $line2, $line4;
-isnt $line5, $line4;
-
-ok close($I);
-ok close($O);
-
-
-##############################################
-# test _print and _insert
-##############################################
-
-ok my $fio = Bio::Root::IO->new(-file=>">$file");
-ok $fio->_print("line 1\n"), '_print';
-ok $fio->_print("line 2\n");
-ok $fio->_insert("insertion at line 2\n",2), '_insert at middle of file';
-ok $fio->_print("line 3\n");
-ok $fio->_print("line 4\n");
-$fio->close;
-
-open my $checkio, '<', $file;
-my @content = <$checkio>;
-close $checkio;
-is_deeply \@content, ["line 1\n","insertion at line 2\n","line 2\n","line 3\n","line 4\n"];
-
-ok $fio = Bio::Root::IO->new(-file=>">$file");
-ok $fio->_insert("insertion at line 1\n",1), '_insert in empty file';
-$fio->close;
-
-open $checkio, '<', $file;
-@content = <$checkio>;
-close $checkio;
-is_deeply \@content, ["insertion at line 1\n"];
-
-
-##############################################
-# test Win vs UNIX line ending
-##############################################
-{
-
-my $unix_rio = Bio::Root::IO->new(-file => test_input_file('U71225.gb.unix'));
-my $win_rio = Bio::Root::IO->new(-file => test_input_file('U71225.gb.win'));
-
-for (1..5) {
-    is($unix_rio->_readline, $win_rio->_readline);
-}
-
-}
-
-
-##############################################
-# test Win vs UNIX line ending using PerlIO::eol
-##############################################
-
-SKIP: {
-    test_skip(-tests => 5, -requires_module => 'PerlIO::eol');
-    local $Bio::Root::IO::HAS_EOL = 1;
-    my $unix_rio = Bio::Root::IO->new(-file => test_input_file('U71225.gb.unix'));
-    my $win_rio = Bio::Root::IO->new(-file => test_input_file('U71225.gb.win'));
-    for (1..5) {
-        is($unix_rio->_readline, $win_rio->_readline);
-    }
-}
-
-
-##############################################
-# test Path::Class support
-##############################################
-
-SKIP: {
-    test_skip(-tests => 2, -requires_module => 'Path::Class');
-
-    my $f = sub { Bio::Root::IO->new( -file => Path::Class::file(test_input_file('U71225.gb.unix') ) ) };
-    lives_ok(sub { $f->() } , 'Bio::Root::IO->new can handle a Path::Class object');
-    isa_ok($f->(), 'Bio::Root::IO');
-}
-
-
-##############################################
-# tests http retrieval
-##############################################
-
-SKIP: {
-  test_skip(-tests => 2, -requires_networking => 1);
-
-  my $TESTURL = 'http://www.google.com/index.html';
-  
-  ok $rio = Bio::Root::IO->new(-url=>$TESTURL), 'default -url method';
-  
-  $Bio::Root::IO::HAS_LWP = 0;
-  lives_ok {$rio = Bio::Root::IO->new(-url=>$TESTURL)};
-}
-
-
-##############################################
-# test -string
-##############################################
-
-my $teststring = "Foo\nBar\nBaz";
-ok $rio = Bio::Root::IO->new(-string =>$teststring), 'default -string method';
-
-$line1 = $rio->_readline;
-is($line1, "Foo\n");
-
-$line2 = $rio->_readline;
-is($line2, "Bar\n");
-$rio->_pushback($line2);
-
-$line3 = $rio->_readline;
-is($line3, "Bar\n");
-$line3 = $rio->_readline;
-is($line3, "Baz");
-
-
-##############################################
-# test format() and variant()
-##############################################
-
-my $in = Bio::SeqIO->new(
-   -file    => test_input_file('bug2901.fa'),
-   -format  => "fasta",
-);
-is $in->format, 'fasta';
-is $in->variant, undef;
-
-$in = Bio::SeqIO->new(
-   -file    => test_input_file('fastq', 'illumina_faked.fastq'),
-   -format  => "fastq",
-   -variant => 'illumina',
-);
-is $in->format, 'fastq';
-is $in->variant, 'illumina';
-
-$in = Bio::Assembly::IO->new(
-   -file   => test_input_file('assembly_with_singlets.ace'),
-);
-is $in->format, 'ace';
-is $in->variant, 'consed';
-
@@ -6,15 +6,15 @@ use strict;
 BEGIN {
     use lib '.';
     use Bio::Root::Test;
-    
+
     test_begin(-tests => 35);
-	
+
     use_ok('Bio::Root::Storable');
 }
 
 foreach my $mode( "BINARY", "ASCII" ){
     if( $mode eq "ASCII" ){
-		no warnings;
+        no warnings;
         $Bio::Root::Storable::BINARY = 0;
     }
 
@@ -27,7 +27,7 @@ foreach my $mode( "BINARY", "ASCII" ){
     ok $@ =~ /Testing throw/;   # 'throw failed';
 
     $obj->{_test}  = "_TEST";   # Provide test attributes
-    $obj->{__test} = "__TEST";  # 
+    $obj->{__test} = "__TEST";  #
 
     my $state = $obj->serialise;
     ok length($state) > 0;
@@ -37,7 +37,7 @@ foreach my $mode( "BINARY", "ASCII" ){
     ok $clone->{_test} eq "_TEST" && $clone->{__test}  eq "__TEST";
 
     #------------------------------
-    # Test standard file IO 
+    # Test standard file IO
     my $file = $obj->store;
     ok $file && -f $obj->statefile;
 
@@ -1,80 +0,0 @@
-# -*-Perl-*- Test Harness script for Bioperl
-# $Id$
-
-use strict;
-
-BEGIN { 
-    use lib '.';
-    use Bio::Root::Test;
-    
-    test_begin(-tests => 18);
-	
-	use_ok('Bio::Root::IO');
-}
-
-ok my $obj = Bio::Root::IO->new(-verbose => 0);
-
-isa_ok($obj, 'Bio::Root::IO');
-
-my $TEST_STRING = "Bioperl rocks!\n";
-
-my ($tfh,$tfile);
-
-eval {
-    ($tfh,$tfile) = $obj->tempfile();
-    print $tfh $TEST_STRING; 
-    close($tfh);
-    open(my $IN, $tfile) or die("cannot open $tfile");    
-    my $val = join("", <$IN>) ;
-    ok( $val eq $TEST_STRING );
-    close $IN;
-    ok( -e $tfile );
-    undef $obj; 
-};
-undef $obj;
-if( $@ ) {
-    ok(0);
-} else { 
-   ok( ! -e $tfile, 'auto UNLINK => 1' );
-}
-
-$obj = Bio::Root::IO->new();
-
-eval {
-    my $tdir = $obj->tempdir(CLEANUP=>1);
-    ok( -d $tdir );
-    ($tfh, $tfile) = $obj->tempfile(dir => $tdir);
-    close $tfh;
-    ok( -e $tfile );
-    undef $obj; # see Bio::Root::IO::_io_cleanup
-};
-
-if( $@ ) { ok(0); } 
-else { ok( ! -e $tfile, 'tempfile deleted' ); }
-
-eval {
-    $obj = Bio::Root::IO->new(-verbose => 0);
-    ($tfh, $tfile) = $obj->tempfile(UNLINK => 0);
-    close $tfh;
-    ok( -e $tfile );   
-    undef $obj; # see Bio::Root::IO::_io_cleanup
-};
-
-if( $@ ) { ok(0) }
-else { ok( -e $tfile, 'UNLINK => 0') }
-
-ok unlink( $tfile) == 1 ;
-
-
-ok $obj = Bio::Root::IO->new;
-
-# check suffix is applied
-my($fh1, $fn1) = $obj->tempfile(SUFFIX => '.bioperl');
-ok $fh1;
-like $fn1, qr/\.bioperl$/, 'tempfile suffix';
-ok close $fh1;
-
-# check single return value mode of File::Temp
-my $fh2 = $obj->tempfile;
-ok $fh2, 'tempfile() in scalar context';
-ok close $fh2;
@@ -4,13 +4,13 @@
 
 use strict;
 
-BEGIN { 
+BEGIN {
     use lib '.';
     use Bio::Root::Test;
-    
+
     test_begin(-tests => 56);
-    
-	use_ok('Bio::Root::Utilities');
+
+    use_ok('Bio::Root::Utilities');
 }
 
 # Object creation
@@ -77,9 +77,15 @@ SKIP: {
     my $gzip = $u->find_exe('gzip');
     skip "gzip not found, skipping gzip tests", 12 unless $gzip;
     ok -x $gzip;
-    
+
     # test compression/decompression of a simple file
     my $zfile = $u->compress($file);
+
+    # In Windows, the folder separator '\' may brake
+    # the following qr{}, so change it to '/'
+    $zfile =~ s'\\'/'g;
+    $file  =~ s'\\'/'g;
+
     like $zfile, qr/$file.gz|tmp.bioperl.gz/;
     ok -s $zfile;
     if ($zfile =~ /tmp.bioperl.gz/) {
@@ -8,7 +8,7 @@ BEGIN {
     use lib '.';
     use Bio::Root::Test;
 
-    test_begin(-tests => 1360);
+    test_begin(-tests => 1389);
 
     use_ok('Bio::SearchIO');
 }
@@ -1493,6 +1493,48 @@ is( $hsp->hit->end,                             179 );
 is( $hsp->gaps,                                 7 );
 is( $hsp->n,                                    1 );
 
+# this is blastn bl2seq+
+$searchio = Bio::SearchIO->new(
+    -format => 'blast',
+    -file   => test_input_file('bl2seq+.blastn')
+);
+$result = $searchio->next_result;
+isa_ok( $result, 'Bio::Search::Result::ResultI' );
+is( $result->query_name, 'gi|2695846|emb|Y13255.1|' );
+is( $result->query_description,
+   'Acipenser baeri mRNA for immunoglobulin heavy chain, clone ScH 3.3'
+);
+is( $result->query_length,                        606 );
+is( $result->algorithm,                          'BLASTN' );
+is( $result->algorithm_version,                  '2.2.29+' );
+is( $result->algorithm_reference,                 undef );
+is( $result->get_statistic('effectivespaceused'), 352836 );
+is( $result->get_statistic('kappa'),              0.621 );
+is( $result->get_statistic('kappa_gapped'),      '0.460' );
+is( $result->get_statistic('lambda'),             1.33 );
+is( $result->get_statistic('lambda_gapped'),      1.28 );
+is( $result->get_statistic('entropy'),            1.12 );
+is( $result->get_statistic('entropy_gapped'),    '0.850' );
+$hit = $result->next_hit;
+is( $hit->name,   'gi|2695846|emb|Y13255.1|' );
+is( $hit->description,
+   'Acipenser baeri mRNA for immunoglobulin heavy chain, clone ScH 3.3'
+);
+is( $hit->length, 606 );
+$hsp = $hit->next_hsp;
+is( $hsp->score,            606 );
+is( $hsp->bits,             1120 );
+is( $hsp->percent_identity, 100 );
+float_is( $hsp->evalue,    '0.0' );
+is( $hsp->query->start,     1 );
+is( $hsp->query->end,       606 );
+is( $hsp->query->strand,    1 );
+is( $hsp->hit->strand,      1 );
+is( $hsp->hit->start,       1 );
+is( $hsp->hit->end,         606 );
+is( $hsp->gaps,             0 );
+is( $hsp->n,                1 );
+
 # this is blastp bl2seq
 $searchio = Bio::SearchIO->new(
     -format => 'blast',
@@ -1904,7 +1946,7 @@ is $hit->name,      'ENSP00000350182';
 is $hit->length,    425;
 is $hit->accession, 'ENSP00000350182';
 is $hit->description,
-'pep:novel clone::BX322644.8:4905:15090:-1 gene:ENSG00000137397 transcript:ENST00000357569 ';
+'pep:novel clone::BX322644.8:4905:15090:-1 gene:ENSG00000137397 transcript:ENST00000357569';
 is $hit->raw_score, 301;
 is $hit->bits,      120;
 float_is( $hit->significance, 3e-27 );
@@ -1925,7 +1967,7 @@ float_is( $hit->significance, 8e-26 );
 
 my $file = test_input_file('bug1986.blast2');
 my %unique_accs;
-open( my $IN, $file ) or die $!;
+open my $IN, '<', $file or die "Could not read file '$file': $!\n";
 
 while (<$IN>) {
     last if (/^Sequences/);
@@ -1944,7 +1986,7 @@ while (<$IN>) {
     #last if ($count == 10);
     ++$count;
 }
-close($IN);
+close $IN;
 
 is( $count,                      495 );
 is( scalar( keys %unique_accs ), 490 );
@@ -1,12 +1,13 @@
 # -*-Perl-*- Test Harness script for Bioperl
 
 use strict;
+use warnings;
 
 BEGIN {
     use lib '.';
     use Bio::Root::Test;
 
-    test_begin( -tests => 327 );
+    test_begin( -tests => 773 );
 
     use_ok('Bio::SearchIO');
 }
@@ -29,31 +30,81 @@ while ( $result = $searchio->next_result ) {
         '/home/birney/src/wise2/example/road.pep',
         'Check sequence_file'
     );
+
     is( $result->query_name,        'roa1_drome', 'Check query_name' );
+    is( $result->query_length,       0,           'Check query_length absence' );
     is( $result->query_description, '',           'Check query_description' );
-    is( $result->num_hits(),        2,            'Check num_hits' );
+    is( $result->num_hits(),         2,           'Check num_hits' );
     my ( $hsp, $hit );
 
-    if ( $hit = $result->next_model ) {
-        is( $hit->name,      'SEED',  'Check hit name' );
-        is( $hit->raw_score, '146.1', 'Check hit raw_score' );
-        float_is( $hit->significance, 6.3e-40, 'Check hit significance' );
+    if ( defined( $hit = $result->next_model ) ) {
         is( ref($hit), 'Bio::Search::Hit::HMMERHit',
             'Check for the correct hit reference type' );
-        is( $hit->num_hsps, 1, 'Check num_hsps' );
+        is( $hit->name, 'SEED', 'Check hit name' );
+        is( $hit->description,
+            '',
+            'Check for hit description'
+        );
+        is( $hit->raw_score,          146.1,   'Check hit raw_score' );
+        float_is( $hit->significance, 6.3e-40, 'Check hit significance' );
+        is( $hit->num_hsps,           1,       'Check num_hsps' );
+
+        # Query and Hit lengths are usually unknown in HMMER,
+        # but sometimes they can be deduced from domain data '[]'
+        is( $hit->length,             77,      'Check hit length' );
+        is( $hit->frac_aligned_query, undef );
+        is( $hit->frac_aligned_hit,  '1.00' );
+
+        is( $hit->matches('cons'), 55, 'Check hit total conserved residues' );
+        is( $hit->matches('id'),   22, 'Check hit total identical residues' );
+        is( sprintf( "%.3f", $hit->frac_identical('query') ), '0.310' );
+        is( sprintf( "%.3f", $hit->frac_identical('hit') ),    0.286 );
+        is( sprintf( "%.3f", $hit->frac_identical('total') ),  0.282 );
+        is( sprintf( "%.3f", $hit->frac_conserved('query') ),  0.775 );
+        is( sprintf( "%.3f", $hit->frac_conserved('hit') ),    0.714 );
+        is( sprintf( "%.3f", $hit->frac_conserved('total') ),  0.705 );
 
         if ( defined( $hsp = $hit->next_domain ) ) {
-            is( $hsp->hit->start,   1,    'Check for hit hmmfrom value' );
-            is( $hsp->hit->end,     77,   'Check for hit hmm to value' );
-            is( $hsp->query->start, 33,   'Check for query alifrom value' );
-            is( $hsp->query->end,   103,  'Check for query ali to value' );
-            is( $hsp->score,        71.2, 'Check for hsp score' );
+            is( ref($hsp), 'Bio::Search::HSP::HMMERHSP',
+                'Check for correct hsp reference type' );
+            is( $hsp->query->seq_id(), 'roa1_drome', 'Check for query seq_id' );
+            is( $hsp->hit->seq_id(),   'SEED',       'Check for hit seq_id' );
+
+            is( $hsp->hit->start,   1,       'Check for hit hmmfrom value' );
+            is( $hsp->hit->end,     77,      'Check for hit hmm to value' );
+            is( $hsp->query->start, 33,      'Check for query alifrom value' );
+            is( $hsp->query->end,   103,     'Check for query ali to value' );
+            is( $hsp->score,        71.2,    'Check for hsp score' );
             float_is( $hsp->evalue, 2.2e-17, 'Check for hsp c-Evalue' );
+
+            is( $hsp->length('query'), 71, 'Check for hsp query length' );
+            is( $hsp->length('hit'),   77, 'Check for hsp hit length' );
+            is( $hsp->length('total'), 78, 'Check for hsp total length' );
+            is( $hsp->gaps('query'),   7,  'Check for hsp query gaps' );
+            is( $hsp->gaps('hit'),     1,  'Check for hsp hit gaps' );
+            is( $hsp->gaps('total'),   8,  'Check for hsp total gaps' );
+
+            ($hit->length == 0) ?
+                  is( $hsp->{HIT_LENGTH}, $hsp->hit->length, 'Check hit length consistency' )
+                : is( $hsp->{HIT_LENGTH}, $hit->length,      'Check hit length consistency' );
+            ($result->query_length == 0) ?
+                  is( $hsp->{QUERY_LENGTH}, $hsp->query->length,   'Check query length consistency' )
+                : is( $hsp->{QUERY_LENGTH}, $result->query_length, 'Check query length consistency' );
+
+            is( $hsp->num_conserved, 55 );
+            is( $hsp->num_identical, 22 );
+            is( sprintf( "%.2f", $hsp->percent_identity ),         28.21 );
+            is( sprintf( "%.3f", $hsp->frac_identical('query') ), '0.310' );
+            is( sprintf( "%.3f", $hsp->frac_identical('hit') ),    0.286 );
+            is( sprintf( "%.3f", $hsp->frac_identical('total') ),  0.282 );
+            is( sprintf( "%.3f", $hsp->frac_conserved('query') ),  0.775 );
+            is( sprintf( "%.3f", $hsp->frac_conserved('hit') ),    0.714 );
+            is( sprintf( "%.3f", $hsp->frac_conserved('total') ),  0.705 );
+
             is( $hsp->query_string,
                 'LFIGGLDYRTTDENLKAHFEKWGNIVDVVVMKD-----PRTKRSRGFGFITYSHSSMIDEAQK--SRpHKIDGRVVEP',
                 'Check for query string'
             );
-            is( $hsp->gaps('query'), 7, 'Check for number of gaps in query' );
             is( $hsp->hit_string,
                 'lfVgNLppdvteedLkdlFskfGpivsikivrDiiekpketgkskGfaFVeFeseedAekAlealnG-kelggrklrv',
                 'Check for hit string'
@@ -64,27 +115,82 @@ while ( $result = $searchio->next_result ) {
             );
             is( length( $hsp->homology_string ),
                 length( $hsp->hit_string ),
-                'Check if homology string and hit string have an equal lenght'
+                'Check if homology string and hit string have an equal length'
             );
             is( length( $hsp->query_string ),
                 length( $hsp->homology_string ),
-                'Check if query string and homology string have an equal lenght'
+                'Check if query string and homology string have an equal length'
             );
+            # This Hmmpfam don't have PP or CS strings, these are tests to check for side effects
+            is( $hsp->posterior_string, '' );
+            is( $hsp->consensus_string, '' );
         }
     }
     if ( defined( $hit = $result->next_model ) ) {
+        is( ref($hit), 'Bio::Search::Hit::HMMERHit',
+            'Check for the correct hit reference type' );
+        is( $hit->name,              'SEED',    'Check hit name' );
+        is( $hit->description,       '',        'Check for hit description' );
+        is( $hit->raw_score,          146.1,    'Check hit raw_score' );
+        float_is( $hit->significance, 6.3e-040, 'Check hit significance' );
+        is( $hit->num_hsps,           1,        'Check num_hsps' );
+
+        # Query and Hit lengths are usually unknown in HMMER,
+        # but sometimes they can be deduced from domain data '[]'
+        is( $hit->length,             77,      'Check hit length' );
+        is( $hit->frac_aligned_query, undef );
+        is( $hit->frac_aligned_hit,  '1.00' );
+
+        is( $hit->matches('cons'), 56, 'Check hit total conserved residues' );
+        is( $hit->matches('id'),   33, 'Check hit total identical residues' );
+        is( sprintf( "%.3f", $hit->frac_identical('query') ),  0.471 );
+        is( sprintf( "%.3f", $hit->frac_identical('hit') ),    0.429 );
+        is( sprintf( "%.3f", $hit->frac_identical('total') ),  0.429 );
+        is( sprintf( "%.3f", $hit->frac_conserved('query') ), '0.800' );
+        is( sprintf( "%.3f", $hit->frac_conserved('hit') ),    0.727 );
+        is( sprintf( "%.3f", $hit->frac_conserved('total') ),  0.727 );
+
         if ( defined( $hsp = $hit->next_domain ) ) {
-            is( $hsp->hit->start,   1,    'Check for hit hmmfrom value' );
-            is( $hsp->hit->end,     77,   'Check for hit hmm to value' );
-            is( $hsp->query->start, 124,  'Check for query alifrom value' );
-            is( $hsp->query->end,   194,  'Check for query ali to value' );
-            is( $hsp->score,        75.5, 'Check for hsp score' );
+            is( ref($hsp), 'Bio::Search::HSP::HMMERHSP',
+                'Check for correct hsp reference type' );
+            is( $hsp->query->seq_id(), 'roa1_drome', 'Check for query seq_id' );
+            is( $hsp->hit->seq_id(),   'SEED',       'Check for hit seq_id' );
+
+            is( $hsp->hit->start,   1,       'Check for hit hmmfrom value' );
+            is( $hsp->hit->end,     77,      'Check for hit hmm to value' );
+            is( $hsp->query->start, 124,     'Check for query alifrom value' );
+            is( $hsp->query->end,   193,     'Check for query ali to value' );
+            is( $hsp->score,        75.5,    'Check for hsp score' );
             float_is( $hsp->evalue, 1.1e-18, 'Check for hsp c-Evalue' );
+
+            is( $hsp->length('query'), 70, 'Check for hsp query length' );
+            is( $hsp->length('hit'),   77, 'Check for hsp hit length' );
+            is( $hsp->length('total'), 77, 'Check for hsp total length' );
+            is( $hsp->gaps('query'),   7,  'Check for hsp query gaps' );
+            is( $hsp->gaps('hit'),     0,  'Check for hsp hit gaps' );
+            is( $hsp->gaps('total'),   7,  'Check for hsp total gaps' );
+
+            ($hit->length == 0) ?
+                  is( $hsp->{HIT_LENGTH}, $hsp->hit->length, 'Check hit length consistency' )
+                : is( $hsp->{HIT_LENGTH}, $hit->length,      'Check hit length consistency' );
+            ($result->query_length == 0) ?
+                  is( $hsp->{QUERY_LENGTH}, $hsp->query->length,   'Check query length consistency' )
+                : is( $hsp->{QUERY_LENGTH}, $result->query_length, 'Check query length consistency' );
+
+            is( $hsp->num_conserved, 56 );
+            is( $hsp->num_identical, 33 );
+            is( sprintf( "%.2f", $hsp->percent_identity ),         42.86 );
+            is( sprintf( "%.3f", $hsp->frac_identical('query') ),  0.471 );
+            is( sprintf( "%.3f", $hsp->frac_identical('hit') ),    0.429 );
+            is( sprintf( "%.3f", $hsp->frac_identical('total') ),  0.429 );
+            is( sprintf( "%.3f", $hsp->frac_conserved('query') ), '0.800' );
+            is( sprintf( "%.3f", $hsp->frac_conserved('hit') ),    0.727 );
+            is( sprintf( "%.3f", $hsp->frac_conserved('total') ),  0.727);
+
             is( $hsp->query_string,
-                'LFVGALKDDHDEQSIRDYFQHFGNIVDINIVID-----KETGKKRGFAFVEFDDYDPVDKVVL-QKQHQLNGKMVDV',
+                'LFVGALKDDHDEQSIRDYFQHFGNIVDINIVID-----KETGKKRGFAFVEFDDYDPVDKVVL--KQHQLNGKMVDV',
                 'Check for query string'
             );
-            is( $hsp->gaps('query'), 6, 'Check for number of gaps in query' );
             is( $hsp->hit_string,
                 'lfVgNLppdvteedLkdlFskfGpivsikivrDiiekpketgkskGfaFVeFeseedAekAlealnGkelggrklrv',
                 'Check for hit string'
@@ -95,16 +201,17 @@ while ( $result = $searchio->next_result ) {
             );
             is( length( $hsp->homology_string ),
                 length( $hsp->hit_string ),
-                'Check if homology string and hit string have an equal lenght'
+                'Check if homology string and hit string have an equal length'
             );
             is( length( $hsp->query_string ),
                 length( $hsp->homology_string ),
-                'Check if query string and homology string have an equal lenght'
+                'Check if query string and homology string have an equal length'
             );
         }
         last;
     }
 }
+
 $searchio = Bio::SearchIO->new(
     -format => 'hmmer',
     -file   => test_input_file('hmmsearch.out')
@@ -114,31 +221,108 @@ while ( $result = $searchio->next_result ) {
         'Bio::Search::Result::HMMERResult',
         'Check for the correct result reference type'
     );
-    is( $result->algorithm,         'HMMSEARCH',  'Check algorithm' );
-    is( $result->algorithm_version, '2.0',        'Check algorithm version' );
-    is( $result->hmm_name,          'HMM [SEED]', 'Check hmm_name' );
-    is( $result->sequence_file, 'HMM.dbtemp.29591', 'Check sequence_file' );
-    is( $result->database_name, 'HMM.dbtemp.29591', 'Check database_name' );
-    is( $result->query_name,    'SEED',             'Check query_name' );
-    is( $result->query_description, '',   'Check query_description' );
-    is( $result->num_hits(),        1215, 'Check num_hits' );
+    is( $result->algorithm,         'HMMSEARCH',        'Check algorithm' );
+    is( $result->algorithm_version, '2.0',              'Check algorithm version' );
+    is( $result->hmm_name,          'HMM [SEED]',       'Check hmm_name' );
+    is( $result->sequence_file,     'HMM.dbtemp.29591', 'Check sequence_file' );
+    is( $result->database_name,     'HMM.dbtemp.29591', 'Check database_name' );
+
+    is( $result->query_name,        'SEED', 'Check query_name' );
+    is( $result->query_length,       77,    'Check query_length' );
+    is( $result->query_description, '',     'Check query_description' );
+    is( $result->num_hits(),         1215,  'Check num_hits' );
+
     my $hit = $result->next_model;
+    is( ref($hit), 'Bio::Search::Hit::HMMERHit',
+        'Check for the correct hit reference type' );
     is( $hit->name, 'Q91581', 'Check hit name' );
     is( $hit->description,
         'Q91581 POLYADENYLATION FACTOR 64 KDA SUBUN',
         'Check for hit description'
     );
+    is( $hit->raw_score,          119.7, 'Check hit raw_score' );
     float_is( $hit->significance, 2e-31, 'Check hit significance' );
-    is( $hit->raw_score, 119.7, 'Check hit raw_score' );
+    is( $hit->num_hsps,           1,     'Check num_hsps' );
+    is( $hit->length,             0,     'Check hit length' );
+
     my $hsp = $hit->next_domain;
-    is( $hsp->score, 119.7, 'Check for hsp score' );
-    float_is( $hsp->evalue, 2e-31, 'Check for hsp c-Evalue' );
-    is( $hsp->query->start,    18,       'Check for query alifrom value' );
-    is( $hsp->query->end,      89,       'Check for query ali to value' );
-    is( $hsp->hit->start,      1,        'Check for hit hmmfrom value' );
-    is( $hsp->hit->end,        77,       'Check for hit hmm to value' );
+    is( ref($hsp), 'Bio::Search::HSP::HMMERHSP',
+        'Check for correct hsp reference type' );
     is( $hsp->query->seq_id(), 'SEED',   'Check for query seq_id' );
     is( $hsp->hit->seq_id(),   'Q91581', 'Check for hit seq_id' );
+
+    is( $hsp->hit->start,       18,    'Check for hit hmmfrom value' );
+    is( $hsp->hit->end,         89,    'Check for hit hmm to value' );
+    is( $hsp->query->start,     1,     'Check for query alifrom value' );
+    is( $hsp->query->end,       77,    'Check for query ali to value' );
+    is( $hsp->score,            119.7, 'Check for hsp score' );
+    float_is( $hsp->evalue,     2e-31, 'Check for hsp c-Evalue' );
+
+    is( $hsp->length('query'), 77, 'Check for hsp query length' );
+    is( $hsp->length('hit'),   72, 'Check for hsp hit length' );
+    is( $hsp->length('total'), 0,  'Check for hsp total length' );
+    is( $hsp->gaps('query'),   0,  'Check for hsp query gaps' );
+    is( $hsp->gaps('hit'),     0,  'Check for hsp hit gaps' );
+    is( $hsp->gaps('total'),   0,  'Check for hsp total gaps' );
+
+    my $example_counter = 0;
+    while ($hit = $result->next_model) {
+        if ($hit->name eq 'Q61954') {
+            $example_counter++;
+            if ($example_counter == 1) {
+                # Query and Hit lengths are usually unknown in HMMER,
+                # but sometimes they can be deduced from domain data '[]'
+                is( $hit->length,              153,    'Check hit length' );
+                is( $hit->frac_aligned_query, '1.00' );
+                is( $hit->frac_aligned_hit,    0.42 );
+
+                $hsp = $hit->next_domain;
+                is( $hsp->query->seq_id(), 'SEED',   'Check for query seq_id' );
+                is( $hsp->hit->seq_id(),   'Q61954', 'Check for hit seq_id' );
+
+                is( $hsp->hit->start,       26,      'Check for hit hmmfrom value' );
+                is( $hsp->hit->end,         89,      'Check for hit hmm to value' );
+                is( $hsp->query->start,     1,       'Check for query alifrom value' );
+                is( $hsp->query->end,       77,      'Check for query ali to value' );
+                is( $hsp->score,            72.9,    'Check for hsp score' );
+                float_is( $hsp->evalue,     2.4e-17, 'Check for hsp c-Evalue' );
+
+                is( $hsp->length('query'), 77, 'Check for hsp query length' );
+                is( $hsp->length('hit'),   64, 'Check for hsp hit length' );
+                is( $hsp->length('total'), 0,  'Check for hsp total length' );
+                is( $hsp->gaps('query'),   0,  'Check for hsp query gaps' );
+                is( $hsp->gaps('hit'),     0,  'Check for hsp hit gaps' );
+                is( $hsp->gaps('total'),   0,  'Check for hsp total gaps' );
+            }
+            elsif ($example_counter == 2) {
+                # Query and Hit lengths are usually unknown in HMMER,
+                # but sometimes they can be deduced from domain data '[]'
+                is( $hit->length,              153,  'Check hit length' );
+                is( $hit->frac_aligned_query, '1.00' );
+                is( $hit->frac_aligned_hit,    0.34 );
+
+                $hsp = $hit->next_domain;
+                is( $hsp->query->seq_id(), 'SEED',   'Check for query seq_id' );
+                is( $hsp->hit->seq_id(),   'Q61954', 'Check for hit seq_id' );
+
+                is( $hsp->hit->start,       102, 'Check for hit hmmfrom value' );
+                is( $hsp->hit->end,         153, 'Check for hit hmm to value' );
+                is( $hsp->query->start,     1,   'Check for query alifrom value' );
+                is( $hsp->query->end,       77,  'Check for query ali to value' );
+                is( $hsp->score,            3.3, 'Check for hsp score' );
+                float_is( $hsp->evalue,     1.9, 'Check for hsp c-Evalue' );
+
+                is( $hsp->length('query'), 77, 'Check for hsp query length' );
+                is( $hsp->length('hit'),   52, 'Check for hsp hit length' );
+                is( $hsp->length('total'), 0,  'Check for hsp total length' );
+                is( $hsp->gaps('query'),   0,  'Check for hsp query gaps' );
+                is( $hsp->gaps('hit'),     0,  'Check for hsp hit gaps' );
+                is( $hsp->gaps('total'),   0,  'Check for hsp total gaps' );
+
+                last;
+            }
+        }
+    }
 }
 
 $searchio = Bio::SearchIO->new(
@@ -155,31 +339,84 @@ while ( $result = $searchio->next_result ) {
     is( $result->algorithm_version, '2.2g',       'Check algorithm version' );
     is( $result->hmm_name,          'Pfam',       'Check hmm_name' );
     is( $result->sequence_file,     'L77119.faa', 'Check sequence_file' );
-    is( $result->query_name, 'gi|1522636|gb|AAC37060.1|',
-        'Check query_name' );
+
+    is( $result->query_name,
+        'gi|1522636|gb|AAC37060.1|',
+        'Check query_name'
+    );
+    is( $result->query_length, 0, 'Check query_length absence' );
     is( $result->query_description,
         'M. jannaschii predicted coding region MJECS02 [Methanococcus jannaschii]',
         'Check query_description'
     );
     is( $result->num_hits(), 1, 'Check num_hits' );
+
     my $hit = $result->next_hit;
+    is( ref($hit), 'Bio::Search::Hit::HMMERHit',
+        'Check for the correct hit reference type' );
     is( $hit->name, 'Methylase_M', 'Check hit name' );
     is( $hit->description,
         'Type I restriction modification system, M',
         'Check for hit description'
     );
+    is( $hit->raw_score,         -105.2,  'Check hit raw_score' );
     float_is( $hit->significance, 0.0022, 'Check hit significance' );
-    is( $hit->raw_score, -105.2, 'Check hit raw_score' );
+    is( $hit->num_hsps,           1,      'Check num_hsps' );
+
+    # Query and Hit lengths are usually unknown in HMMER,
+    # but sometimes they can be deduced from domain data '[]'
+    is( $hit->length,             279,    'Check hit length' );
+    is( $hit->frac_aligned_query, undef );
+    is( $hit->frac_aligned_hit,  '1.00' );
+
+    is( $hit->matches('cons'), 133, 'Check hit total conserved residues' );
+    is( $hit->matches('id'),   48,  'Check hit total identical residues' );
+    is( sprintf( "%.3f", $hit->frac_identical('query') ), 0.238 );
+    is( sprintf( "%.3f", $hit->frac_identical('hit') ),   0.172 );
+    is( sprintf( "%.3f", $hit->frac_identical('total') ), 0.171 );
+    is( sprintf( "%.3f", $hit->frac_conserved('query') ), 0.658 );
+    is( sprintf( "%.3f", $hit->frac_conserved('hit') ),   0.477 );
+    is( sprintf( "%.3f", $hit->frac_conserved('total') ), 0.475 );
+
     my $hsp = $hit->next_hsp;
-    is( $hsp->score, -105.2, 'Check for hsp score' );
+    is( ref($hsp), 'Bio::Search::HSP::HMMERHSP',
+        'Check for correct hsp reference type' );
+    is( $hsp->query->seq_id(), 'gi|1522636|gb|AAC37060.1|', 'Check for query seq_id' );
+    is( $hsp->hit->seq_id(),   'Methylase_M',               'Check for hit seq_id' );
+
+    is( $hsp->hit->start,   1,      'Check for hit hmmfrom value' );
+    is( $hsp->hit->end,     279,    'Check for hit hmm to value' );
+    is( $hsp->query->start, 280,    'Check for query alifrom value' );
+    is( $hsp->query->end,   481,    'Check for query ali to value' );
+    is( $hsp->score,       -105.2,  'Check for hsp score' );
     float_is( $hsp->evalue, 0.0022, 'Check for hsp evalue' );
-    is( $hsp->query->start, 280, 'Check for query alifrom value' );
-    is( $hsp->query->end,   481, 'Check for query ali to value' );
-    is( $hsp->hit->start,   1,   'Check for hit hmmfrom value' );
-    is( $hsp->hit->end,     279, 'Check for hit hmm to value' );
-    is( $hsp->query->seq_id(),
-        'gi|1522636|gb|AAC37060.1|', 'Check for query seq_id' );
-    is( $hsp->hit->seq_id(), 'Methylase_M', 'Check for hit seq_id' );
+
+    is( $hsp->length('query'), 202, 'Check for hsp query length' );
+    is( $hsp->length('hit'),   279, 'Check for hsp hit length' );
+    is( $hsp->length('total'), 280, 'Check for hsp total length' );
+    is( $hsp->gaps('query'),   78,  'Check for hsp query gaps' );
+    is( $hsp->gaps('hit'),     1,   'Check for hsp hit gaps' );
+    is( $hsp->gaps('total'),   79,  'Check for hsp total gaps' );
+
+    ($hit->length == 0) ?
+          is( $hsp->{HIT_LENGTH}, $hsp->hit->length, 'Check hit length consistency' )
+        : is( $hsp->{HIT_LENGTH}, $hit->length,      'Check hit length consistency' );
+    ($result->query_length == 0) ?
+          is( $hsp->{QUERY_LENGTH}, $hsp->query->length,   'Check query length consistency' )
+        : is( $hsp->{QUERY_LENGTH}, $result->query_length, 'Check query length consistency' );
+
+    is( $hsp->num_conserved, 133 );
+    is( $hsp->num_identical, 48 );
+    is( sprintf( "%.2f", $hsp->percent_identity ),        17.14 );
+    is( sprintf( "%.3f", $hsp->frac_identical('query') ), 0.238 );
+    is( sprintf( "%.3f", $hsp->frac_identical('hit') ),   0.172 );
+    is( sprintf( "%.3f", $hsp->frac_identical('total') ), 0.171 );
+    is( sprintf( "%.3f", $hsp->frac_conserved('query') ), 0.658 );
+    is( sprintf( "%.3f", $hsp->frac_conserved('hit') ),   0.477 );
+    is( sprintf( "%.3f", $hsp->frac_conserved('total') ), 0.475 );
+
+    is (length($hsp->homology_string), length($hsp->query_string));
+
     is( $hsp->hit_string,
         'lrnELentLWavADkLRGsmDaseYKdyVLGLlFlKYiSdkFlerrieieerktdtesepsldyakledqyeqlededlekedfyqkkGvFilPsqlFwdfikeaeknkldedigtdldkifseledqialgypaSeedfkGlfpdldfnsnkLgskaqarnetLtelidlfselelgtPmHNG-dfeelgikDlfGDaYEYLLgkFAeneGKsGGeFYTPqeVSkLiaeiLtigqpsegdfsIYDPAcGSGSLllqaskflgehdgkrnaisyYGQEsn',
         'Check for hiy string'
@@ -226,27 +463,82 @@ while ( $result = $searchio->next_result ) {
     );
     is( $result->database_name,   'cysprot1b.fa', 'Check database_name' );
     is( $result->sequence_file,   'cysprot1b.fa', 'Check sequence_file' );
+
     is( $result->query_name,      'Peptidase_C1', 'Check query_name' );
+    is( $result->query_length,     337,           'Check query_length' );
     is( $result->query_accession, 'PF00112',      'Check query_accession' );
     is( $result->query_description,
         'Papain family cysteine protease',
         'Check query_description'
     );
     is( $result->num_hits(), 4, 'Check num_hits' );
+
     my $hit = $result->next_hit;
-    is( $hit->name,        'CATL_RAT', 'Check hit name' );
-    is( $hit->description, '',         'Check for hit description' );
+    is( ref($hit), 'Bio::Search::Hit::HMMERHit',
+        'Check for the correct hit reference type' );
+    is( $hit->name, 'CATL_RAT', 'Check hit name' );
+    is( $hit->description,
+        '',
+        'Check for hit description'
+    );
+    is( $hit->raw_score,          449.4,  'Check hit raw_score' );
     float_is( $hit->significance, 2e-135, 'Check hit significance' );
-    is( $hit->raw_score, 449.4, 'Check hit raw_score' );
+    is( $hit->num_hsps,           1,      'Check num_hsps' );
+
+    # Query and Hit lengths are usually unknown in HMMER,
+    # but sometimes they can be deduced from domain data '[]'
+    is( $hit->length,              0,     'Check hit length absence' );
+    is( $hit->frac_aligned_query, '1.00' );
+    is( $hit->frac_aligned_hit,    undef );
+
+    is( $hit->matches('cons'), 204, 'Check hit total conserved residues' );
+    is( $hit->matches('id'),   131, 'Check hit total identical residues' );
+    is( sprintf( "%.3f", $hit->frac_identical('query') ), 0.389 );
+    is( sprintf( "%.3f", $hit->frac_identical('hit') ),   0.598 );
+    is( sprintf( "%.3f", $hit->frac_identical('total') ), 0.389 );
+    is( sprintf( "%.3f", $hit->frac_conserved('query') ), 0.605 );
+    is( sprintf( "%.3f", $hit->frac_conserved('hit') ),   0.932 );
+    is( sprintf( "%.3f", $hit->frac_conserved('total') ), 0.605 );
+
     my $hsp = $hit->next_hsp;
-    is( $hsp->score, 449.4, 'Check for hsp score' );
-    float_is( $hsp->evalue, 2e-135, 'Check for hsp evalue' );
-    is( $hsp->query->start, 1,   'Check for query alifrom value' );
-    is( $hsp->query->end,   337, 'Check for query ali to value' );
-    is( $hsp->hit->start,   114, 'Check for hit hmmfrom value' );
-    is( $hsp->hit->end,     332, 'Check for hit hmm to value' );
+    is( ref($hsp), 'Bio::Search::HSP::HMMERHSP',
+        'Check for correct hsp reference type' );
     is( $hsp->query->seq_id(), 'Peptidase_C1', 'Check for query seq_id' );
     is( $hsp->hit->seq_id(),   'CATL_RAT',     'Check for hit seq_id' );
+
+    is( $hsp->hit->start,       114,           'Check for hit hmmfrom value' );
+    is( $hsp->hit->end,         332,           'Check for hit hmm to value' );
+    is( $hsp->query->start,     1,             'Check for query alifrom value' );
+    is( $hsp->query->end,       337,           'Check for query ali to value' );
+    is( $hsp->score,            449.4,         'Check for hsp score' );
+    float_is( $hsp->evalue,     2e-135,        'Check for hsp evalue' );
+
+    is( $hsp->length('query'), 337, 'Check for hsp query length' );
+    is( $hsp->length('hit'),   219, 'Check for hsp hit length' );
+    is( $hsp->length('total'), 337, 'Check for hsp total length' );
+    is( $hsp->gaps('query'),   0,   'Check for hsp query gaps' );
+    is( $hsp->gaps('hit'),     118, 'Check for hsp hit gaps' );
+    is( $hsp->gaps('total'),   118, 'Check for hsp total gaps' );
+
+    ($hit->length == 0) ?
+          is( $hsp->{HIT_LENGTH}, $hsp->hit->length, 'Check hit length consistency' )
+        : is( $hsp->{HIT_LENGTH}, $hit->length,      'Check hit length consistency' );
+    ($result->query_length == 0) ?
+          is( $hsp->{QUERY_LENGTH}, $hsp->query->length,   'Check query length consistency' )
+        : is( $hsp->{QUERY_LENGTH}, $result->query_length, 'Check query length consistency' );
+
+    is( $hsp->num_conserved, 204 );
+    is( $hsp->num_identical, 131 );
+    is( sprintf( "%.2f", $hsp->percent_identity ),        38.87 );
+    is( sprintf( "%.3f", $hsp->frac_identical('query') ), 0.389 );
+    is( sprintf( "%.3f", $hsp->frac_identical('hit') ),   0.598 );
+    is( sprintf( "%.3f", $hsp->frac_identical('total') ), 0.389 );
+    is( sprintf( "%.3f", $hsp->frac_conserved('query') ), 0.605 );
+    is( sprintf( "%.3f", $hsp->frac_conserved('hit') ),   0.932 );
+    is( sprintf( "%.3f", $hsp->frac_conserved('total') ), 0.605 );
+
+    is (length($hsp->homology_string), length($hsp->query_string));
+
     is( $hsp->hit_string,
         'IPKTVDWRE-KG-CVTPVKNQG-QCGSCWAFSASGCLEGQMFLKT------GKLISLSEQNLVDCSH-DQGNQ------GCNG-GLMDFAFQYIKE-----NGGLDSEESY-----PYE----AKD-------------------GSCKYR-AEYAV-----ANDTGFVDIPQQ-----EKALMKAVATVGPISVAMDASHPS---LQFYSSG-------IYYEP---NCSSK---DLDHGVLVVGYGYEG-T------------------------------------DSNKDKYWLVKNSWGKEWGMDGYIKIAKDRN----NHCGLATAASYPI',
         'Check for hiy string'
@@ -259,25 +551,52 @@ while ( $result = $searchio->next_result ) {
         'lPesfDWReWkggaVtpVKdQGiqCGSCWAFSavgalEgryciktgtkawggklvsLSEQqLvDCdgedygnngesCGyGCnGGGlmdnAfeYikkeqIsnNgGlvtEsdYekgCkPYtdfPCgkdggndtyypCpgkaydpndTgtCkynckknskypktyakikgygdvpynvsTydEealqkalaknGPvsVaidasedskgDFqlYksGendvgyGvYkhtsageCggtpfteLdHAVliVGYGteneggtfdetssskksesgiqvssgsngssgSSgssgapiedkgkdYWIVKNSWGtdWGEnGYfriaRgknksgkneCGIaseasypi',
         'Check for query string'
     );
+    # Hmmsearch2 don't have PP or CS strings, these are tests to check for side effects
+    is( $hsp->posterior_string, '' );
+    is( $hsp->consensus_string, '' );
+
     $hit = $result->next_hit;
-    is( $hit->name,        'CATL_HUMAN', 'Check hit name' );
-    is( $hit->description, '',           'Check for hit description' );
-    float_is( $hit->significance, 6.1e-134, 'Check hit significance' );
-    is( $hit->raw_score, 444.5, 'Check hit raw_score' );
+    is( $hit->name,              'CATL_HUMAN', 'Check hit name' );
+    is( $hit->description,       '',           'Check for hit description' );
+    is( $hit->raw_score,          444.5,       'Check hit raw_score' );
+    float_is( $hit->significance, 6.1e-134,    'Check hit significance' );
 }
 
-# test for bug 2632 - CS lines should get ignored without breaking the parser
+# test for bug 2632 - CS lines are captured without breaking the parser
 $searchio = Bio::SearchIO->new(
     -format => 'hmmer',
     -file   => test_input_file('hmmpfam_cs.out')
 );
-$result = $searchio->next_result;
-my $hit = $result->next_hit;
-my $hsp = $hit->next_hsp;
-is( $hsp->seq_str,
-    'CGV-GFIADVNNVANHKIVVQALEALTCMEHRGACSADRDSGDGAGITTAIPWNLFQKSLQNQNIKFEQnDSVGVGMLFLPAHKLKES--KLIIETVLKEENLEIIGWRLVPTVQEVLGKQAYLNKPHVEQVFCKSSNLSKDRLEQQLFLVRKKIEKYIGINGKDwaheFYICSLSCYTIVYKGMMRSAVLGQFYQDLYHSEYTSSFAIYHRRFSTNTMPKWPLAQPMR---------FVSHNGEINTLLGNLNWMQSREPLLQSKVWKDRIHELKPITNKDNSDSANLDAAVELLIASGRSPEEALMILVPEAFQNQPDFA-NNTEISDFYEYYSGLQEPWDGPALVVFTNGKV-IGATLDRNGL-RPARYVIT----KDNLVIVSSES',
-    'Check for hsp seq_str'
-);
+if (defined ($result = $searchio->next_result) ) {
+    my $hit = $result->next_hit;
+    my $hsp = $hit->next_hsp;
+
+    is ($hsp->seq_str,                  $hsp->query_string);
+    is (length($hsp->seq_str),          length($hsp->query_string));
+    is (length($hsp->homology_string),  length($hsp->query_string));
+    is (length($hsp->consensus_string), length($hsp->query_string));
+
+    is( $hsp->consensus_string,
+        'EEEEEEEEETSSHSBHHHHHHHHHHHHHGGGGSSCSTTSSCECEEEEEEECTCCCHHHHHHHCT----S GC-EEEEEEE-SSHHHHHHHHHHHHHHHHHTT-EEEEEEE--B-GGGS-HHHHHC--EEEEEEEE-TT--HHHHHHCEEEEECHSCHHHHTHHH.    BEEEEEESSEEEEEECC-GGGHHHHBHGGGSTTEEBSEEEEEECESSSSSCTGGGSSCEEECCCTTCEEEEEEEEETTTHHHHHHHHHHTSCCCSSTTCGHHHHCC-SSS-TTSCHHHHHHHHHHHHHHTT--HHHHHHHHS----TT-GGGTST-HHHHHHHHHHHHHHCCHCCEEEEEEETSSEEEEEEETTTSCESEEEEEEEEEE.TTEEEEEESSC',
+        'Check for consensus structure string'
+    );
+    is( $hsp->seq_str,
+        'CGV-GFIADVNNVANHKIVVQALEALTCMEHRGACSADRDSGDGAGITTAIPWNLFQKSLQNQNIKFEQnDSVGVGMLFLPAHKLKES--KLIIETVLKEENLEIIGWRLVPTVQEVLGKQAYLNKPHVEQVFCKSSNLSKDRLEQQLFLVRKKIEKYIGINGKDwaheFYICSLSCYTIVYKGMMRSAVLGQFYQDLYHSEYTSSFAIYHRRFSTNTMPKWPLAQPMR---------FVSHNGEINTLLGNLNWMQSREPLLQSKVWKDRIHELKPITNKDNSDSANLDAAVELLIASGRSPEEALMILVPEAFQNQPDFA-NNTEISDFYEYYSGLQEPWDGPALVVFTNGKV-IGATLDRNGL-RPARYVIT----KDNLVIVSSES',
+        'Check for hsp seq_str'
+    );
+    is( $hsp->query_string,
+        'CGV-GFIADVNNVANHKIVVQALEALTCMEHRGACSADRDSGDGAGITTAIPWNLFQKSLQNQNIKFEQnDSVGVGMLFLPAHKLKES--KLIIETVLKEENLEIIGWRLVPTVQEVLGKQAYLNKPHVEQVFCKSSNLSKDRLEQQLFLVRKKIEKYIGINGKDwaheFYICSLSCYTIVYKGMMRSAVLGQFYQDLYHSEYTSSFAIYHRRFSTNTMPKWPLAQPMR---------FVSHNGEINTLLGNLNWMQSREPLLQSKVWKDRIHELKPITNKDNSDSANLDAAVELLIASGRSPEEALMILVPEAFQNQPDFA-NNTEISDFYEYYSGLQEPWDGPALVVFTNGKV-IGATLDRNGL-RPARYVIT----KDNLVIVSSES',
+        'Check for query string'
+    );
+    is( $hsp->hit_string,
+        'CGvlGfiAhikgkpshkivedaleaLerLeHRGavgADgktGDGAGIltqiPdgFFrevakelGieLpe-gqYAVGmvFLPqdelaraearkifEkiaeeeGLeVLGWReVPvnnsvLGetAlatePvIeQvFvgapsgdgedfErrLyviRkrieksivaenvn----fYiCSLSsrTIVYKGMLtseQLgqFYpDLqderfeSalAivHsRFSTNTfPsWplAQPfRVnslwgggivlAHNGEINTlrgNrnwMraRegvlksplFgddldkLkPIvneggSDSaalDnvlEllvraGRslpeAlMMlIPEAWqnnpdmdkdrpekraFYeylsglmEPWDGPAalvftDGryavgAtLDRNGLTRPaRygiTrdldkDglvvvaSEa',
+        'Check for hit string'
+    );
+    is( $hsp->homology_string,
+        'CGv GfiA+ ++ ++hkiv +aleaL+++eHRGa++AD ++GDGAGI t+iP+++F++  ++++i++ ++   +VGm+FLP   l+    + i+E +++ee+Le++GWR VP+  +vLG++A  + P++eQvF+ +++ +++ +E++L+++Rk+iek+i+  + +  ++fYiCSLS++TIVYKGM++s++LgqFY+DL++++++S++Ai+H+RFSTNT+P+WplAQP+R         ++ HNGEINTl gN nwM++Re +l+s++++d++++LkPI n+++SDSa+lD ++Ell+++GRs++eAlM+l+PEA+qn+pd   +++e+ +FYey+sgl+EPWDGPA++vft+G++ +gAtLDRNGL RPaRy+iT    kD+lv+v+SE+',
+        'Check for homology string'
+    );
+}
 
 # Tests for hmmer3 output here
 $searchio = Bio::SearchIO->new(
@@ -287,58 +606,169 @@ $searchio = Bio::SearchIO->new(
 );
 is( ref($searchio), 'Bio::SearchIO::hmmer3',
     'Check if correct searchio object is returned' );
+my $counter = 0;
 while ( $result = $searchio->next_result ) {
-    is( ref($result),
-        'Bio::Search::Result::HMMERResult',
-        'Check for the correct result reference type'
-    );
-    is( $result->algorithm,         'HMMSCAN', 'Check algorithm' );
-    is( $result->algorithm_version, '3.0',     'Check algorithm version' );
-    is( $result->hmm_name,
-        '/data/biodata/HMMerDB/Pfam.hmm',
-        'Check hmm_name'
-    );
-    is( $result->sequence_file, 'BA000019.orf1.fasta',
-        'Check sequence_file' );
-    is( $result->query_name, 'BA000019.orf1', 'Check query_name' );
-    is( $result->query_length, '198', 'Check query_length' );
-    is( $result->query_description, '', 'Check query_description' );
-    is( $result->num_hits(),        1,  'Check num_hits' );
-    my ( $hsp, $hit );
-
-    if ( $hit = $result->next_model ) {
-        is( ref($hit), 'Bio::Search::Hit::HMMERHit',
-            'Check for the correct hit reference type' );
-        is( $hit->name, 'Peripla_BP_2', 'Check hit name' );
-        is( $hit->description,
-            'Periplasmic binding protein',
-            'Check for hit description'
+    $counter++;
+    if ($counter == 1) {
+        is( ref($result),
+            'Bio::Search::Result::HMMERResult',
+            'Check for the correct result reference type'
+        );
+        is( $result->algorithm,         'HMMSCAN', 'Check algorithm' );
+        is( $result->algorithm_version, '3.0',     'Check algorithm version' );
+        is( $result->hmm_name,
+            '/data/biodata/HMMerDB/Pfam.hmm',
+            'Check hmm_name'
+        );
+        is( $result->sequence_file,
+            'BA000019.orf1.fasta',
+            'Check sequence_file'
         );
-        is( $hit->raw_score, '105.2', 'Check hit raw_score' );
-        float_is( $hit->significance, 6e-30, 'Check hit significance' );
-        is( $hit->num_hsps, 1, 'Check num_hsps' );
+        is( $result->query_name,        'BA000019.orf1', 'Check query_name' );
+        is( $result->query_length,       198,            'Check query_length' );
+        is( $result->query_accession,   '',              'Check query_accession' );
+        is( $result->query_description, '',              'Check query_description' );
+        # 1 hit above and 6 below inclusion threshold
+        is( $result->num_hits(), 7, 'Check num_hits' );
 
-        if ( defined( $hsp = $hit->next_domain ) ) {
-            is( ref($hsp), 'Bio::Search::HSP::HMMERHSP',
-                'Check for correct hsp reference type' );
-            is( $hsp->hit->start,   59,  'Check for hit hmmfrom value' );
-            is( $hsp->hit->end,     236, 'Check for hit hmm to value' );
-            is( $hsp->query->start, 2,   'Check for query alifrom value' );
-            is( $hsp->query->end,   173, 'Check for query ali to value' );
-            is( $hsp->score, '105.0', 'Check for hsp score' );
-            float_is( $hsp->evalue, 1.5e-33, 'Check for hsp c-Evalue' );
-            is( $hsp->query_string,
-                'LKPDLIIGREYQ---KNIYNQLSNFAPTVLVDWGSF-TSFQDNFRYIAQVLNEEEQGKLVLQQYQKRIRDLQDRMGERlQKIEVSVIGFSGQSIKSLNR-DAVFNQVLDDAGIKRIsIQKNQQERYLEISIENLNKYDADVLFVINE---SKEQLYPDLKNPLWHHLRAVKKQQVYVVNQ',
-                'Check for query string'
-            );
-            is( $hsp->hit_string,
-                'lkPDlvivsafgalvseieellelgipvvavessstaeslleqirllgellgeedeaeelvaelesridavkaridsl-kpktvlvfgyadegikvvfgsgswvgdlldaaggeni-iaeakgseseeisaEqilaadpdviivsgrgedtktgveelkenplwaelpAvkngrvyllds',
-                'Check for hit string'
-            );
-            is( $hsp->homology_string,
-                'lkPDl+i+ +++   ++i+++l++ +p+v v+  s+  s+++ +r ++++l+ee++++ + +++++ri+++++r  +  ++ +v+v+g+++ +ik+++  +  ++++ld+ag++ i i++++++ + eis+E+++++d+dv++v       k+ +   ++nplw +l+Avk+++vy++++',
-                'Check for homology string'
+        my ( $hsp, $hit );
+        if ( $hit = $result->next_model ) {
+            is( ref($hit), 'Bio::Search::Hit::HMMERHit',
+                'Check for the correct hit reference type' );
+            is( $hit->name, 'Peripla_BP_2', 'Check hit name' );
+            is( $hit->description,
+                'Periplasmic binding protein',
+                'Check for hit description'
             );
+            is( $hit->raw_score,          105.2, 'Check hit raw_score' );
+            float_is( $hit->significance, 6e-30, 'Check hit significance' );
+            is( $hit->num_hsps,           1,     'Check num_hsps' );
+
+            # Hit length is usually unknown for HMMSCAN and HMMSEARCH but not for NHMMER.
+            # When is not known, sometimes it can be deduced from domain data '[]'
+            is( $hit->length,             0,     'Check hit length absence' );
+            is( $hit->frac_aligned_query, 0.87 );
+            is( $hit->frac_aligned_hit,   undef );
+
+            if ( defined( $hsp = $hit->next_domain ) ) {
+                is( ref($hsp), 'Bio::Search::HSP::HMMERHSP',
+                    'Check for correct hsp reference type' );
+                is( $hsp->hit->seq_id(),   'Peripla_BP_2',  'Check for hit seq_id' );
+                is( $hsp->query->seq_id(), 'BA000019.orf1', 'Check for query seq_id' );
+
+                is( $hsp->hit->start,   59,      'Check for hit hmmfrom value' );
+                is( $hsp->hit->end,     236,     'Check for hit hmm to value' );
+                is( $hsp->query->start, 2,       'Check for query alifrom value' );
+                is( $hsp->query->end,   173,     'Check for query ali to value' );
+                is( $hsp->score,       '105.0',  'Check for hsp score' );
+                float_is( $hsp->evalue, 1.5e-33, 'Check for hsp c-Evalue' );
+
+                is( $hsp->length('query'), 172, 'Check for hsp query length' );
+                is( $hsp->length('hit'),   178, 'Check for hsp hit length' );
+                is( $hsp->length('total'), 180, 'Check for hsp total length' );
+                is( $hsp->gaps('query'),   8,   'Check for hsp query gaps' );
+                is( $hsp->gaps('hit'),     2,   'Check for hsp hit gaps' );
+                is( $hsp->gaps('total'),   10,  'Check for hsp total gaps' );
+
+                ($hit->length == 0) ?
+                      is( $hsp->{HIT_LENGTH}, $hsp->hit->length, 'Check hit length consistency' )
+                    : is( $hsp->{HIT_LENGTH}, $hit->length,      'Check hit length consistency' );
+                ($result->query_length == 0) ?
+                      is( $hsp->{QUERY_LENGTH}, $hsp->query->length,   'Check query length consistency' )
+                    : is( $hsp->{QUERY_LENGTH}, $result->query_length, 'Check query length consistency' );
+
+                is( $hsp->num_conserved, 140 );
+                is( $hsp->num_identical, 50 );
+                is( sprintf( "%.2f", $hsp->percent_identity ),        27.78 );
+                is( sprintf( "%.3f", $hsp->frac_identical('query') ), 0.291 );
+                is( sprintf( "%.3f", $hsp->frac_identical('hit') ),   0.281 );
+                is( sprintf( "%.3f", $hsp->frac_identical('total') ), 0.278 );
+                is( sprintf( "%.3f", $hsp->frac_conserved('query') ), 0.814 );
+                is( sprintf( "%.3f", $hsp->frac_conserved('hit') ),   0.787 );
+                is( sprintf( "%.3f", $hsp->frac_conserved('total') ), 0.778 );
+
+                is (length($hsp->homology_string), length($hsp->query_string));
+
+                is( $hsp->query_string,
+                    'LKPDLIIGREYQ---KNIYNQLSNFAPTVLVDWGSF-TSFQDNFRYIAQVLNEEEQGKLVLQQYQKRIRDLQDRMGERlQKIEVSVIGFSGQSIKSLNR-DAVFNQVLDDAGIKRIsIQKNQQERYLEISIENLNKYDADVLFVINE---SKEQLYPDLKNPLWHHLRAVKKQQVYVVNQ',
+                    'Check for query string'
+                );
+                is( $hsp->hit_string,
+                    'lkPDlvivsafgalvseieellelgipvvavessstaeslleqirllgellgeedeaeelvaelesridavkaridsl-kpktvlvfgyadegikvvfgsgswvgdlldaaggeni-iaeakgseseeisaEqilaadpdviivsgrgedtktgveelkenplwaelpAvkngrvyllds',
+                    'Check for hit string'
+                );
+                is( $hsp->homology_string,
+                    'lkPDl+i+ +++   ++i+++l++ +p+v v+  s+  s+++ +r ++++l+ee++++ + +++++ri+++++r  +  ++ +v+v+g+++ +ik+++  +  ++++ld+ag++ i i++++++ + eis+E+++++d+dv++v       k+ +   ++nplw +l+Avk+++vy++++',
+                    'Check for homology string'
+                );
+                is( $hsp->posterior_string,
+                    '8***********...********************9.*****************************************999999999999997777776.5678999999****99777777*************************...77777777899***************9976',
+                    'Check for posterior probability string'
+                );
+            }
+        }
+    }
+    # Check for errors in HSP caused by the existence of 2 hits with the same ID
+    elsif ($counter == 2) {
+        is( $result->algorithm,         'HMMSCAN', 'Check algorithm' );
+        is( $result->algorithm_version, '3.0',     'Check algorithm version' );
+        is( $result->hmm_name,
+            '/data/biodata/HMMerDB/Pfam.hmm',
+            'Check hmm_name'
+        );
+        is( $result->sequence_file,
+            'BA000019.orf1.fasta',
+            'Check sequence_file'
+        );
+        is( $result->query_name,        'lcl|Test_ID.1|P1', 'Check query_name' );
+        is( $result->query_length,       463,               'Check query_length' );
+        is( $result->query_description, '281521..282909',   'Check query_description' );
+        is( $result->num_hits(),         2,                 'Check num_hits' );
+
+        my ( $hsp, $hit );
+        my $hit_counter = 0;
+        while ( $hit = $result->next_model ) {
+            $hit_counter++;
+            if ($hit_counter == 1) {
+                is( ref($hit), 'Bio::Search::Hit::HMMERHit',
+                    'Check for the correct hit reference type' );
+                is( $hit->name,        'IS4.original', 'Check hit name' );
+                is( $hit->description, '',             'Check for hit description' );
+                is( $hit->num_hsps,     1,             'Check num_hsps' );
+                if ( defined( $hsp = $hit->next_domain ) ) {
+                    is( ref($hsp), 'Bio::Search::HSP::HMMERHSP',
+                        'Check for correct hsp reference type' );
+                    is( $hsp->hit->seq_id(),   'IS4.original',     'Check for hit seq_id' );
+                    is( $hsp->query->seq_id(), 'lcl|Test_ID.1|P1', 'Check for query seq_id' );
+
+                    is( $hsp->hit->start,   315,     'Check for hit hmmfrom value' );
+                    is( $hsp->hit->end,     353,     'Check for hit hmm to value' );
+                    is( $hsp->query->start, 335,     'Check for query alifrom value' );
+                    is( $hsp->query->end,   369,     'Check for query ali to value' );
+                    is( $hsp->score,        18.9,    'Check for hsp score' );
+                    float_is( $hsp->evalue, 8.9e-08, 'Check for hsp c-Evalue' );
+                }
+            }
+            elsif ($hit_counter == 2) {
+                is( ref($hit), 'Bio::Search::Hit::HMMERHit',
+                    'Check for the correct hit reference type' );
+                is( $hit->name,        'IS4.original', 'Check hit name' );
+                is( $hit->description, '',             'Check for hit description' );
+                is( $hit->num_hsps,     1,             'Check num_hsps' );
+                if ( defined( $hsp = $hit->next_domain ) ) {
+                    is( ref($hsp), 'Bio::Search::HSP::HMMERHSP',
+                        'Check for correct hsp reference type' );
+                    is( $hsp->hit->seq_id(),   'IS4.original',     'Check for hit seq_id' );
+                    is( $hsp->query->seq_id(), 'lcl|Test_ID.1|P1', 'Check for query seq_id' );
+
+                    is( $hsp->hit->start,   315,    'Check for hit hmmfrom value' );
+                    is( $hsp->hit->end,     353,    'Check for hit hmm to value' );
+                    is( $hsp->query->start, 335,    'Check for query alifrom value' );
+                    is( $hsp->query->end,   369,    'Check for query ali to value' );
+                    is( $hsp->score,        18.8,   'Check for hsp score' );
+                    float_is( $hsp->evalue, 9e-08, 'Check for hsp c-Evalue' );
+                }
+            }
         }
     }
 }
@@ -371,6 +801,232 @@ while ( $result = $searchio->next_result ) {
 
 $searchio = Bio::SearchIO->new(
     -format  => 'hmmer',
+    -file    => test_input_file('hmmsearch3_multi.out'),
+    -verbose => 1
+);
+is( ref($searchio), 'Bio::SearchIO::hmmer3',
+    'Check if correct searchio object is returned' );
+$counter = 0;
+while ( $result = $searchio->next_result ) {
+    $counter++;
+    if ($counter == 1) {
+        is( ref($result),
+            'Bio::Search::Result::HMMERResult',
+            'Check for the correct result reference type'
+        );
+        is( $result->algorithm,         'HMMSEARCH',             'Check algorithm' );
+        is( $result->algorithm_version, '3.0',                   'Check algorithm version' );
+        is( $result->hmm_name,          'Pfam-A.hmm',            'Check hmm_name' );
+        is( $result->sequence_file,     'test_seqs.seq_raw.txt', 'Check sequence_file' );
+
+        is( $result->query_name,      '1-cysPrx_C', 'Check query_name' );
+        is( $result->query_length,     40,          'Check query_length' );
+        is( $result->query_accession, 'PF10417.4',  'Check query_accession' );
+        is( $result->query_description,
+            'C-terminal domain of 1-Cys peroxiredoxin',
+            'Check query_description'
+        );
+        is( $result->num_hits(), 0, 'Check num_hits' );
+    }
+    elsif ($counter == 2) {
+        is( ref($result),
+            'Bio::Search::Result::HMMERResult',
+            'Check for the correct result reference type'
+        );
+        is( $result->algorithm,         'HMMSEARCH',             'Check algorithm' );
+        is( $result->algorithm_version, '3.0',                   'Check algorithm version' );
+        is( $result->hmm_name,          'Pfam-A.hmm',            'Check hmm_name' );
+        is( $result->sequence_file,     'test_seqs.seq_raw.txt', 'Check sequence_file' );
+
+        is( $result->query_name,      'DUF4229',   'Check query_name' );
+        is( $result->query_length,     69,         'Check query_length' );
+        is( $result->query_accession, 'PF14012.1', 'Check query_accession' );
+        is( $result->query_description,
+            'Protein of unknown function (DUF4229)',
+            'Check query_description'
+        );
+        is( $result->num_hits(), 1, 'Check num_hits' );
+
+        my ( $hsp, $hit );
+        if ( $hit = $result->next_model ) {
+            is( ref($hit), 'Bio::Search::Hit::HMMERHit',
+                'Check for the correct hit reference type' );
+            is( $hit->name, 'lcl|Protein_ID1.3|M3', 'Check hit name' );
+            is( $hit->description,
+                'complement(48376..51420)',
+                'Check for hit description'
+            );
+            is( $hit->raw_score,         -17.8, 'Check hit raw_score' );
+            float_is( $hit->significance, 3,    'Check hit significance' );
+            is( $hit->num_hsps,           5,    'Check num_hsps' );
+
+            # Check first HSP
+            if ( defined( $hsp = $hit->next_domain ) ) {
+                is( ref($hsp), 'Bio::Search::HSP::HMMERHSP',
+                    'Check for correct hsp reference type' );
+                is( $hsp->hit->seq_id(),   'lcl|Protein_ID1.3|M3', 'Check for hit seq_id' );
+                is( $hsp->query->seq_id(), 'DUF4229',              'Check for query seq_id' );
+
+                is( $hsp->hit->start,   305, 'Check for hit alifrom value' );
+                is( $hsp->hit->end,     311, 'Check for hit ali to value' );
+                is( $hsp->query->start, 34,  'Check for query hmmfrom value' );
+                is( $hsp->query->end,   40,  'Check for query hmm to value' );
+                is( $hsp->score,       -4.3, 'Check for hsp score' );
+                float_is( $hsp->evalue, 1,   'Check for hsp c-Evalue' );
+
+                is( $hsp->length('query'), 7, 'Check for hsp query length' );
+                is( $hsp->length('hit'),   7, 'Check for hsp hit length' );
+                is( $hsp->length('total'), 7, 'Check for hsp total length' );
+                is( $hsp->gaps('query'),   0, 'Check for hsp query gaps' );
+                is( $hsp->gaps('hit'),     0, 'Check for hsp hit gaps' );
+                is( $hsp->gaps('total'),   0, 'Check for hsp total gaps' );
+
+                ($hit->length == 0) ?
+                      is( $hsp->{HIT_LENGTH}, $hsp->hit->length, 'Check hit length consistency' )
+                    : is( $hsp->{HIT_LENGTH}, $hit->length,      'Check hit length consistency' );
+                ($result->query_length == 0) ?
+                      is( $hsp->{QUERY_LENGTH}, $hsp->query->length,   'Check query length consistency' )
+                    : is( $hsp->{QUERY_LENGTH}, $result->query_length, 'Check query length consistency' );
+
+                is( $hsp->num_conserved, 6 );
+                is( $hsp->num_identical, 4 );
+                is( sprintf( "%.2f", $hsp->percent_identity ),        57.14 );
+                is( sprintf( "%.3f", $hsp->frac_identical('query') ), 0.571 );
+                is( sprintf( "%.3f", $hsp->frac_identical('hit') ),   0.571 );
+                is( sprintf( "%.3f", $hsp->frac_identical('total') ), 0.571 );
+                is( sprintf( "%.3f", $hsp->frac_conserved('query') ), 0.857 );
+                is( sprintf( "%.3f", $hsp->frac_conserved('hit') ),   0.857 );
+                is( sprintf( "%.3f", $hsp->frac_conserved('total') ), 0.857 );
+
+                is (length($hsp->homology_string), length($hsp->query_string));
+
+                is( $hsp->consensus_string,
+                    '',
+                    'Check for consensus structure string'
+                );
+                is( $hsp->query_string,
+                    'laallAl',
+                    'Check for query string'
+                );
+                is( $hsp->hit_string,
+                    'LAILSAI',
+                    'Check for hit string'
+                );
+                is( $hsp->homology_string,
+                    'la+l A+',
+                    'Check for homology string'
+                );
+                is( $hsp->posterior_string,
+                    '3333332',
+                    'Check for posterior probability string'
+                );
+            }
+        }
+    }
+    elsif ($counter == 3) {
+        is( ref($result),
+            'Bio::Search::Result::HMMERResult',
+            'Check for the correct result reference type'
+        );
+        is( $result->algorithm,         'HMMSEARCH',             'Check algorithm' );
+        is( $result->algorithm_version, '3.0',                   'Check algorithm version' );
+        is( $result->hmm_name,          'Pfam-A.hmm',            'Check hmm_name' );
+        is( $result->sequence_file,     'test_seqs.seq_raw.txt', 'Check sequence_file' );
+
+        is( $result->query_name,      'ACR_tran',   'Check query_name' );
+        is( $result->query_length,     1021,        'Check query_length' );
+        is( $result->query_accession, 'PF00873.14', 'Check query_accession' );
+        is( $result->query_description,
+            'AcrB/AcrD/AcrF family',
+            'Check query_description'
+        );
+        is( $result->num_hits(), 1, 'Check num_hits' );
+
+        my ( $hsp, $hit );
+        if ( $hit = $result->next_model ) {
+            is( ref($hit), 'Bio::Search::Hit::HMMERHit',
+                'Check for the correct hit reference type' );
+            is( $hit->name, 'lcl|Protein_ID1.3|M3', 'Check hit name' );
+            is( $hit->description,
+                'complement(48376..51420)',
+                'Check for hit description'
+            );
+            is( $hit->raw_score,          616.9,    'Check hit raw_score' );
+            float_is( $hit->significance, 9.3e-189, 'Check hit significance' );
+            is( $hit->num_hsps,           1,        'Check num_hsps' );
+
+            # Hit length is usually unknown for HMMSCAN and HMMSEARCH but not for NHMMER.
+            # When is not known, sometimes it can be deduced from domain data '[]'
+            is( $hit->length,             0,        'Check hit length absence' );
+            is( $hit->frac_aligned_query, 0.93 );
+            is( $hit->frac_aligned_hit,   undef );
+
+            if ( defined( $hsp = $hit->next_domain ) ) {
+                is( ref($hsp), 'Bio::Search::HSP::HMMERHSP',
+                    'Check for correct hsp reference type' );
+                is( $hsp->hit->seq_id(),   'lcl|Protein_ID1.3|M3', 'Check for hit seq_id' );
+                is( $hsp->query->seq_id(), 'ACR_tran',             'Check for query seq_id' );
+
+                is( $hsp->hit->start,   11,       'Check for hit alifrom value' );
+                is( $hsp->hit->end,     1000,     'Check for hit ali to value' );
+                is( $hsp->query->start, 71,       'Check for query hmmfrom value' );
+                is( $hsp->query->end,   1021,     'Check for query hmm to value' );
+                is( $hsp->score,        616.6,    'Check for hsp score' );
+                float_is( $hsp->evalue, 3.9e-189, 'Check for hsp c-Evalue' );
+
+                is( $hsp->length('query'), 951,  'Check for hsp query length' );
+                is( $hsp->length('hit'),   990,  'Check for hsp hit length' );
+                is( $hsp->length('total'), 1003, 'Check for hsp total length' );
+                is( $hsp->gaps('query'),   52,   'Check for hsp query gaps' );
+                is( $hsp->gaps('hit'),     13,   'Check for hsp hit gaps' );
+                is( $hsp->gaps('total'),   65,   'Check for hsp total gaps' );
+
+                ($hit->length == 0) ?
+                      is( $hsp->{HIT_LENGTH}, $hsp->hit->length, 'Check hit length consistency' )
+                    : is( $hsp->{HIT_LENGTH}, $hit->length,      'Check hit length consistency' );
+                ($result->query_length == 0) ?
+                      is( $hsp->{QUERY_LENGTH}, $hsp->query->length,   'Check query length consistency' )
+                    : is( $hsp->{QUERY_LENGTH}, $result->query_length, 'Check query length consistency' );
+
+                is( $hsp->num_conserved, 690 );
+                is( $hsp->num_identical, 262 );
+                is( sprintf( "%.2f", $hsp->percent_identity ),        26.12 );
+                is( sprintf( "%.3f", $hsp->frac_identical('query') ), 0.275 );
+                is( sprintf( "%.3f", $hsp->frac_identical('hit') ),   0.265 );
+                is( sprintf( "%.3f", $hsp->frac_identical('total') ), 0.261 );
+                is( sprintf( "%.3f", $hsp->frac_conserved('query') ), 0.726 );
+                is( sprintf( "%.3f", $hsp->frac_conserved('hit') ),   0.697 );
+                is( sprintf( "%.3f", $hsp->frac_conserved('total') ), 0.688 );
+
+                is (length($hsp->homology_string), length($hsp->query_string));
+
+                is( $hsp->consensus_string,
+                    'S-TTEEEEEEEETTSEEEEEEEESTTS-HHHHHHHHHHHHHHHGGGS-HHHHHH-EEEEEEECCECEEEEEEESSSTS-HHHHHHHHHHCTHHHHHTSTTEEEEEESS.--EEEEEEE-HHHHHCTT--HHHHHHHHHHHSSB-EEEECTT-SB-EEEE-SB---SCCHHCT-EEEETTSEEEEHHHCEEEEEEESSSS-EEEETTCEEEEEEEEEETTSBHHHHHHHHHHHHHCCGGGSSTTEEEEEEEESHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHSSHCCCHHHHHHHHHHHHHHHHHHHHTT--EEHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHCSS-HHHHHHHHHHHHCCHHHHHHHHHHHHCCGGGGSBHHHHHHHHHHHHHHHHHHHHHHHHHHCCHHHHHHHCS----TT-CC..............................CHHHHHHHHHHHHHHHHHHHHHHHHHSCHHHHHHHHHHHHH.HHHHHCCS-BESS----TSEEEEEEE-STTC-HHHHHHHHHHHHHHHH...TTTTEEEEEEEESESSSS..E........CTTEEEEEEEE--CTTS-SCCCSHHHHHHHHHHHC.CTSTSSEEEEEE-SSSCCCSSSSSEEEEEEE.TSSSCHHHHHHHHHHHHHHHCCSTTEECEEESS-S-EEEEEEEE-HHHHHHCTB-HHHHHHHHHHHHT-..EEEEEEEETTE...EEEEEEEE-GGGSSSGGGGCC-EEEETTSE.EEECGGCEEEEEEEE-SEEEEETTCEEEEEEEEESTTS...-HHHHHHHHHHCCTT..SSTTEEEEEECHHHHHHHHCCCHHHHHHHHHHHHHHHHHHHCTSSSTCHHHHTTHHHHHHHHHHHHHHTT--BSHHHHHHHHHHHHHHHHHHHHHHHHHHHHHCTTTBHHHHHHHHHHHHCHHHHHHHHHHHHHCCHHHHTT-STTHHHHHHHHHHHHHHHHHHHHCHHHHHHHHHHHHH',
+                    'Check for consensus structure string'
+                );
+                is( $hsp->query_string,
+                    'gldglkyvsSqSseglssitvtFedgtdidiArqqvqnrlqeaknkLPeevqepgiskiktssseilvlavtskdgsltktdlrdlaesnikdqlsrveGVgdvqliGgsekavriwldpqklaklgltltdvvsalkeqnvqvaaGqlegqqeelliraqgrlqsaediekiivksqdgskvrlrDvAkvelgaeeeriaatlngkpavllavkklpganaievvkavkekleelketlPegveivvvydttefvrasieeVvktlleaivLvvlvlflFLqnlratlipaiavPlsllgtfavlkalglsiNlltlfgLvlAiGlvvDdAiVvvEnverkleeegekpleaalksmkeiegalvaialvllavfvPilflgGveGklfrqfaltivlaillsvlvaltltPalcallLkarkeekek..............................gffrefnrlfdalerrYekllekvlrhravvllvalllvvg.slllfvripkeflPeedegvlvtsvqlppgvsleqtekvlkqvekilk...ekpevesvfavtGfafagdta........gqnsakvfisLkpekerkeeektvealierlrkel.ekikganvellapiqlreletlsgvrlelqvklfgddleaLseareqllaalkqlpeladvrseqqedepqlqvkidrekaaalGvsiadinetlstalgg..syvndfieegr...vvkvvvqleedlrsspedlkklyvrnkkgk.mvplsavakieeekgpnsierenglrsveisgevaegd...slgeaeeavekiakqvklPagvgiewtglseqeqeagnsllllvalalllvflvLaalyeslsdpllvlltvPlalvGallalllrglelsviaqvGlilliGlavkNailivefakelrekeglsleeAileaaklRLrPiLMTalaailGvlPLalstGaGselqqplgivvlGGlvtstvLtlllvPvlYvlva',
+                    'Check for query string'
+                );
+                is( $hsp->hit_string,
+                    'TVNDIEHIESQSLFGYGIVKIFFQPDVDIRTANAQVTAISQTVLKQMPPGITPPLILNYNAATVPILQLALSSK--VLSEDRIFDLGQNFIRPQLATVRGSAVPSPYGGKVRQIQIDLDPQAMQSKRVSPDDVARALSQQNLVLSPGTEKIGSFEYNVKINDSPDEFTLLNNLPIKNVGGVTIFIHDVAHVRDGFPPQINVVRDDGRRSVLMTILKNGATSTLDIIQGTKELIPKLKETLPNNLVLKVVGDQSIFVKSAISGVVREGTIAGILTSVMILLFLGSWRSTIIISMSIPLAILSAIIFLSLTGNTLNVMTLGGLALAVGMLVDDATVVIENINHHLEM-GKPTTKAIIDAARQIIQPALVSTLSICIVFVPMFSLTGVPRYLFIPMAEAVIFGMLSSFVLSQTFVPTVANKLLKYQTQHFKHehhtdahrpehdpnfkvhrsvkasifqffiNIQQGFEKRFTKVRLVYRSILHFALDHRKKFITLFLGFVIVsCVTLFPLLGKNFFPEVDSGDMKIHIRVQVGTRIEETAKQFDLIENTIRrlvPQNELDTIVDNIGLSVSGINTaysstgtiGPQDGDILIHLNEN------HHPTKEYMKKLRETLpRAFPGVS-FAFLPADITSQILNFGVPAPIDIRVDGPNHDNNLKFVRAILKDIRNVPGIADLRVQQATNYPQFNVDIDRSQAKNYGLTEGDITNSLVATLAGtsQVAPTFWLNNKngvSYPIVIQMPQYKINSLADLANIPITTKESSsMQVLGGLGSIERDQSDSVISHYNIKPSFDIFASLQGRDlgsISGDIETIIQHHHQE--LPKGVSVKLQGQVPIMQDSYRGLSLGLVASIILIYFLVVVNFESWLDPFVIITALPAALAGIVWMLYLTGTTLSVPALTGAIMCMGVATANSILVISFARERLA-IVKDSTQAALEAGYTRFRPVLMTASAMLIGMIPMALGLGDGGEQNAPLGRAVIGGLLLATIATLIFVPVVFSVVH',
+                    'Check for hit string'
+                );
+                is( $hsp->homology_string,
+                    ' ++ +++++SqS  g   + + F+ + di  A+ qv++  q + +++P ++++p i   +++  +il+la++sk   l++  + dl ++ i++ql+ v G +    +Gg+ ++++i ldpq++++ +++++dv++al++qn   + G+ +  + e+++++++   +   ++++ +k+  g  + ++DvA+v +g   + ++++ +g   vl+++ k     ++++++  ke +++lketlP+++ ++vv d++ fv+++i+ Vv +  +a +L  ++++lFL+++r+t+i+ +++Pl++l ++++l++ g ++N++tl+gL+lA+G++vDdA Vv+En+  +le+ g+   +a++ ++++i  + + ++l++++vfvP+++l+Gv   lf ++a ++++ +l s +++ t++P ++  lLk + ++ ++                              ++ + f++ f ++   Y+ +l++ l hr+  ++++l +v++ ++ lf+ ++k+f+Pe d g++ ++++++ g+ +e+t+k  + +e++++    ++e + ++   G + +g +         g++ +++ i+L ++      ++  ++ +++lr+ l ++++g++ +++ p +++ +    gv + ++  + g ++++  + ++++l+ ++++p++ad+r++q ++ pq++v+idr +a+++G++  di + l + l g  +++ +f  +++    + +v+q+++ + +s+ dl+++++++k++  m  l+ + +ie+ ++ + i+++n ++s+ i ++++ +d   ++g++e+++++ +++  lP+gv+++ +g+    q ++  l+l ++++++l++++  + +es++dp+++++ +P al+G +  l+l+g++lsv a+ G i+ +G+a  N il+++fa+e  +   ++  +A+lea+ +R+rP+LMTa a+++G++P+al+ G+G e   plg +v+GGl+++t+ tl +vPv++ +v+',
+                    'Check for homology string'
+                );
+                is( $hsp->posterior_string,
+                    '578899********************************************************************..*****************************************************************************************************************************************************************************************************************************************************************************.***************************************************************************8776544446799********************9655555578*************************999999887775899******************************************8875446889999999999888774331111111134445555555444......45688999999999945678887.7888999*999************************************************************************8877666655434556776544422279***********************998764889*******************************8876222578999999999888..********************************************************************************************************.888899*****************************************************************9997',
+                    'Check for posterior probability string'
+                );
+            }
+        }
+    }
+}
+
+$searchio = Bio::SearchIO->new(
+    -format  => 'hmmer',
     -file    => test_input_file('hmmscan_multi_domain.out'),
     -verbose => 1
 );
@@ -388,7 +1044,7 @@ my @multi_hits = (
         ]
     ],
     [   'HemolysinCabind',
-        'Hemolysin-type calcium-binding repeat (2 cop',
+        'Hemolysin-type calcium-binding repeat (2 copies)',
         '47.9', 4.7e-13, 3,
         [   [ 2, 13, 1214, 1225, 5.9,  0.0026 ],
             [ 1, 18, 1231, 1248, 10.8, 6.8e-5 ],
@@ -417,6 +1073,13 @@ while ( $result = $searchio->next_result ) {
     my ( $hsp, $hit );
 
     while ( $hit = $result->next_model ) {
+        if ($hit->name eq 'HemolysinCabind') {
+            # Hit length is usually unknown for HMMSCAN and HMMSEARCH but not for NHMMER.
+            # When is not known, sometimes it can be deduced from domain data '[]'
+            is( $hit->length,             18, 'Check hit length' );
+            is( $hit->frac_aligned_query, 0.03 );
+            is( $hit->frac_aligned_hit,  '1.00' );
+        }
         my @expected = @{ shift @multi_hits };
         is( ref($hit), 'Bio::Search::Hit::HMMERHit',
             'Check for the correct hit reference type' );
@@ -464,7 +1127,7 @@ $searchio = Bio::SearchIO->new(
 
 @multi_hits = (
     [   'HTH_AraC',
-        'Bacterial regulatory helix-turn-helix proteins, Ara',
+        'Bacterial regulatory helix-turn-helix proteins, AraC family',
         '41.3', 6.7e-11, 2,
         [   [ 'siadiAeevgfSpsyfsrlFkkytGvt', 'SLMELSRQVGLNDCTLKRGFRLVFDTT' ],
             [   'nwsiadiAeevgf-SpsyfsrlFkkytGvtPsqyr',
@@ -506,6 +1169,13 @@ while ( $result = $searchio->next_result ) {
     my ( $hsp, $hit );
 
     while ( $hit = $result->next_model ) {
+        if ($hit->name eq 'PKSI-KS_m3') {
+            # Hit length is usually unknown for HMMSCAN and HMMSEARCH but not for NHMMER.
+            # When is not known, sometimes it can be deduced from domain data '[]'
+            is( $hit->length,             16, 'Check hit length' );
+            is( $hit->frac_aligned_query, 0.09 );
+            is( $hit->frac_aligned_hit,  '1.00' );
+        }
         my @expected = @{ shift @multi_hits };
         is( ref($hit), 'Bio::Search::Hit::HMMERHit',
             'Check for the correct hit reference type' );
@@ -624,7 +1294,8 @@ is( ref( $searchio->next_result ),
     'Check for the correct result reference type'
 );
 
-my $pipestr = "cat " . test_input_file('hmmpfam.out') . " |";
+my $cat_command = ($^O =~ m/mswin/i) ? 'type' : 'cat';
+my $pipestr = "$cat_command " . test_input_file('hmmpfam.out') . " |";
 open( my $pipefh, $pipestr );
 
 $searchio = Bio::SearchIO->new(
@@ -649,9 +1320,11 @@ is( $result->num_hits(), 2, 'Check num_hits' );
     my $result = $in->next_result;
     my $hit    = $result->next_hit;
     my $hsp    = $hit->next_hsp;
+    is( $result->query_length, 97, 'Check query_length' );
+    is( $hit->length,          95, 'Check nhmmer hit length' );
     is( $hsp->hit_string,
-        "svfqqqqssksttgstvtAiAiAigYRYRYRAvtWnsGsLssGvnDnDnDqqsdgLYtiYYsvtvpssslpsqtviHHHaHkasstkiiikiePr",
-        "bug3376"
+        'svfqqqqssksttgstvtAiAiAigYRYRYRAvtWnsGsLssGvnDnDnDqqsdgLYtiYYsvtvpssslpsqtviHHHaHkasstkiiikiePr',
+        'bug3376'
     );
 }
 # end bug 3376
@@ -665,8 +1338,8 @@ is( $result->num_hits(), 2, 'Check num_hits' );
     my $result = $in->next_result;
     my $hit    = $result->next_hit;
     my $hsp    = $hit->next_hsp;
-    is( $hsp->length, "561",
-        "bug3421 - Check if can correctly parse an HSP with line full of dashes"
+    is( $hsp->length, '561',
+        'bug3421 - Check if can correctly parse an HSP with line full of dashes'
     );
 }
 # end bug 3421
@@ -680,7 +1353,7 @@ is( $result->num_hits(), 2, 'Check num_hits' );
     my $result = $in->next_result;
     $result = $in->next_result;
     my $hit = $result->next_hit;
-    is( $hit->name, "IS66_ORF3.uniq", "bug3302 - Check if can parse multiresult hmmer" );
+    is( $hit->name, 'IS66_ORF3.uniq', 'bug3302 - Check if can parse multiresult hmmer' );
 }
 # end bug 3302
 
@@ -692,39 +1365,240 @@ is( $result->num_hits(), 2, 'Check num_hits' );
         -file    => test_input_file('nhmmer-3.1.out')
     );
     my $result = $in->next_result;
-    is( $result->algorithm_version, '3.1b1', 'Check nhmmer algorithm version' );
+    is( $result->algorithm,         'NHMMER', 'Check algorithm' );
+    is( $result->algorithm_version, '3.1b1',  'Check nhmmer algorithm version' );
+    is( $result->hmm_name,
+        '../HMMs/A_HA_H7_CDS_nucleotide.hmm',
+        'Check hmm_name'
+    );
+    is( $result->sequence_file,
+        'tmp.fa',
+        'Check sequence_file'
+    );
+    is( $result->query_name,        'A_HA_H7_CDS_nucleotide', 'Check query_name' );
+    is( $result->query_length,       1683,                    'Check query_length' );
+    is( $result->query_accession,   '',                       'Check query_accession' );
+    is( $result->query_description, '',                       'Check query_description' );
+    is( $result->num_hits(),         2,                       'Check num_hits' );
 
     my $hit = $result->next_hit;
-    is( $hit->name, "seq1", "Check nhmmer hit name" );
-    is( $hit->description, "Description of seq1", "Check nhmmer hit description" );
-    is( $hit->significance, "3.2e-48", "Check nhmmer hit significance" );
-    is( $hit->score,        "148.2",   "Check nhmmer hit score" );
+    is( ref($hit), 'Bio::Search::Hit::HMMERHit',
+        'Check for the correct hit reference type' );
+    is( $hit->name,              'seq1',                'Check nhmmer hit name' );
+    is( $hit->description,       'Description of seq1', 'Check nhmmer hit description' );
+    is( $hit->score,              148.2,                'Check nhmmer hit score' );
+    float_is( $hit->significance, 3.2e-48,              'Check nhmmer hit significance' );
+    is( $hit->num_hsps,           1,                    'Check num_hsps' );
+
+    # Hit length is usually unknown for HMMSCAN and HMMSEARCH but not for NHMMER.
+    # When is not known, sometimes it can be deduced from domain data '[]'
+    is( $hit->length,             151,                  'Check nhmmer hit length' );
+    is( $hit->frac_aligned_query, 0.09 );
+    is( $hit->frac_aligned_hit,  '1.00' );
 
     my $hsp = $hit->next_hsp;
-    is( $hsp->score, "148.2",   "Check nhmmer hsp score" );
-    is( $hsp->significance, "3.2e-48",   "Check nhmmer hsp score" );
-    is( $hsp->start('hit'), "1",   "Check nhmmer hsp hit start" );
-    is( $hsp->end('hit'), "151",   "Check nhmmer hsp hit end" );
-    is( $hsp->start('query'), "258",   "Check nhmmer hsp query start" );
-    is( $hsp->end('query'), "411",   "Check nhmmer hsp query end" );
-    is( $hsp->strand('hit'), '1',   "Check nhmmer hsp hit strand" );
-    is( $hsp->strand('query'), '1',   "Check nhmmer hsp query strand" );
+    is( ref($hsp), 'Bio::Search::HSP::HMMERHSP',
+        'Check for correct hsp reference type' );
+    is( $hsp->hit->seq_id(),   'seq1',                   'Check for nhmmer hit seq_id' );
+    is( $hsp->query->seq_id(), 'A_HA_H7_CDS_nucleotide', 'Check for nhmmer query seq_id' );
+
+    is( $hsp->start('hit'),       1,       'Check nhmmer hsp hit start' );
+    is( $hsp->end('hit'),         151,     'Check nhmmer hsp hit end' );
+    is( $hsp->start('query'),     258,     'Check nhmmer hsp query start' );
+    is( $hsp->end('query'),       411,     'Check nhmmer hsp query end' );
+    is( $hsp->strand('hit'),      1,       'Check nhmmer hsp hit strand' );
+    is( $hsp->strand('query'),    1,       'Check nhmmer hsp query strand' );
+    is( $hsp->score,              148.2,   'Check nhmmer hsp score' );
+    float_is( $hsp->significance, 3.2e-48, 'Check nhmmer hsp evalue' );
+
+    is( $hsp->length('query'), 154, 'Check for hsp query length' );
+    is( $hsp->length('hit'),   151, 'Check for hsp hit length' );
+    is( $hsp->length('total'), 154, 'Check for hsp total length' );
+    is( $hsp->gaps('query'),   0,   'Check for hsp query gaps' );
+    is( $hsp->gaps('hit'),     3,   'Check for hsp hit gaps' );
+    is( $hsp->gaps('total'),   3,   'Check for hsp total gaps' );
+
+    ($hit->length == 0) ?
+          is( $hsp->{HIT_LENGTH}, $hsp->hit->length, 'Check hit length consistency' )
+        : is( $hsp->{HIT_LENGTH}, $hit->length,      'Check hit length consistency' );
+    ($result->query_length == 0) ?
+          is( $hsp->{QUERY_LENGTH}, $hsp->query->length,   'Check query length consistency' )
+        : is( $hsp->{QUERY_LENGTH}, $result->query_length, 'Check query length consistency' );
+
+    is( $hsp->num_conserved, 151 );
+    is( $hsp->num_identical, 146 );
+    is( sprintf( "%.2f", $hsp->percent_identity ),        94.81 );
+    is( sprintf( "%.3f", $hsp->frac_identical('query') ), 0.948 );
+    is( sprintf( "%.3f", $hsp->frac_identical('hit') ),   0.967 );
+    is( sprintf( "%.3f", $hsp->frac_identical('total') ), 0.948 );
+    is( sprintf( "%.3f", $hsp->frac_conserved('query') ), 0.981 );
+    is( sprintf( "%.3f", $hsp->frac_conserved('hit') ),  '1.000' );
+    is( sprintf( "%.3f", $hsp->frac_conserved('total') ), 0.981 );
+
+    is( $hsp->consensus_string,
+        '',
+        'Check for consensus structure string'
+    );
+    is( $hsp->query_string,
+        'attcctagaattttcagctgatttaattattgagaggcgagaaggaagtaatgatgtctgttatcctgggaaattcgtaaatgaagaagctctgaggcaaattctcagggggtcaggcggaattgacaaggagacaatgggattcacatatagc',
+        'Check for nhmmer query string'
+    );
+    is( $hsp->homology_string,
+        'attcctagaattttcagc+gatttaattattgagaggcgagaaggaagt   gatgtctgttatcctgggaaattcgt+aatgaagaagctctgaggcaaattctcaggg+gtcaggcggaattgacaaggagacaatgggattcac+ta+agc',
+        'Check for nhmmer homology string'
+    );
+    is( $hsp->hit_string,
+        'ATTCCTAGAATTTTCAGCCGATTTAATTATTGAGAGGCGAGAAGGAAGT---GATGTCTGTTATCCTGGGAAATTCGTGAATGAAGAAGCTCTGAGGCAAATTCTCAGGGAGTCAGGCGGAATTGACAAGGAGACAATGGGATTCACCTACAGC',
+        'Check for nhmmer hit string'
+    );
+    is( $hsp->posterior_string,
+       '689*******************************************777...***************************************************************************************************986',
+        'Check for nhmmer posterior probability string'
+    );
+    is( length( $hsp->homology_string ),
+        length( $hsp->hit_string ),
+        'Check if nhmmer homology string and hit string have an equal length'
+    );
+    is( length( $hsp->query_string ),
+        length( $hsp->homology_string ),
+        'Check if nhmmer query string and homology string have an equal length'
+    );
 
     $hit = $result->next_hit;
-    is( $hit->name, "seq2", "Check nhmmer hit name" );
-    is( $hit->description, "Description of seq2", "Check nhmmer hit description" );
-    is( $hit->significance, "3.9e-15", "Check nhmmer hit significance" );
-    is( $hit->score,        "38.6",   "Check nhmmer hit score" );
+    is( $hit->name,              'seq2',                'Check nhmmer hit name' );
+    is( $hit->description,       'Description of seq2', 'Check nhmmer hit description' );
+    is( $hit->score,              38.6,                 'Check nhmmer hit score' );
+    float_is( $hit->significance, 3.9e-15,              'Check nhmmer hit significance' );
+    is( $hit->length,             60,                   'Check nhmmer hit length' );
 
     $hsp = $hit->next_hsp;
-    is( $hsp->score, '38.6',   "Check nhmmer hsp score" );
-    is( $hsp->significance, '3.9e-15',   "Check nhmmer hsp score" );
-    is( $hsp->start('query'), '34',   "Check nhmmer hsp query start" );
-    is( $hsp->end('query'), '92',   "Check nhmmer hsp query end" );
-    is( $hsp->start('hit'), '1',   "Check nhmmer hsp hit start" );
-    is( $hsp->end('hit'), '59',   "Check nhmmer hsp hit end" );
-    is( $hsp->strand('hit'), '-1',   "Check nhmmer hsp hit strand" );
-    is( $hsp->strand('query'), '1',   "Check nhmmer hsp query strand" );
+    is( $hsp->hit->seq_id(),   'seq2',                   'Check for nhmmer hit seq_id' );
+    is( $hsp->query->seq_id(), 'A_HA_H7_CDS_nucleotide', 'Check for nhmmer query seq_id' );
+
+    is( $hsp->start('query'),     34,      'Check nhmmer hsp query start' );
+    is( $hsp->end('query'),       92,      'Check nhmmer hsp query end' );
+    is( $hsp->start('hit'),       1,       'Check nhmmer hsp hit start' );
+    is( $hsp->end('hit'),         59,      'Check nhmmer hsp hit end' );
+    is( $hsp->strand('hit'),     -1,       'Check nhmmer hsp hit strand' );
+    is( $hsp->strand('query'),    1,       'Check nhmmer hsp query strand' );
+    is( $hsp->score,              38.6,    'Check nhmmer hsp score' );
+    float_is( $hsp->significance, 3.9e-15, 'Check nhmmer hsp evalue' );
+
+    is( $hsp->length('query'), 59, 'Check for hsp query length' );
+    is( $hsp->length('hit'),   59, 'Check for hsp hit length' );
+    is( $hsp->length('total'), 59, 'Check for hsp total length' );
+    is( $hsp->gaps('query'),   0,  'Check for hsp query gaps' );
+    is( $hsp->gaps('hit'),     0,  'Check for hsp hit gaps' );
+    is( $hsp->gaps('total'),   0,  'Check for hsp total gaps' );
+
+    ($hit->length == 0) ?
+          is( $hsp->{HIT_LENGTH}, $hsp->hit->length, 'Check hit length consistency' )
+        : is( $hsp->{HIT_LENGTH}, $hit->length,      'Check hit length consistency' );
+    ($result->query_length == 0) ?
+          is( $hsp->{QUERY_LENGTH}, $hsp->query->length,   'Check query length consistency' )
+        : is( $hsp->{QUERY_LENGTH}, $result->query_length, 'Check query length consistency' );
+
+    is (length($hsp->homology_string), length($hsp->query_string));
+
+    is( $hsp->consensus_string,
+        '',
+        'Check for consensus structure string'
+    );
+    is( $hsp->query_string,
+        'gtgatgattgcaacaaatgcagacaaaatctgccttgggcaccatgctgtgtcaaacgg',
+        'Check for nhmmer query string'
+    );
+    is( $hsp->homology_string,
+        'g+gat+att+c+acaaatgcagacaa atctgccttgggca+catgc+gtgtcaaacgg',
+        'Check for nhmmer homology string'
+    );
+    is( $hsp->hit_string,
+        'GCGATCATTCCGACAAATGCAGACAAGATCTGCCTTGGGCATCATGCCGTGTCAAACGG',
+        'Check for nhmmer hit string'
+    );
+    is( $hsp->posterior_string,
+        '6899****************************************************986',
+        'Check for nhmmer posterior probability string' );
+    is( length( $hsp->homology_string ),
+        length( $hsp->hit_string ),
+        'Check if nhmmer homology string and hit string have an equal length'
+    );
+    is( length( $hsp->query_string ),
+        length( $hsp->homology_string ),
+        'Check if nhmmer query string and homology string have an equal length'
+    );
 }
 # end HMMER 3.1 nhmmer output
 
+# Test HIT filtering by SIGNIFICANCE
+$searchio = Bio::SearchIO->new(
+    '-format' => 'hmmer',
+    '-file'   => test_input_file('hmmpfam_cs.out'),
+    '-signif' => 1e-100
+);
+# NOTE: For Hmmer2, if a single model pass the HIT filter
+# but it shows 2 domains, it counts as 2 hits (Glu_synthase)
+my @valid = qw( GATase_2
+                Glu_syn_central
+                Glu_synthase
+                Glu_synthase
+                GXGXG );
+$result   = $searchio->next_result;
+is( $result->num_hits(), 5, 'Check Significance filtered num_hits' );
+while ( my $hit = $result->next_hit ) {
+    is( $hit->name, shift @valid, 'Check Significance filtered hit ID' );
+}
+is( @valid, 0 );
+
+# Test HIT filtering by SCORE
+$searchio = Bio::SearchIO->new(
+    '-format' => 'hmmer',
+    '-file'   => test_input_file('hmmsearch.out'),
+    '-score'  => 390
+);
+# NOTE: This Hmmer2 report top hit (score 393.8) have 4 domains,
+# so it count as 4 hits (PAB2_ARATH)
+@valid = qw( PAB2_ARATH
+             PAB2_ARATH
+             PAB2_ARATH
+             PAB2_ARATH );
+$result   = $searchio->next_result;
+is( $result->num_hits(), 4, 'Check Score filtered num_hits' );
+while ( my $hit = $result->next_hit ) {
+    is( $hit->name, shift @valid, 'Check Score filtered hit ID' );
+}
+is( @valid, 0 );
+
+# Test HIT filtering by BITS
+$searchio = Bio::SearchIO->new(
+    '-format' => 'hmmer',
+    '-file'   => test_input_file('hmmsearch3_multi.out'),
+    '-bits'   => 10
+);
+# NOTE: No HMMER report use Bits, so this will filter out everything
+$result   = $searchio->next_result;
+is( $result->num_hits(), 0, 'Check Bits filtered num_hits' );
+$result   = $searchio->next_result;
+is( $result->num_hits(), 0, 'Check Bits filtered num_hits' );
+$result   = $searchio->next_result;
+is( $result->num_hits(), 0, 'Check Bits filtered num_hits' );
+
+# Test HIT filtering by HIT_FILTER
+my $filt_func = sub {
+    my $hit = shift;
+    $hit->frac_aligned_query >= 0.20;
+};
+$searchio = Bio::SearchIO->new(
+    '-format'     => 'hmmer',
+    '-file'       => test_input_file('hmmscan_multi_domain.out'),
+    '-hit_filter' => $filt_func
+);
+# NOTE: In Hmmer3 reports, the multiple domains of a model are treated
+# as HSPs instead of Hits (like it is in Hmmer2 reports)
+@valid = qw( PPC );
+$result   = $searchio->next_result;
+is( $result->num_hits(), 1, 'Check Hit_filter filtered num_hits' );
+while ( my $hit = $result->next_hit ) {
+    is( $hit->name, shift @valid, 'Check Hit_filter filtered hits ID' );
+}
+is( @valid, 0 );
@@ -132,7 +132,7 @@ is($meta, '(((((((,,<<<<___.____>>>>,<<<<<_______>>>>>,,,,,<<<<<_______>>>>>))))
 is($meta, '(((((((,,<<<<___.____>>>>,<<<<<_______>>>>>,,,,,<<<<<_______>>>>>))))))):');
 
 is($hsp->frame('query'), 0, "HSP frame");
-is($hsp->gaps, 0, "HSP gaps");
+is($hsp->gaps, 1, "HSP gaps");
 is($hit->length, 0, "Hit length");
 isa_ok($hsp->get_aln, 'Bio::Align::AlignI');
 isa_ok($hsp->hit, 'Bio::SeqFeature::Similarity', "HSP hit");
@@ -315,7 +315,7 @@ is($meta, ':::::::::::::::::((((((((,,,<<<<<<<_______>>>>>>>,,,,,,,,<<<<<<<_____
 is($meta, ':::::::::::::::::((((((((,,,<<<<<<<_______>>>>>>>,,,,,,,,<<<<<<<_______>>>>>>>,,)))).))))::::::::::::::');
 
 is($hsp->frame('query'), 0, "HSP frame");
-is($hsp->gaps, 0, "HSP gaps");
+is($hsp->gaps, 1, "HSP gaps");
 is($hit->length, 0, "Hit length");
 isa_ok($hsp->get_aln, 'Bio::Align::AlignI');
 isa_ok($hsp->hit, 'Bio::SeqFeature::Similarity', "HSP hit");
@@ -613,7 +613,7 @@ float_is($hsp->evalue, 6.802);
 isa_ok($hsp->feature1, 'Bio::SeqFeature::Similarity');
 isa_ok($hsp->feature2, 'Bio::SeqFeature::Similarity');
 is($hsp->frame('query'), 0, "HSP frame");
-is($hsp->gaps, 3, "HSP gaps");
+is($hsp->gaps, 4, "HSP gaps");
 # infernal can return alignment data
 isa_ok($hsp->get_aln, 'Bio::Align::AlignI');
 isa_ok($hsp->hit, 'Bio::SeqFeature::Similarity', "HSP hit");
@@ -714,4 +714,3 @@ is($hsp->meta,
    ':::::::::::::::::((((((((,,,<<<<<<<_______>>>>>>>,,,,,,,,<<<<<<<_______>>>>>>>,,))))))))::::::::::::::',
    "HSP meta");
 is($hsp->strand('hit'), 1, "HSP strand");
-
@@ -132,16 +132,15 @@ is $names[0], 'DEFAULT';
 sub diff {
     my ($infile, $outfile) = @_;
     my ($in, $out);
-    open FH, $infile;
-    $in .= $_ while (<FH>);
-    close FH;
+    open my $FH_IN, '<', $infile or die "Could not read file '$infile': $!\n";
+    $in .= $_ while (<$FH_IN>);
+    close $FH_IN;
 
-    open FH, $outfile;
-    $out .= $_ while (<FH>);
-    close FH;
+    open my $FH_OUT, '<', $outfile or die "Could not read file '$outfile': $!\n";
+    $out .= $_ while (<$FH_OUT>);
+    close $FH_OUT;
     print "|$in||$out|\n" if $DEBUG;
     is $in, $out;
-
 }
 
 
@@ -7,7 +7,7 @@ use Data::Dumper;
 BEGIN {
     use lib '.';
     use Bio::Root::Test;
-    test_begin( -tests => 287 );
+    test_begin( -tests => 310 );
 
     use_ok('Bio::PrimarySeq');
     use_ok('Bio::Location::Simple');
@@ -495,6 +495,8 @@ is $seq->subseq($loc1_strand),    'TTTTT';
 is $seq->subseq($loc1_no_strand), 'TTTTT';
 is $loc1_strand->to_FTstring,     'complement(1..5)';
 is $loc1_no_strand->to_FTstring,  'complement(1..5)';
+is $loc1_strand->length,    5;
+is $loc1_no_strand->length, 5;
 
 # Basic split, both locations in positive strand
 # Coords: join(6..10,16..20) => CCCCCTTTTT
@@ -515,6 +517,8 @@ is $seq->subseq($loc2_strand),    'AAAAAGGGGG';
 is $seq->subseq($loc2_no_strand), 'AAAAAGGGGG';
 is $loc2_strand->to_FTstring,     'complement(join(6..10,16..20))';
 is $loc2_no_strand->to_FTstring,  'complement(join(6..10,16..20))';
+is $loc2_strand->length,    15;
+is $loc2_no_strand->length, 15;
 
 # Basic split, both locations in negative strand
 # Coords: complement(join(6..10,16..20)) => AAAAAGGGGG
@@ -527,6 +531,7 @@ is $loc3_strand->to_FTstring,     'complement(join(6..10,16..20))';
 $loc3_strand->flip_strand;
 is $seq->subseq($loc3_strand),    'CCCCCTTTTT';
 is $loc3_strand->to_FTstring,     'join(6..10,16..20)';
+is $loc3_strand->length, 15;
 
 ## Cut by origin-split, same strand, single sequence that pass through origin
 #Coords: join(16..20,1..2) => TTTTTAA
@@ -547,6 +552,8 @@ is $seq->subseq($loc4_strand),    'TTAAAAA';
 is $seq->subseq($loc4_no_strand), 'TTAAAAA';
 is $loc4_strand->to_FTstring,     'complement(join(16..20,1..2))';
 is $loc4_no_strand->to_FTstring,  'complement(join(16..20,1..2))';
+is $loc4_strand->length,    7;
+is $loc4_no_strand->length, 7;
 
 ## Cut by origin-combo split, same strand, 2 sequences with 1st passing through origin
 #Coords: join(19..20,1..2,11..13) => TTAAGGG
@@ -569,6 +576,8 @@ is $seq->subseq($loc5_strand),    'CCCTTAA';
 is $seq->subseq($loc5_no_strand), 'CCCTTAA';
 is $loc5_strand->to_FTstring,     'complement(join(19..20,1..2,11..13))';
 is $loc5_no_strand->to_FTstring,  'complement(join(19..20,1..2,11..13))';
+is $loc5_strand->length,    15;
+is $loc5_no_strand->length, 15;
 
 ## Cut by origin-combo split, same strand, 2 sequences with 2nd passing through origin
 #Coords: join(6..10,19..20,1..4) => CCCCCTTAAAA
@@ -591,6 +600,8 @@ is $seq->subseq($loc6_strand),    'TTTTAAGGGGG';
 is $seq->subseq($loc6_no_strand), 'TTTTAAGGGGG';
 is $loc6_strand->to_FTstring,     'complement(join(6..10,19..20,1..4))';
 is $loc6_no_strand->to_FTstring,  'complement(join(6..10,19..20,1..4))';
+is $loc6_strand->length,    19;
+is $loc6_no_strand->length, 19;
 
 ## Trans-splicing, 2 sequences in different strands, 2nd in complement
 #Coords: join(6..10,complement(16..20)) => CCCCCAAAAA
@@ -611,6 +622,8 @@ is $seq->subseq($loc7_strand),    'TTTTTGGGGG';
 is $seq->subseq($loc7_no_strand), 'TTTTTGGGGG';
 is $loc7_strand->to_FTstring,     'join(16..20,complement(6..10))';
 is $loc7_no_strand->to_FTstring,  'join(16..20,complement(6..10))';
+is $loc7_strand->length,    10;
+is $loc7_no_strand->length, 10;
 
 ## Trans-splicing, 2 sequences in different strands, 1st in complement
 #Coords: join(complement(16..20),6..10) => AAAAACCCCC
@@ -631,6 +644,8 @@ is $seq->subseq($loc8_strand),    'GGGGGTTTTT';
 is $seq->subseq($loc8_no_strand), 'GGGGGTTTTT';
 is $loc8_strand->to_FTstring,     'join(complement(6..10),16..20)';
 is $loc8_no_strand->to_FTstring,  'join(complement(6..10),16..20)';
+is $loc8_strand->length,    10;
+is $loc8_no_strand->length, 10;
 
 ## Trans-splicing w/cut by origin, 2 sequences with 1st passing through origin, 2nd in complement
 #Coords: join(19..20,1..3,complement(11..13)) => TTAAACCC
@@ -653,6 +668,8 @@ is $seq->subseq($loc9_strand),    'GGGTTTAA';
 is $seq->subseq($loc9_no_strand), 'GGGTTTAA';
 is $loc9_strand->to_FTstring,     'join(11..13,complement(1..3),complement(19..20))';
 is $loc9_no_strand->to_FTstring,  'join(11..13,complement(1..3),complement(19..20))';
+is $loc9_strand->length,    8;
+is $loc9_no_strand->length, 8;
 
 ## Trans-splicing w/cut by origin, 2 sequences with 1st passing through origin, 1st in complement
 #Coords: join(complement(1..3),complement(19..20),11..13) => TTTAAGGG
@@ -675,6 +692,8 @@ is $seq->subseq($loc10_strand),    'CCCTTAAA';
 is $seq->subseq($loc10_no_strand), 'CCCTTAAA';
 is $loc10_strand->to_FTstring,     'join(complement(11..13),19..20,1..3)';
 is $loc10_no_strand->to_FTstring,  'join(complement(11..13),19..20,1..3)';
+is $loc10_strand->length,    8;
+is $loc10_no_strand->length, 8;
 
 ## Trans-splicing w/cut by origin, 2 sequences with 2nd passing through origin, 2nd in complement
 #Coords: join(6..10,complement(1..2),complement(18..20)) => CCCCCTTAAA
@@ -697,6 +716,8 @@ is $seq->subseq($loc11_strand),    'TTTAAGGGGG';
 is $seq->subseq($loc11_no_strand), 'TTTAAGGGGG';
 is $loc11_strand->to_FTstring,     'join(18..20,1..2,complement(6..10))';
 is $loc11_no_strand->to_FTstring,  'join(18..20,1..2,complement(6..10))';
+is $loc11_strand->length,    10;
+is $loc11_no_strand->length, 10;
 
 ## Trans-splicing w/cut by origin, 2 sequences with 2nd passing through origin, 1st in complement
 #Coords: join(complement(6..10),18..20,1..2) => GGGGGTTTAA
@@ -719,3 +740,5 @@ is $seq->subseq($loc12_strand),    'TTAAACCCCC';
 is $seq->subseq($loc12_no_strand), 'TTAAACCCCC';
 is $loc12_strand->to_FTstring,     'join(complement(1..2),complement(18..20),6..10)';
 is $loc12_no_strand->to_FTstring,  'join(complement(1..2),complement(18..20),6..10)';
+is $loc12_strand->length,    10;
+is $loc12_no_strand->length, 10;
@@ -167,9 +167,9 @@ ok( ! -e $filename);
 # without -keep => 1, $filename was deleted as expected.
 # to stop Bio::Root::Test complaining that the temp file was already deleted,
 # we'll just create it again
-open(TMP, ">", $filename);
-print TMP "temp\n";
-close(TMP);
+open my $TMP, '>', $filename or die "Could not write file '$filename': $!\n";
+print $TMP "temp\n";
+close $TMP;
 
 if( $verbose ) {
     my @fts =  sort { $a->start <=> $b->start}  
@@ -7,7 +7,7 @@ BEGIN {
     use lib '.';
     use Bio::Root::Test;
     
-    test_begin(-tests => 103);
+    test_begin(-tests => 109);
 	
     use_ok('Bio::Location::Simple');
     use_ok('Bio::Location::Split');
@@ -15,6 +15,7 @@ BEGIN {
     use_ok('Bio::SeqFeature::Generic');
     use_ok('Bio::SeqFeature::SimilarityPair');
     use_ok('Bio::SeqFeature::FeaturePair');
+    use_ok('Bio::SeqFeature::Lite');
 }
 
 my $simple = Bio::Location::Simple->new('-start' => 10, '-end' => 20,
@@ -38,6 +39,15 @@ isa_ok($generic,'Bio::RangeI');
 is($generic->start, 5);
 is($generic->end, 30);
 
+my $lite_pos  = Bio::SeqFeature::Lite->new(-start => 1000, -stop => 2000, -strand => '+');
+my $lite_neg  = Bio::SeqFeature::Lite->new(-start => 1000, -end  => 2000, -strand => '-');
+my $lite_none = Bio::SeqFeature::Lite->new(-start => 1000, -stop => 2000, -strand => '.');
+is($lite_pos->strand,  1);
+is($lite_neg->strand, -1);
+is($lite_neg->end,  2000);
+is($lite_neg->stop, 2000);
+is($lite_none->strand, 0);
+
 my $similarity = Bio::SeqFeature::SimilarityPair->new();
 
 my $feat1 = Bio::SeqFeature::Generic->new('-start' => 30, '-end' => 43, 
@@ -3,85 +3,85 @@
 
 use strict;
 
-BEGIN { 
+BEGIN {
     use lib '.';
     use Bio::Root::Test;
-    
-    test_begin(-tests => 11);
-	
-	use_ok('Bio::SeqIO');
-	use_ok('Bio::SeqFeature::Tools::Unflattener');
+
+    test_begin(-tests => 21);
+
+    use_ok('Bio::SeqIO');
+    use_ok('Bio::SeqFeature::Tools::Unflattener');
 }
 
 my $verbosity = test_debug();
 
 my ($seq, @sfs);
-my $unflattener = Bio::SeqFeature::Tools::Unflattener->new();
+my $unflattener = Bio::SeqFeature::Tools::Unflattener->new;
+$unflattener->verbose($verbosity);
+
 
 if (1) {
-    $unflattener->verbose(10);
     my @path = ("NC_000007-ribosomal-slippage.gb");
     $seq = getseq(@path);
-    
+
     my @topsfs = $seq->get_SeqFeatures;
     if( $verbosity > 0 ) {
-	warn sprintf "TOP:%d\n", scalar(@topsfs);
-	write_hier(@topsfs);
+        warn sprintf "TOP:%d\n", scalar(@topsfs);
+        write_hier(@topsfs);
     }
-    
+
     # UNFLATTEN
-    $unflattener->verbose($verbosity);
-    @sfs = $unflattener->unflatten_seq(-seq=>$seq,
-				       -use_magic=>1);
+    @sfs = $unflattener->unflatten_seq(-seq       => $seq,
+                                       -use_magic => 1);
     if( $verbosity > 0 ) {
-	warn "\n\nPOST PROCESSING:\n";
-	write_hier(@sfs);
-	warn sprintf "PROCESSED:%d\n", scalar(@sfs);
+        warn "\n\nPOST PROCESSING:\n";
+        write_hier(@sfs);
+        warn sprintf "PROCESSED:%d\n", scalar(@sfs);
     }
     is(@sfs, 1995);
 }
 
+
 if (1) {
     my @path = ("ribosome-slippage.gb");
-    $seq = getseq(@path);
-    
+    $seq     = getseq(@path);
+
     my @topsfs = $seq->get_SeqFeatures;
     if( $verbosity > 0 ) {
-	warn sprintf "TOP:%d\n", scalar(@topsfs);
-	write_hier(@topsfs);
+        warn sprintf "TOP:%d\n", scalar(@topsfs);
+        write_hier(@topsfs);
     }
-    
+
     # UNFLATTEN
-    $unflattener->verbose($verbosity);
-    @sfs = $unflattener->unflatten_seq(-seq=>$seq,
-				       -use_magic=>1);
+    @sfs = $unflattener->unflatten_seq(-seq       => $seq,
+                                       -use_magic => 1);
     if( $verbosity > 0 ) {
-	warn "\n\nPOST PROCESSING:\n";
-	write_hier(@sfs);
-	warn sprintf "PROCESSED:%d\n", scalar(@sfs);
+        warn "\n\nPOST PROCESSING:\n";
+        write_hier(@sfs);
+        warn sprintf "PROCESSED:%d\n", scalar(@sfs);
     }
     is(@sfs, 3);
 }
 
+
 if (1) {
     my @path = ("AE003644_Adh-genomic.gb");
-    $seq = getseq(@path);
-    
+    $seq     = getseq(@path);
+
     is ($seq->accession_number, 'AE003644');
     my @topsfs = $seq->get_SeqFeatures;
     if( $verbosity > 0 ) {
-	warn sprintf "TOP:%d\n", scalar(@topsfs);
-	write_hier(@topsfs);
+        warn sprintf "TOP:%d\n", scalar(@topsfs);
+        write_hier(@topsfs);
     }
-    
+
     # UNFLATTEN
-    $unflattener->verbose($verbosity);
-    @sfs = $unflattener->unflatten_seq(-seq=>$seq,
-				       -group_tag=>'locus_tag');
+    @sfs = $unflattener->unflatten_seq(-seq       => $seq,
+                                       -group_tag => 'locus_tag');
     if( $verbosity > 0 ) {
-	warn "\n\nPOST PROCESSING:\n";
-	write_hier(@sfs);
-	warn sprintf "PROCESSED:%d\n", scalar(@sfs);
+        warn "\n\nPOST PROCESSING:\n";
+        write_hier(@sfs);
+        warn sprintf "PROCESSED:%d\n", scalar(@sfs);
     }
     is(@sfs, 21);
 }
@@ -89,48 +89,51 @@ if (1) {
 # now try again, using a custom subroutine to link together features
 $seq = getseq("AE003644_Adh-genomic.gb");
 @sfs = $unflattener->unflatten_seq
-    (-seq=>$seq,
-     -group_tag=>'locus_tag',
-     -resolver_method => 
-     sub {
-	 my $self = shift;
-	 my ($sf, @candidate_container_sfs) = @_;
-	 if ($sf->has_tag('note')) {
-	     my @notes = $sf->get_tag_values('note');
-	     my @trnames = map {/from transcript\s+(.*)/;
-				$1} @notes;
-	     @trnames = grep {$_} @trnames;
-	     my $trname;
-	     if (@trnames == 0) {
-		 $self->throw("UNRESOLVABLE");
-	     }
-	     elsif (@trnames == 1) {
-		 $trname = $trnames[0];
-	     }
-	     else {
-		 $self->throw("AMBIGUOUS: @trnames");
-	     }
-	     my @container_sfs =
-		 grep {
-		     my ($product) =
-			 $_->has_tag('product') ?
-			 $_->get_tag_values('product') :
-			 ('');
-		     $product eq $trname;
-		 } @candidate_container_sfs;
-	     if (@container_sfs == 0) {
-		 $self->throw("UNRESOLVABLE");
-	     }
-	     elsif (@container_sfs == 1) {
-		 # we got it!
-		 return ($container_sfs[0]=>0);
-	     }
-	     else {
-		 $self->throw("AMBIGUOUS");
-	     }
-	 }
-     });
-$unflattener->feature_from_splitloc(-seq=>$seq);
+    (-seq       => $seq,
+     -group_tag => 'locus_tag',
+     -resolver_method =>
+        sub {
+             my $self = shift;
+             my ($sf, @candidate_container_sfs) = @_;
+
+             if ($sf->has_tag('note')) {
+                 my @notes   = $sf->get_tag_values('note');
+                 my @trnames = map {/from transcript\s+(.*)/; $1;}
+                               @notes;
+                 @trnames    = grep {$_} @trnames;
+
+                 my $trname;
+                 if (@trnames == 0) {
+                     $self->throw("UNRESOLVABLE");
+                 }
+                 elsif (@trnames == 1) {
+                     $trname = $trnames[0];
+                 }
+                 else {
+                     $self->throw("AMBIGUOUS: @trnames");
+                 }
+
+                 my @container_sfs =
+                     grep {
+                           my ($product) =
+                                 $_->has_tag('product') ? $_->get_tag_values('product')
+                               : ('');
+                           $product eq $trname;
+                     } @candidate_container_sfs;
+
+                 if (@container_sfs == 0) {
+                     $self->throw("UNRESOLVABLE");
+                 }
+                 elsif (@container_sfs == 1) {
+                     # we got it!
+                     return ($container_sfs[0]=>0);
+                 }
+                 else {
+                     $self->throw("AMBIGUOUS");
+                 }
+             }
+        });
+$unflattener->feature_from_splitloc(-seq => $seq);
 if( $verbosity > 0 ) {
     warn "\n\nPOST PROCESSING:\n";
     write_hier(@sfs);
@@ -145,9 +148,8 @@ is(@sfs, 21);
 $seq = getseq("D10483.gbk");
 
 # UNFLATTEN
-@sfs = $unflattener->unflatten_seq(-seq=>$seq,
-				   -partonomy=>{'*'=>'gene'},
-                                );
+@sfs = $unflattener->unflatten_seq(-seq       => $seq,
+                                   -partonomy => {'*'=>'gene'});
 if( $verbosity > 0 ) {
     warn "\n\nPOST PROCESSING:\n";
     write_hier(@sfs);
@@ -159,9 +161,8 @@ is(@sfs, 98);
 $seq = getseq("AY763288.gb");
 
 # UNFLATTEN
-@sfs = $unflattener->unflatten_seq(-seq=>$seq,
-				   -use_magic=>1
-                                  );
+@sfs = $unflattener->unflatten_seq(-seq       => $seq,
+                                   -use_magic => 1);
 if( $verbosity > 0 ) {
     warn "\n\nPOST PROCESSING:\n";
     write_hier(@sfs);
@@ -169,16 +170,14 @@ if( $verbosity > 0 ) {
 }
 is(@sfs, 3);
 
-
 # try again; different sequence - dicistronic gene, mRNA record
 
 $seq = getseq("X98338_Adh-mRNA.gb");
 
 # UNFLATTEN
-@sfs = $unflattener->unflatten_seq(-seq=>$seq,
-                                 -partonomy=>{'*'=>'gene'},
-                                );
-if( $verbosity > 0 ) {                                 
+@sfs = $unflattener->unflatten_seq(-seq       => $seq,
+                                   -partonomy => {'*'=>'gene'});
+if( $verbosity > 0 ) {
     warn "\n\nPOST PROCESSING:\n";
     write_hier(@sfs);
     warn sprintf "PROCESSED:%d\n", scalar(@sfs);
@@ -190,9 +189,8 @@ is(@sfs, 7);
 $seq = getseq("no_cds_example.gb");
 
 # UNFLATTEN
-@sfs = $unflattener->unflatten_seq(-seq=>$seq,
-                                 use_magic=>1
-                                );
+@sfs = $unflattener->unflatten_seq(-seq       => $seq,
+                                   -use_magic => 1);
 if( $verbosity > 0 ) {
     warn "\n\nPOST PROCESSING:\n";
     write_hier(@sfs);
@@ -201,11 +199,122 @@ if( $verbosity > 0 ) {
 
 my @all_sfs = $seq->get_all_SeqFeatures;
 
-my @exons = grep { $_-> primary_tag eq 'exon' }  @all_sfs ; 
+my @exons = grep { $_-> primary_tag eq 'exon' } @all_sfs ;
 
 is(@exons, 2);
 
 
+if (1) {
+    # this is an arabidopsise gbk record. it has no mRNA features.
+    # it has explicit exon/intron records
+    my @path = ("ATF14F8.gbk");
+    $seq     = getseq(@path);
+
+    is ($seq->accession_number, 'AL391144');
+    my @topsfs = $seq->get_SeqFeatures;
+    my @cdss   = grep {$_->primary_tag eq 'CDS'} @topsfs;
+    my $n      = scalar(@topsfs);
+    if( $verbosity > 0 ) {
+        warn sprintf "TOP:%d\n", scalar(@topsfs);
+        write_hier(@topsfs);
+    }
+
+    # UNFLATTEN
+    @sfs = $unflattener->unflatten_seq(-seq       => $seq,
+                                       -use_magic => 1);
+    @sfs = $seq->get_SeqFeatures;
+    if( $verbosity > 0 ) {
+        warn "\n\nPOST PROCESSING:\n";
+        write_hier(@sfs);
+        warn sprintf "PROCESSED/TOP:%d\n", scalar(@sfs);
+    }
+    is(@sfs,28);
+
+    my @allsfs = $seq->get_all_SeqFeatures;
+    is(@allsfs,202);
+
+    my @mrnas = grep {$_->primary_tag eq 'mRNA'} @allsfs;
+    if( $verbosity > 0 ) {
+        warn sprintf "ALL:%d\n",   scalar(@allsfs);
+        warn sprintf "mRNAs:%d\n", scalar(@mrnas);
+    }
+    # relationship between mRNA and CDS should be one-one
+    is(@mrnas,@cdss);
+}
+
+
+if (1) {
+    # this is a record from FlyBase
+    # it has mRNA features, and explicit exon/intron records
+    my @path = ("AnnIX-v003.gbk");
+    $seq     = getseq(@path);
+
+    my @topsfs = $seq->get_SeqFeatures;
+    if( $verbosity > 0 ) {
+        warn sprintf "TOP:%d\n", scalar(@topsfs);
+        write_hier(@topsfs);
+    }
+
+    # UNFLATTEN
+    @sfs = $unflattener->unflatten_seq(-seq       => $seq,
+                                       -use_magic => 1);
+    @sfs = $seq->get_SeqFeatures;
+    if( $verbosity > 0 ) {
+        warn "\n\nPOST PROCESSING:\n";
+        write_hier(@sfs);
+        warn sprintf "PROCESSED/TOP:%d\n", scalar(@sfs);
+    }
+    is scalar(@sfs), 1;
+
+    my @exons = grep {$_->primary_tag eq 'exon'} $seq->get_all_SeqFeatures;
+    is scalar(@exons), 6;    # total number of exons per splice
+
+    my %numberh = map {$_->get_tag_values("number") => 1} @exons;
+    my @numbers = keys %numberh;
+    if( $verbosity > 0 ) {
+        warn sprintf "DISTINCT EXONS: %d [@numbers]\n", scalar(@numbers);
+    }
+    is scalar(@numbers), 6;  # distinct exons
+}
+
+
+if (1) {
+    # example of a BAD genbank entry
+    my @path = ("dmel_2Lchunk.gb");
+    $seq     = getseq(@path);
+
+    my @topsfs = $seq->get_SeqFeatures;
+    if( $verbosity > 0 ) {
+        warn sprintf "TOP:%d\n", scalar(@topsfs);
+        write_hier(@topsfs);
+    }
+
+    # UNFLATTEN
+    #
+    # we EXPECT problems with this erroneous record
+    $unflattener->error_threshold(2);
+    @sfs = $unflattener->unflatten_seq(-seq       => $seq,
+                                       -use_magic => 1);
+    @sfs = $seq->get_SeqFeatures;
+    if( $verbosity > 0 ) {
+        warn "\n\nPOST PROCESSING:\n";
+        write_hier(@sfs);
+        warn sprintf "PROCESSED/TOP:%d\n", scalar(@sfs);
+    }
+    is scalar(@sfs), 2;
+
+    my @exons = grep {$_->primary_tag eq 'exon'} $seq->get_all_SeqFeatures;
+    is scalar(@exons), 2;    # total number of exons per splice
+
+    my @probs = $unflattener->get_problems;
+    $unflattener->report_problems(\*STDERR) if $verbosity > 0;
+    $unflattener->clear_problems;
+    if( $verbosity > 0 ) {
+        warn sprintf "PROBLEMS ENCOUNTERED: %d (EXPECTED: 6)\n", scalar(@probs);
+    }
+    is scalar(@probs), 6;
+}
+
 
 sub write_hier {
     my @sfs = @_;
@@ -217,9 +326,15 @@ sub _write_hier {
     my @sfs = @_;
     foreach my $sf (@sfs) {
         my $label = '?';
-        if ($sf->has_tag('product')) {
+        if ($sf->has_tag('gene')) {
+            ($label) = $sf->get_tag_values('gene');
+        }
+        elsif ($sf->has_tag('product')) {
             ($label) = $sf->get_tag_values('product');
         }
+        elsif ($sf->has_tag('number')) {
+            $label = join("; ", $sf->get_tag_values('number'));
+        }
         warn sprintf "%s%s $label\n", '  ' x $indent, $sf->primary_tag;
         my @sub_sfs = $sf->sub_SeqFeature;
         _write_hier($indent+1, @sub_sfs);
@@ -227,10 +342,9 @@ sub _write_hier {
 }
 
 sub getseq {
-    my @path = @_;
-    my $seqio =
-      Bio::SeqIO->new('-file'=> test_input_file(@path), 
-                      '-format' => 'GenBank');
+    my @path  = @_;
+    my $seqio = Bio::SeqIO->new('-file'   => test_input_file(@path),
+                                '-format' => 'GenBank');
     $seqio->verbose($verbosity);
 
     my $seq = $seqio->next_seq();
@@ -1,167 +0,0 @@
-# -*-Perl-*- Test Harness script for Bioperl
-# $Id$
-
-use strict;
-
-BEGIN { 
-    use lib '.';
-    use Bio::Root::Test;
-    
-    test_begin(-tests => 12);
-	
-	use_ok('Bio::SeqIO');
-	use_ok('Bio::SeqFeature::Tools::Unflattener');
-}
-
-my $verbosity = test_debug();
-
-my ($seq, @sfs);
-my $unflattener = Bio::SeqFeature::Tools::Unflattener->new;
-$unflattener->verbose($verbosity);
-
-if (1) {
-    
-    # this is an arabidopsise gbk record. it has no mRNA features.
-    # it has explicit exon/intron records
-
-    my @path = ("ATF14F8.gbk");
-    $seq = getseq(@path);
-    
-    is ($seq->accession_number, 'AL391144');
-    my @topsfs = $seq->get_SeqFeatures;
-    my @cdss = grep {$_->primary_tag eq 'CDS'} @topsfs;
-    my $n = scalar(@topsfs);
-    if( $verbosity > 0 ) {
-	warn sprintf "TOP:%d\n", scalar(@topsfs);
-	write_hier(@topsfs);
-    }
-    # UNFLATTEN
-    @sfs = $unflattener->unflatten_seq(-seq=>$seq,
-				       -use_magic=>1,
-				      );
-    @sfs = $seq->get_SeqFeatures;
-    if( $verbosity > 0 ) {
-	warn "\n\nPOST PROCESSING:\n";
-	write_hier(@sfs);
-	warn sprintf "PROCESSED/TOP:%d\n", scalar(@sfs);
-    }
-    is(@sfs,28);
-    my @allsfs = $seq->get_all_SeqFeatures;
-    is(@allsfs,202);
-    my @mrnas = grep {$_->primary_tag eq 'mRNA'} @allsfs;
-    if( $verbosity > 0 ) {
-	warn sprintf "ALL:%d\n", scalar(@allsfs);
-	warn sprintf "mRNAs:%d\n", scalar(@mrnas);
-    }
-
-    # relationship between mRNA and CDS should be one-one
-    is(@mrnas,@cdss);
-}
-
-if (1) {
-    
-    # this is a record from FlyBase
-    # it has mRNA features, and explicit exon/intron records
-
-    my @path = ("AnnIX-v003.gbk");
-    $seq = getseq(@path);
-    
-    my @topsfs = $seq->get_SeqFeatures;
-    if( $verbosity > 0 ) {
-	warn sprintf "TOP:%d\n", scalar(@topsfs);
-	write_hier(@topsfs);
-    }
-    # UNFLATTEN
-    @sfs = $unflattener->unflatten_seq(-seq=>$seq,
-				       -use_magic=>1,
-				      );
-    @sfs = $seq->get_SeqFeatures;
-    if( $verbosity > 0 ) {
-	warn "\n\nPOST PROCESSING:\n";
-	write_hier(@sfs);
-	warn sprintf "PROCESSED/TOP:%d\n", scalar(@sfs);
-    }
-    is scalar(@sfs), 1;
-    my @exons = grep {$_->primary_tag eq 'exon'} $seq->get_all_SeqFeatures;
-    is scalar(@exons), 6;    # total number of exons per splice
-    my %numberh = map {$_->get_tag_values("number") => 1} @exons;
-    my @numbers = keys %numberh;
-    if( $verbosity > 0 ) {
-	warn sprintf "DISTINCT EXONS: %d [@numbers]\n", scalar(@numbers);
-    }
-    is scalar(@numbers), 6;  # distinct exons
-}
-
-if (1) {
-    
-    # example of a BAD genbank entry
-
-    my @path = ("dmel_2Lchunk.gb");
-    $seq = getseq(@path);
-    
-    my @topsfs = $seq->get_SeqFeatures;
-    if( $verbosity > 0 ) {
-	warn sprintf "TOP:%d\n", scalar(@topsfs);
-	write_hier(@topsfs);
-    }
-    # UNFLATTEN
-    #
-    # we EXPECT problems with this erroneous record
-    $unflattener->error_threshold(2);
-    @sfs = $unflattener->unflatten_seq(-seq=>$seq,
-                                       -use_magic=>1,
-                                      );
-    my @probs = $unflattener->get_problems;
-    $unflattener->report_problems(\*STDERR) if $verbosity > 0;
-    $unflattener->clear_problems;
-    @sfs = $seq->get_SeqFeatures;
-    if( $verbosity > 0 ) {
-	warn "\n\nPOST PROCESSING:\n";
-	write_hier(@sfs);
-	warn sprintf "PROCESSED/TOP:%d\n", scalar(@sfs);
-    }
-    is scalar(@sfs), 2;
-    my @exons = grep {$_->primary_tag eq 'exon'} $seq->get_all_SeqFeatures;
-    is scalar(@exons), 2;    # total number of exons per splice
-    if( $verbosity > 0 ) {
-	warn sprintf "PROBLEMS ENCOUNTERED: %d (EXPECTED: 6)\n", scalar(@probs);
-    }
-    is scalar(@probs), 6;
-}
-
-
-sub write_hier {
-    my @sfs = @_;
-    _write_hier(0, @sfs);
-}
-
-sub _write_hier {
-    my $indent = shift;
-    my @sfs = @_;
-    foreach my $sf (@sfs) {
-        my $label = '?';
-        if ($sf->has_tag('gene')) {
-            ($label) = $sf->get_tag_values('gene');
-        }
-        if ($sf->has_tag('product')) {
-            ($label) = $sf->get_tag_values('product');
-        }
-        if ($sf->has_tag('number')) {
-            $label = join("; ", $sf->get_tag_values('number'));
-        }
-        printf "%s%s $label\n", '  ' x $indent, $sf->primary_tag;
-        my @sub_sfs = $sf->sub_SeqFeature;
-        _write_hier($indent+1, @sub_sfs);
-    }
-}
-
-sub getseq {
-    my @path = @_;
-    my $seqio =
-      Bio::SeqIO->new('-file'=> test_input_file(@path), 
-                      '-format' => 'GenBank');
-    $seqio->verbose($verbosity);
-
-    my $seq = $seqio->next_seq();
-    return $seq;
-}
@@ -7,7 +7,8 @@ BEGIN {
     use lib '.';
     use Bio::Root::Test;
     
-    test_begin(-tests => 561);
+    test_begin(-tests           => 561,
+               -requires_module => 'Data::Stag');
 	
     use_ok('Bio::SeqIO');
 }
@@ -394,16 +395,16 @@ foreach my $in ('BK000016-tpa.gbk', 'ay116458.gb', 'ay149291.gb', 'NC_006346.gb'
     $out->write_seq($seq);
     $out->close();
     
-    open (IN, $infile);
-    my @in = <IN>;
-    close(IN);
-    open (RESULT, $outfile);
+    open my $IN, '<', $infile or die "Could not read file '$infile': $!\n";
+    my @in = <$IN>;
+    close $IN;
+    open my $RESULT, '<', $outfile or die "Could not read file '$outfile': $!\n";
     my $line = 0;
     my $check = 0;
     my $is = 1;
     
     FILECHECK:
-    while (my $result = <RESULT>) {
+    while (my $result = <$RESULT>) {
         if ($result =~ /^KEYWORDS/) {
             $check = 1;
             next;
@@ -425,7 +426,7 @@ foreach my $in ('BK000016-tpa.gbk', 'ay116458.gb', 'ay149291.gb', 'NC_006346.gb'
             }
         }
     } continue { $line++ }
-    close(RESULT);
+    close $RESULT;
     
     ok $is, $in;
 }
@@ -4,26 +4,35 @@
 use strict;
 
 BEGIN {
-	use lib '.';
+    use lib '.';
     use Bio::Root::Test;
     
-    test_begin(-tests => 3);
-		
-	use_ok('Bio::SeqIO::MultiFile');
+    test_begin(-tests => 5);
+
+    use_ok 'Bio::SeqIO::MultiFile';
 }
 
 my $verbose = test_debug();
 
-my $mf = Bio::SeqIO::MultiFile->new(-format => 'Fasta' ,
-												-verbose => $verbose,
-												-files =>
-												[ test_input_file('multi_1.fa'),
-												  test_input_file('multi_2.fa')]);
-ok defined $mf;
+
+# Test multiple files, with a specified format
+ok my $mf = Bio::SeqIO::MultiFile->new(
+    -format  => 'Fasta' ,
+    -verbose => $verbose,
+    -files   => [ test_input_file('multi_1.fa'), test_input_file('multi_2.fa')],
+);
+
 my $count = 0;
-eval {
-	while (my $seq = $mf->next_seq() ) {
-		$count++;
-	}
-};
-is( $count,12 );
+while (my $seq = $mf->next_seq() ) {
+    $count++;
+}
+is $count, 12;
+
+
+# Automatically determine format
+ok $mf = Bio::SeqIO::MultiFile->new(
+    -verbose => $verbose,
+    -files   => [ test_input_file('multi_1.fa'), test_input_file('multi_2.fa')],
+);
+
+is $mf->format, 'fasta';
@@ -7,9 +7,9 @@ BEGIN {
     use lib '.';
     use Bio::Root::Test;
     
-    test_begin(-tests => 51);
+    test_begin(-tests => 58);
     
-    use_ok('Bio::SeqIO');
+    use_ok 'Bio::SeqIO';
 }
 
 my $verbose = test_debug();
@@ -17,18 +17,13 @@ my $verbose = test_debug();
 my @formats = qw(gcg fasta raw pir tab ace );
 # The following files or formats are failing: swiss genbank interpro embl
 
-foreach my $format (@formats) {
+for my $format (@formats) {
     print "======== $format ========\n" if $verbose;
-    read_write($format);
-}
-
-sub read_write {
-    my $format = shift;
     my $seq;
-    my $str = Bio::SeqIO->new(-file=> test_input_file("test.$format"),
-                                  -format => $format);
+    my $str = Bio::SeqIO->new( -file   => test_input_file("test.$format"),
+                               -format => $format                          );
 
-        is $str->format(), $format;
+    is $str->format(), $format;
 
     ok $seq = $str->next_seq();
     print "Sequence 1 of 2 from $format stream:\n", $seq->seq, "\n\n" if  $verbose;
@@ -43,8 +38,8 @@ sub read_write {
     }
     
     my $outfile = test_output_file();
-    my $out = Bio::SeqIO->new(-file => ">$outfile",
-                              -format => $format);
+    my $out = Bio::SeqIO->new( -file   => ">$outfile",
+                               -format => $format      );
     ok $out->write_seq($seq);
     if ($format eq 'fasta') {
         my $id_type;
@@ -55,15 +50,17 @@ sub read_write {
     ok -s $outfile;
 }
 
+
+
 # from testformats.pl
 SKIP: {
     test_skip(-tests => 6, -requires_modules => [qw(Algorithm::Diff
                                                     IO::ScalarArray
                                                     IO::String)]);
-    use_ok('Algorithm::Diff');
+    use_ok 'Algorithm::Diff';
     eval "use Algorithm::Diff qw(diff LCS);";
-    use_ok('IO::ScalarArray');
-    use_ok('IO::String');
+    use_ok 'IO::ScalarArray';
+    use_ok 'IO::String';
     
     my %files = ( 
              #'test.embl'      => 'embl',
@@ -79,17 +76,19 @@ SKIP: {
     while( my ($file, $type) = each %files ) {
         my $filename = test_input_file($file);
         print "processing file $filename\n" if $verbose;
-        open(FILE, "< $filename") or die("cannot open $filename");
-        my @datain = <FILE>;
-        my $in = new IO::String(join('', @datain));
-        my $seqin = new Bio::SeqIO( -fh => $in,
-                    -format => $type);
-        my $out = new IO::String;
-        my $seqout = new Bio::SeqIO( -fh => $out,
-                     -format => $type);
+        open my $FILE, '<', $filename or die "Could not read file '$filename': $!\n";
+        my @datain = <$FILE>;
+        close $FILE;
+
+        my $in = IO::String->new( join('', @datain) );
+        my $seqin = Bio::SeqIO->new( -fh     => $in,
+                                     -format => $type );
+        my $out = IO::String->new();
+        my $seqout = Bio::SeqIO->new( -fh     => $out,
+                                      -format => $type );
         my $seq;
         while( defined($seq = $seqin->next_seq) ) {
-        $seqout->write_seq($seq);
+            $seqout->write_seq($seq);
         }
         $seqout->close();
         $seqin->close();
@@ -114,6 +113,43 @@ SKIP: {
 # simple tests specific to Bio::SeqIO interface (applicable to all SeqIO
 # modules)
 
+##############################################
+# test format() and variant() in Bio::RootIO
+##############################################
+
+my $in = Bio::SeqIO->new(
+   -file    => test_input_file('bug2901.fa'),
+   -format  => "fasta",
+);
+is $in->format, 'fasta';
+is $in->variant, undef;
+
+$in = Bio::SeqIO->new(
+   -file    => test_input_file('fastq', 'illumina_faked.fastq'),
+   -format  => "fastq",
+   -variant => 'illumina',
+);
+is $in->format, 'fastq';
+is $in->variant, 'illumina';
+
+
+######################################################
+# test format detection from different inputs
+######################################################
+
+$in = Bio::SeqIO->new( -file => test_input_file('test.fastq') );
+is $in->format, 'fastq';
+
+open my $fh, '<', test_input_file('test.genbank') or die "Could not read file 'test.genbank': $!\n";
+$in = Bio::SeqIO->new( -fh => $fh );
+is $in->format, 'genbank';
+close $fh;
+
+my $string = ">seq\nACGATCG\n";
+$in = Bio::SeqIO->new( -string => $string );
+is $in->format, 'fasta';
+
+
 ############ EXCEPTION HANDLING ############
 
 TODO: {
@@ -135,6 +171,5 @@ throws_ok {
 
 throws_ok {
     Bio::SeqIO->new(-file => 'foo.bar');
-} qr/Can not open 'foo.bar' for reading:/,
+} qr/Could not read file 'foo.bar':/,
     'Must pass a real file';
-
@@ -3,38 +3,35 @@
 
 use strict;
 
-BEGIN {     
+BEGIN {
     use lib '.';
     use Bio::Root::Test;
-    
-    test_begin(-tests => 14);
-	
-	use_ok('Bio::SeqIO');
-}
 
-ok my $str = Bio::SeqIO->new(
-			'-file'=> test_input_file('U58726.gb'), 
-			'-format' => 'GenBank');
+    test_begin(-tests => 19);
 
-my $seq;
+    use_ok('Bio::SeqIO');
+}
 
+ok my $str = Bio::SeqIO->new(-file   => test_input_file('U58726.gb'),
+                             -format => 'GenBank');
+my $seq;
 ok ( $seq = $str->next_seq() );
 
 # Here is a cute way to verify the sequence by seeing if the
 # the translation matches what is annotated in the file -js
-foreach my $ft ( grep { $_->primary_tag eq 'CDS'} 
-		 $seq->top_SeqFeatures ) {
+foreach my $ft ( grep { $_->primary_tag eq 'CDS'}
+                 $seq->top_SeqFeatures ) {
     if( $ft->has_tag('translation') ) {
-	my ($translation) = $ft->get_tag_values('translation');
-	my $t = $ft->spliced_seq(-nosort => 1);
-	my $pepseq = $t->translate()->seq();
-	chop($pepseq);# chop is to remove stop codon
-	is($translation,$pepseq); 
-	}
+        my ($translation) = $ft->get_tag_values('translation');
+        my $t = $ft->spliced_seq(-nosort => 1);
+        my $pepseq = $t->translate()->seq();
+        chop($pepseq); # chop is to remove stop codon
+        is($translation, $pepseq);
+    }
 }
 
-my $stream = Bio::SeqIO->new(-file => test_input_file('M12730.gb'),
-                              -format => 'genbank');
+my $stream = Bio::SeqIO->new(-file   => test_input_file('M12730.gb'),
+                             -format => 'genbank');
 # Jump down to M12730 which lists CDS join(1959..2355,1..92)
 while ($seq->accession ne "M12730") {
     $seq = $stream->next_seq;
@@ -51,8 +48,42 @@ foreach my $feat2 ( @features ) {
 }
 my ($protein_seq) = $feat->get_tag_values("translation");
 like($protein_seq, qr(^MKERYGTVYKGSQRLIDE.*ANEKQENALYLIIILSRTSIT$),
-	 "protein sequence");
+                   "protein sequence");
 my ($nucleotide_seq) = $feat->spliced_seq(-nosort => 1)->seq;
 like($nucleotide_seq, qr(^ATGAAAGAAAGATATGGA.*TCAAGGACTAGTATAACATAA$),
-	 "nucleotide sequence - correct CDS range");
+                     "nucleotide sequence - correct CDS range");
 is(length($nucleotide_seq), 489, "nucleotide length");
+
+#  Test for Fix spliced seq #72
+my $str2 = Bio::SeqIO->new(-file   => test_input_file('AF032047.gbk'),
+                           -format => 'GenBank');
+my @feats = $str2-> next_seq -> get_SeqFeatures;
+# feat[1] has 2 exons from remote sequence AF032048.1
+my $len_nodb;
+warnings_like { $len_nodb = length($feats[1]->spliced_seq()->seq); }
+              [ {carped => qr/cannot get remote location for/},
+                {carped => qr/cannot get remote location for/}
+               ],
+              "appropriate warning if db not provided for remote sequence";
+ok($len_nodb == 374, "correct number of Ns added if remote sequence not provided");
+
+SKIP: {
+    test_skip(-tests => 3, -requires_networking => 1);
+    my $db_in;
+    eval {
+        use Bio::DB::GenBank;
+        ok $db_in = Bio::DB::GenBank->new();
+        my $seq_obj = $db_in->get_Seq_by_id('AF032048.1');
+    };
+    if ($@) {
+        print "$@\n";
+        skip  "Warning: Problem accessing GenBank entry AF032048.1 "
+            . "to test spliced_seq on remote DBs", 2;
+    }
+
+    my $len_w_db;
+    warning_is { $len_w_db = length($feats[1]->spliced_seq(-db => $db_in)->seq) }
+               [],
+               "no warnings if GenBank db provided for remote sequence";
+    ok($len_w_db == 374, "correct length if remote sequence is provided")
+}
@@ -4,62 +4,59 @@
 use strict;
 
 BEGIN {
-	use lib '.';
+    use lib '.';
     use Bio::Root::Test;
-    
+
     test_begin(-tests => 7);
-	
-	use_ok('Bio::SeqIO');
+
+    use_ok 'Bio::SeqIO';
 }
 
 my $verbose = test_debug();
 
 my $t_file = test_input_file('test.ace');
-my( $before );
+my $before;
 {
-	local $/ = undef;
-	local *BEFORE;
-	open BEFORE, $t_file;
-	$before = <BEFORE>;
-	close BEFORE;
+    local $/ = undef;
+    open my $BEFORE, '<', $t_file or die "Could not read file '$t_file': $!\n";
+    $before = <$BEFORE>;
+    close $BEFORE;
 }
 
-my $a_in = Bio::SeqIO->new( -FILE => $t_file,
-									 -verbose => $verbose,
-									 -FORMAT => 'ace');
-my( @a_seq );
+my $a_in = Bio::SeqIO->new( -FILE    => $t_file,
+                            -verbose => $verbose,
+                            -FORMAT  => 'ace' );
+my @a_seq;
 while (my $a = $a_in->next_seq) {
-	push(@a_seq, $a);
+    push @a_seq, $a;
 }
 
 is @a_seq, 3, 'number of sequence objects';
 
 my $esc_name = $a_seq[1]->display_id;
-is( $esc_name , 'Name; 4% strewn with \ various / escaped characters',
-	 "unescaping of characters, $esc_name");
+is $esc_name, 'Name; 4% strewn with \ various / escaped characters',
+    "unescaping of characters, $esc_name";
 
 is $a_seq[0]->alphabet, 'protein', 'alphabets detected';
 is $a_seq[1]->alphabet, 'dna', 'alphabets detected';
 
 my $o_file = test_output_file();
-my $a_out = Bio::SeqIO->new(-FILE => "> $o_file",
-									 -verbose => $verbose,
-									 -FORMAT => 'ace');
+my $a_out = Bio::SeqIO->new( -FILE    => ">$o_file",
+                             -verbose => $verbose,
+                             -FORMAT  => 'ace' );
 my $a_out_ok = 1;
-foreach my $a (@a_seq) {
-	$a_out->write_seq($a) or $a_out_ok = 0;
+for my $a (@a_seq) {
+    $a_out->write_seq($a) or $a_out_ok = 0;
 }
 undef($a_out);  # Flush to disk
 is $a_out_ok,1,'writing sequence';
 
-my( $after );
+my $after;
 {
-	local $/ = undef;
-	local *AFTER;
-	open AFTER, $o_file;
-	$after = <AFTER>;
-	close AFTER;
+    local $/ = undef;
+    open my $AFTER, '<', $o_file or die "Could not read file '$o_file': $!\n";
+    $after = <$AFTER>;
+    close $AFTER;
 }
 
-is( ($before and $after and ($before eq $after)),1,
-	 'test output');
+is( ($before and $after and ($before eq $after)), 1, 'test output');
@@ -4,15 +4,14 @@
 use strict;
 
 BEGIN {
-	use lib '.';
+    use lib '.';
     use Bio::Root::Test;
-    
+
     test_begin(-tests               => 8,
-			   -requires_modules    => [],
-			   -requires_networking => 0,
-			  );
-	
-	use_ok('Bio::SeqIO::chaos');
+               -requires_module     => 'Data::Stag',
+               -requires_networking => 0);
+
+    use_ok('Bio::SeqIO::chaos');
 }
 
 my $verbose = test_debug();
@@ -44,4 +43,4 @@ TODO: {
 	is   ($seq_obj->length(),      $expected{'length'},      'length');
 	is   ($seq_obj->primary_id(),  $expected{'primary_id'},  'primary_id');
 	like ($seq_obj->description(), $expected{'description'}, 'description');
-}
\ No newline at end of file
+}
@@ -229,7 +229,7 @@ foreach my $feature ($seq->top_SeqFeatures) {
 
     # Write EMBL
     my $string;
-    open(my $str_fh, '>', \$string) || skip("Can't open string, skipping", 2);
+    open my $str_fh, '>', \$string or skip("Could not write string, skipping", 2);
     
     my $out=Bio::SeqIO->new(-format=>'embl', -fh => $str_fh);
     $out->write_seq($seq);
@@ -257,7 +257,7 @@ foreach my $feature ($seq->top_SeqFeatures) {
 
     # Write EMBL
     my $string;
-    open(my $str_fh, '>', \$string) || skip("Can't open string, skipping", 2);
+    open my $str_fh, '>', \$string or skip("Could not write string, skipping", 2);
 
     my $out=Bio::SeqIO->new(-format=>'embl', -fh => $str_fh);
     $out->write_seq($seq);
@@ -297,7 +297,7 @@ foreach my $feature ($seq->top_SeqFeatures) {
 
     # Write EMBL
     my $string;
-    open(my $str_fh, '>', \$string) || skip("Can't open string, skipping", 2);
+    open my $str_fh, '>', \$string or skip("Could not write string, skipping", 2);
 
     my $out=Bio::SeqIO->new(-format=>'embl', -fh => $str_fh);
     $out->write_seq($seq);
@@ -321,7 +321,7 @@ foreach my $feature ($seq->top_SeqFeatures) {
     my $seq = Bio::Seq->new(-seq=>'actg', -id=>'test_id');
 
     my $string;
-    open(my $str_fh, '>', \$string) || skip("Can't open string, skipping", 1);
+    open my $str_fh, '>', \$string or skip("Could not write string, skipping", 1);
 
     my $out = Bio::SeqIO->new(-format=>'embl', -fh=>$str_fh);
     $out->write_seq($seq);
@@ -4,13 +4,13 @@
 use strict;
 
 BEGIN {
-	use lib '.';
-	use Bio::Root::Test;
-	
-	test_begin(-tests => 1422,
-			   -requires_module => 'Bio::ASN1::EntrezGene');
-	
-	use_ok('Bio::SeqIO::entrezgene');
+    use lib '.';
+    use Bio::Root::Test;
+
+    test_begin(-tests => 1427,
+               -requires_module => 'Bio::ASN1::EntrezGene');
+
+    use_ok('Bio::SeqIO::entrezgene');
 }
 
 my @species=('Homo sapiens','Mus musculus', 'Caenorhabditis elegans');
@@ -492,7 +492,7 @@ my @llsp =('OFFICIAL_GENE_NAME','CHR','MAP','OFFICIAL_SYMBOL');
 ok my $eio_b=Bio::SeqIO->new(-file=>test_input_file('entrezgene.dat'),-format=>'entrezgene', -debug=>'on',-service_record=>'yes',-locuslink=>'convert');
 my $loop_count = 0;
 while (my $seq=$eio_b->next_seq) {
-	$loop_count++;
+    $loop_count++;
     ok $seq;
     my $acc=$seq->accession_number;
     is grep(/\b$acc\b/,@ids),1;
@@ -504,3 +504,19 @@ while (my $seq=$eio_b->next_seq) {
     }
 }
 is $loop_count, 4, "correct number of loops for T18";
+
+# Test for Bug #3453
+ok my $eio_c = Bio::SeqIO->new(-format => 'entrezgene',
+                               -file   => test_input_file('entrezgene_bug3453.dat') );
+my $entry = 0;
+while ( my ( $gene, $genestructure, $uncaptured ) = $eio_c->next_seq ) {
+    $entry++;
+    if ($entry == 1) {
+        is $gene->accession_number, 3581;
+        is scalar @{ $uncaptured }, 55;
+    }
+    elsif ($entry == 2) {
+        is $gene->accession_number, 56111;
+        is scalar @{ $uncaptured }, 32;
+    }
+}
@@ -87,8 +87,10 @@ SKIP: {
     my ($file, $type) = ("test.$format", $format);
     my $filename = test_input_file($file);
     print "processing file $filename\n" if $verbose;
-    open(FILE, "< $filename") or die("cannot open $filename");
-    my @datain = <FILE>;
+    open my $FILE, '<', $filename or die "Could not read file '$filename': $!\n";
+    my @datain = <$FILE>;
+    close $FILE;
+
     my $in = new IO::String(join('', @datain));
     my $seqin = new Bio::SeqIO( -fh => $in,
                 -format => $type);
@@ -77,11 +77,13 @@ SKIP: {
     use_ok('IO::ScalarArray');
     use_ok('IO::String');
     
-	my ($file, $type) = ("test.$format", $format);
+    my ($file, $type) = ("test.$format", $format);
     my $filename = test_input_file($file);
     print "processing file $filename\n" if $verbose;
-    open(FILE, "< $filename") or die("cannot open $filename");
-    my @datain = <FILE>;
+    open my $FILE, '<', $filename or die "Could not read file '$filename': $!\n";
+    my @datain = <$FILE>;
+    close $FILE;
+
     my $in = new IO::String(join('', @datain));
     my $seqin = new Bio::SeqIO( -fh => $in,
                 -format => $type);
@@ -5,19 +5,19 @@ use strict;
 
 BEGIN {
     use lib '.';
-	use Bio::Root::Test;
-	test_begin(-tests => 287 );
+    use Bio::Root::Test;
+    test_begin(-tests => 287);
     use_ok('Bio::SeqIO::genbank');
 }
 
-my $verbose = test_debug();
+my $verbose = test_debug;
 
-my $ast = Bio::SeqIO->new(-format => 'genbank' ,
-                                  -verbose => $verbose,
-                                  -file => test_input_file('roa1.genbank'));
+my $ast = Bio::SeqIO->new(-format  => 'genbank' ,
+                          -verbose => $verbose,
+                          -file    => test_input_file('roa1.genbank'));
 isa_ok($ast, 'Bio::SeqIO');
 $ast->verbose($verbose);
-my $as = $ast->next_seq();
+my $as = $ast->next_seq;
 is $as->molecule, 'mRNA',$as->accession_number;
 is $as->alphabet, 'dna';
 is $as->division, 'EST';
@@ -26,11 +26,11 @@ is($as->primary_id, 3598416);
 my @class = $as->species->classification;
 is $class[$#class],'Eukaryota';
 
-$ast = Bio::SeqIO->new(-format => 'genbank',
-                              -verbose => $verbose,
-                       -file => test_input_file('NT_021877.gbk'));
+$ast = Bio::SeqIO->new(-format  => 'genbank',
+                       -verbose => $verbose,
+                       -file    => test_input_file('NT_021877.gbk'));
 $ast->verbose($verbose);
-$as = $ast->next_seq();
+$as = $ast->next_seq;
 is $as->molecule, 'DNA',$as->accession_number;
 is $as->alphabet, 'dna';
 is $as->division, 'CON';
@@ -38,16 +38,16 @@ is join(',',$as->get_dates), '17-OCT-2003';
 is($as->primary_id, 37539616);
 is($as->accession_number, 'NT_021877');
 
-my ($cds) = grep { $_->primary_tag eq 'CDS' } $as->get_SeqFeatures();
+my ($cds) = grep { $_->primary_tag eq 'CDS' } $as->get_SeqFeatures;
 is(($cds->get_tag_values('transl_except'))[1],
    '(pos:complement(4224..4226),aa:OTHER)');
 
 # test for a DBSOURCE line
-$ast = Bio::SeqIO->new(-format => 'genbank',
-                              -verbose => $verbose,
-                       -file => test_input_file('BAB68554.gb'));
+$ast = Bio::SeqIO->new(-format  => 'genbank',
+                       -verbose => $verbose,
+                       -file    => test_input_file('BAB68554.gb'));
 $ast->verbose($verbose);
-$as = $ast->next_seq();
+$as = $ast->next_seq;
 is $as->molecule, 'PRT',$as->accession_number;
 is $as->alphabet, 'protein';
 is $as->division, 'VRT';
@@ -70,55 +70,55 @@ is($dblinks[0]->version, '1');
 is($dblinks[0]->display_text, 'GenBank:AB072353.1','operator overloading in AnnotationI is deprecated');
 
 # test for multi-line SOURCE
-$ast = Bio::SeqIO->new(-format => 'genbank',
-                              -verbose => $verbose,
-                       -file => test_input_file('NC_006346.gb'));
+$ast = Bio::SeqIO->new(-format  => 'genbank',
+                       -verbose => $verbose,
+                       -file    => test_input_file('NC_006346.gb'));
 $as = $ast->next_seq;
 is $as->species->binomial('FULL'), 'Bolitoglossa n. sp. RLM-2004',$as->accession_number;;
 @class = $as->species->classification;
 is($class[$#class],'Eukaryota');
 is($as->species->common_name,'mushroomtongue salamander');
 
-$ast = Bio::SeqIO->new(-format => 'genbank',
-                              -verbose => $verbose,
-                       -file => test_input_file('U71225.gb'));
+$ast = Bio::SeqIO->new(-format  => 'genbank',
+                       -verbose => $verbose,
+                       -file    => test_input_file('U71225.gb'));
 $as = $ast->next_seq;
 @class = $as->species->classification;
 is($class[$#class],'Eukaryota',$as->accession_number);
 is $as->species->common_name,'black-bellied salamander';
 
 # test for unusual common name
-$ast = Bio::SeqIO->new(-format => 'genbank',
-                              -verbose => $verbose,
-                       -file => test_input_file('AB077698.gb'));
+$ast = Bio::SeqIO->new(-format  => 'genbank',
+                       -verbose => $verbose,
+                       -file    => test_input_file('AB077698.gb'));
 $as = $ast->next_seq;
 # again, this is not a common name but is in name('abbreviated')
 ok defined($as->species->name('abbreviated')->[0]),$as->accession_number;
 is $as->species->name('abbreviated')->[0],'Homo sapiens cDNA to mRNA';
 
 # test for common name with parentheses
-$ast = Bio::SeqIO->new(-format => 'genbank',
-                              -verbose => $verbose,
-                       -file => test_input_file('DQ018368.gb'));
+$ast = Bio::SeqIO->new(-format  => 'genbank',
+                       -verbose => $verbose,
+                       -file    => test_input_file('DQ018368.gb'));
 $as = $ast->next_seq;
 is $as->species->scientific_name,'(Populus tomentosa x P. bolleana) x P. tomentosa var. truncata',
 $as->accession_number;;
 
 # test secondary accessions
-my $seqio = Bio::SeqIO->new(-format => 'genbank',
-                                    -verbose => $verbose,
-                                    -file => test_input_file('D10483.gbk'));
+my $seqio = Bio::SeqIO->new(-format  => 'genbank',
+                            -verbose => $verbose,
+                            -file    => test_input_file('D10483.gbk'));
 my $seq = $seqio->next_seq;
 my @kw =  $seq->get_keywords;
 is(scalar @kw, 118, $seq->accession_number);
 is($kw[-1], 'yabO');
-my @sec_acc = $seq->get_secondary_accessions();
+my @sec_acc = $seq->get_secondary_accessions;
 is(scalar @sec_acc,14);
 is($sec_acc[-1], 'X56742');
 
 # bug #1487
 my $str = Bio::SeqIO->new(-verbose => $verbose,
-                                 -file    => test_input_file('D12555.gbk'));
+                          -file    => test_input_file('D12555.gbk'));
 eval {
     $seq = $str->next_seq;
 };
@@ -126,9 +126,9 @@ eval {
 ok(! $@, 'bug 1487');
 
 # bug 1647 rpt_unit sub-feature with multiple parens
-$str = Bio::SeqIO->new(-format => 'genbank',
-                              -verbose => $verbose,
-                       -file => test_input_file('mini-AE001405.gb'));
+$str = Bio::SeqIO->new(-format  => 'genbank',
+                       -verbose => $verbose,
+                       -file    => test_input_file('mini-AE001405.gb'));
 ok($seq = $str->next_seq);
 my @rpts = grep { $_->primary_tag eq 'repeat_region' }
   $seq->get_SeqFeatures;
@@ -138,9 +138,9 @@ is $#rpt_units, 0;
 is(($rpt_units[0]->get_tag_values('rpt_unit'))[0],'(TG)10;A;(TG)7');
 
 # test bug #1673 , RDB-II genbank files
-$str = Bio::SeqIO->new(-format => 'genbank',
-                              -verbose => $verbose,
-                       -file => test_input_file('Mcjanrna_rdbII.gbk')
+$str = Bio::SeqIO->new(-format  => 'genbank',
+                       -verbose => $verbose,
+                       -file    => test_input_file('Mcjanrna_rdbII.gbk')
               );
 ok($seq = $str->next_seq, 'bug 1673');
 my @refs = $seq->annotation->get_Annotations('reference');
@@ -150,17 +150,17 @@ is($seq->molecule ,'RNA');
 is $as->division, 'PLN';
 is join(',',$as->get_dates), '23-MAY-2005';
 
-$str  = Bio::SeqIO->new(-format => 'genbank',
-                              -file   => test_input_file('AF165282.gb'),
-                              -verbose => $verbose);
+$str  = Bio::SeqIO->new(-format  => 'genbank',
+                        -file    => test_input_file('AF165282.gb'),
+                        -verbose => $verbose);
 $seq = $str->next_seq;
-my @features = $seq->all_SeqFeatures();
+my @features = $seq->all_SeqFeatures;
 is(@features, 5, $seq->accession_number);
 is($features[0]->start, 1);
 is($features[0]->end, 226);
 my $location = $features[1]->location;
 ok($location->isa('Bio::Location::SplitLocationI'));
-my @sublocs = $location->sub_Location();
+my @sublocs = $location->sub_Location;
 is(@sublocs, 29);
 
 # version and primary ID - believe it or not, this wasn't working
@@ -169,9 +169,9 @@ is ($seq->seq_version, 1);
 is ($seq->primary_id, "5734104");
 
 # streaming and Bio::RichSeq creation
-my $stream = Bio::SeqIO->new(-file => test_input_file('test.genbank'),
-                                      -verbose => $verbose,
-                             -format => 'genbank');
+my $stream = Bio::SeqIO->new(-file    => test_input_file('test.genbank'),
+                             -verbose => $verbose,
+                             -format  => 'genbank');
 $stream->verbose($verbose);
 my $seqnum = 0;
 my $species;
@@ -179,50 +179,51 @@ my @cl;
 my $lasts;
 my @ids = qw(DDU63596 DDU63595 HUMBDNF);
 my @tids = (44689, 44689, 9606);
-my @tnames = ("Dictyostelium discoideum","Dictyostelium discoideum",
-                  "Homo sapiens");
-while($seq = $stream->next_seq()) {
+my @tnames = ("Dictyostelium discoideum",
+              "Dictyostelium discoideum",
+              "Homo sapiens");
+while($seq = $stream->next_seq) {
     if($seqnum < 3) {
-        is $seq->display_id(), $ids[$seqnum];
-        $species = $seq->species();
-        @cl = $species->classification();
-        is( $species->binomial(), $tnames[$seqnum],
-             'species parsing incorrect for genbank');
-        is( $cl[3] ne $species->genus(), 1,
-             'genus duplicated in genbank parsing');
+        is $seq->display_id, $ids[$seqnum];
+        $species = $seq->species;
+        @cl = $species->classification;
+        is( $species->binomial, $tnames[$seqnum],
+            'species parsing incorrect for genbank');
+        is( $cl[3] ne $species->genus, 1,
+            'genus duplicated in genbank parsing');
         is( $species->ncbi_taxid, $tids[$seqnum] );
     }
     $seqnum++;
     $lasts = $seq;
 }
 is($seqnum, 5,'streaming');
-is $lasts->display_id(), "HUMBETGLOA";
+is $lasts->display_id, "HUMBETGLOA";
 my ($ref) = $lasts->annotation->get_Annotations('reference');
 is($ref->medline, 94173918);
-$stream->close();
+$stream->close;
 
-$stream = Bio::SeqIO->new(-file => test_input_file('test.genbank.noseq'),
-                                  -verbose => $verbose,
-                                  -format => 'genbank' );
+$stream = Bio::SeqIO->new(-file    => test_input_file('test.genbank.noseq'),
+                          -verbose => $verbose,
+                          -format  => 'genbank' );
 $seqnum = 0;
-while($seq = $stream->next_seq()) {
+while($seq = $stream->next_seq) {
     if($seqnum < 3) {
-        is $seq->display_id(), $ids[$seqnum];
-    } elsif( $seq->display_id eq 'M37762') {
-        is( ($seq->get_keywords())[0], 'neurotrophic factor');
+        is $seq->display_id, $ids[$seqnum];
+    }
+    elsif( $seq->display_id eq 'M37762') {
+        is( ($seq->get_keywords)[0], 'neurotrophic factor');
     }
     $seqnum++;
 }
 is $seqnum, 5, "Total number of sequences in test file";
 
 # fuzzy
-$seq = Bio::SeqIO->new( -format => 'genbank',
-                                -verbose => $verbose,
-                        -file =>test_input_file('testfuzzy.genbank'));
-$seq->verbose($verbose);
-ok(defined($as = $seq->next_seq()));
+$seq = Bio::SeqIO->new( -file    => test_input_file('testfuzzy.genbank'),
+                        -format  => 'genbank',
+                        -verbose => $verbose );
+ok(defined($as = $seq->next_seq));
 
-@features = $as->all_SeqFeatures();
+@features = $as->all_SeqFeatures;
 is(@features,21,'Fuzzy in');
 my $lastfeature = pop @features;
 # this is a split location; the root doesn't have strand
@@ -234,7 +235,7 @@ is($location->strand, undef);
 is($location->start, 83202);
 is($location->end, 84996);
 
-@sublocs = $location->sub_Location();
+@sublocs = $location->sub_Location;
 
 is(@sublocs, 2);
 my $loc = shift @sublocs;
@@ -247,16 +248,16 @@ is($loc->start, 84248);
 is($loc->end, 84996);
 is($loc->strand,1);
 
-$seq = Bio::SeqIO->new(-format => 'genbank',
-                              -verbose => $verbose,
-                       -file=> ">" .test_output_file());
+$seq = Bio::SeqIO->new(-format  => 'genbank',
+                       -verbose => $verbose,
+                       -file    => ">" .test_output_file);
 $seq->verbose($verbose);
 ok($seq->write_seq($as),'Fuzzy out');
 
 ## now genbank ##
-$str = Bio::SeqIO->new(-format =>'genbank',
-                             -verbose => $verbose,
-                             -file => test_input_file('BK000016-tpa.gbk'));
+$str = Bio::SeqIO->new(-format  => 'genbank',
+                       -verbose => $verbose,
+                       -file    => test_input_file('BK000016-tpa.gbk'));
 $seq = $str->next_seq;
 ok(defined $seq, $seq->accession_number);
 ok(defined $seq->seq);
@@ -281,14 +282,14 @@ is ($reference->pubmed, '11479594');
 is ($reference->medline, '21372465',$seq->accession_number);
 
 # validate that what is written is what is read
-my $testfile = test_output_file();
-my $out = Bio::SeqIO->new(-file => ">$testfile",
-                             -format => 'genbank');
+my $testfile = test_output_file;
+my $out = Bio::SeqIO->new(-file   => ">$testfile",
+                          -format => 'genbank');
 $out->write_seq($seq);
-$out->close();
+$out->close;
 
-$str = Bio::SeqIO->new(-format =>'genbank',
-                             -file => $testfile);
+$str = Bio::SeqIO->new(-format => 'genbank',
+                       -file   => $testfile);
 $seq = $str->next_seq;
 ok(defined $seq,'roundtrip');
 ok(defined $seq->seq);
@@ -314,15 +315,15 @@ is ($reference->medline, '21372465');
 
 # write revcomp split location
 my $gb = Bio::SeqIO->new(-format => 'genbank',
-                        # This sequence has an odd LOCUS line which sets off a warning, setting
-                        # verbose to -1.
-                        # The newest Ensembl seq lacks this.  Maybe update?  cjfields 6-5-07
-                        -verbose => $verbose ? $verbose : -1,
-                        -file   => test_input_file('revcomp_mrna.gb'));
-$seq = $gb->next_seq();
+                         # This sequence has an odd LOCUS line which sets off a warning, setting
+                         # verbose to -1.
+                         # The newest Ensembl seq lacks this.  Maybe update?  cjfields 6-5-07
+                         -verbose => $verbose ? $verbose : -1,
+                         -file   => test_input_file('revcomp_mrna.gb'));
+$seq = $gb->next_seq;
 
 $gb = Bio::SeqIO->new(-format => 'genbank',
-                     -file   => ">$testfile");
+                      -file   => ">$testfile");
 
 $gb->write_seq($seq);
 undef $gb;
@@ -333,9 +334,9 @@ ok(! -z $testfile, 'revcomp split location');
 #           9150
 #           Bacteria; Proteobacteria; Gammaproteobacteria; Enterobacteriales;
 #           Enterobacteriaceae; Salmonella.
-$gb = Bio::SeqIO->new(-format => 'genbank',
-                     -verbose => $verbose,
-                        -file   => test_input_file('NC_006511-short.gbk'));
+$gb = Bio::SeqIO->new(-format  => 'genbank',
+                      -verbose => $verbose,
+                      -file    => test_input_file('NC_006511-short.gbk'));
 $seq = $gb->next_seq;
 is $seq->species->common_name, undef, "Bug 1925";
 is $seq->species->scientific_name, "Salmonella enterica subsp. enterica serovar Paratyphi A str. ATCC 9150";
@@ -343,14 +344,14 @@ is $seq->species->scientific_name, "Salmonella enterica subsp. enterica serovar
 is $class[$#class], "Bacteria";
 
 # WGS   tests
-$gb = Bio::SeqIO->new(-format => 'genbank',
+$gb = Bio::SeqIO->new(-format  => 'genbank',
                       -verbose => $verbose,
-                    -file   => test_input_file('O_sat.wgs'));
+                      -file    => test_input_file('O_sat.wgs'));
 $seq = $gb->next_seq;
 
 my @tests = ('wgs'        => 'AAAA02000001-AAAA02050231',
-            'wgs_scafld' => 'CM000126-CM000137',
-            'wgs_scafld' => 'CH398081-CH401163');
+             'wgs_scafld' => 'CM000126-CM000137',
+             'wgs_scafld' => 'CH398081-CH401163');
 
 my @wgs = map {$seq->annotation->get_Annotations(lc($_))} qw(WGS WGS_SCAFLD);
 
@@ -366,9 +367,9 @@ for my $wgs (@wgs) {
 is ($ct, 3);
 
 # make sure we can retrieve a feature with a primary tag of 'misc_difference'
-$gb = Bio::SeqIO->new(-format => 'genbank',
-                     -verbose => $verbose,
-                    -file   => test_input_file('BC000007.gbk'));
+$gb = Bio::SeqIO->new(-format  => 'genbank',
+                      -verbose => $verbose,
+                      -file    => test_input_file('BC000007.gbk'));
 $seq = $gb->next_seq;
 ($cds) = grep { $_->primary_tag eq 'misc_difference' } $seq->get_SeqFeatures;
 my @vals = $cds->get_tag_values('gene');
@@ -384,32 +385,34 @@ is $vals[0], 'PX19', $seq->accession_number;
 # changes so are really useless; I will change them to verify common name,
 # organelle, scientific name, etc.
 
-my $outfile = test_output_file();
+my $outfile = test_output_file;
 
 # output always adds a period (GenBank std), but two of these files do not use them.
 
 foreach my $in ('BK000016-tpa.gbk', 'ay116458.gb', 'ay149291.gb', 'NC_006346.gb', 'ay007676.gb', 'dq519393.gb') {
     my $infile =  test_input_file($in);
 
-    $str = Bio::SeqIO->new(-format =>'genbank',
-                          -verbose => $verbose,
-                          -file => $infile);
+    $str = Bio::SeqIO->new(-format  => 'genbank',
+                           -verbose => $verbose,
+                           -file    => $infile);
     $seq = $str->next_seq;
 
-    $out = Bio::SeqIO->new(-file => ">$outfile", -format => 'genbank');
+    $out = Bio::SeqIO->new(-file   => ">$outfile",
+                           -format => 'genbank');
     $out->write_seq($seq);
-    $out->close();
+    $out->close;
+
+    open my $IN, '<', $infile or die "Could not read file '$infile': $!\n";
+    my @in = <$IN>;
+    close $IN;
 
-    open (IN, $infile);
-    my @in = <IN>;
-    close(IN);
-    open (RESULT, $outfile);
+    open my $RESULT, '<', $outfile or die "Could not read file '$outfile': $!\n";
     my $line = 0;
     my $check = 0;
     my $is = 1;
 
-    FILECHECK:
-    while (my $result = <RESULT>) {
+  FILECHECK:
+    while (my $result = <$RESULT>) {
         if ($result =~ /^KEYWORDS/) {
             $check = 1;
             next;
@@ -420,7 +423,6 @@ foreach my $in ('BK000016-tpa.gbk', 'ay116458.gb', 'ay149291.gb', 'NC_006346.gb'
         }
 
         if ($check) {
-
             # end periods don't count (not all input files have them)
             $result =~ s{\.$}{};
             $in[$line] =~ s{\.$}{};
@@ -430,8 +432,11 @@ foreach my $in ('BK000016-tpa.gbk', 'ay116458.gb', 'ay149291.gb', 'NC_006346.gb'
                 last;
             }
         }
-    } continue { $line++ }
-    close(RESULT);
+    }
+    continue {
+        $line++;
+    }
+    close $RESULT;
 
     ok $is, $in;
 }
@@ -444,21 +449,20 @@ $ct = 0;
 
 foreach my $in ('P35527.gb') {
     my $infile =  test_input_file($in);
-    $str = Bio::SeqIO->new(-format =>'genbank',
-                         -verbose => $verbose,
-                         -file => $infile);
+    $str = Bio::SeqIO->new(-format  => 'genbank',
+                           -verbose => $verbose,
+                           -file    => $infile);
     $seq = $str->next_seq;
-    my $ac      = $seq->annotation();      # Bio::AnnotationCollection
-    foreach my $key ($ac->get_all_annotation_keys() ) {
+
+    my $ac = $seq->annotation;      # Bio::AnnotationCollection
+    foreach my $key ($ac->get_all_annotation_keys ) {
         my @values = $ac->get_Annotations($key);
         foreach my $ann (@values) {
             my $value = $ann->display_text;
             $ct++;
             if ($key eq 'dblink') {
-
                 ok (index($value,'::') < 0);   # this should never be true
-
-                ok ($value, $value);   # check value is not empty
+                ok ($value, $value);           # check value is not empty
 
                 #  print "  ann/", sprintf('%12s  ',$key), '>>>', $value , '<<<', "\n";
                 #  print "        index double colon: ",index($value   ,'::'), "\n";
@@ -468,10 +472,10 @@ foreach my $in ('P35527.gb') {
                 if ( $parts[0] =~ /^(?:
                         #  not an exhaustive list of databases;
                         #  just the db's referenced in P35527.gb:
-                        swissprot | GenBank | GenPept  | HSSP| IntAct | Ensembl | KEGG | HGNC | MIM | ArrayExpress
-                                  | GO      | InterPro | Pfam| PRINTS | PROSITE
-                                     )$/x )
-                {
+                          swissprot | GenBank | GenPept      | HSSP | IntAct   | Ensembl | KEGG
+                        | HGNC      | MIM     | ArrayExpress | GO   | InterPro | Pfam    | PRINTS
+                        | PROSITE    )$/x
+                ) {
                     ok 1;
                 }
                 else {
@@ -479,7 +483,6 @@ foreach my $in ('P35527.gb') {
                 }
                     ok ( $parts[1], "$parts[0]" );
             }
-
         }
     }
 }
@@ -488,66 +491,63 @@ is($ct, 46);
 
 # bug 2195
 
-$str = Bio::SeqIO->new(-format =>'genbank',
-                      -verbose => $verbose,
-                      -file => test_input_file('AF305198.gb')
+$str = Bio::SeqIO->new(-format  => 'genbank',
+                       -verbose => $verbose,
+                       -file    => test_input_file('AF305198.gb')
                      );
 
 $species = $str->next_seq->species;
 
 is($species->scientific_name, 'Virginia creeper phytoplasma', 'Bug 2195');
-is(join(', ',$species->classification), 'Virginia creeper phytoplasma, '.
-   '16SrV (Elm yellows group), Candidatus Phytoplasma, '.
-   'Acholeplasmataceae, Acholeplasmatales, Mollicutes, '.
-   'Firmicutes, Bacteria', 'Bug 2195');
+is(join(', ',$species->classification),
+     'Virginia creeper phytoplasma, 16SrV (Elm yellows group), '
+   . 'Candidatus Phytoplasma, Acholeplasmataceae, Acholeplasmatales, '
+   . 'Mollicutes, Firmicutes, Bacteria',
+   'Bug 2195');
 
 # bug 2569, PROJECT line support, read and write, round-tripping
 
-$str = Bio::SeqIO->new(-format =>'genbank',
-                      -verbose => $verbose,
-                      -file => test_input_file('NC_008536.gb'));
-
+$str = Bio::SeqIO->new(-format  => 'genbank',
+                       -verbose => $verbose,
+                       -file    => test_input_file('NC_008536.gb'));
 $seq = $str->next_seq;
 
 my $project = ($seq->annotation->get_Annotations('project'))[0];
-
 isa_ok($project, 'Bio::Annotation::SimpleValue');
 
 if ($project) {
-	is($project->value, 'GenomeProject:12638');
-} else {
-	ok(0, "PROJECT not parsed");
+    is($project->value, 'GenomeProject:12638');
+}
+else {
+    ok(0, "PROJECT not parsed");
 }
 
-$outfile = test_output_file();
-
-$gb = Bio::SeqIO->new(-format => 'genbank',
-                              -verbose => $verbose,
-                       -file=> ">$outfile");
-
-$gb->write_seq($seq);
-
-$str = Bio::SeqIO->new(-format =>'genbank',
+$outfile = test_output_file;
+$gb = Bio::SeqIO->new(-format  => 'genbank',
                       -verbose => $verbose,
-                      -file => $outfile);
+                      -file    => ">$outfile");
+$gb->write_seq($seq);
 
+$str = Bio::SeqIO->new(-format  => 'genbank',
+                       -verbose => $verbose,
+                       -file    => $outfile);
 $seq = $str->next_seq;
 
 $project = ($seq->annotation->get_Annotations('project'))[0];
-
 isa_ok($project, 'Bio::Annotation::SimpleValue');
 
 if ($project) {
-	is($project->value, 'GenomeProject:12638');
-} else {
-	ok(0, "Roundtrip test failed");
+    is($project->value, 'GenomeProject:12638');
+}
+else {
+    ok(0, "Roundtrip test failed");
 }
 
 # test for swissprot/UniProt/UniProtKB DBSOURCE line (Bug : RT 44536)
-$ast = Bio::SeqIO->new(-format => 'genbank',
-                              -verbose => $verbose,
-                       -file => test_input_file('P39765.gb'));
-$as = $ast->next_seq();
+$ast = Bio::SeqIO->new(-format  => 'genbank',
+                       -verbose => $verbose,
+                       -file    => test_input_file('P39765.gb'));
+$as = $ast->next_seq;
 is $as->molecule, 'PRT',$as->accession_number;
 is $as->division, 'BCT',$as->accession_number;
 is join(',',$as->get_dates), '03-MAR-2009',$as->accession_number;
@@ -571,40 +571,39 @@ is($dblinks[0]->display_text, 'UniProtKB:PYRR_BACSU','operator overloading in An
 
 #bug 2982 embl/genbank contig handling
 
-$ast = Bio::SeqIO->new( -file => test_input_file('bug2982.gb'),
-			-format => 'genbank' );
-
+$ast = Bio::SeqIO->new( -file   => test_input_file('bug2982.gb'),
+                        -format => 'genbank' );
 $seq = $ast->next_seq;
 
 ok my @ctg = $seq->annotation->get_Annotations('contig');
 like $ctg[0]->value, qr/join\(.*?gap.*?complement/;
 
 # write_seq() and FTHelper duplicate specific tags, need to check a round-trip
-$ast = Bio::SeqIO->new(-format => 'genbank' ,
+$ast = Bio::SeqIO->new(-format  => 'genbank' ,
                        -verbose => $verbose,
-                       -file => test_input_file('singlescore.gbk'));
-$as = $ast->next_seq();
-($cds) = grep { $_->primary_tag eq 'CDS' } $as->get_SeqFeatures();
+                       -file    => test_input_file('singlescore.gbk'));
+$as = $ast->next_seq;
+($cds) = grep { $_->primary_tag eq 'CDS' } $as->get_SeqFeatures;
 my @notes = $cds->get_tag_values('note');
 is(scalar @notes, 2);
-$testfile = test_output_file();
-$out = Bio::SeqIO->new(-file => ">$testfile",
+$testfile = test_output_file;
+$out = Bio::SeqIO->new(-file   => ">$testfile",
                        -format => 'genbank');
 $out->write_seq($as);
-$out->close();
-$ast = Bio::SeqIO->new(-format => 'genbank' ,
+$out->close;
+$ast = Bio::SeqIO->new(-format  => 'genbank' ,
                        -verbose => $verbose,
-                       -file => $testfile );
+                       -file    => $testfile );
 $as = $ast->next_seq;
-($cds) = grep { $_->primary_tag eq 'CDS' } $as->get_SeqFeatures();
+($cds) = grep { $_->primary_tag eq 'CDS' } $as->get_SeqFeatures;
 @notes = $cds->get_tag_values('note');
 is(scalar @notes, 2);
 
 
 #bug 3375
 my $in = Bio::SeqIO->new(-format => 'genbank',
-                        -file => test_input_file('NC_002058_multDBLINK_bug3375.gb'));
-$seq = $in->next_seq();     # should not throw a warning now
+                         -file   => test_input_file('NC_002058_multDBLINK_bug3375.gb'));
+$seq = $in->next_seq;     # should not throw a warning now
 @dblinks = $seq->annotation->get_Annotations('dblink');    # contains 5 dblink references
 # testing DBLINK      BioProject: PRJNA15288
 is($dblinks[0]->database, 'BioProject', 'bug3375 database is BioProject');
@@ -620,33 +619,34 @@ is($dblinks[4]->version, '3');
 # long labels handled
 {
     # Create sequence with feature with a long label qualifier
-    my $seq=Bio::Seq->new(-seq  => 'actg',
-                          -id   => 'abacab');
+    my $seq=Bio::Seq->new(-seq => 'actg',
+                          -id  => 'abacab');
     my $feature=Bio::SeqFeature::Generic->new(-primary=>'CDS', -start=>1, -end=>4);
     my $label='1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r';
-    $feature->add_tag_value(label=>$label);
+    $feature->add_tag_value(label => $label);
     $seq->add_SeqFeature($feature);
 
     # Write genbank
     my $string;
-    open(my $str_fh, '>', \$string) || skip("Can't open string, skipping", 2);
-    my $out=Bio::SeqIO->new(-format=>'genbank', -fh => $str_fh);
+    open my $str_fh, '>', \$string or skip("Could not write string, skipping", 2);
+    my $out = Bio::SeqIO->new(-format => 'genbank',
+                              -fh     => $str_fh);
     $out->write_seq($seq);
 
     # Read genbank
-    my $in=Bio::SeqIO->new(-format=>'genbank', -string => $string);
-    my $genbank=$in->next_seq;
-    my ($read_feature)=$genbank->get_SeqFeatures;
-    my ($read_label)=$read_feature->get_tag_values('label');
+    my $in = Bio::SeqIO->new(-format => 'genbank',
+                             -string => $string);
+    my $genbank = $in->next_seq;
+    my ($read_feature) = $genbank->get_SeqFeatures;
+    my ($read_label) = $read_feature->get_tag_values('label');
     is($read_label, $label, 'Label is the same');
 }
 
 # bug 3448
-
-$in = Bio::SeqIO->new(-format => 'genbank',
-        -file => test_input_file('YP_007988852.gp'),
-        -verbose => $verbose);
-$seq = $in->next_seq();     # should not throw a warning now
+$in = Bio::SeqIO->new(-format  => 'genbank',
+                      -file    => test_input_file('YP_007988852.gp'),
+                      -verbose => $verbose);
+$seq = $in->next_seq;     # should not throw a warning now
 is($seq->length, 205);
 
 my @anns = $seq->annotation->get_Annotations('contig');
@@ -654,6 +654,7 @@ is(@anns, 1);
 isa_ok($anns[0], 'Bio::Annotation::SimpleValue');
 is($anns[0]->value, 'join(WP_015639704.1:1..205)');
 
-is($seq->seq, 'MENRKFGYIRVSSKDQNEGRQLEAMRKIGITERDIYLDKQSGKNFERANYQLLKRIIRKGDI'.
-   'LYIHSLDRFGRNKEEILQEWNDLTKNIEADIVVLDMPLLDTTQYKDSMGTFIADLVLQILSWMAEEERERIRK'.
-   'RQREGIDLALQNGIQFGRSPVVVSDEFKEVYRKWKAKELTAVEAMQEAGVKKTSFYKLVKAHENSIKVNS');
+is($seq->seq, 'MENRKFGYIRVSSKDQNEGRQLEAMRKIGITERDIYLDKQSGKNFERANYQLLKRIIRKGDI'
+            . 'LYIHSLDRFGRNKEEILQEWNDLTKNIEADIVVLDMPLLDTTQYKDSMGTFIADLVLQILSWMAEEERERIRK'
+            . 'RQREGIDLALQNGIQFGRSPVVVSDEFKEVYRKWKAKELTAVEAMQEAGVKKTSFYKLVKAHENSIKVNS');
+
@@ -34,7 +34,7 @@ is $pseq->display_id(), 'HSBA536C5';
 is $pseq->accession_number(), 'unknown';
 is $pseq->desc, 'this is my description';
 
-is open(OUT, ">$tmpfile"), 1;
+is open(OUT, '>', $tmpfile), 1;
 
 my $seqout = Bio::SeqIO->new('-format' => 'largefasta',
                              '-fh'     => \*OUT );
@@ -456,10 +456,10 @@ END
         $gzip = "| gzip";
     }
     else { $gzip = ' '; }
-    open OUT, "$gzip >$destination" or croak("Unable to open $destination\n");
+    open my $OUT, "$gzip >$destination" or croak "Could not write file '$destination': $!\n";
 
-    print OUT $out;
-    close OUT;
+    print $OUT $out;
+    close $OUT;
 }
 
 sub print_file2 {
@@ -521,10 +521,10 @@ END
     }
     else { $gzip = ' '; }
 
-    open OUT, "$gzip >$destination" or croak("Unable to open $destination\n");
+    open my $OUT, "$gzip >$destination" or croak "Could not write file '$destination': $!\n";
 
-    print OUT $out;
-    close OUT;
+    print $OUT $out;
+    close $OUT;
 }
 
 sub print_file3 {
@@ -548,23 +548,20 @@ END
     }
     else { $gzip = ' '; }
 
-    open OUT, "$gzip >$destination" or croak("Unable to open $destination\n");
+    open my $OUT, "$gzip >$destination" or croak "Could not write file '$destination': $!\n";
 
-    print OUT $out;
-    close OUT;
+    print $OUT $out;
+    close $OUT;
 }
 
 sub print_to_file {
     my ( $ra_in, $out ) = @_;
-    unless ( open OUT, ">$out" ) {
-        croak("\nCould not open outfile $out!!\n\n");
-    }
-    print OUT ("@$ra_in");
-    close OUT;
+    open my $OUT, '>', $out or croak "\nCould not write outfile '$out': $!\n";
+    print $OUT ("@$ra_in");
+    close $OUT;
 }
 
 sub convert_bases_to_nums {
-
     my ( $rh_base_conversion_table, @seqs ) = @_;
 
     my @out_seqstrings;
@@ -575,7 +572,5 @@ sub convert_bases_to_nums {
         }
         push @out_seqstrings, $seqstring;
     }
-
     return @out_seqstrings;
-
 }
@@ -519,11 +519,9 @@ sub test_file_3 {
 
 sub print_to_file {
     my ( $ra_in, $out ) = @_;
-    unless ( open OUT, ">$out" ) {
-        die "\nCould not open outfile $out!!\n\n";
-    }
-    print OUT ("@$ra_in");
-    close OUT;
+    open my $OUT, '>', $out or die "\nCould not write outfile '$out': $!\n";
+    print $OUT ("@$ra_in");
+    close $OUT;
 }
 
 sub convert_bases_to_nums {
@@ -76,8 +76,10 @@ SKIP: {
 	my ($file, $type) = ("test.$format", $format);
     my $filename = test_input_file($file);
     print "processing file $filename\n" if $verbose;
-    open(FILE, "< $filename") or die("cannot open $filename");
-    my @datain = <FILE>;
+    open my $FILE, '<', $filename or die "Could not read file '$filename': $!\n";
+    my @datain = <$FILE>;
+    close $FILE;
+
     my $in = IO::String->new(join('', @datain));
     my $seqin = Bio::SeqIO->new( -fh => $in,
                 -format => $type);
@@ -147,4 +149,3 @@ is($seqio_obj->variant, 'single');
 
 $seq = $seqio_obj->next_seq;
 is($seq->seq, join('', @seq));
-
@@ -6,9 +6,10 @@ use strict;
 BEGIN {
     use lib '.';
     use Bio::Root::Test;
-    
-    test_begin(-tests => 247);
-	
+
+    test_begin(-tests           => 247,
+               -requires_module => 'Data::Stag');
+
     use_ok('Bio::SeqIO::swiss');
 }
 
@@ -472,7 +473,7 @@ lives_ok {$seqout->write_seq($seq)};
 
 $seqout->close;
 
-open(my $swissfh, '<', $outfile) || die "Can't open $outfile: $!";
+open my $swissfh, '<', $outfile or die "Could not read file '$outfile': $!\n";
 
 my $seen_gn;
 while (<$swissfh>) {
@@ -481,7 +482,6 @@ while (<$swissfh>) {
         last
     }
 }
-
 close $swissfh;
 
 is $seen_gn, 'bar';
@@ -3,24 +3,24 @@
 
 use strict;
 
-BEGIN { 
+BEGIN {
     use lib '.';
     use Bio::Root::Test;
-    
+
     test_begin(-tests => 16,
-			   -requires_modules => [qw(XML::Parser::PerlSAX XML::Writer)]);
-	
-	use_ok('Bio::SeqIO::tinyseq');
+               -requires_modules => [qw(XML::Parser::PerlSAX XML::Writer)]);
+
+    use_ok('Bio::SeqIO::tinyseq');
 }
 
-my $file = test_input_file('test.tseq');
+my $file    = test_input_file('test.tseq');
 my $outfile = test_output_file();
 
-my $instream = Bio::SeqIO->new( -file 		=> $file,
-				-format		=> 'tinyseq' );
+my $instream = Bio::SeqIO->new( -file    => $file,
+                                -format  => 'tinyseq' );
 
-my $outstream = Bio::SeqIO->new( -file		=> ">$outfile",
-				 -format	=> 'tinyseq' );
+my $outstream = Bio::SeqIO->new( -file   => ">$outfile",
+                                 -format => 'tinyseq' );
 
 my $seq = $instream->next_seq;
 ok(defined $seq);
@@ -29,14 +29,14 @@ is($seq->length, 5830);
 is($seq->accession_number,'NM_002253');
 ok($seq->species);
 is($seq->species->binomial, 'Homo sapiens');
-is($seq->species->ncbi_taxid, 9606);   
+is($seq->species->ncbi_taxid, 9606);
 $outstream->write_seq($seq);
 undef $outstream;
 
 ok(-s $outfile);
 
-my $reread = Bio::SeqIO->new( -file 		=> $outfile,
-			      -format		=> 'tinyseq' );
+my $reread = Bio::SeqIO->new( -file   => $outfile,
+                              -format => 'tinyseq' );
 
 my $seq2 = $reread->next_seq;
 
@@ -46,4 +46,4 @@ is($seq2->length, 5830);
 is($seq2->accession_number, 'NM_002253');
 ok($seq2->species);
 is($seq2->species->binomial, 'Homo sapiens');
-is($seq2->species->ncbi_taxid, 9606);   
+is($seq2->species->ncbi_taxid, 9606);
@@ -1,129 +1,132 @@
 # -*-Perl-*- Test Harness script for Bioperl
 # $Id$
 
-
 use strict;
 
 BEGIN {
-   use lib '.';
-   use Bio::Root::Test;
+    use lib '.';
+    use Bio::Root::Test;
    
-   test_begin(-tests => 52);
+    test_begin(-tests => 105);
    
-   use_ok('Bio::SeqIO');
-   use_ok('Bio::AlignIO');
-   use_ok('Bio::Tools::GuessSeqFormat');
+    use_ok 'Bio::Tools::GuessSeqFormat';
+    use_ok 'Bio::SeqIO';
+    use_ok 'Bio::AlignIO';
 }
 
-my @seqformats = qw{ ace embl fasta fastq gcg genbank mase
-                        pfam pir raw swiss tab game};
 
-my $format;
-my $verbose = test_debug();
+ok my $guesser = Bio::Tools::GuessSeqFormat->new;
+isa_ok $guesser, 'Bio::Tools::GuessSeqFormat';
+
+
 #
-# Seqio formats
+# Test guesser interfaces
 #
 
-#not tested:  waba
-
-my %no_seqio_module = map {$_=>1} qw {gcgblast gcgfasta mase pfam};
-
-my $guessed_format = Bio::Tools::GuessSeqFormat->new
-        (-file => test_input_file('test.waba'))->guess;
-is $guessed_format, undef ;
-
-my $seq;
-
-eval {
-   my $input = Bio::SeqIO->new
-       (-file=>test_input_file('test.waba'));
-   $seq = $input->next_seq();
-};
-
-ok !$seq;
-
-$@ ? ok 1 : ok 0;
-
-foreach $format (@seqformats) {
-   SKIP: {
-      if ($format eq 'game') {
-         test_skip(-tests => 2, -requires_modules => [qw(XML::Writer XML::Parser::PerlSAX)]);
-      }
-      
-      my $guessed_format = Bio::Tools::GuessSeqFormat->new
-          (-file => test_input_file("test.$format"),
-           #-verbose=> $verbose;
-          )->guess;
-      $format =~ s/\..*$//;
-      is $guessed_format, $format, "Guessed:$format";
-      next if $no_seqio_module{$format};
-     
-      eval {
-          my $input = Bio::SeqIO->new
-              (-file=>test_input_file("test.$format"));
-          $seq = $input->next_seq();
-      };
-      
-      my $implemented = $format eq 'ace' ? 'Bio::PrimarySeqI' : 'Bio::SeqI';
-      
-      isa_ok $seq, $implemented;
-      
-      is 0, 1, $@ if $@;
-   }
+# 1/ File guess
+ok $guesser = Bio::Tools::GuessSeqFormat->new(
+    -file => test_input_file('test.fasta'),
+), 'File input';
+is $guesser->guess, 'fasta';
+
+# 2/ String guess
+my $string = ">test1 no comment
+agtgctagctagctagctagct
+>test2 no comment
+gtagttatgc
+";
+ok $guesser = Bio::Tools::GuessSeqFormat->new(
+    -text => $string,
+), 'String input';
+is $guesser->guess, 'fasta';
+
+# 3/ Filehandle guess
+SKIP: {
+    test_skip(-tests => 2, -requires_modules => [qw(IO::String)]);
+    require IO::String;
+    my $fh = IO::String->new($string);
+    ok $guesser = Bio::Tools::GuessSeqFormat->new(
+        -fh => $fh,
+    ), 'Filehandle input';
+    is $guesser->guess, 'fasta';
 }
 
+
 #
-# AlignIO formats
+# Test behavior with unknown format
 #
 
-@seqformats = qw{ aln:clustalw fasta fastq mase msf nexus pfam phylip
-                  prodom stockholm}; # not selex (same as pfam, mainly)
+is $guesser = Bio::Tools::GuessSeqFormat->new(
+    -file => test_input_file('test.waba'), # Bio::SearchIO::waba
+)->guess, undef, 'Unknown file format';
 
-my %no_alignio_module = map {$_=>1} qw { fastq };
+throws_ok {
+    Bio::SeqIO->new( -file=>test_input_file('test.waba') );
+} qr/Could not guess format/;
 
-foreach my $ext (@seqformats) {
-    my $format;
-    ($ext, $format) = split /:/, $ext;
-    my $guesser = Bio::Tools::GuessSeqFormat->new
-        (-file => test_input_file("testaln.$ext"));
-    $format ||= $ext;
-    ok $guesser->guess(), $format;
 
-    next if $no_alignio_module{$format};
+#
+# Test SeqIO formats
+#
 
-    eval {
-        my $input = Bio::AlignIO->new
-            (-file=>test_input_file("testaln.$ext"));
-        $seq = $input->next_aln();
-    };
-    
-    isa_ok $seq, 'Bio::Align::AlignI';
-    #ok 0, 1, $@ if $@;
+my @fmts = qw{ace embl fasta fastq game gcg genbank pir raw swiss tab};
+
+for my $fmt (@fmts) {
+    SKIP: {
+        test_skip(
+            -tests => 4,
+            -requires_modules => [qw(XML::Writer XML::Parser::PerlSAX)]
+        ) if $fmt eq 'game';
+        test_skip(
+            -tests => 4,
+            -requires_module  => 'Data::Stag'
+        ) if $fmt eq 'swiss';
+
+        my $guess = Bio::Tools::GuessSeqFormat->new(
+            -file => test_input_file("test.$fmt"),
+        )->guess;
+        is $guess, $fmt, "$fmt format";
+
+        ok my $input = Bio::SeqIO->new( -file=>test_input_file("test.$fmt") );
+        ok my $seq = $input->next_seq();
+        isa_ok $seq, 'Bio::PrimarySeqI';
+    }
 }
 
 
 #
-# File handle tests
+# Test AlignIO formats
 #
-SKIP: {
-   test_skip(-tests => 3, -requires_modules => [qw(IO::String)]);
 
-    my $string = ">test1 no comment
-agtgctagctagctagctagct
->test2 no comment
-gtagttatgc
-";
+@fmts = qw{clustalw fasta fastq mase mega msf nexus pfam phylip prodom selex stockholm};
+my %skip_module = map {$_=>1} qw{ fastq };
+
+for my $fmt (@fmts) {
+    my $guess = Bio::Tools::GuessSeqFormat->new(
+        -file => test_input_file("testaln.$fmt")
+    )->guess;
+    is $guess, $fmt, "$fmt format";
+    next if $skip_module{$fmt};
+
+    ok my $input = Bio::AlignIO->new( -file=>test_input_file("testaln.$fmt") );
+    ok my $seq = $input->next_aln();
+    isa_ok $seq, 'Bio::Align::AlignI';
+}
+
 
-    my $stringfh = new IO::String($string);
-    
-    my $seqio = Bio::SeqIO->new(-fh => $stringfh);
-    while( my $seq = $seqio->next_seq ) {
-	ok $seq->id =~ /test/;
-    }
-    
 #
-# text guessing
+# Other formats
 #
 
-    ok new Bio::Tools::GuessSeqFormat( -text => $string )->guess, 'fasta';
+my %fmts = (
+   blast    => test_input_file('blastp2215.blast'),
+   gcgblast => test_input_file('test.gcgblast'),
+   vcf      => test_input_file('example.vcf'),
+);
+
+while (my ($fmt, $file) = each %fmts) {
+    my $guess = Bio::Tools::GuessSeqFormat->new(
+        -file => $file,
+    )->guess;
+    is $guess, $fmt, "$fmt format";
 }
@@ -584,79 +584,74 @@ my ($fragment_feat_lig) = grep ($_->primary_tag eq 'frag_feat1', $product->get_S
 ok( $fragment_feat_lig, 'the fragment feature1 is now a feature of the product');
 is_deeply( [$fragment_feat_lig->start, $fragment_feat_lig->end], [17,19], 'start and end of a feature on the fragment are correct after insertion with "flip" option');
 
-
-SKIP: {
-    skip("Storable::dclone not supported yet for Bio::SeqUtils, see ", 9) if $Bio::Root::Root::CLONE_CLASS eq 'Storable';
-
-    # test clone_obj option (create new objects via clone not 'new')
-    my $foo_seq_obj = Bio::Seq::Foo->new(
-      -seq =>'aaaaaaaaaaccccccccccggggggggggtttttttttt',
-      -display_id => 'seq1',
-      -desc       => 'some sequence for testing'
-    );
-    for ($composite_feat1, $feature1, $feature2, $feature3, $feature4, $feature5) {
-        $foo_seq_obj->add_SeqFeature( $_ );
-    }
-    $foo_seq_obj->annotation($coll);
-
-    dies_ok(
-      sub {
-        $product = Bio::SeqUtils->delete( $foo_seq_obj, 11, 20, { clone_obj => 0} );
-      },
-      "Trying to delete from an object of a custom Bio::Seq subclass that doesn't allow calling 'new' throws an error"
-    );
-
-    lives_ok(
-      sub {
-        $product = Bio::SeqUtils->delete( $foo_seq_obj, 11, 20, { clone_obj => 1} );
-      },
-      "Deleting from Bio::Seq::Foo does not throw an error when using the 'clone_obj' option to clone instead of calling 'new'"
-    );
-
-    isa_ok( $product, 'Bio::Seq::Foo');
-
-    # just repeat some of the tests for the cloned feature
-    ok(
-      grep ($_ eq 'deletion of 10bp',
-        map ($_->get_tag_values('note'),
-          grep ($_->primary_tag eq 'misc_feature', $product->get_SeqFeatures)
-        )
-      ),
-      "the product has an additional 'misc_feature' and the note specifies the lengths of the deletion'"
-    );
-    ($composite_feat1_del) = grep ($_->primary_tag eq 'comp_feat1', $product->get_SeqFeatures);
-    ok ($composite_feat1_del, "The composite feature is still present");
-    isa_ok( $composite_feat1_del, 'Bio::SeqFeature::Generic');
-    isa_ok( $composite_feat1_del->location, 'Bio::Location::Split', "a composite feature that spanned the deletion site has been split up, Location");
-
-    # ligate with clone_obj
-    dies_ok(
-      sub {
-        $product = Bio::SeqUtils->ligate(
-          -recipient => $foo_seq_obj,
-          -fragment  => $fragment_obj,
-          -left      => 10,
-          -right     => 31,
-          -flip      => 1
-        );
-      },
-      "'ligate' without clone_obj option dies with a Bio::Seq::Foo object that can't call new"
-    );
-
-    lives_ok(
-      sub {
-        $product = Bio::SeqUtils->ligate(
-          -recipient => $foo_seq_obj,
-          -fragment  => $fragment_obj,
-          -left      => 10,
-          -right     => 31,
-          -flip      => 1,
-          -clone_obj => 1,
-        );
-      },
-      "'ligate' with clone_obj option works with a Bio::Seq::Foo object that can't call new"
-    );
+# test clone_obj option (create new objects via clone not 'new')
+my $foo_seq_obj = Bio::Seq::Foo->new( 
+  -seq =>'aaaaaaaaaaccccccccccggggggggggtttttttttt',
+  -display_id => 'seq1',
+  -desc       => 'some sequence for testing'
+);
+for ($composite_feat1, $feature1, $feature2, $feature3, $feature4, $feature5) {
+    $foo_seq_obj->add_SeqFeature( $_ );
 }
+$foo_seq_obj->annotation($coll);
+
+dies_ok(
+  sub {
+    $product = Bio::SeqUtils->delete( $foo_seq_obj, 11, 20, { clone_obj => 0} );
+  },
+  "Trying to delete from an object of a custom Bio::Seq subclass that doesn't allow calling 'new' throws an error"
+);
+
+lives_ok(
+  sub {
+    $product = Bio::SeqUtils->delete( $foo_seq_obj, 11, 20, { clone_obj => 1} );
+  },
+  "Deleting from Bio::Seq::Foo does not throw an error when using the 'clone_obj' option to clone instead of calling 'new'"
+);
+
+isa_ok( $product, 'Bio::Seq::Foo');
+
+# just repeat some of the tests for the cloned feature
+ok( 
+  grep ($_ eq 'deletion of 10bp', 
+    map ($_->get_tag_values('note'), 
+      grep ($_->primary_tag eq 'misc_feature', $product->get_SeqFeatures)
+    )
+  ),
+  "the product has an additional 'misc_feature' and the note specifies the lengths of the deletion'"
+);
+($composite_feat1_del) = grep ($_->primary_tag eq 'comp_feat1', $product->get_SeqFeatures);
+ok ($composite_feat1_del, "The composite feature is still present");
+isa_ok( $composite_feat1_del, 'Bio::SeqFeature::Generic');
+isa_ok( $composite_feat1_del->location, 'Bio::Location::Split', "a composite feature that spanned the deletion site has been split up, Location");
+
+# ligate with clone_obj
+dies_ok(
+  sub {
+    $product = Bio::SeqUtils->ligate( 
+      -recipient => $foo_seq_obj, 
+      -fragment  => $fragment_obj, 
+      -left      => 10, 
+      -right     => 31,
+      -flip      => 1
+    ); 
+  },
+  "'ligate' without clone_obj option dies with a Bio::Seq::Foo object that can't call new"
+);
+
+lives_ok(
+  sub {
+    $product = Bio::SeqUtils->ligate( 
+      -recipient => $foo_seq_obj, 
+      -fragment  => $fragment_obj, 
+      -left      => 10, 
+      -right     => 31,
+      -flip      => 1,
+      -clone_obj => 1,
+    ); 
+  },
+  "'ligate' with clone_obj option works with a Bio::Seq::Foo object that can't call new"
+);
 
 sub uniq_sort {
     my @args = @_;
@@ -1,5 +1,4 @@
 # -*-Perl-*- Test Harness script for Bioperl
-# $Id$
 
 use strict;
 my $WEAKEN;
@@ -81,4 +80,3 @@ SKIP: {
       }
     ));
 }
-
@@ -14,8 +14,7 @@ BEGIN {
     use lib '.';
 	use Bio::Root::Test;
 	
-	test_begin(-tests => 15,
-			   -excludes_os => 'mswin');
+	test_begin(-tests => 15);
     
 	use_ok('Bio::Tools::Alignment::Consed');
 }
@@ -5,17 +5,18 @@ use strict;
 
 BEGIN {
     use lib '.';
-	use Bio::Root::Test;
-	
-	test_begin(-tests => 15,
-			   -requires_modules => [qw(IO::String
-									    LWP::UserAgent
-										HTML::HeadParser)],
-			   -requires_networking => 1);
-	
-	use_ok('Bio::Tools::Analysis::Protein::ELM');
-	use_ok('Bio::SeqIO');
-	use_ok('Bio::WebAgent');
+    use Bio::Root::Test;
+
+    test_begin(-tests               => 15,
+               -requires_modules    => [qw(IO::String
+                                           LWP::UserAgent
+                                           HTML::HeadParser
+                                           Data::Stag)],
+               -requires_networking => 1);
+
+    use_ok('Bio::Tools::Analysis::Protein::ELM');
+    use_ok('Bio::SeqIO');
+    use_ok('Bio::WebAgent');
 }
 
 my $verbose = test_debug();
@@ -4,15 +4,17 @@
 use strict;
 
 BEGIN {
-	use lib '.';
+    use lib '.';
     use Bio::Root::Test;
     
-    test_begin(-tests => 14,
-			   -requires_modules => [qw(IO::String LWP::UserAgent)]);
-	
-	use_ok('Bio::Tools::Analysis::Protein::Scansite');
-	use_ok('Bio::SeqIO');
-	use_ok('Bio::WebAgent');
+    test_begin(-tests            => 14,
+               -requires_modules => [qw(IO::String
+                                        LWP::UserAgent
+                                        Data::Stag)]);
+
+    use_ok('Bio::Tools::Analysis::Protein::Scansite');
+    use_ok('Bio::SeqIO');
+    use_ok('Bio::WebAgent');
 }
 
 my $verbose = test_debug();
@@ -44,9 +44,9 @@ is ($sf->feature2->start,1);
 is ($sf->feature2->end,44);
 is ($sf->feature1->end,22396);
 
-open(FH,$inputfilename);
-$parser = Bio::Tools::Genewise->new(-fh=>\*FH);
-while (my $gene= $parser->next_prediction){
+open my $FH, '<', $inputfilename or die "Could not read file '$inputfilename': $!\n";
+$parser = Bio::Tools::Genewise->new(-fh => $FH);
+while (my $gene = $parser->next_prediction){
     push @gene, $gene;
 }
 @t = $gene[0]->transcripts;
@@ -67,4 +67,3 @@ is ($sf->feature2->seq_id,'SINFRUP00000067802');
 is ($sf->feature2->start,1);
 is ($sf->feature2->end,44);
 is ($sf->feature1->end,22396);
-
@@ -34,8 +34,8 @@ is ($e[0]->end, 4874);
 my ($phase) = $e[0]->get_tag_values('phase');
 is ($phase,0);
 
-open(FH,$inputfilename);
-$parser = Bio::Tools::Genomewise->new(-fh=>\*FH);
+open my $FH, '<', $inputfilename or die "Could not read file '$inputfilename': $!\n";
+$parser = Bio::Tools::Genomewise->new(-fh => $FH);
 while (my $gene= $parser->next_prediction){
     push @gene, $gene;
 }
@@ -1,18 +0,0 @@
-# -*-Perl-*- Test Harness script for Bioperl
-# $Id$
-
-use strict;
-
-BEGIN {
-    use lib '.';
-    use Bio::Root::Test;
-
-    test_begin(-tests => 4);
-
-    use_ok('Bio::Tools::GuessSeqFormat');
-}
-
-my $file = 'example.vcf';
-ok (my $guesser = Bio::Tools::GuessSeqFormat->new(-file => test_input_file($file)));
-isa_ok ($guesser, 'Bio::Tools::GuessSeqFormat');
-is ($guesser->guess, 'vcf');
@@ -29,7 +29,7 @@ our $join = ' ';
 
 our @program_commands = qw(
  rpsblast
- cat
+ find
  goob
  blorb
  multiglob
@@ -6,219 +6,225 @@ use strict;
 BEGIN {
     use lib '.';
     use Bio::Root::Test;
-    
-    test_begin(-tests => 21,
-               -requires_modules => [qw(IO::String LWP LWP::UserAgent)],
+
+    test_begin(-tests               => 21,
+               -requires_modules    => [qw(IO::String
+                                           LWP
+                                           LWP::UserAgent)],
                -requires_networking => 1);
-    
+
     use_ok('Bio::Tools::Run::RemoteBlast');
 }
 
-my $prog = 'blastp';
-my $db   = 'swissprot';
-my $e_val= '1e-10';
-my $v = test_debug();
+my $prog  = 'blastp';
+my $db    = 'swissprot';
+my $e_val = '1e-10';
+my $v     = test_debug();
 
 SKIP: {
-    my $remote_blast = Bio::Tools::Run::RemoteBlast->new('-verbose' => $v,
-                                                    '-prog' => $prog,
-                                                    '-data' => $db,
-                                                    '-expect' => $e_val,
-                                    );
+    my $remote_blast
+        = Bio::Tools::Run::RemoteBlast->new(-verbose => $v,
+                                            -prog    => $prog,
+                                            -data    => $db,
+                                            -expect  => $e_val,
+                                            );
     $remote_blast->submit_parameter('ENTREZ_QUERY', 'Escherichia coli[ORGN]');
+
     my $inputfilename = test_input_file('ecolitst.fa');
-    ok( -e $inputfilename); 
-    
+    ok( -e $inputfilename);
     ok(1, 'Text BLAST');
-    
-    my $attempt = 1;
 
+    my $attempt = 1;
     my $status;
     eval{
-    $status = $remote_blast->submit_blast($inputfilename);
+        $status = $remote_blast->submit_blast($inputfilename);
     };
-    
+
     ok($status,'BLAST text output submitted');
+    skip("Error accessing remote BLAST interface: $@", 5) if $@;
 
-    skip("Error accessing remote BLAST interface: $@", 3) if $@;
-    
     cmp_ok($remote_blast->get_rtoe, '>', 0, "Estimated retrieval time");
-    
     diag("Time remaining: ".$remote_blast->get_rtoe) if $v;
-    
+
     my @rids = $remote_blast->each_rid;
     is(@rids, 1, 'should only be one RID');
-    skip("Wrong number of RIDs: ".scalar(@rids), 2) if @rids != 1;
+    skip("Wrong number of RIDs: ".scalar(@rids), 3) if @rids != 1;
 
     diag("Retrieving $rids[0]...\n") if $v;
+    my $max_attempts = 20;
     my $rc;
     while (defined($rc = $remote_blast->retrieve_blast($rids[0]))) {
-    if ( !ref($rc) ) {
-        if ( $rc < 0 ) {
-        skip("need a better solution for when 'Server failed to return any data'",2);
+        if ( !ref($rc) ) {
+            if ( $rc < 0 ) {
+                skip("need a better solution for when 'Server failed to return any data'",3);
+            }
+            sleep 30;
+            diag("Retrieval attempt: $attempt\n") if $v;
+            $attempt++ < $max_attempts ? next : last;
+        }
+        else {
+            last;
         }
-        sleep 5;
-        diag("Retrieval attempt: $attempt\n") if $v;
-        $attempt++ < 10 ? next : last;
-    } else {
-        last
-    }
     }
 
     if ($rc) {
-    ok(1,'retrieve_blast succeeded');
-    $remote_blast->remove_rid($rids[0]);
-    my $count = 0;
-    isa_ok($rc, 'Bio::SearchIO');
-    while (my $result = $rc->next_result) {
-        while ( my $hit = $result->next_hit ) {
-        $count++;
-        next unless ( $v > 0);
-        print "sbjct name is ", $hit->name, "\n";
-        while ( my $hsp = $hit->next_hsp ) {
-            print "score is ", $hsp->bits, "\n";
-        } 
+        ok(1,'retrieve_blast succeeded');
+        $remote_blast->remove_rid($rids[0]);
+        my $count = 0;
+        isa_ok($rc, 'Bio::SearchIO');
+        while (my $result = $rc->next_result) {
+            while ( my $hit = $result->next_hit ) {
+                $count++;
+                next unless ( $v > 0);
+                print "sbjct name is ", $hit->name, "\n";
+                while ( my $hsp = $hit->next_hsp ) {
+                    print "score is ", $hsp->bits, "\n";
+                }
+            }
         }
+        is($count, 3, 'HSPs returned');
+    }
+    elsif ($attempt > $max_attempts) {
+        # have a test fail here (there should not be repeated failed attempts to
+        # get reports)
+        ok(0,'Exceeded maximum attempts on server to retrieve report');
+        diag("Timeout, did not return report after ".($attempt - 1)." attempts");
+        skip('Remote server timeout problems', 2);
     }
-    is($count, 3, 'HSPs returned');
-    } elsif ($attempt > 10) {
-    # have a test fail here (there should not be repeated failed attempts to
-    # get reports)
-    
-    ok(0,'Exceeded maximum attempts on server to retrieve report');
-    diag("Timeout, did not return report after ".($attempt - 1)." attempts");
-    } else {
-    # have a test fail here (whatever is returned should be eval as true and
-    # be a SearchIO)
-    
-    ok(0,"Other problem on remote server, no report returned: $rc");
-    skip('Possible remote server problems', 1);
+    else {
+        # have a test fail here (whatever is returned should be eval as true and
+        # be a SearchIO)
+        ok(0,"Other problem on remote server, no report returned: $rc");
+        skip('Possible remote server problems', 2);
     }
 }
 
 SKIP: {
     # test blasttable
-
-    my $remote_blast = Bio::Tools::Run::RemoteBlast->new
-      ('-verbose'    => $v,
-        '-prog'       => $prog,
-        '-data'       => $db,
-        '-readmethod' => 'blasttable',
-        '-expect'     => $e_val,
-      );
+    my $remote_blast
+        = Bio::Tools::Run::RemoteBlast->new(-verbose    => $v,
+                                            -prog       => $prog,
+                                            -data       => $db,
+                                            -readmethod => 'blasttable',
+                                            -expect     => $e_val,
+                                            );
     $remote_blast->submit_parameter('ENTREZ_QUERY', 'Escherichia coli[ORGN]');
-    
     $remote_blast->retrieve_parameter('ALIGNMENT_VIEW', 'Tabular');
-    
+
     my $inputfilename = test_input_file('ecolitst.fa');
     my $attempt = 1;
 
     my $status;
     eval{
-    $status = $remote_blast->submit_blast($inputfilename);
+        $status = $remote_blast->submit_blast($inputfilename);
     };
-    
+
     ok($status,'Tabular BLAST submitted');
+    skip("Error accessing remote BLAST interface: $@", 5) if $@;
 
-    skip("Error accessing remote BLAST interface: $@", 3) if $@;
-    
     cmp_ok($remote_blast->get_rtoe, '>', 0, "Estimated retrieval time");
     diag("Time remaining: ".$remote_blast->get_rtoe) if $v;
-    
+
     my @rids = $remote_blast->each_rid;
     is(@rids, 1, 'should only be one RID');
-    skip("Wrong number of RIDs: ".scalar(@rids), 2) if @rids != 1;
+    skip("Wrong number of RIDs: ".scalar(@rids), 3) if @rids != 1;
 
     diag("waiting [$rids[0]]...") if $v;
+    my $max_attempts = 20;
     my $rc;
     while (defined($rc = $remote_blast->retrieve_blast($rids[0]))) {
-    if ( !ref($rc) ) {
-        if ( $rc < 0 ) {
-        skip("need a better solution for when 'Server failed to return any data'",2);
+        if ( !ref($rc) ) {
+            if ( $rc < 0 ) {
+                skip("need a better solution for when 'Server failed to return any data'",3);
+            }
+            sleep 30;
+            diag("Retrieval attempt: $attempt") if $v;
+            $attempt++ < $max_attempts ? next : last;
+        }
+        else {
+            last;
         }
-        sleep 5;
-        diag("Retrieval attempt: $attempt") if $v;
-        $attempt++ < 10 ? next : last;
-    } else {
-        last
-    }
     }
 
     if ($rc) {
-    ok(1,'retrieve_blast succeeded');
-    $remote_blast->remove_rid($rids[0]);
-    my $count = 0;
-    isa_ok($rc, 'Bio::SearchIO');
-    while (my $result = $rc->next_result) {
-        while ( my $hit = $result->next_hit ) {
-        $count++;
-        next unless ( $v > 0);
-        print "sbjct name is ", $hit->name, "\n";
-        while ( my $hsp = $hit->next_hsp ) {
-            print "score is ", $hsp->bits, "\n";
-        } 
+        ok(1,'retrieve_blast succeeded');
+        $remote_blast->remove_rid($rids[0]);
+        my $count = 0;
+        isa_ok($rc, 'Bio::SearchIO');
+        while (my $result = $rc->next_result) {
+            while ( my $hit = $result->next_hit ) {
+                $count++;
+                next unless ( $v > 0);
+                print "sbjct name is ", $hit->name, "\n";
+                while ( my $hsp = $hit->next_hsp ) {
+                    print "score is ", $hsp->bits, "\n";
+                }
+            }
         }
+        is($count, 3, 'HSPs returned');
+    }
+    elsif ($attempt > $max_attempts) {
+        # have a test fail here (there should not be repeated failed attempts to
+        # get reports)
+        ok(0,'Exceeded maximum attempts on server to retrieve report');
+        diag("Timeout, did not return report after ".($attempt - 1)." attempts");
+        skip('Remote server timeout problems', 2);
     }
-    is($count, 3, 'HSPs returned');
-    } elsif ($attempt > 10) {
-    # have a test fail here (there should not be repeated failed attempts to
-    # get reports)
-    
-    ok(0,'Exceeded maximum attempts on server to retrieve report');
-    skip("Timeout, did not return report after ".($attempt - 1)." attempts", 1);
-    } else {
-    # have a test fail here (whatever is returned should be eval as true and
-    # be a SearchIO)
-    
-    ok(0,"Other problem on remote server, no report returned: $rc");
-    skip('Possible remote server problems', 1);
+    else {
+        # have a test fail here (whatever is returned should be eval as true and
+        # be a SearchIO)
+        ok(0,"Other problem on remote server, no report returned: $rc");
+        skip('Possible remote server problems', 2);
     }
 }
 
 SKIP: {
-    test_skip(-tests => 5, -requires_module => 'Bio::SearchIO::blastxml');
-   
-    my $remote_blast = Bio::Tools::Run::RemoteBlast->new('-prog' => $prog,
-        '-data'       => $db,
-        '-readmethod' => 'xml',
-        '-expect'     => $e_val,
-    );
-    $remote_blast->submit_parameter('ENTREZ_QUERY', 
+    test_skip(-tests           => 6,
+              -requires_module => 'Bio::SearchIO::blastxml');
+
+    my $remote_blast
+        = Bio::Tools::Run::RemoteBlast->new(-prog       => $prog,
+                                            -data       => $db,
+                                            -readmethod => 'xml',
+                                            -expect     => $e_val,
+                                            );
+    $remote_blast->submit_parameter('ENTREZ_QUERY',
                                     'Escherichia coli[ORGN]');
-    
     $remote_blast->retrieve_parameter('FORMAT_TYPE', 'XML');
-    
+
     my $inputfilename = test_input_file('ecolitst.fa');
     my $attempt = 1;
 
     my $status;
     eval{
-    $status = $remote_blast->submit_blast($inputfilename);
+        $status = $remote_blast->submit_blast($inputfilename);
     };
-    
+
     ok($status,'XML BLAST submitted');
+    skip("Error accessing remote BLAST interface: $@", 5) if $@;
 
-    skip("Error accessing remote BLAST interface: $@", 3) if $@;
-    
     cmp_ok($remote_blast->get_rtoe, '>', 0, "Estimated retrieval time");
     diag("Time remaining: ".$remote_blast->get_rtoe) if $v;
-    
+
     my @rids = $remote_blast->each_rid;
     is(@rids, 1, 'should only be one RID');
-    skip("Wrong number of RIDs: ".scalar(@rids), 2) if @rids != 1;
+    skip("Wrong number of RIDs: ".scalar(@rids), 3) if @rids != 1;
 
     diag("waiting [$rids[0]]...") if $v;
+    # This blast usually takes 2x time compared to the other two
+    my $max_attempts = 30;
     my $rc;
     while (defined($rc = $remote_blast->retrieve_blast($rids[0]))) {
         if ( !ref($rc) ) {
             if ( $rc < 0 ) {
-                skip("need a better solution for when 'Server failed to return any data'",2);
+                skip("need a better solution for when 'Server failed to return any data'",3);
             }
-            sleep 5;
+            sleep 30;
             diag("Retrieval attempt: $attempt") if $v;
-            $attempt++ < 10 ? next : last;
-        } else {
-            last
+            $attempt++ < $max_attempts ? next : last;
+        }
+        else {
+            last;
         }
     }
 
@@ -233,17 +239,18 @@ SKIP: {
             }
         }
         is($count, 3, 'HSPs returned');
-    } elsif ($attempt > 10) {
+    }
+    elsif ($attempt > $max_attempts) {
         # have a test fail here (there should not be repeated failed attempts to
         # get reports)
-
         ok(0,'Exceeded maximum attempts on server to retrieve report');
         diag("Timeout, did not return report after ".($attempt - 1)." attempts");
-    } else {
+        skip('Remote server timeout problems', 2);
+    }
+    else {
         # have a test fail here (whatever is returned should be eval as true and
         # be a SearchIO)
-
         ok(0,"Other problem on remote server, no report returned: $rc");
-        diag('Possible remote server problems');
+        skip('Possible remote server problems', 2);
     }
 }
@@ -1,5 +1,5 @@
 # -*-Perl-*- Test Harness script for Bioperl
-# 	$Id$	
+# $Id$
 
 # malcolm_cook@stowers.org: this test is in a separate file from
 # RemoteBlast.t (on which it is modelled) since there is some sort of
@@ -14,8 +14,10 @@ BEGIN {
     use lib '.';
     use Bio::Root::Test;
 
-    test_begin(-tests => 7,
-               -requires_modules => [qw(IO::String LWP LWP::UserAgent)],
+    test_begin(-tests               => 7,
+               -requires_modules    => [qw(IO::String
+                                           LWP
+                                           LWP::UserAgent)],
                -requires_networking => 1);
 
     use_ok('Bio::Tools::Run::RemoteBlast');
@@ -23,81 +25,81 @@ BEGIN {
 
 my $v = test_debug();
 my $inputfilename = test_input_file('ecolitst.fa');
-ok( -e $inputfilename);	
-
-my $remote_rpsblast = Bio::Tools::Run::RemoteBlast->new
-  ('-verbose'    => test_debug(),
-   '-prog'       => 'blastp',
-   '-data'       => 'cdsearch/cdd',
-   '-readmethod' => 'blasttable',
-   '-expect'     => '1e-10',
-  );
+ok( -e $inputfilename);
 
+my $remote_rpsblast
+    = Bio::Tools::Run::RemoteBlast->new(-verbose    => test_debug(),
+                                        -prog       => 'blastp',
+                                        -data       => 'cdsearch/cdd',
+                                        -readmethod => 'blasttable',
+                                        -expect     => '1e-10',
+                                        );
 $remote_rpsblast->retrieve_parameter('ALIGNMENT_VIEW', 'Tabular');
 
 # This is the key to getting job run using rpsblast:
-$Bio::Tools::Run::RemoteBlast::HEADER{'SERVICE'} = 'rpsblast'; 
+$Bio::Tools::Run::RemoteBlast::HEADER{'SERVICE'} = 'rpsblast';
 
 my $attempt = 1;
 
 SKIP: {
     my $status;
     eval{
-	$status = $remote_rpsblast->submit_blast($inputfilename);
+        $status = $remote_rpsblast->submit_blast($inputfilename);
     };
-    
+
     ok($status,'rpsblast blasttable submitted');
-    
-    skip("Error accessing remote BLAST interface: $@", 3) if $@;
-    
+    skip("Error accessing remote BLAST interface: $@", 4) if $@;
+
     my @rids = $remote_rpsblast->each_rid;
     is(@rids, 1, 'should only be one RID');
-    skip("Wrong number of RIDs: ".scalar(@rids), 2) if @rids != 1;
-    
-    print STDERR "waiting [$rids[0]]..." if( $v > 0 );
+    skip("Wrong number of RIDs: ".scalar(@rids), 3) if @rids != 1;
+
+    diag("Retrieving $rids[0]...\n") if $v;
     my $rc;
     while (defined($rc = $remote_rpsblast->retrieve_blast($rids[0]))) {
-	if ( !ref($rc) ) {
-	    if ( $rc < 0 ) {
-		skip("need a better solution for when 'Server failed to return any data'",2);
-	    }
-	    sleep 5;
-	    print STDERR "Retrieval attempt: $attempt\n" if ( $v > 0 );
-	    $attempt++ < 10 ? next : last;
-	} else {
-	    last
-	}
+        if ( !ref($rc) ) {
+            if ( $rc < 0 ) {
+                skip("need a better solution for when 'Server failed to return any data'",2);
+            }
+            sleep 5;
+            diag("Retrieval attempt: $attempt\n") if $v;
+            $attempt++ < 10 ? next : last;
+        }
+        else {
+            last;
+        }
     }
     $remote_rpsblast->remove_rid($rids[0]);
-    
+
     if ($rc) {
-	ok(1,'retrieve_blast succeeded');
-	$remote_rpsblast->remove_rid($rids[0]);
-	my $count = 0;
-	isa_ok($rc, 'Bio::SearchIO');
-	while (my $result = $rc->next_result) {
-	    while ( my $hit = $result->next_hit ) {
-		$count++;
-		next unless ( $v > 0);
-		print "sbjct name is ", $hit->name, "\n";
-		while ( my $hsp = $hit->next_hsp ) {
-		    print "score is ", $hsp->bits, "\n";
-		} 
-	    }
-	}
-	cmp_ok($count, '>=', 45, 'HSPs returned');
-    } elsif ($attempt > 10) {
-	# have a test fail here (there should not be repeated failed attempts to
-	# get reports)
-	
-	ok(0,'Exceeded maximum attempts on server to retrieve report');
-	skip("Timeout, did not return report after ".($attempt - 1)." attempts", 2);
-    } else {
-	# have a test fail here (whatever is returned should be eval as true and
-	# be a SearchIO)
-	
-	ok(0,"Other problem on remote server, no report returned: $rc");
-	skip('Possible remote server problems', 1);
+        ok(1,'retrieve_blast succeeded');
+        $remote_rpsblast->remove_rid($rids[0]);
+        my $count = 0;
+        isa_ok($rc, 'Bio::SearchIO');
+        while (my $result = $rc->next_result) {
+            while ( my $hit = $result->next_hit ) {
+                $count++;
+                next unless ( $v > 0);
+                print "sbjct name is ", $hit->name, "\n";
+                while ( my $hsp = $hit->next_hsp ) {
+                    print "score is ", $hsp->bits, "\n";
+                }
+            }
+        }
+        cmp_ok($count, '>=', 45, 'HSPs returned');
+    }
+    elsif ($attempt > 10) {
+        # have a test fail here (there should not be repeated failed attempts to
+        # get reports)
+        ok(0,'Exceeded maximum attempts on server to retrieve report');
+        diag("Timeout, did not return report after ".($attempt - 1)." attempts");
+        skip('Remote server timeout problems', 2);
+    }
+    else {
+        # have a test fail here (whatever is returned should be eval as true and
+        # be a SearchIO)
+        ok(0,"Other problem on remote server, no report returned: $rc");
+        skip('Possible remote server problems', 2);
     }
 }
 
@@ -46,7 +46,7 @@ ok !$fac->narf, "parm cleared after reset";
 
 is_deeply( [$fac->available_parameters('parameters')], [qw( command narf schlurb )], "avail parms");
 is_deeply( [$fac->available_parameters('switches')], ['freen'], "avail switches");
-is_deeply( [$fac->available_parameters('commands')], [qw(rpsblast cat goob blorb multiglob)], "avail commands");
+is_deeply( [$fac->available_parameters('commands')], [qw(rpsblast find goob blorb multiglob)], "avail commands");
 
 ok $fac = Dummy->new( -command => 'multiglob',
 		     -g_freen => 1,
@@ -61,6 +61,6 @@ is $facs{blorb}->scroob, 10.5, "subfactory 2 parm correct";
 
 $fac->program_dir('.');
 # ok $fac->executables('rpsblast'), "find in program_dir";
-ok $fac->executables('cat'), "find in syspath";
+ok $fac->executables('find'), "find in syspath";
 
 1;
@@ -49,7 +49,7 @@ my $tmpdir = $obj->tempdir();
 ok -d $tmpdir, 'tempdir created a directory';
 ok open(my $test, '>', File::Spec->catfile($tmpdir, 'test')), 'could create file in tempdir';
 print $test "test\n";
-close($test);
+close $test;
 
 # cleanup
 
@@ -8,7 +8,6 @@ BEGIN {
 
   test_begin(-tests => 70,
 	     -requires_modules => [qw(Bio::PhyloNetwork
-				      Math::Random
 				      Bio::Tree::RandomFactory)]);
 
   use_ok('Bio::PhyloNetwork::RandomFactory');
@@ -7,7 +7,7 @@ BEGIN {
   use lib '.';
   use Bio::Root::Test;
     
-  test_begin(-tests => 49);
+  test_begin(-tests => 51);
 
   use_ok('Bio::TreeIO');
 }
@@ -133,6 +133,12 @@ $tree = $treeio->next_tree;
 ok($tree);
 is($tree->get_nodes, 15);
 
+# initial AMPHORA2 tests
+$treeio = Bio::TreeIO->new(-format => 'newick',
+			   -file=> test_input_file('amphora.newick'));
+$tree = $treeio->next_tree;
+ok($tree);
+is($tree->get_nodes, 5);
 
 test_roundtrip('((a,b),c);','Round trip: simple newick');
 test_roundtrip('(a:1,b:2,c:3,d:4)TEST:1.2345;','Round trip: Root node branch length');
@@ -182,8 +188,10 @@ sub test_roundtrip {
 
 sub read_file {
   my $file = shift;
-  open(IN,"<$file");
-  my (@lines) = <IN>;
+  open my $IN, '<', $file or die "Could not read file '$file': $!\n";
+  my (@lines) = <$IN>;
+  close $IN;
+
   @lines = map {$_ =~ s/\\n//g} @lines;
   return join("",@lines);
 }
@@ -81,10 +81,10 @@ sub read_file {
   my $file = shift;
   local $/=undef;
   my $string;
-  open IN, $file or die ("Couldn't open file [$file]: $!");
-  binmode IN;
-  $string = <IN>;
-  close IN;
+  open my $IN, '<', $file or die "Could not read file '$file': $!\n";
+  binmode $IN;
+  $string = <$IN>;
+  close $IN;
   $string =~ s/\n//g;
   $string =~ s/\r//g; # For files with Windows line-endings
   #print STDERR "STR: $string\n";
@@ -24,10 +24,9 @@ sub io {
     my( $before );
     {
         local $/ = undef;
-        local *BEFORE;
-        open(BEFORE, "$t_name.$o_ext") || die "couldn't open $t_name.$o_ext\n";;
-        $before = <BEFORE>;
-        close BEFORE;
+        open my $BEFORE, '<', "$t_name.$o_ext" or die "Could not read file '$t_name.$o_ext': $!\n";
+        $before = <$BEFORE>;
+        close $BEFORE;
     }
 
     ok $before;#"Error in reading input file [$t_name.$o_ext]";
@@ -52,10 +51,9 @@ sub io {
     my( $after );
     {
         local $/ = undef;
-        local *AFTER;
-        open AFTER, $o_file;
-        $after = <AFTER>;
-        close AFTER;
+        open my $AFTER, '<', $o_file or die "Could not read file '$o_file': $!\n";
+        $after = <$AFTER>;
+        close $AFTER;
     }
 
     ok $after;# "Error in reading in again the output file [$o_file]";
@@ -0,0 +1 @@
+LOCUS       U71225                  1164 bp    DNA     linear   VRT 27-NOV-2001
DEFINITION  Desmognathus quadramaculatus 12S ribosomal RNA gene, partial
            sequence; tRNA-Val gene, complete sequence; and 16S ribosomal RNA
            gene, partial sequence, mitochondrial genes for mitochondrial RNAs.
ACCESSION   U71225
VERSION     U71225.1  GI:2804359
KEYWORDS    .
SOURCE      mitochondrion Desmognathus quadramaculatus (black-bellied
            salamander)
  ORGANISM  Desmognathus quadramaculatus
            Eukaryota; Metazoa; Chordata; Craniata; Vertebrata; Euteleostomi;
            Amphibia; Batrachia; Caudata; Salamandroidea; Plethodontidae;
            Desmognathinae; Desmognathus.
REFERENCE   1  (bases 1 to 1164)
  AUTHORS   Titus,T.A. and Larson,A.
  TITLE     Molecular phylogenetics of Desmognathine salamanders (Caudata:
            Plethodontidae): A reevaluation of evolution in ecology, life
            history, and morphology
  JOURNAL   Syst. Biol. 45, 451-472 (1996)
REFERENCE   2  (bases 1 to 1164)
  AUTHORS   Titus,T.A.
  TITLE     Direct Submission
  JOURNAL   Submitted (19-SEP-1996) Biology, University of Oregon, Eugene, OR
            97403, USA
FEATURES             Location/Qualifiers
     source          1..1164
                     /organism="Desmognathus quadramaculatus"
                     /organelle="mitochondrion"
                     /mol_type="genomic DNA"
                     /db_xref="taxon:52105"
     rRNA            <1..638
                     /product="12S ribosomal RNA"
     tRNA            639..706
                     /product="tRNA-Val"
     rRNA            707..>1164
                     /product="16S ribosomal RNA"
ORIGIN      
        1 ggcccaaagg gtagttttag gtgaaataaa atagaattta aaatttatct agtagttata
       61 tataaacata aaatgtaaaa tcaaaaacga aagtcatact atataacctt gaatctacta
      121 cagctgagaa acaaactagg attagatacc ctactatgct caactttaaa atggaccttc
      181 ccgccagagc actacgagcc acagcttaaa actcaaagga cttggcggtg ctctacaccc
      241 acctagagga gcctgttcta taatcgacac tccccgataa acctcaccac ctcttgctaa
      301 tacagcctat ataccaccgc cctcagttca cccttcaaaa gaataatagt gaacaaaata
      361 atttaaaata aaaaagtcag gtcaaggtgc agcaaatgaa gtggaaagaa atgggctaca
      421 ttttttatag taaaaaatac ggaatattct atgaaataaa atataaagga ggatttagaa
      481 gtaaaaagaa aaaagagtgt tctttttaaa ttggcaatag agcacgcaca caccgcccgt
      541 caccctcttc aaaattaaat aaactaaata aatatataaa tttataagaa aaggtaagtc
      601 gtaacatggt aagtctaccg gaaggtggcc ttggatatcg aagtatagct taaataaagc
      661 attttgctta caccaaaaaa atatttgtta acccaaatta ccttaaattt taaatctatg
      721 ctaaatataa aatactactt cctaatacac aaaacattat tatatgatag tacgggcgac
      781 agaaaactta ttagcgcaat agaaaaagta ctgtaaagga aagatgaaat aaaattgaaa
      841 taaaataaaa atataaaaga gcaaagatta taacttttac ctttagcata atggtctagc
      901 cagtctatat taacataaag aattttagtt atataccccg aaaccaggcg agctacccta
      961 aaacagcaat atatgagcga actcttctct gtggcaaaag agtgagaaga atttttggta
     1021 gaggcgaaaa accaaacgag cccggatata gctggttact tgagaatgaa ttttagttca
     1081 attaaaagca taaatattat aaaaacataa cgcttttatt ataattaatt gaggtacagc
     1141 ccaattaata aaggaaacaa ccta
//
\ No newline at end of file
@@ -0,0 +1 @@
+((REF-YP_004290029-NC_015216:0.23840847960367719804[I116],REF-YP_004520254-NC_015574:0.18701622612251170286[I117]):0.03268127637536134139[I115],REF-YP_447902-NC_007681:0.32812155226299949407[I118])
@@ -0,0 +1,78 @@
+BLASTN 2.2.29+
+
+
+Query= gi|2695846|emb|Y13255.1| Acipenser baeri mRNA for immunoglobulin
+heavy chain, clone ScH 3.3
+
+Length=606
+
+Subject= gi|2695846|emb|Y13255.1| Acipenser baeri mRNA for immunoglobulin
+heavy chain, clone ScH 3.3
+
+Length=606
+
+
+ Score =  1120 bits (606),  Expect = 0.0
+ Identities = 606/606 (100%), Gaps = 0/606 (0%)
+ Strand=Plus/Plus
+
+Query  1    TGGTTACAACACTTTCTTCTTTCAATAACCACAATACTGCAGTACAATGGGGATTTTAAC  60
+            ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+Sbjct  1    TGGTTACAACACTTTCTTCTTTCAATAACCACAATACTGCAGTACAATGGGGATTTTAAC  60
+
+Query  61   AGCTCTCTGTATAATAATGACAGCTCTATCAAGTGTCCGGTCTGATGTAGTGTTGACTGA  120
+            ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+Sbjct  61   AGCTCTCTGTATAATAATGACAGCTCTATCAAGTGTCCGGTCTGATGTAGTGTTGACTGA  120
+
+Query  121  GTCCGGACCAGCAGTTATAAAGCCTGGAGAGTCCCATAAACTGTCCTGTAAAGCCTCTGG  180
+            ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+Sbjct  121  GTCCGGACCAGCAGTTATAAAGCCTGGAGAGTCCCATAAACTGTCCTGTAAAGCCTCTGG  180
+
+Query  181  ATTCACATTCAGCAGCGCCTACATGAGCTGGGTTCGACAAGCTCCTGGAAAGGGTCTGGA  240
+            ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+Sbjct  181  ATTCACATTCAGCAGCGCCTACATGAGCTGGGTTCGACAAGCTCCTGGAAAGGGTCTGGA  240
+
+Query  241  ATGGGTGGCTTATATTTACTCAGGTGGTAGTAGTACATACTATGCCCAGTCTGTCCAGGG  300
+            ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+Sbjct  241  ATGGGTGGCTTATATTTACTCAGGTGGTAGTAGTACATACTATGCCCAGTCTGTCCAGGG  300
+
+Query  301  AAGATTCGCCATCTCCAGAGACGATTCCAACAGCATGCTGTATTTACAAATGAACAGCCT  360
+            ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+Sbjct  301  AAGATTCGCCATCTCCAGAGACGATTCCAACAGCATGCTGTATTTACAAATGAACAGCCT  360
+
+Query  361  GAAGACTGAAGACACTGCCGTGTATTACTGTGCTCGGGGCGGGCTGGGGTGGTCCCTTGA  420
+            ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+Sbjct  361  GAAGACTGAAGACACTGCCGTGTATTACTGTGCTCGGGGCGGGCTGGGGTGGTCCCTTGA  420
+
+Query  421  CTACTGGGGGAAAGGCACAATGATCACCGTAACTTCTGCTACGCCATCACCACCGACAGT  480
+            ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+Sbjct  421  CTACTGGGGGAAAGGCACAATGATCACCGTAACTTCTGCTACGCCATCACCACCGACAGT  480
+
+Query  481  GTTTCCGCTTATGGAGTCATGTTGTTTGAGCGATATCTCGGGTCCTGTTGCTACGGGCTG  540
+            ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+Sbjct  481  GTTTCCGCTTATGGAGTCATGTTGTTTGAGCGATATCTCGGGTCCTGTTGCTACGGGCTG  540
+
+Query  541  CTTAGCAACCGGATTCTGCCTACCCCCGCGACCTTCTCGTGGACTGATCAATCTGGAAAA  600
+            ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+Sbjct  541  CTTAGCAACCGGATTCTGCCTACCCCCGCGACCTTCTCGTGGACTGATCAATCTGGAAAA  600
+
+Query  601  GCTTTT  606
+            ||||||
+Sbjct  601  GCTTTT  606
+
+
+
+Lambda      K        H
+    1.33    0.621     1.12 
+
+Gapped
+Lambda      K        H
+    1.28    0.460    0.850 
+
+Effective search space used: 352836
+
+
+
+
+Matrix: blastn matrix 1 -2
+Gap Penalties: Existence: 0, Extension: 2.5
@@ -0,0 +1,6855 @@
+Entrezgene ::= {
+  track-info {
+    geneid 3581,
+    status live,
+    create-date std {
+      year 1997,
+      month 11,
+      day 18
+    },
+    update-date std {
+      year 2013,
+      month 12,
+      day 8,
+      hour 11,
+      minute 11,
+      second 0
+    }
+  },
+  type protein-coding,
+  source {
+    genome genomic,
+    origin natural,
+    org {
+      taxname "Homo sapiens",
+      common "human",
+      db {
+        {
+          db "taxon",
+          tag id 9606
+        }
+      },
+      syn {
+        "man"
+      },
+      orgname {
+        name binomial {
+          genus "Homo",
+          species "sapiens"
+        },
+        lineage "Eukaryota; Metazoa; Chordata; Craniata; Vertebrata;
+ Euteleostomi; Mammalia; Eutheria; Euarchontoglires; Primates; Haplorrhini;
+ Catarrhini; Hominidae; Homo",
+        gcode 1,
+        mgcode 2,
+        div "PRI",
+        pgcode 0
+      }
+    },
+    subtype {
+      {
+        subtype chromosome,
+        name "X"
+      },
+      {
+        subtype chromosome,
+        name "Y"
+      }
+    }
+  },
+  gene {
+    locus "IL9R",
+    desc "interleukin 9 receptor",
+    maploc "Xq28 and Yq12",
+    db {
+      {
+        db "HGNC",
+        tag id 6030
+      },
+      {
+        db "Ensembl",
+        tag str "ENSG00000124334"
+      },
+      {
+        db "HPRD",
+        tag str "02052"
+      },
+      {
+        db "MIM",
+        tag id 300007
+      },
+      {
+        db "Vega",
+        tag str "OTTHUMG00000022720"
+      }
+    },
+    syn {
+      "CD129",
+      "IL-9R"
+    }
+  },
+  prot {
+    name {
+      "interleukin-9 receptor",
+      "IL-9 receptor"
+    },
+    desc "interleukin-9 receptor"
+  },
+  summary "The protein encoded by this gene is a cytokine receptor that
+ specifically mediates the biological effects of interleukin 9 (IL9). The
+ functional IL9 receptor complex requires this protein as well as the
+ interleukin 2 receptor, gamma (IL2RG), a common gamma subunit shared by the
+ receptors of many different cytokines. The ligand binding of this receptor
+ leads to the activation of various JAK kinases and STAT proteins, which
+ connect to different biologic responses. This gene is located at the
+ pseudoautosomal regions of X and Y chromosomes. Genetic studies suggested an
+ association of this gene with the development of asthma. Multiple pseudogenes
+ on chromosome 9, 10, 16, and 18 have been described. Alternatively spliced
+ transcript variants have been found for this gene. [provided by RefSeq, Jul
+ 2008]",
+  location {
+    {
+      display-str "Xq28 and Yq12",
+      method map-type cyto
+    }
+  },
+  gene-source {
+    src "LocusLink",
+    src-int 3581,
+    src-str2 "3581"
+  },
+  locus {
+    {
+      type genomic,
+      heading "Reference GRCh37.p13 Primary Assembly",
+      label "chromosome Y reference GRCh37.p13 Primary Assembly",
+      accession "NC_000024",
+      version 9,
+      seqs {
+        int {
+          from 59330251,
+          to 59343487,
+          strand plus,
+          id gi 224589823
+        }
+      },
+      products {
+        {
+          type mRNA,
+          heading "Reference",
+          label "transcript variant 2",
+          accession "NM_176786",
+          version 1,
+          genomic-coords {
+            mix {
+              int {
+                from 59330251,
+                to 59330457,
+                strand plus,
+                id gi 224589823
+              },
+              int {
+                from 59334078,
+                to 59334178,
+                strand plus,
+                id gi 224589823
+              },
+              int {
+                from 59335552,
+                to 59335689,
+                strand plus,
+                id gi 224589823
+              },
+              int {
+                from 59336119,
+                to 59336230,
+                strand plus,
+                id gi 224589823
+              },
+              int {
+                from 59336354,
+                to 59336525,
+                strand plus,
+                id gi 224589823
+              },
+              int {
+                from 59337119,
+                to 59337235,
+                strand plus,
+                id gi 224589823
+              },
+              int {
+                from 59337948,
+                to 59338149,
+                strand plus,
+                id gi 224589823
+              },
+              int {
+                from 59338753,
+                to 59338858,
+                strand plus,
+                id gi 224589823
+              },
+              int {
+                from 59342486,
+                to 59343487,
+                strand plus,
+                id gi 224589823
+              }
+            }
+          },
+          seqs {
+            whole gi 29171683
+          },
+          products {
+            {
+              type peptide,
+              heading "Reference",
+              label "isoform 2",
+              accession "NP_789743",
+              version 2,
+              source {
+                {
+                  src {
+                    db "CCDS",
+                    tag str "CCDS59180.1"
+                  },
+                  anchor "CCDS59180.1"
+                }
+              },
+              genomic-coords {
+                mix {
+                  int {
+                    from 59330414,
+                    to 59330457,
+                    strand plus,
+                    id gi 224589823
+                  },
+                  int {
+                    from 59334078,
+                    to 59334178,
+                    strand plus,
+                    id gi 224589823
+                  },
+                  int {
+                    from 59335552,
+                    to 59335689,
+                    strand plus,
+                    id gi 224589823
+                  },
+                  int {
+                    from 59336119,
+                    to 59336230,
+                    strand plus,
+                    id gi 224589823
+                  },
+                  int {
+                    from 59336354,
+                    to 59336525,
+                    strand plus,
+                    id gi 224589823
+                  },
+                  int {
+                    from 59337119,
+                    to 59337235,
+                    strand plus,
+                    id gi 224589823
+                  },
+                  int {
+                    from 59337948,
+                    to 59338149,
+                    strand plus,
+                    id gi 224589823
+                  },
+                  int {
+                    from 59338753,
+                    to 59338858,
+                    strand plus,
+                    id gi 224589823
+                  },
+                  int {
+                    from 59342486,
+                    to 59342522,
+                    strand plus,
+                    id gi 224589823
+                  }
+                }
+              },
+              seqs {
+                whole gi 388490122
+              }
+            }
+          }
+        },
+        {
+          type mRNA,
+          heading "Reference",
+          label "transcript variant 1",
+          accession "NM_002186",
+          version 2,
+          genomic-coords {
+            mix {
+              int {
+                from 59330251,
+                to 59330457,
+                strand plus,
+                id gi 224589823
+              },
+              int {
+                from 59335576,
+                to 59335689,
+                strand plus,
+                id gi 224589823
+              },
+              int {
+                from 59336119,
+                to 59336230,
+                strand plus,
+                id gi 224589823
+              },
+              int {
+                from 59336347,
+                to 59336525,
+                strand plus,
+                id gi 224589823
+              },
+              int {
+                from 59337090,
+                to 59337235,
+                strand plus,
+                id gi 224589823
+              },
+              int {
+                from 59337948,
+                to 59338149,
+                strand plus,
+                id gi 224589823
+              },
+              int {
+                from 59338753,
+                to 59338858,
+                strand plus,
+                id gi 224589823
+              },
+              int {
+                from 59340193,
+                to 59340277,
+                strand plus,
+                id gi 224589823
+              },
+              int {
+                from 59342486,
+                to 59343487,
+                strand plus,
+                id gi 224589823
+              }
+            }
+          },
+          seqs {
+            whole gi 29171681
+          },
+          products {
+            {
+              type peptide,
+              heading "Reference",
+              label "isoform 1 precursor",
+              accession "NP_002177",
+              version 2,
+              source {
+                {
+                  src {
+                    db "CCDS",
+                    tag str "CCDS14771.4"
+                  },
+                  anchor "CCDS14771.4"
+                }
+              },
+              genomic-coords {
+                mix {
+                  int {
+                    from 59330430,
+                    to 59330457,
+                    strand plus,
+                    id gi 224589823
+                  },
+                  int {
+                    from 59335576,
+                    to 59335689,
+                    strand plus,
+                    id gi 224589823
+                  },
+                  int {
+                    from 59336119,
+                    to 59336230,
+                    strand plus,
+                    id gi 224589823
+                  },
+                  int {
+                    from 59336347,
+                    to 59336525,
+                    strand plus,
+                    id gi 224589823
+                  },
+                  int {
+                    from 59337090,
+                    to 59337235,
+                    strand plus,
+                    id gi 224589823
+                  },
+                  int {
+                    from 59337948,
+                    to 59338149,
+                    strand plus,
+                    id gi 224589823
+                  },
+                  int {
+                    from 59338753,
+                    to 59338858,
+                    strand plus,
+                    id gi 224589823
+                  },
+                  int {
+                    from 59340193,
+                    to 59340277,
+                    strand plus,
+                    id gi 224589823
+                  },
+                  int {
+                    from 59342486,
+                    to 59343079,
+                    strand plus,
+                    id gi 224589823
+                  }
+                }
+              },
+              seqs {
+                whole gi 29171682
+              }
+            }
+          }
+        }
+      }
+    },
+    {
+      type genomic,
+      heading "Reference GRCh37.p13 Primary Assembly",
+      label "chromosome X reference GRCh37.p13 Primary Assembly",
+      accession "NC_000023",
+      version 10,
+      seqs {
+        int {
+          from 155227245,
+          to 155240481,
+          strand plus,
+          id gi 224589822
+        }
+      },
+      products {
+        {
+          type mRNA,
+          heading "Reference",
+          label "transcript variant 2",
+          accession "NM_176786",
+          version 1,
+          genomic-coords {
+            mix {
+              int {
+                from 155227245,
+                to 155227451,
+                strand plus,
+                id gi 224589822
+              },
+              int {
+                from 155231072,
+                to 155231172,
+                strand plus,
+                id gi 224589822
+              },
+              int {
+                from 155232546,
+                to 155232683,
+                strand plus,
+                id gi 224589822
+              },
+              int {
+                from 155233113,
+                to 155233224,
+                strand plus,
+                id gi 224589822
+              },
+              int {
+                from 155233348,
+                to 155233519,
+                strand plus,
+                id gi 224589822
+              },
+              int {
+                from 155234113,
+                to 155234229,
+                strand plus,
+                id gi 224589822
+              },
+              int {
+                from 155234942,
+                to 155235143,
+                strand plus,
+                id gi 224589822
+              },
+              int {
+                from 155235747,
+                to 155235852,
+                strand plus,
+                id gi 224589822
+              },
+              int {
+                from 155239480,
+                to 155240481,
+                strand plus,
+                id gi 224589822
+              }
+            }
+          },
+          seqs {
+            whole gi 29171683
+          },
+          products {
+            {
+              type peptide,
+              heading "Reference",
+              label "isoform 2",
+              accession "NP_789743",
+              version 2,
+              source {
+                {
+                  src {
+                    db "CCDS",
+                    tag str "CCDS59180.1"
+                  },
+                  anchor "CCDS59180.1"
+                }
+              },
+              genomic-coords {
+                mix {
+                  int {
+                    from 155227408,
+                    to 155227451,
+                    strand plus,
+                    id gi 224589822
+                  },
+                  int {
+                    from 155231072,
+                    to 155231172,
+                    strand plus,
+                    id gi 224589822
+                  },
+                  int {
+                    from 155232546,
+                    to 155232683,
+                    strand plus,
+                    id gi 224589822
+                  },
+                  int {
+                    from 155233113,
+                    to 155233224,
+                    strand plus,
+                    id gi 224589822
+                  },
+                  int {
+                    from 155233348,
+                    to 155233519,
+                    strand plus,
+                    id gi 224589822
+                  },
+                  int {
+                    from 155234113,
+                    to 155234229,
+                    strand plus,
+                    id gi 224589822
+                  },
+                  int {
+                    from 155234942,
+                    to 155235143,
+                    strand plus,
+                    id gi 224589822
+                  },
+                  int {
+                    from 155235747,
+                    to 155235852,
+                    strand plus,
+                    id gi 224589822
+                  },
+                  int {
+                    from 155239480,
+                    to 155239516,
+                    strand plus,
+                    id gi 224589822
+                  }
+                }
+              },
+              seqs {
+                whole gi 388490122
+              }
+            }
+          }
+        },
+        {
+          type mRNA,
+          heading "Reference",
+          label "transcript variant 1",
+          accession "NM_002186",
+          version 2,
+          genomic-coords {
+            mix {
+              int {
+                from 155227245,
+                to 155227451,
+                strand plus,
+                id gi 224589822
+              },
+              int {
+                from 155232570,
+                to 155232683,
+                strand plus,
+                id gi 224589822
+              },
+              int {
+                from 155233113,
+                to 155233224,
+                strand plus,
+                id gi 224589822
+              },
+              int {
+                from 155233341,
+                to 155233519,
+                strand plus,
+                id gi 224589822
+              },
+              int {
+                from 155234084,
+                to 155234229,
+                strand plus,
+                id gi 224589822
+              },
+              int {
+                from 155234942,
+                to 155235143,
+                strand plus,
+                id gi 224589822
+              },
+              int {
+                from 155235747,
+                to 155235852,
+                strand plus,
+                id gi 224589822
+              },
+              int {
+                from 155237187,
+                to 155237271,
+                strand plus,
+                id gi 224589822
+              },
+              int {
+                from 155239480,
+                to 155240481,
+                strand plus,
+                id gi 224589822
+              }
+            }
+          },
+          seqs {
+            whole gi 29171681
+          },
+          products {
+            {
+              type peptide,
+              heading "Reference",
+              label "isoform 1 precursor",
+              accession "NP_002177",
+              version 2,
+              source {
+                {
+                  src {
+                    db "CCDS",
+                    tag str "CCDS14771.4"
+                  },
+                  anchor "CCDS14771.4"
+                }
+              },
+              genomic-coords {
+                mix {
+                  int {
+                    from 155227424,
+                    to 155227451,
+                    strand plus,
+                    id gi 224589822
+                  },
+                  int {
+                    from 155232570,
+                    to 155232683,
+                    strand plus,
+                    id gi 224589822
+                  },
+                  int {
+                    from 155233113,
+                    to 155233224,
+                    strand plus,
+                    id gi 224589822
+                  },
+                  int {
+                    from 155233341,
+                    to 155233519,
+                    strand plus,
+                    id gi 224589822
+                  },
+                  int {
+                    from 155234084,
+                    to 155234229,
+                    strand plus,
+                    id gi 224589822
+                  },
+                  int {
+                    from 155234942,
+                    to 155235143,
+                    strand plus,
+                    id gi 224589822
+                  },
+                  int {
+                    from 155235747,
+                    to 155235852,
+                    strand plus,
+                    id gi 224589822
+                  },
+                  int {
+                    from 155237187,
+                    to 155237271,
+                    strand plus,
+                    id gi 224589822
+                  },
+                  int {
+                    from 155239480,
+                    to 155240073,
+                    strand plus,
+                    id gi 224589822
+                  }
+                }
+              },
+              seqs {
+                whole gi 29171682
+              }
+            }
+          }
+        }
+      }
+    },
+    {
+      type genomic,
+      heading "Reference assembly",
+      label "RefSeqGene",
+      accession "NG_013238",
+      version 1,
+      seqs {
+        int {
+          from 5000,
+          to 18236,
+          strand plus,
+          id gi 261823945
+        }
+      },
+      products {
+        {
+          type mRNA,
+          heading "Reference",
+          label "transcript variant 1",
+          accession "NM_002186",
+          version 2,
+          genomic-coords {
+            mix {
+              int {
+                from 5000,
+                to 5206,
+                strand plus,
+                id gi 261823945
+              },
+              int {
+                from 10325,
+                to 10438,
+                strand plus,
+                id gi 261823945
+              },
+              int {
+                from 10868,
+                to 10979,
+                strand plus,
+                id gi 261823945
+              },
+              int {
+                from 11096,
+                to 11274,
+                strand plus,
+                id gi 261823945
+              },
+              int {
+                from 11839,
+                to 11984,
+                strand plus,
+                id gi 261823945
+              },
+              int {
+                from 12697,
+                to 12898,
+                strand plus,
+                id gi 261823945
+              },
+              int {
+                from 13502,
+                to 13607,
+                strand plus,
+                id gi 261823945
+              },
+              int {
+                from 14942,
+                to 15026,
+                strand plus,
+                id gi 261823945
+              },
+              int {
+                from 17235,
+                to 18236,
+                strand plus,
+                id gi 261823945
+              }
+            }
+          },
+          seqs {
+            whole gi 29171681
+          },
+          products {
+            {
+              type peptide,
+              heading "Reference",
+              label "isoform 1 precursor",
+              accession "NP_002177",
+              version 2,
+              source {
+                {
+                  src {
+                    db "CCDS",
+                    tag str "CCDS14771.4"
+                  },
+                  anchor "CCDS14771.4"
+                }
+              },
+              genomic-coords {
+                mix {
+                  int {
+                    from 5179,
+                    to 5206,
+                    strand plus,
+                    id gi 261823945
+                  },
+                  int {
+                    from 10325,
+                    to 10438,
+                    strand plus,
+                    id gi 261823945
+                  },
+                  int {
+                    from 10868,
+                    to 10979,
+                    strand plus,
+                    id gi 261823945
+                  },
+                  int {
+                    from 11096,
+                    to 11274,
+                    strand plus,
+                    id gi 261823945
+                  },
+                  int {
+                    from 11839,
+                    to 11984,
+                    strand plus,
+                    id gi 261823945
+                  },
+                  int {
+                    from 12697,
+                    to 12898,
+                    strand plus,
+                    id gi 261823945
+                  },
+                  int {
+                    from 13502,
+                    to 13607,
+                    strand plus,
+                    id gi 261823945
+                  },
+                  int {
+                    from 14942,
+                    to 15026,
+                    strand plus,
+                    id gi 261823945
+                  },
+                  int {
+                    from 17235,
+                    to 17828,
+                    strand plus,
+                    id gi 261823945
+                  }
+                }
+              },
+              seqs {
+                whole gi 29171682
+              }
+            }
+          }
+        }
+      }
+    },
+    {
+      type genomic,
+      heading "Alternate CHM1_1.1",
+      label "chromosome X alternate CHM1_1.1",
+      accession "NC_018934",
+      version 2,
+      seqs {
+        int {
+          from 155138862,
+          to 155152088,
+          strand plus,
+          id gi 528476524
+        }
+      },
+      products {
+        {
+          type mRNA,
+          heading "Reference",
+          label "transcript variant 2",
+          accession "NM_176786",
+          version 1,
+          genomic-coords {
+            mix {
+              int {
+                from 155138862,
+                to 155139068,
+                strand plus,
+                id gi 528476524
+              },
+              int {
+                from 155142688,
+                to 155142788,
+                strand plus,
+                id gi 528476524
+              },
+              int {
+                from 155144166,
+                to 155144303,
+                strand plus,
+                id gi 528476524
+              },
+              int {
+                from 155144733,
+                to 155144844,
+                strand plus,
+                id gi 528476524
+              },
+              int {
+                from 155144968,
+                to 155145139,
+                strand plus,
+                id gi 528476524
+              },
+              int {
+                from 155145733,
+                to 155145849,
+                strand plus,
+                id gi 528476524
+              },
+              int {
+                from 155146562,
+                to 155146763,
+                strand plus,
+                id gi 528476524
+              },
+              int {
+                from 155147367,
+                to 155147472,
+                strand plus,
+                id gi 528476524
+              },
+              int {
+                from 155151087,
+                to 155152088,
+                strand plus,
+                id gi 528476524
+              }
+            }
+          },
+          seqs {
+            whole gi 29171683
+          },
+          products {
+            {
+              type peptide,
+              heading "Reference",
+              label "isoform 2",
+              accession "NP_789743",
+              version 2,
+              genomic-coords {
+                mix {
+                  int {
+                    from 155139025,
+                    to 155139068,
+                    strand plus,
+                    id gi 528476524
+                  },
+                  int {
+                    from 155142688,
+                    to 155142788,
+                    strand plus,
+                    id gi 528476524
+                  },
+                  int {
+                    from 155144166,
+                    to 155144303,
+                    strand plus,
+                    id gi 528476524
+                  },
+                  int {
+                    from 155144733,
+                    to 155144844,
+                    strand plus,
+                    id gi 528476524
+                  },
+                  int {
+                    from 155144968,
+                    to 155145139,
+                    strand plus,
+                    id gi 528476524
+                  },
+                  int {
+                    from 155145733,
+                    to 155145849,
+                    strand plus,
+                    id gi 528476524
+                  },
+                  int {
+                    from 155146562,
+                    to 155146763,
+                    strand plus,
+                    id gi 528476524
+                  },
+                  int {
+                    from 155147367,
+                    to 155147472,
+                    strand plus,
+                    id gi 528476524
+                  },
+                  int {
+                    from 155151087,
+                    to 155151123,
+                    strand plus,
+                    id gi 528476524
+                  }
+                }
+              },
+              seqs {
+                whole gi 388490122
+              }
+            }
+          }
+        },
+        {
+          type mRNA,
+          heading "Reference",
+          label "transcript variant 1",
+          accession "NM_002186",
+          version 2,
+          genomic-coords {
+            mix {
+              int {
+                from 155138862,
+                to 155139068,
+                strand plus,
+                id gi 528476524
+              },
+              int {
+                from 155144190,
+                to 155144303,
+                strand plus,
+                id gi 528476524
+              },
+              int {
+                from 155144733,
+                to 155144844,
+                strand plus,
+                id gi 528476524
+              },
+              int {
+                from 155144961,
+                to 155145139,
+                strand plus,
+                id gi 528476524
+              },
+              int {
+                from 155145704,
+                to 155145849,
+                strand plus,
+                id gi 528476524
+              },
+              int {
+                from 155146562,
+                to 155146763,
+                strand plus,
+                id gi 528476524
+              },
+              int {
+                from 155147367,
+                to 155147472,
+                strand plus,
+                id gi 528476524
+              },
+              int {
+                from 155148808,
+                to 155148892,
+                strand plus,
+                id gi 528476524
+              },
+              int {
+                from 155151087,
+                to 155152088,
+                strand plus,
+                id gi 528476524
+              }
+            }
+          },
+          seqs {
+            whole gi 29171681
+          },
+          products {
+            {
+              type peptide,
+              heading "Reference",
+              label "isoform 1 precursor",
+              accession "NP_002177",
+              version 2,
+              genomic-coords {
+                mix {
+                  int {
+                    from 155139041,
+                    to 155139068,
+                    strand plus,
+                    id gi 528476524
+                  },
+                  int {
+                    from 155144190,
+                    to 155144303,
+                    strand plus,
+                    id gi 528476524
+                  },
+                  int {
+                    from 155144733,
+                    to 155144844,
+                    strand plus,
+                    id gi 528476524
+                  },
+                  int {
+                    from 155144961,
+                    to 155145139,
+                    strand plus,
+                    id gi 528476524
+                  },
+                  int {
+                    from 155145704,
+                    to 155145849,
+                    strand plus,
+                    id gi 528476524
+                  },
+                  int {
+                    from 155146562,
+                    to 155146763,
+                    strand plus,
+                    id gi 528476524
+                  },
+                  int {
+                    from 155147367,
+                    to 155147472,
+                    strand plus,
+                    id gi 528476524
+                  },
+                  int {
+                    from 155148808,
+                    to 155148892,
+                    strand plus,
+                    id gi 528476524
+                  },
+                  int {
+                    from 155151087,
+                    to 155151680,
+                    strand plus,
+                    id gi 528476524
+                  }
+                }
+              },
+              seqs {
+                whole gi 29171682
+              }
+            }
+          }
+        }
+      }
+    },
+    {
+      type genomic,
+      heading "Alternate HuRef",
+      label "chromosome X alternate HuRef",
+      accession "AC_000155",
+      version 1,
+      seqs {
+        int {
+          from 143710175,
+          to 143723406,
+          strand plus,
+          id gi 157734237
+        }
+      },
+      products {
+        {
+          type mRNA,
+          heading "Reference",
+          label "transcript variant 2",
+          accession "NM_176786",
+          version 1,
+          genomic-coords {
+            mix {
+              int {
+                from 143710175,
+                to 143710381,
+                strand plus,
+                id gi 157734237
+              },
+              int {
+                from 143714002,
+                to 143714102,
+                strand plus,
+                id gi 157734237
+              },
+              int {
+                from 143715480,
+                to 143715617,
+                strand plus,
+                id gi 157734237
+              },
+              int {
+                from 143716047,
+                to 143716158,
+                strand plus,
+                id gi 157734237
+              },
+              int {
+                from 143716282,
+                to 143716453,
+                strand plus,
+                id gi 157734237
+              },
+              int {
+                from 143717047,
+                to 143717163,
+                strand plus,
+                id gi 157734237
+              },
+              int {
+                from 143717876,
+                to 143718077,
+                strand plus,
+                id gi 157734237
+              },
+              int {
+                from 143718681,
+                to 143718786,
+                strand plus,
+                id gi 157734237
+              },
+              int {
+                from 143722405,
+                to 143723406,
+                strand plus,
+                id gi 157734237
+              }
+            }
+          },
+          seqs {
+            whole gi 29171683
+          },
+          products {
+            {
+              type peptide,
+              heading "Reference",
+              label "isoform 2",
+              accession "NP_789743",
+              version 2,
+              genomic-coords {
+                mix {
+                  int {
+                    from 143710338,
+                    to 143710381,
+                    strand plus,
+                    id gi 157734237
+                  },
+                  int {
+                    from 143714002,
+                    to 143714102,
+                    strand plus,
+                    id gi 157734237
+                  },
+                  int {
+                    from 143715480,
+                    to 143715617,
+                    strand plus,
+                    id gi 157734237
+                  },
+                  int {
+                    from 143716047,
+                    to 143716158,
+                    strand plus,
+                    id gi 157734237
+                  },
+                  int {
+                    from 143716282,
+                    to 143716453,
+                    strand plus,
+                    id gi 157734237
+                  },
+                  int {
+                    from 143717047,
+                    to 143717163,
+                    strand plus,
+                    id gi 157734237
+                  },
+                  int {
+                    from 143717876,
+                    to 143718077,
+                    strand plus,
+                    id gi 157734237
+                  },
+                  int {
+                    from 143718681,
+                    to 143718786,
+                    strand plus,
+                    id gi 157734237
+                  },
+                  int {
+                    from 143722405,
+                    to 143722441,
+                    strand plus,
+                    id gi 157734237
+                  }
+                }
+              },
+              seqs {
+                whole gi 388490122
+              }
+            }
+          }
+        },
+        {
+          type mRNA,
+          heading "Reference",
+          label "transcript variant 1",
+          accession "NM_002186",
+          version 2,
+          genomic-coords {
+            mix {
+              int {
+                from 143710175,
+                to 143710381,
+                strand plus,
+                id gi 157734237
+              },
+              int {
+                from 143715504,
+                to 143715617,
+                strand plus,
+                id gi 157734237
+              },
+              int {
+                from 143716047,
+                to 143716158,
+                strand plus,
+                id gi 157734237
+              },
+              int {
+                from 143716275,
+                to 143716453,
+                strand plus,
+                id gi 157734237
+              },
+              int {
+                from 143717018,
+                to 143717163,
+                strand plus,
+                id gi 157734237
+              },
+              int {
+                from 143717876,
+                to 143718077,
+                strand plus,
+                id gi 157734237
+              },
+              int {
+                from 143718681,
+                to 143718786,
+                strand plus,
+                id gi 157734237
+              },
+              int {
+                from 143720118,
+                to 143720202,
+                strand plus,
+                id gi 157734237
+              },
+              int {
+                from 143722405,
+                to 143723406,
+                strand plus,
+                id gi 157734237
+              }
+            }
+          },
+          seqs {
+            whole gi 29171681
+          },
+          products {
+            {
+              type peptide,
+              heading "Reference",
+              label "isoform 1 precursor",
+              accession "NP_002177",
+              version 2,
+              genomic-coords {
+                mix {
+                  int {
+                    from 143710354,
+                    to 143710381,
+                    strand plus,
+                    id gi 157734237
+                  },
+                  int {
+                    from 143715504,
+                    to 143715617,
+                    strand plus,
+                    id gi 157734237
+                  },
+                  int {
+                    from 143716047,
+                    to 143716158,
+                    strand plus,
+                    id gi 157734237
+                  },
+                  int {
+                    from 143716275,
+                    to 143716453,
+                    strand plus,
+                    id gi 157734237
+                  },
+                  int {
+                    from 143717018,
+                    to 143717163,
+                    strand plus,
+                    id gi 157734237
+                  },
+                  int {
+                    from 143717876,
+                    to 143718077,
+                    strand plus,
+                    id gi 157734237
+                  },
+                  int {
+                    from 143718681,
+                    to 143718786,
+                    strand plus,
+                    id gi 157734237
+                  },
+                  int {
+                    from 143720118,
+                    to 143720202,
+                    strand plus,
+                    id gi 157734237
+                  },
+                  int {
+                    from 143722405,
+                    to 143722998,
+                    strand plus,
+                    id gi 157734237
+                  }
+                }
+              },
+              seqs {
+                whole gi 29171682
+              }
+            }
+          }
+        }
+      }
+    }
+  },
+  properties {
+    {
+      type comment,
+      label "Nomenclature",
+      source {
+        {
+          anchor "HUGO Gene Nomenclature Committee"
+        }
+      },
+      properties {
+        {
+          type property,
+          label "Official Symbol",
+          text "IL9R"
+        },
+        {
+          type property,
+          label "Official Full Name",
+          text "interleukin 9 receptor"
+        }
+      }
+    },
+    {
+      type comment,
+      heading "GeneOntology",
+      source {
+        {
+          pre-text "Provided by",
+          anchor "GOA",
+          url "http://www.ebi.ac.uk/GOA/"
+        }
+      },
+      comment {
+        {
+          type comment,
+          label "Function",
+          comment {
+            {
+              type comment,
+              refs {
+                pmid 1376929
+              },
+              source {
+                {
+                  src {
+                    db "GO",
+                    tag id 4919
+                  },
+                  anchor "interleukin-9 receptor activity",
+                  post-text "evidence: TAS"
+                }
+              }
+            }
+          }
+        },
+        {
+          type comment,
+          label "Process",
+          comment {
+            {
+              type comment,
+              refs {
+                pmid 1376929
+              },
+              source {
+                {
+                  src {
+                    db "GO",
+                    tag id 8283
+                  },
+                  anchor "cell proliferation",
+                  post-text "evidence: TAS"
+                }
+              }
+            },
+            {
+              type comment,
+              refs {
+                pmid 1376929
+              },
+              source {
+                {
+                  src {
+                    db "GO",
+                    tag id 38113
+                  },
+                  anchor "interleukin-9-mediated signaling pathway",
+                  post-text "evidence: TAS"
+                }
+              }
+            },
+            {
+              type comment,
+              refs {
+                pmid 1376929
+              },
+              source {
+                {
+                  src {
+                    db "GO",
+                    tag id 7165
+                  },
+                  anchor "signal transduction",
+                  post-text "evidence: TAS"
+                }
+              }
+            }
+          }
+        },
+        {
+          type comment,
+          label "Component",
+          comment {
+            {
+              type comment,
+              refs {
+                pmid 1376929
+              },
+              source {
+                {
+                  src {
+                    db "GO",
+                    tag id 5615
+                  },
+                  anchor "extracellular space",
+                  post-text "evidence: TAS"
+                }
+              }
+            },
+            {
+              type comment,
+              refs {
+                pmid 1376929
+              },
+              source {
+                {
+                  src {
+                    db "GO",
+                    tag id 5887
+                  },
+                  anchor "integral to plasma membrane",
+                  post-text "evidence: TAS"
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  },
+  homology {
+    {
+      type comment,
+      heading "Mouse, Rat",
+      source {
+        {
+          src {
+            db "HomoloGene",
+            tag id 37591
+          },
+          anchor "Map Viewer",
+          url "http://www.ncbi.nlm.nih.gov/mapview/maps.cgi?taxid=9606&chr=X&M
+APS=genes-r-org/rat-chr/human%3AX,genes-r-org/mouse-chr/human%3AX,genes-r-org/
+human-chrX&query=e%3A3581[egene_id]+AND+gene[obj_type]&QSTR=il9r&cmd=focus&fil
+l=10",
+          post-text "(chromosome X)"
+        }
+      }
+    },
+    {
+      type comment,
+      heading "Mouse, Rat",
+      source {
+        {
+          src {
+            db "HomoloGene",
+            tag id 37591
+          },
+          anchor "Map Viewer",
+          url "http://www.ncbi.nlm.nih.gov/mapview/maps.cgi?taxid=9606&chr=Y&M
+APS=genes-r-org/rat-chr/human%3AY,genes-r-org/mouse-chr/human%3AY,genes-r-org/
+human-chrY&query=e%3A3581[egene_id]+AND+gene[obj_type]&QSTR=il9r&cmd=focus&fil
+l=10",
+          post-text "(chromosome Y)"
+        }
+      }
+    }
+  },
+  comments {
+    {
+      type comment,
+      heading "RefSeq Status",
+      label "REVIEWED"
+    },
+    {
+      type comment,
+      heading "Annotation Information",
+      properties {
+        {
+          type property,
+          label "Annotation category",
+          text "partial on reference assembly"
+        }
+      }
+    },
+    {
+      type gene-group,
+      heading "Related pseudogene(s)",
+      source {
+        {
+          pre-text "5 found",
+          anchor "Review record(s) in Gene"
+        }
+      }
+    },
+    {
+      type comment,
+      refs {
+        pmid 23638223,
+        pmid 22638550,
+        pmid 21371865,
+        pmid 20673868,
+        pmid 20595916,
+        pmid 20503287,
+        pmid 20452482,
+        pmid 20424473,
+        pmid 19723899,
+        pmid 19692168,
+        pmid 19401191,
+        pmid 19258923,
+        pmid 19139102,
+        pmid 18829468,
+        pmid 18633131,
+        pmid 18339896,
+        pmid 17919707,
+        pmid 17703412,
+        pmid 17207965,
+        pmid 17192395,
+        pmid 17083349,
+        pmid 15621723,
+        pmid 15591265,
+        pmid 12477932,
+        pmid 11868823,
+        pmid 11588013,
+        pmid 11418623,
+        pmid 11160343,
+        pmid 11039580,
+        pmid 10657622,
+        pmid 10655549,
+        pmid 10642536,
+        pmid 10486269,
+        pmid 10329852,
+        pmid 9535918,
+        pmid 9002663,
+        pmid 8756628,
+        pmid 8666384,
+        pmid 8193355,
+        pmid 7718508,
+        pmid 1376929
+      }
+    },
+    {
+      type comment,
+      heading "NCBI Reference Sequences (RefSeq)",
+      comment {
+        {
+          type comment,
+          heading "RefSeqs maintained independently of Annotated Genomes",
+          products {
+            {
+              type mRNA,
+              heading "mRNA Sequence",
+              accession "NM_002186",
+              version 2,
+              source {
+                {
+                  src {
+                    db "Nucleotide",
+                    tag id 29171681
+                  },
+                  anchor "NM_002186"
+                }
+              },
+              seqs {
+                whole gi 29171681
+              },
+              products {
+                {
+                  type peptide,
+                  heading "Product",
+                  accession "NP_002177",
+                  version 2,
+                  source {
+                    {
+                      src {
+                        db "Protein",
+                        tag id 29171682
+                      },
+                      anchor "NP_002177",
+                      post-text "interleukin-9 receptor isoform 1 precursor"
+                    }
+                  },
+                  seqs {
+                    whole gi 29171682
+                  },
+                  comment {
+                    {
+                      type other,
+                      heading "Related",
+                      source {
+                        {
+                          src {
+                            db "Ensembl",
+                            tag str "ENSP00000244174"
+                          }
+                        }
+                      }
+                    },
+                    {
+                      type other,
+                      heading "UniProtKB",
+                      source {
+                      },
+                      comment {
+                        {
+                          type other,
+                          source {
+                            {
+                              src {
+                                db "UniProtKB/Swiss-Prot",
+                                tag str "Q01113"
+                              },
+                              anchor "Q01113"
+                            }
+                          }
+                        }
+                      }
+                    },
+                    {
+                      type other,
+                      heading "Consensus CDS (CCDS)",
+                      source {
+                        {
+                          src {
+                            db "CCDS",
+                            tag str "CCDS14771.4"
+                          },
+                          anchor "CCDS14771.4"
+                        }
+                      }
+                    },
+                    {
+                      type other,
+                      heading "Related",
+                      source {
+                        {
+                          src {
+                            db "Vega",
+                            tag str "OTTHUMP00000024332"
+                          }
+                        }
+                      }
+                    }
+                  }
+                }
+              },
+              comment {
+                {
+                  type comment,
+                  label "RefSeq Status",
+                  text "REVIEWED"
+                },
+                {
+                  type comment,
+                  heading "Transcriptional Variant",
+                  comment {
+                    {
+                      type comment,
+                      text "Transcript Variant: This variant (1) represent the
+ longer transcript and encodes the longer isoform (1)."
+                    }
+                  }
+                },
+                {
+                  type other,
+                  heading "Source Sequence",
+                  source {
+                    {
+                      src {
+                        db "Nucleotide",
+                        tag str "BC025298,M84747"
+                      },
+                      anchor "BC025298,M84747"
+                    }
+                  }
+                },
+                {
+                  type other,
+                  heading "Related",
+                  source {
+                    {
+                      src {
+                        db "Ensembl",
+                        tag str "ENST00000244174"
+                      }
+                    }
+                  }
+                },
+                {
+                  type other,
+                  heading "Related",
+                  source {
+                    {
+                      src {
+                        db "Vega",
+                        tag str "OTTHUMT00000058981"
+                      }
+                    }
+                  }
+                }
+              }
+            },
+            {
+              type mRNA,
+              heading "mRNA Sequence",
+              accession "NM_176786",
+              version 1,
+              source {
+                {
+                  src {
+                    db "Nucleotide",
+                    tag id 29171683
+                  },
+                  anchor "NM_176786"
+                }
+              },
+              seqs {
+                whole gi 29171683
+              },
+              products {
+                {
+                  type peptide,
+                  heading "Product",
+                  accession "NP_789743",
+                  version 2,
+                  source {
+                    {
+                      src {
+                        db "Protein",
+                        tag id 388490122
+                      },
+                      anchor "NP_789743",
+                      post-text "interleukin-9 receptor isoform 2"
+                    }
+                  },
+                  seqs {
+                    whole gi 388490122
+                  },
+                  comment {
+                    {
+                      type other,
+                      heading "Related",
+                      source {
+                        {
+                          src {
+                            db "Ensembl",
+                            tag str "ENSP00000358431"
+                          }
+                        }
+                      }
+                    },
+                    {
+                      type other,
+                      heading "UniProtKB",
+                      source {
+                      },
+                      comment {
+                        {
+                          type other,
+                          source {
+                            {
+                              src {
+                                db "UniProtKB/Swiss-Prot",
+                                tag str "Q01113"
+                              },
+                              anchor "Q01113"
+                            }
+                          }
+                        }
+                      }
+                    },
+                    {
+                      type other,
+                      heading "Consensus CDS (CCDS)",
+                      source {
+                        {
+                          src {
+                            db "CCDS",
+                            tag str "CCDS59180.1"
+                          },
+                          anchor "CCDS59180.1"
+                        }
+                      }
+                    },
+                    {
+                      type other,
+                      heading "Related",
+                      source {
+                        {
+                          src {
+                            db "Vega",
+                            tag str "OTTHUMP00000024331"
+                          }
+                        }
+                      }
+                    }
+                  }
+                }
+              },
+              comment {
+                {
+                  type comment,
+                  label "RefSeq Status",
+                  text "REVIEWED"
+                },
+                {
+                  type comment,
+                  heading "Transcriptional Variant",
+                  comment {
+                    {
+                      type comment,
+                      text "Transcript Variant: This variant (2) differs in
+ the 5' and 3' UTR and has multiple coding region differences, compared to
+ variant 1. Some of these differences result in translational frameshifts. The
+ resulting isoform (2) has distinct N- and C-termini and is shorter than
+ isoform 1."
+                    }
+                  }
+                },
+                {
+                  type other,
+                  heading "Source Sequence",
+                  source {
+                    {
+                      src {
+                        db "Nucleotide",
+                        tag str "AJ271736,BC025298"
+                      },
+                      anchor "AJ271736,BC025298"
+                    }
+                  }
+                },
+                {
+                  type other,
+                  heading "Related",
+                  source {
+                    {
+                      src {
+                        db "Ensembl",
+                        tag str "ENST00000369423"
+                      }
+                    }
+                  }
+                },
+                {
+                  type other,
+                  heading "Related",
+                  source {
+                    {
+                      src {
+                        db "Vega",
+                        tag str "OTTHUMT00000058980"
+                      }
+                    }
+                  }
+                }
+              }
+            }
+          },
+          comment {
+            {
+              type genomic,
+              heading "RefSeqGene",
+              accession "NG_013238",
+              version 1,
+              source {
+                {
+                  src {
+                    db "Nucleotide",
+                    tag id 261823945
+                  },
+                  anchor "NG_013238"
+                }
+              },
+              seqs {
+                int {
+                  from 5000,
+                  to 18236,
+                  strand plus,
+                  id gi 261823945
+                }
+              }
+            }
+          }
+        },
+        {
+          type comment,
+          heading "RefSeqs of Annotated Genomes: Homo sapiens Annotation
+ Release 105",
+          products {
+            {
+              type genomic,
+              heading "Reference GRCh37.p13 Primary Assembly",
+              accession "NC_000023",
+              version 10,
+              source {
+                {
+                  src {
+                    db "Nucleotide",
+                    tag id 224589822
+                  }
+                }
+              },
+              seqs {
+                int {
+                  from 155227245,
+                  to 155240481,
+                  strand plus,
+                  id gi 224589822
+                }
+              }
+            },
+            {
+              type genomic,
+              heading "Alternate HuRef",
+              accession "AC_000155",
+              version 1,
+              source {
+                {
+                  src {
+                    db "Nucleotide",
+                    tag id 157734237
+                  }
+                }
+              },
+              seqs {
+                int {
+                  from 143710175,
+                  to 143723406,
+                  strand plus,
+                  id gi 157734237
+                }
+              }
+            },
+            {
+              type genomic,
+              heading "Alternate CHM1_1.1",
+              accession "NC_018934",
+              version 2,
+              source {
+                {
+                  src {
+                    db "Nucleotide",
+                    tag id 528476524
+                  }
+                }
+              },
+              seqs {
+                int {
+                  from 155138862,
+                  to 155152088,
+                  strand plus,
+                  id gi 528476524
+                }
+              }
+            }
+          }
+        }
+      }
+    },
+    {
+      type comment,
+      heading "Related Sequences",
+      products {
+        {
+          type genomic,
+          heading "Genomic",
+          accession "ABBA01028635",
+          version 1,
+          source {
+            {
+              src {
+                db "Nucleotide",
+                tag id 148163528
+              },
+              anchor "ABBA01028635"
+            }
+          },
+          seqs {
+            int {
+              from 28050,
+              to 41281,
+              strand plus,
+              id gi 148163528
+            }
+          },
+          products {
+            {
+              type peptide,
+              text "None"
+            }
+          }
+        },
+        {
+          type genomic,
+          heading "Genomic",
+          accession "AJ271736",
+          version 1,
+          source {
+            {
+              src {
+                db "Nucleotide",
+                tag id 8979791
+              },
+              anchor "AJ271736"
+            }
+          },
+          seqs {
+            whole gi 8979791
+          },
+          products {
+            {
+              type peptide,
+              accession "CAB96817",
+              version 1,
+              source {
+                {
+                  src {
+                    db "Protein",
+                    tag id 8979793
+                  },
+                  anchor "CAB96817"
+                }
+              },
+              seqs {
+                whole gi 8979793
+              }
+            }
+          }
+        },
+        {
+          type genomic,
+          heading "Genomic",
+          accession "AMYH02040904",
+          version 1,
+          source {
+            {
+              src {
+                db "Nucleotide",
+                tag id 511784226
+              },
+              anchor "AMYH02040904"
+            }
+          },
+          seqs {
+            int {
+              from 17496,
+              to 30722,
+              strand plus,
+              id gi 511784226
+            }
+          },
+          products {
+            {
+              type peptide,
+              text "None"
+            }
+          }
+        },
+        {
+          type genomic,
+          heading "Genomic",
+          accession "AY071830",
+          version 1,
+          source {
+            {
+              src {
+                db "Nucleotide",
+                tag id 18071671
+              },
+              anchor "AY071830"
+            }
+          },
+          seqs {
+            whole gi 18071671
+          },
+          products {
+            {
+              type peptide,
+              accession "AAL55435",
+              version 1,
+              source {
+                {
+                  src {
+                    db "Protein",
+                    tag id 18071672
+                  },
+                  anchor "AAL55435"
+                }
+              },
+              seqs {
+                whole gi 18071672
+              }
+            }
+          }
+        },
+        {
+          type genomic,
+          heading "Genomic",
+          accession "CH471247",
+          version 1,
+          source {
+            {
+              src {
+                db "Nucleotide",
+                tag id 71514074
+              },
+              anchor "CH471247"
+            }
+          },
+          seqs {
+            whole gi 71514074
+          },
+          products {
+            {
+              type peptide,
+              accession "EAW55884",
+              version 1,
+              source {
+                {
+                  src {
+                    db "Protein",
+                    tag id 119576288
+                  },
+                  anchor "EAW55884"
+                }
+              },
+              seqs {
+                whole gi 119576288
+              }
+            },
+            {
+              type peptide,
+              accession "EAW55885",
+              version 1,
+              source {
+                {
+                  src {
+                    db "Protein",
+                    tag id 119576289
+                  },
+                  anchor "EAW55885"
+                }
+              },
+              seqs {
+                whole gi 119576289
+              }
+            },
+            {
+              type peptide,
+              accession "EAW55886",
+              version 1,
+              source {
+                {
+                  src {
+                    db "Protein",
+                    tag id 119576290
+                  },
+                  anchor "EAW55886"
+                }
+              },
+              seqs {
+                whole gi 119576290
+              }
+            }
+          }
+        },
+        {
+          type genomic,
+          heading "Genomic",
+          accession "L39064",
+          version 1,
+          source {
+            {
+              src {
+                db "Nucleotide",
+                tag id 632992
+              },
+              anchor "L39064"
+            }
+          },
+          seqs {
+            whole gi 632992
+          },
+          products {
+            {
+              type peptide,
+              accession "AAC29513",
+              version 1,
+              source {
+                {
+                  src {
+                    db "Protein",
+                    tag id 632993
+                  },
+                  anchor "AAC29513"
+                }
+              },
+              seqs {
+                whole gi 632993
+              }
+            }
+          }
+        },
+        {
+          type genomic,
+          heading "Genomic",
+          accession "S71420",
+          version 1,
+          source {
+            {
+              src {
+                db "Nucleotide",
+                tag id 551360
+              },
+              anchor "S71420"
+            }
+          },
+          seqs {
+            whole gi 551360
+          },
+          products {
+            {
+              type peptide,
+              accession "AAD14081",
+              version 1,
+              source {
+                {
+                  src {
+                    db "Protein",
+                    tag id 4261781
+                  },
+                  anchor "AAD14081"
+                }
+              },
+              seqs {
+                whole gi 4261781
+              }
+            }
+          }
+        },
+        {
+          type mRNA,
+          heading "mRNA",
+          accession "AK303178",
+          version 1,
+          source {
+            {
+              src {
+                db "Nucleotide",
+                tag id 194381807
+              },
+              anchor "AK303178"
+            }
+          },
+          seqs {
+            whole gi 194381807
+          },
+          products {
+            {
+              type peptide,
+              accession "BAG64273",
+              version 1,
+              source {
+                {
+                  src {
+                    db "Protein",
+                    tag id 194381808
+                  },
+                  anchor "BAG64273"
+                }
+              },
+              seqs {
+                whole gi 194381808
+              }
+            }
+          }
+        },
+        {
+          type mRNA,
+          heading "mRNA",
+          accession "BC025298",
+          version 1,
+          source {
+            {
+              src {
+                db "Nucleotide",
+                tag id 22137637
+              },
+              anchor "BC025298"
+            }
+          },
+          seqs {
+            whole gi 22137637
+          },
+          products {
+            {
+              type peptide,
+              text "None"
+            }
+          }
+        },
+        {
+          type mRNA,
+          heading "mRNA",
+          accession "BC051337",
+          version 1,
+          source {
+            {
+              src {
+                db "Nucleotide",
+                tag id 30410903
+              },
+              anchor "BC051337"
+            }
+          },
+          seqs {
+            whole gi 30410903
+          },
+          products {
+            {
+              type peptide,
+              accession "AAH51337",
+              version 1,
+              source {
+                {
+                  src {
+                    db "Protein",
+                    tag id 30410904
+                  },
+                  anchor "AAH51337"
+                }
+              },
+              seqs {
+                whole gi 30410904
+              }
+            }
+          }
+        },
+        {
+          type mRNA,
+          heading "mRNA",
+          accession "M84747",
+          version 1,
+          source {
+            {
+              src {
+                db "Nucleotide",
+                tag id 184508
+              },
+              anchor "M84747"
+            }
+          },
+          seqs {
+            whole gi 184508
+          },
+          products {
+            {
+              type peptide,
+              accession "AAA58679",
+              version 1,
+              source {
+                {
+                  src {
+                    db "Protein",
+                    tag id 184509
+                  },
+                  anchor "AAA58679"
+                }
+              },
+              seqs {
+                whole gi 184509
+              }
+            }
+          }
+        },
+        {
+          type mRNA,
+          heading "mRNA",
+          accession "S71404",
+          version 1,
+          source {
+            {
+              src {
+                db "Nucleotide",
+                tag id 551356
+              },
+              anchor "S71404"
+            }
+          },
+          seqs {
+            whole gi 551356
+          },
+          products {
+            {
+              type peptide,
+              accession "AAB30844",
+              version 2,
+              source {
+                {
+                  src {
+                    db "Protein",
+                    tag id 13236921
+                  },
+                  anchor "AAB30844"
+                }
+              },
+              seqs {
+                whole gi 13236921
+              }
+            }
+          }
+        },
+        {
+          type other,
+          text "None",
+          products {
+            {
+              type peptide,
+              accession "Q01113",
+              version 3,
+              source {
+                {
+                  src {
+                    db "Protein",
+                    tag id 116242526
+                  }
+                },
+                {
+                  src {
+                    db "UniProtKB/Swiss-Prot",
+                    tag str "Q01113"
+                  }
+                }
+              },
+              seqs {
+                whole gi 116242526
+              }
+            }
+          }
+        },
+        {
+          type other-genetic,
+          heading "Synthetic",
+          accession "HQ447710",
+          version 1,
+          source {
+            {
+              src {
+                db "Nucleotide",
+                tag id 312151365
+              },
+              anchor "HQ447710"
+            }
+          },
+          seqs {
+            whole gi 312151365
+          },
+          products {
+            {
+              type peptide,
+              accession "ADQ32195",
+              version 1,
+              source {
+                {
+                  src {
+                    db "Protein",
+                    tag id 312151366
+                  },
+                  anchor "ADQ32195"
+                }
+              },
+              seqs {
+                whole gi 312151366
+              }
+            }
+          }
+        }
+      }
+    },
+    {
+      type comment,
+      heading "Additional Links",
+      comment {
+        {
+          type comment,
+          source {
+            {
+              src {
+                db "Evidence Viewer",
+                tag str "3581"
+              },
+              anchor "Evidence Viewer",
+              url "http://www.ncbi.nlm.nih.gov/sutils/evv.cgi?taxid=9606&conti
+g=NT_167198.1&gene=IL9R&lid=3581&from=6145183&to=6158419"
+            }
+          }
+        },
+        {
+          type comment,
+          source {
+            {
+              src {
+                db "Evidence Viewer",
+                tag str "3581"
+              },
+              anchor "Evidence Viewer",
+              url "http://www.ncbi.nlm.nih.gov/sutils/evv.cgi?taxid=9606&conti
+g=NT_167206.1&gene=IL9R&lid=3581&from=296202&to=309438"
+            }
+          }
+        },
+        {
+          type comment,
+          text "MIM",
+          source {
+            {
+              src {
+                db "MIM",
+                tag id 300007
+              },
+              anchor "300007"
+            }
+          }
+        },
+        {
+          type comment,
+          source {
+            {
+              src {
+                db "AceView",
+                tag id 3581
+              },
+              anchor "AceView",
+              url "http://www.ncbi.nlm.nih.gov/IEB/Research/Acembly/av.cgi?c=g
+eneid&org=9606&l=3581"
+            }
+          }
+        },
+        {
+          type comment,
+          text "IL9R @ LOVD",
+          source {
+            {
+              src {
+                db "IL9R",
+                tag str "IL9R"
+              },
+              anchor "IL9R",
+              url "http://www.LOVD.nl/IL9R"
+            }
+          }
+        },
+        {
+          type comment,
+          text "UCSC",
+          source {
+            {
+              src {
+                db "UCSC",
+                tag str "UCSC"
+              },
+              anchor "UCSC",
+              url "http://genome.ucsc.edu/cgi-bin/hgTracks?org=human&position=
+NM_176786"
+            }
+          }
+        },
+        {
+          type comment,
+          source {
+            {
+              src {
+                db "MGC",
+                tag str "BC051337"
+              },
+              anchor "MGC",
+              url "http://mgc.nci.nih.gov/Genes/CloneList?ORG=Hs&LIST=BC051337"
+            }
+          }
+        },
+        {
+          type comment,
+          source {
+            {
+              src {
+                db "HuGE Navigator",
+                tag str "3581"
+              },
+              anchor "HuGE Navigator",
+              url "http://hugenavigator.net/HuGENavigator/huGEPedia.do?firstQu
+ery=IL9R&geneID=3581&typeOption=gene&which=2&pubOrderType=pubD&typeSubmit=GO&c
+heck=y"
+            }
+          }
+        },
+        {
+          type comment,
+          source {
+            {
+              src {
+                db "KEGG",
+                tag str "hsa:3581"
+              },
+              url "http://www.genome.jp/dbget-bin/www_bget?hsa:3581"
+            }
+          }
+        },
+        {
+          type comment,
+          text "UniGene",
+          xtra-properties {
+            {
+              tag "UNIGENE",
+              value "Hs.406228"
+            }
+          },
+          source {
+            {
+              src {
+                db "UniGene",
+                tag str "Hs.406228"
+              },
+              anchor "Hs.406228",
+              url "http://www.ncbi.nlm.nih.gov/UniGene/clust.cgi?ORG=Hs&CID=40
+6228"
+            }
+          }
+        }
+      }
+    },
+    {
+      type generif,
+      text "Our findings suggest that overexpression of IL-9R may contribute
+ to the pathogenesis of diffuse large B-cell lymphoma",
+      refs {
+        pmid 23638223
+      },
+      create-date std {
+        year 2013,
+        month 11,
+        day 30,
+        hour 10,
+        minute 1,
+        second 0
+      },
+      update-date std {
+        year 2013,
+        month 11,
+        day 30,
+        hour 12,
+        minute 36,
+        second 0
+      }
+    },
+    {
+      type generif,
+      text "One of the identified peptide sequences corresponded to a fragment
+ of the human interleukin-9 receptor alpha (IL-9Ralpha).",
+      refs {
+        pmid 22638550
+      },
+      create-date std {
+        year 2013,
+        month 5,
+        day 11,
+        hour 10,
+        minute 1,
+        second 0
+      },
+      update-date std {
+        year 2013,
+        month 5,
+        day 11,
+        hour 10,
+        minute 42,
+        second 0
+      }
+    },
+    {
+      type generif,
+      text "analysis of IL-9 and IL-9 receptor gene polymorphisms and atopic
+ dermatitis in a Korean population",
+      refs {
+        pmid 21371865
+      },
+      create-date std {
+        year 2011,
+        month 7,
+        day 23,
+        hour 10,
+        minute 1,
+        second 0
+      },
+      update-date std {
+        year 2011,
+        month 7,
+        day 23,
+        hour 10,
+        minute 31,
+        second 0
+      }
+    },
+    {
+      type generif,
+      text "There is an association of at least 2 X-chromosomal genes with
+ rheumatoid arthritis: TIMP1 and IL9R.",
+      refs {
+        pmid 19723899
+      },
+      create-date std {
+        year 2010,
+        month 2,
+        day 15,
+        hour 11,
+        minute 2,
+        second 0
+      },
+      update-date std {
+        year 2010,
+        month 2,
+        day 15,
+        hour 11,
+        minute 13,
+        second 0
+      }
+    },
+    {
+      type generif,
+      text "These results reveal a regulatory function for IFN-gamma and IL-10
+ on modulating the inducible IL-9Ralpha expression levels on peripheral blood
+ neutrophils by T(H)2 cytokines.",
+      refs {
+        pmid 19401191
+      },
+      create-date std {
+        year 2009,
+        month 6,
+        day 15,
+        hour 11,
+        minute 2,
+        second 0
+      },
+      update-date std {
+        year 2010,
+        month 1,
+        day 21,
+        hour 0,
+        minute 0,
+        second 0
+      }
+    },
+    {
+      type generif,
+      text "IL-9Ralpha and IL-2Rbeta homodimers efficiently mediate
+ constitutive activation of ALL-associated JAK1 mutants.",
+      refs {
+        pmid 19139102
+      },
+      create-date std {
+        year 2009,
+        month 5,
+        day 9,
+        hour 10,
+        minute 1,
+        second 0
+      },
+      update-date std {
+        year 2010,
+        month 1,
+        day 21,
+        hour 0,
+        minute 0,
+        second 0
+      }
+    },
+    {
+      type generif,
+      text "Observational study of gene-disease association and
+ gene-environment interaction. (HuGE Navigator)",
+      refs {
+        pmid 20595916,
+        pmid 19258923
+      },
+      source {
+        {
+          src {
+            db "HuGENet",
+            tag str "3581.19258923"
+          },
+          anchor "HuGENet"
+        }
+      },
+      create-date std {
+        year 2009,
+        month 3,
+        day 25,
+        hour 21,
+        minute 36,
+        second 0
+      },
+      update-date std {
+        year 2009,
+        month 3,
+        day 25,
+        hour 21,
+        minute 36,
+        second 0
+      }
+    },
+    {
+      type generif,
+      text "Observational study of gene-disease association. (HuGE Navigator)",
+      refs {
+        pmid 20673868,
+        pmid 20503287,
+        pmid 20452482,
+        pmid 20424473,
+        pmid 19723899,
+        pmid 19692168,
+        pmid 17703412
+      },
+      source {
+        {
+          src {
+            db "HuGENet",
+            tag str "3581.17703412"
+          },
+          anchor "HuGENet"
+        }
+      },
+      create-date std {
+        year 2009,
+        month 3,
+        day 25,
+        hour 21,
+        minute 36,
+        second 0
+      },
+      update-date std {
+        year 2009,
+        month 3,
+        day 25,
+        hour 21,
+        minute 36,
+        second 0
+      }
+    },
+    {
+      type generif,
+      text "the preformed complexes between gamma c and IL-2Rbeta or
+ IL-9Ralpha promote signaling by the JAK3 A572V mutant without ligand,
+ identified in several human cancers.",
+      refs {
+        pmid 18829468
+      },
+      create-date std {
+        year 2009,
+        month 1,
+        day 31,
+        hour 10,
+        minute 1,
+        second 0
+      },
+      update-date std {
+        year 2010,
+        month 1,
+        day 21,
+        hour 0,
+        minute 0,
+        second 0
+      }
+    },
+    {
+      type generif,
+      text "Observational study of gene-disease association and gene-gene
+ interaction. (HuGE Navigator)",
+      refs {
+        pmid 18633131
+      },
+      source {
+        {
+          src {
+            db "HuGENet",
+            tag str "3581.18633131"
+          },
+          anchor "HuGENet"
+        }
+      },
+      create-date std {
+        year 2008,
+        month 9,
+        day 24,
+        hour 21,
+        minute 30,
+        second 0
+      },
+      update-date std {
+        year 2008,
+        month 9,
+        day 24,
+        hour 21,
+        minute 30,
+        second 0
+      }
+    },
+    {
+      type generif,
+      text "primary ATL cells, via IL-9, support the action of
+ IL-9Ralpha/CD14-expressing monocytes, which subsequently support the ex vivo
+ spontaneous proliferation of malignant T cells",
+      refs {
+        pmid 18339896
+      },
+      create-date std {
+        year 2008,
+        month 7,
+        day 12,
+        hour 10,
+        minute 1,
+        second 0
+      },
+      update-date std {
+        year 2010,
+        month 1,
+        day 21,
+        hour 0,
+        minute 0,
+        second 0
+      }
+    },
+    {
+      type generif,
+      text "IL-9R alpha was expressed on human tonsillar B cells, with an
+ ability to transduce signals through activation of signal transducer and
+ activator of transcription 3 and 5.",
+      refs {
+        pmid 17919707
+      },
+      create-date std {
+        year 2008,
+        month 2,
+        day 9,
+        hour 10,
+        minute 1,
+        second 0
+      },
+      update-date std {
+        year 2010,
+        month 1,
+        day 21,
+        hour 0,
+        minute 0,
+        second 0
+      }
+    },
+    {
+      type generif,
+      text "Human bronchial epithelium expresses interleukin-9 receptors.",
+      refs {
+        pmid 11868823
+      },
+      create-date std {
+        year 2007,
+        month 8,
+        day 25,
+        hour 10,
+        minute 2,
+        second 0
+      },
+      update-date std {
+        year 2010,
+        month 1,
+        day 21,
+        hour 0,
+        minute 0,
+        second 0
+      }
+    },
+    {
+      type generif,
+      text "Variants in the IL4RA gene alone may not exert any major influence
+ on susceptibility to asthma-related diseases in childhood, but in combination
+ with other genes, such as IL9R, IL4RA may be an important gene for disease
+ susceptibility",
+      refs {
+        pmid 17083349
+      },
+      create-date std {
+        year 2007,
+        month 8,
+        day 25,
+        hour 10,
+        minute 2,
+        second 0
+      },
+      update-date std {
+        year 2010,
+        month 1,
+        day 21,
+        hour 0,
+        minute 0,
+        second 0
+      }
+    },
+    {
+      type generif,
+      text "IL-9 and its receptor have roles in cell growth and malignant
+ transformation of lymphoid cells associated with constitutive activation of
+ the Jak/STAT pathway [review]",
+      refs {
+        pmid 15621723
+      },
+      create-date std {
+        year 2007,
+        month 8,
+        day 25,
+        hour 10,
+        minute 2,
+        second 0
+      },
+      update-date std {
+        year 2010,
+        month 1,
+        day 21,
+        hour 0,
+        minute 0,
+        second 0
+      }
+    },
+    {
+      type generif,
+      text "variations in the IL9R gene may influence susceptibility to
+ childhood wheezing and atopy, and data support the notion that different
+ haplotypes may have sex specific influences",
+      refs {
+        pmid 15591265
+      },
+      create-date std {
+        year 2007,
+        month 8,
+        day 25,
+        hour 10,
+        minute 2,
+        second 0
+      },
+      update-date std {
+        year 2010,
+        month 1,
+        day 21,
+        hour 0,
+        minute 0,
+        second 0
+      }
+    },
+    {
+      type generif,
+      heading "Interactions",
+      comment {
+        {
+          type generif,
+          text "Two-hybrid",
+          refs {
+            pmid 21988832
+          },
+          source {
+            {
+              src {
+                db "BioGRID",
+                tag id 109795
+              },
+              anchor "BioGRID"
+            }
+          },
+          comment {
+            {
+              type other,
+              source {
+                {
+                  src {
+                    db "BioGRID",
+                    tag id 109795
+                  }
+                }
+              }
+            },
+            {
+              type other,
+              source {
+                {
+                  src {
+                    db "GeneID",
+                    tag id 8738
+                  },
+                  anchor "CRADD"
+                },
+                {
+                  src {
+                    db "BioGRID",
+                    tag id 114275
+                  }
+                }
+              }
+            }
+          },
+          create-date std {
+            year 2013,
+            month 4,
+            day 7,
+            hour 10,
+            minute 36,
+            second 0
+          },
+          update-date std {
+            year 2013,
+            month 12,
+            day 8,
+            hour 11,
+            minute 11,
+            second 0
+          }
+        },
+        {
+          type generif,
+          text "Affinity Capture-Western; Two-hybrid",
+          refs {
+            pmid 10486269
+          },
+          source {
+            {
+              src {
+                db "BioGRID",
+                tag id 109795
+              },
+              anchor "BioGRID"
+            }
+          },
+          comment {
+            {
+              type other,
+              source {
+                {
+                  src {
+                    db "BioGRID",
+                    tag id 109795
+                  }
+                }
+              }
+            },
+            {
+              type other,
+              source {
+                {
+                  src {
+                    db "GeneID",
+                    tag id 10524
+                  },
+                  anchor "KAT5"
+                },
+                {
+                  src {
+                    db "BioGRID",
+                    tag id 115779
+                  }
+                }
+              }
+            }
+          },
+          create-date std {
+            year 2012,
+            month 7,
+            day 8,
+            hour 10,
+            minute 24,
+            second 0
+          },
+          update-date std {
+            year 2013,
+            month 12,
+            day 8,
+            hour 11,
+            minute 11,
+            second 0
+          }
+        },
+        {
+          type generif,
+          refs {
+            pmid 10486269
+          },
+          source {
+            {
+              src {
+                db "HPRD",
+                tag str "02052"
+              },
+              anchor "HPRD"
+            }
+          },
+          comment {
+            {
+              type peptide,
+              source {
+                {
+                  src {
+                    db "Protein",
+                    tag id 116242526
+                  },
+                  anchor "Q01113"
+                }
+              }
+            },
+            {
+              type peptide,
+              source {
+                {
+                  src {
+                    db "GeneID",
+                    tag id 10524
+                  },
+                  anchor "KAT5"
+                },
+                {
+                  src {
+                    db "Protein",
+                    tag id 30923328
+                  },
+                  anchor "Q92993"
+                }
+              }
+            }
+          },
+          create-date std {
+            year 2009,
+            month 12,
+            day 17,
+            hour 15,
+            minute 28,
+            second 0
+          },
+          update-date std {
+            year 2009,
+            month 12,
+            day 17,
+            hour 15,
+            minute 31,
+            second 0
+          }
+        },
+        {
+          type generif,
+          refs {
+            pmid 10642536
+          },
+          source {
+            {
+              src {
+                db "HPRD",
+                tag str "02052"
+              },
+              anchor "HPRD"
+            }
+          },
+          comment {
+            {
+              type peptide,
+              source {
+                {
+                  src {
+                    db "Protein",
+                    tag id 116242526
+                  },
+                  anchor "Q01113"
+                }
+              }
+            },
+            {
+              type peptide,
+              source {
+                {
+                  src {
+                    db "GeneID",
+                    tag id 7534
+                  },
+                  anchor "YWHAZ"
+                },
+                {
+                  src {
+                    db "Protein",
+                    tag id 52000887
+                  },
+                  anchor "P63104"
+                }
+              }
+            }
+          },
+          create-date std {
+            year 2009,
+            month 12,
+            day 17,
+            hour 15,
+            minute 28,
+            second 0
+          },
+          update-date std {
+            year 2009,
+            month 12,
+            day 17,
+            hour 15,
+            minute 31,
+            second 0
+          }
+        },
+        {
+          type generif,
+          refs {
+            pmid 11418623
+          },
+          source {
+            {
+              src {
+                db "HPRD",
+                tag str "02052"
+              },
+              anchor "HPRD"
+            }
+          },
+          comment {
+            {
+              type peptide,
+              source {
+                {
+                  src {
+                    db "Protein",
+                    tag id 116242526
+                  },
+                  anchor "Q01113"
+                }
+              }
+            },
+            {
+              type peptide,
+              source {
+                {
+                  src {
+                    db "GeneID",
+                    tag id 3561
+                  },
+                  anchor "IL2RG"
+                },
+                {
+                  src {
+                    db "Protein",
+                    tag id 400048
+                  },
+                  anchor "P31785"
+                }
+              }
+            }
+          },
+          create-date std {
+            year 2009,
+            month 12,
+            day 17,
+            hour 15,
+            minute 28,
+            second 0
+          },
+          update-date std {
+            year 2009,
+            month 12,
+            day 17,
+            hour 15,
+            minute 31,
+            second 0
+          }
+        },
+        {
+          type generif,
+          refs {
+            pmid 8756628
+          },
+          source {
+            {
+              src {
+                db "HPRD",
+                tag str "02052"
+              },
+              anchor "HPRD"
+            }
+          },
+          comment {
+            {
+              type peptide,
+              source {
+                {
+                  src {
+                    db "Protein",
+                    tag id 116242526
+                  },
+                  anchor "Q01113"
+                }
+              }
+            },
+            {
+              type peptide,
+              source {
+                {
+                  src {
+                    db "GeneID",
+                    tag id 3716
+                  },
+                  anchor "JAK1"
+                },
+                {
+                  src {
+                    db "Protein",
+                    tag id 215274013
+                  },
+                  anchor "P23458"
+                }
+              }
+            }
+          },
+          create-date std {
+            year 2009,
+            month 12,
+            day 17,
+            hour 15,
+            minute 28,
+            second 0
+          },
+          update-date std {
+            year 2009,
+            month 12,
+            day 17,
+            hour 15,
+            minute 31,
+            second 0
+          }
+        },
+        {
+          type generif,
+          refs {
+            pmid 11588013
+          },
+          source {
+            {
+              src {
+                db "HPRD",
+                tag str "02052"
+              },
+              anchor "HPRD"
+            }
+          },
+          comment {
+            {
+              type peptide,
+              source {
+                {
+                  src {
+                    db "Protein",
+                    tag id 116242526
+                  },
+                  anchor "Q01113"
+                }
+              }
+            },
+            {
+              type peptide,
+              source {
+                {
+                  src {
+                    db "GeneID",
+                    tag id 3578
+                  },
+                  anchor "IL9"
+                },
+                {
+                  src {
+                    db "Protein",
+                    tag id 124362
+                  },
+                  anchor "P15248"
+                }
+              }
+            }
+          },
+          create-date std {
+            year 2009,
+            month 12,
+            day 17,
+            hour 15,
+            minute 28,
+            second 0
+          },
+          update-date std {
+            year 2009,
+            month 12,
+            day 17,
+            hour 15,
+            minute 31,
+            second 0
+          }
+        },
+        {
+          type generif,
+          text "Affinity Capture-Western; Two-hybrid",
+          refs {
+            pmid 10642536
+          },
+          source {
+            {
+              src {
+                db "BioGRID",
+                tag id 109795
+              },
+              anchor "BioGRID"
+            }
+          },
+          comment {
+            {
+              type other,
+              source {
+                {
+                  src {
+                    db "BioGRID",
+                    tag id 109795
+                  }
+                }
+              }
+            },
+            {
+              type other,
+              source {
+                {
+                  src {
+                    db "GeneID",
+                    tag id 7534
+                  },
+                  anchor "YWHAZ"
+                },
+                {
+                  src {
+                    db "BioGRID",
+                    tag id 113366
+                  }
+                }
+              }
+            }
+          },
+          create-date std {
+            year 2008,
+            month 12,
+            day 23,
+            hour 9,
+            minute 6,
+            second 0
+          },
+          update-date std {
+            year 2013,
+            month 12,
+            day 8,
+            hour 11,
+            minute 11,
+            second 0
+          }
+        },
+        {
+          type generif,
+          text "Affinity Capture-Western",
+          refs {
+            pmid 8756628
+          },
+          source {
+            {
+              src {
+                db "BioGRID",
+                tag id 109795
+              },
+              anchor "BioGRID"
+            }
+          },
+          comment {
+            {
+              type other,
+              source {
+                {
+                  src {
+                    db "BioGRID",
+                    tag id 109795
+                  }
+                }
+              }
+            },
+            {
+              type other,
+              source {
+                {
+                  src {
+                    db "GeneID",
+                    tag id 3716
+                  },
+                  anchor "JAK1"
+                },
+                {
+                  src {
+                    db "BioGRID",
+                    tag id 109919
+                  }
+                }
+              }
+            }
+          },
+          create-date std {
+            year 2008,
+            month 12,
+            day 23,
+            hour 9,
+            minute 6,
+            second 0
+          },
+          update-date std {
+            year 2013,
+            month 12,
+            day 8,
+            hour 11,
+            minute 11,
+            second 0
+          }
+        }
+      }
+    },
+    {
+      type comment,
+      heading "Pathways",
+      comment {
+        {
+          type comment,
+          text "KEGG pathway: Cytokine-cytokine receptor interaction",
+          source {
+            {
+              src {
+                db "KEGG pathway",
+                tag str "04060"
+              },
+              anchor "04060",
+              url "http://www.genome.jp/dbget-bin/show_pathway?hsa04060+3581"
+            }
+          }
+        },
+        {
+          type comment,
+          text "KEGG pathway: Hematopoietic cell lineage",
+          source {
+            {
+              src {
+                db "KEGG pathway",
+                tag str "04640"
+              },
+              anchor "04640",
+              url "http://www.genome.jp/dbget-bin/show_pathway?hsa04640+3581"
+            }
+          }
+        },
+        {
+          type comment,
+          text "KEGG pathway: Jak-STAT signaling pathway",
+          source {
+            {
+              src {
+                db "KEGG pathway",
+                tag str "04630"
+              },
+              anchor "04630",
+              url "http://www.genome.jp/dbget-bin/show_pathway?hsa04630+3581"
+            }
+          }
+        }
+      }
+    },
+    {
+      type comment,
+      heading "Markers (Sequence Tagged Sites/STS)",
+      comment {
+        {
+          type comment,
+          source {
+            {
+              src {
+                db "UniSTS",
+                tag id 85806
+              },
+              anchor "RH69191",
+              post-text "(e-PCR)"
+            }
+          }
+        },
+        {
+          type comment,
+          source {
+            {
+              src {
+                db "UniSTS",
+                tag id 296037
+              },
+              anchor "ECD15020",
+              post-text "(e-PCR)"
+            }
+          }
+        }
+      }
+    },
+    {
+      type comment,
+      heading "Gene Location History",
+      comment {
+        {
+          type comment,
+          heading "Homo sapiens Annotation Release 105",
+          comment {
+            {
+              type assembly,
+              heading "GRCh37.p13",
+              label "Reference",
+              accession "GCF_000001405",
+              version 25,
+              comment {
+                {
+                  type assembly-unit,
+                  heading "Primary Assembly",
+                  accession "GCF_000001305",
+                  version 13,
+                  comment {
+                    {
+                      type genomic,
+                      label "chromosome Chromosome X",
+                      accession "NC_000023",
+                      version 10,
+                      seqs {
+                        int {
+                          from 155227245,
+                          to 155240481,
+                          strand plus,
+                          id gi 224589822
+                        }
+                      }
+                    },
+                    {
+                      type genomic,
+                      label "chromosome Chromosome Y",
+                      accession "NC_000024",
+                      version 9,
+                      seqs {
+                        int {
+                          from 59330251,
+                          to 59343487,
+                          strand plus,
+                          id gi 224589823
+                        }
+                      }
+                    }
+                  }
+                }
+              }
+            },
+            {
+              type assembly,
+              heading "HuRef",
+              label "Alternate",
+              accession "GCF_000002125",
+              version 1,
+              comment {
+                {
+                  type genomic,
+                  label "chromosome Chromosome X",
+                  accession "AC_000155",
+                  version 1,
+                  seqs {
+                    int {
+                      from 143710175,
+                      to 143723406,
+                      strand plus,
+                      id gi 157734237
+                    }
+                  }
+                }
+              }
+            },
+            {
+              type assembly,
+              heading "CHM1_1.1",
+              label "Alternate",
+              accession "GCF_000306695",
+              version 2,
+              comment {
+                {
+                  type genomic,
+                  label "chromosome Chromosome X",
+                  accession "NC_018934",
+                  version 2,
+                  seqs {
+                    int {
+                      from 155138862,
+                      to 155152088,
+                      strand plus,
+                      id gi 528476524
+                    }
+                  }
+                }
+              }
+            }
+          }
+        },
+        {
+          type comment,
+          heading "Homo sapiens Annotation Release 104",
+          comment {
+            {
+              type assembly,
+              heading "GRCh37.p10",
+              label "Reference",
+              accession "GCF_000001405",
+              version 22,
+              comment {
+                {
+                  type assembly-unit,
+                  heading "Primary Assembly",
+                  accession "GCF_000001305",
+                  version 13,
+                  comment {
+                    {
+                      type genomic,
+                      label "chromosome Chromosome X",
+                      accession "NC_000023",
+                      version 10,
+                      seqs {
+                        int {
+                          from 155227245,
+                          to 155240481,
+                          strand plus,
+                          id gi 224589822
+                        }
+                      }
+                    },
+                    {
+                      type genomic,
+                      label "chromosome Chromosome Y",
+                      accession "NC_000024",
+                      version 9,
+                      seqs {
+                        int {
+                          from 59330251,
+                          to 59343487,
+                          strand plus,
+                          id gi 224589823
+                        }
+                      }
+                    }
+                  }
+                }
+              }
+            },
+            {
+              type assembly,
+              heading "HuRef",
+              label "Alternate",
+              accession "GCF_000002125",
+              version 1,
+              comment {
+                {
+                  type genomic,
+                  label "chromosome Chromosome X",
+                  accession "AC_000155",
+                  version 1,
+                  seqs {
+                    int {
+                      from 143710175,
+                      to 143723406,
+                      strand plus,
+                      id gi 157734237
+                    }
+                  }
+                }
+              }
+            },
+            {
+              type assembly,
+              heading "CHM1_1.0",
+              label "Alternate",
+              accession "GCF_000306695",
+              version 1,
+              comment {
+                {
+                  type genomic,
+                  label "chromosome Chromosome X",
+                  accession "NC_018934",
+                  version 1,
+                  seqs {
+                    int {
+                      from 155094217,
+                      to 155107460,
+                      strand plus,
+                      id gi 409253441
+                    }
+                  }
+                }
+              }
+            }
+          }
+        },
+        {
+          type comment,
+          heading "Build 37.3",
+          comment {
+            {
+              type assembly,
+              heading "GRCh37.p5",
+              label "Reference",
+              accession "GCF_000001405",
+              version 17,
+              comment {
+                {
+                  type assembly-unit,
+                  heading "Primary Assembly",
+                  accession "GCF_000001305",
+                  version 13,
+                  comment {
+                    {
+                      type genomic,
+                      label "chromosome Chromosome X",
+                      accession "NC_000023",
+                      version 10,
+                      seqs {
+                        int {
+                          from 155227245,
+                          to 155240481,
+                          strand plus,
+                          id gi 224589822
+                        }
+                      }
+                    },
+                    {
+                      type genomic,
+                      label "chromosome Chromosome Y",
+                      accession "NC_000024",
+                      version 9,
+                      seqs {
+                        int {
+                          from 59330251,
+                          to 59343487,
+                          strand plus,
+                          id gi 224589823
+                        }
+                      }
+                    }
+                  }
+                }
+              }
+            },
+            {
+              type assembly,
+              heading "HuRef",
+              label "Alternate",
+              accession "GCF_000002125",
+              version 1,
+              comment {
+                {
+                  type assembly-unit,
+                  heading "Primary Assembly",
+                  accession "GCF_000000025",
+                  version 1,
+                  comment {
+                    {
+                      type genomic,
+                      label "chromosome Chromosome X",
+                      accession "AC_000155",
+                      version 1,
+                      seqs {
+                        int {
+                          from 143710175,
+                          to 143723406,
+                          strand plus,
+                          id gi 157734237
+                        }
+                      }
+                    }
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  },
+  unique-keys {
+    {
+      db "HGNC",
+      tag id 6030
+    },
+    {
+      db "LocusID",
+      tag id 3581
+    },
+    {
+      db "MIM",
+      tag id 300007
+    }
+  },
+  xtra-index-terms {
+    "LOC3581"
+  }
+}
+Entrezgene ::= {
+  track-info {
+    geneid 56111,
+    status live,
+    create-date std {
+      year 2000,
+      month 7,
+      day 13
+    },
+    update-date std {
+      year 2013,
+      month 12,
+      day 3,
+      hour 17,
+      minute 40,
+      second 0
+    }
+  },
+  type protein-coding,
+  source {
+    genome genomic,
+    origin natural,
+    org {
+      taxname "Homo sapiens",
+      common "human",
+      db {
+        {
+          db "taxon",
+          tag id 9606
+        }
+      },
+      syn {
+        "man"
+      },
+      orgname {
+        name binomial {
+          genus "Homo",
+          species "sapiens"
+        },
+        lineage "Eukaryota; Metazoa; Chordata; Craniata; Vertebrata;
+ Euteleostomi; Mammalia; Eutheria; Euarchontoglires; Primates; Haplorrhini;
+ Catarrhini; Hominidae; Homo",
+        gcode 1,
+        mgcode 2,
+        div "PRI",
+        pgcode 0
+      }
+    },
+    subtype {
+      {
+        subtype chromosome,
+        name "5"
+      }
+    }
+  },
+  gene {
+    locus "PCDHGA4",
+    desc "protocadherin gamma subfamily A, 4",
+    maploc "5q31",
+    db {
+      {
+        db "HGNC",
+        tag id 8702
+      },
+      {
+        db "Ensembl",
+        tag str "ENSG00000262576"
+      },
+      {
+        db "HPRD",
+        tag str "09381"
+      },
+      {
+        db "MIM",
+        tag id 606291
+      },
+      {
+        db "Vega",
+        tag str "OTTHUMG00000177593"
+      }
+    },
+    syn {
+      "PCDH-GAMMA-A4"
+    }
+  },
+  prot {
+    name {
+      "protocadherin gamma-A4"
+    },
+    desc "protocadherin gamma-A4"
+  },
+  summary "This gene is a member of the protocadherin gamma gene cluster, one
+ of three related clusters tandemly linked on chromosome five. These gene
+ clusters have an immunoglobulin-like organization, suggesting that a novel
+ mechanism may be involved in their regulation and expression. The gamma gene
+ cluster includes 22 genes divided into 3 subfamilies. Subfamily A contains 12
+ genes, subfamily B contains 7 genes and 2 pseudogenes, and the more distantly
+ related subfamily C contains 3 genes. The tandem array of 22 large, variable
+ region exons are followed by a constant region, containing 3 exons shared by
+ all genes in the cluster. Each variable region exon encodes the extracellular
+ region, which includes 6 cadherin ectodomains and a transmembrane region. The
+ constant region exons encode the common cytoplasmic region. These neural
+ cadherin-like cell adhesion proteins most likely play a critical role in the
+ establishment and function of specific cell-cell connections in the brain.
+ Alternative splicing has been described for the gamma cluster genes.
+ [provided by RefSeq, Jul 2008]",
+  location {
+    {
+      display-str "5q31",
+      method map-type cyto
+    }
+  },
+  gene-source {
+    src "LocusLink",
+    src-int 56111,
+    src-str2 "56111"
+  },
+  locus {
+    {
+      type genomic,
+      heading "Reference GRCh37.p13 Primary Assembly",
+      label "chromosome 5 reference GRCh37.p13 Primary Assembly",
+      accession "NC_000005",
+      version 9,
+      seqs {
+        int {
+          from 140734767,
+          to 140892545,
+          strand plus,
+          id gi 224589817
+        }
+      },
+      products {
+        {
+          type mRNA,
+          heading "Reference",
+          label "transcript variant 1",
+          accession "NM_018917",
+          version 2,
+          genomic-coords {
+            mix {
+              int {
+                from 140734767,
+                to 140737187,
+                strand plus,
+                id gi 224589817
+              },
+              int {
+                from 140874373,
+                to 140874431,
+                strand plus,
+                id gi 224589817
+              },
+              int {
+                from 140884959,
+                to 140885047,
+                strand plus,
+                id gi 224589817
+              },
+              int {
+                from 140890513,
+                to 140892545,
+                strand plus,
+                id gi 224589817
+              }
+            }
+          },
+          seqs {
+            whole gi 14196466
+          },
+          products {
+            {
+              type peptide,
+              heading "Reference",
+              label "isoform 1 precursor",
+              accession "NP_061740",
+              version 1,
+              source {
+                {
+                  src {
+                    db "CCDS",
+                    tag str "CCDS58979.1"
+                  },
+                  anchor "CCDS58979.1"
+                }
+              },
+              genomic-coords {
+                mix {
+                  int {
+                    from 140734767,
+                    to 140737187,
+                    strand plus,
+                    id gi 224589817
+                  },
+                  int {
+                    from 140874373,
+                    to 140874431,
+                    strand plus,
+                    id gi 224589817
+                  },
+                  int {
+                    from 140884959,
+                    to 140885047,
+                    strand plus,
+                    id gi 224589817
+                  },
+                  int {
+                    from 140890513,
+                    to 140890739,
+                    strand plus,
+                    id gi 224589817
+                  }
+                }
+              },
+              seqs {
+                whole gi 11056026
+              }
+            }
+          }
+        },
+        {
+          type mRNA,
+          heading "Reference",
+          label "transcript variant 2",
+          accession "NM_032053",
+          version 1,
+          genomic-coords {
+            int {
+              from 140734767,
+              to 140737295,
+              strand plus,
+              id gi 224589817
+            }
+          },
+          seqs {
+            whole gi 14196467
+          },
+          products {
+            {
+              type peptide,
+              heading "Reference",
+              label "isoform 2",
+              accession "NP_114442",
+              version 1,
+              genomic-coords {
+                int {
+                  from 140734767,
+                  to 140737229,
+                  strand plus,
+                  id gi 224589817
+                }
+              },
+              seqs {
+                whole gi 14196468
+              }
+            }
+          }
+        }
+      }
+    },
+    {
+      type genomic,
+      heading "Reference assembly",
+      label "genomic region",
+      accession "NG_000012",
+      version 2,
+      seqs {
+        int {
+          from 65221,
+          to 223175,
+          strand plus,
+          id gi 50284693
+        }
+      },
+      products {
+        {
+          type mRNA,
+          heading "Reference",
+          label "transcript variant 1",
+          accession "NM_018917",
+          version 3,
+          genomic-coords {
+            mix {
+              int {
+                from 65221,
+                to 67817,
+                strand plus,
+                id gi 50284693
+              },
+              int {
+                from 205003,
+                to 205061,
+                strand plus,
+                id gi 50284693
+              },
+              int {
+                from 215589,
+                to 215677,
+                strand plus,
+                id gi 50284693
+              },
+              int {
+                from 221143,
+                to 223175,
+                strand plus,
+                id gi 50284693
+              }
+            }
+          },
+          seqs {
+            whole gi 523567547
+          }
+        },
+        {
+          type mRNA,
+          heading "Reference",
+          label "transcript variant 2",
+          accession "NM_032053",
+          version 2,
+          genomic-coords {
+            int {
+              from 65221,
+              to 67926,
+              strand plus,
+              id gi 50284693
+            }
+          },
+          seqs {
+            whole gi 523567549
+          },
+          products {
+            {
+              type peptide,
+              heading "Reference",
+              label "isoform 1 precursor",
+              accession "NP_061740",
+              version 2,
+              source {
+                {
+                  src {
+                    db "CCDS",
+                    tag str "CCDS58979.1"
+                  },
+                  anchor "CCDS58979.1"
+                }
+              },
+              genomic-coords {
+                mix {
+                  int {
+                    from 65304,
+                    to 67817,
+                    strand plus,
+                    id gi 50284693
+                  },
+                  int {
+                    from 205003,
+                    to 205061,
+                    strand plus,
+                    id gi 50284693
+                  },
+                  int {
+                    from 215589,
+                    to 215677,
+                    strand plus,
+                    id gi 50284693
+                  },
+                  int {
+                    from 221143,
+                    to 221369,
+                    strand plus,
+                    id gi 50284693
+                  }
+                }
+              },
+              seqs {
+                whole gi 523567548
+              }
+            },
+            {
+              type peptide,
+              heading "Reference",
+              label "isoform 2 precursor",
+              accession "NP_114442",
+              version 2,
+              genomic-coords {
+                int {
+                  from 65304,
+                  to 67859,
+                  strand plus,
+                  id gi 50284693
+                }
+              },
+              seqs {
+                whole gi 523567550
+              }
+            }
+          }
+        }
+      }
+    },
+    {
+      type genomic,
+      heading "Alternate CHM1_1.1",
+      label "chromosome 5 alternate CHM1_1.1",
+      accession "NC_018916",
+      version 2,
+      seqs {
+        int {
+          from 140167974,
+          to 140325822,
+          strand plus,
+          id gi 528476642
+        }
+      },
+      products {
+        {
+          type mRNA,
+          heading "Reference",
+          label "transcript variant 1",
+          accession "NM_018917",
+          version 2,
+          genomic-coords {
+            mix {
+              int {
+                from 140167974,
+                to 140170394,
+                strand plus,
+                id gi 528476642
+              },
+              int {
+                from 140307638,
+                to 140307696,
+                strand plus,
+                id gi 528476642
+              },
+              int {
+                from 140318237,
+                to 140318325,
+                strand plus,
+                id gi 528476642
+              },
+              int {
+                from 140323790,
+                to 140325822,
+                strand plus,
+                id gi 528476642
+              }
+            }
+          },
+          seqs {
+            whole gi 14196466
+          },
+          products {
+            {
+              type peptide,
+              heading "Reference",
+              label "isoform 1 precursor",
+              accession "NP_061740",
+              version 1,
+              genomic-coords {
+                mix {
+                  int {
+                    from 140167974,
+                    to 140170394,
+                    strand plus,
+                    id gi 528476642
+                  },
+                  int {
+                    from 140307638,
+                    to 140307696,
+                    strand plus,
+                    id gi 528476642
+                  },
+                  int {
+                    from 140318237,
+                    to 140318325,
+                    strand plus,
+                    id gi 528476642
+                  },
+                  int {
+                    from 140323790,
+                    to 140324016,
+                    strand plus,
+                    id gi 528476642
+                  }
+                }
+              },
+              seqs {
+                whole gi 11056026
+              }
+            }
+          }
+        },
+        {
+          type mRNA,
+          heading "Reference",
+          label "transcript variant 2",
+          accession "NM_032053",
+          version 1,
+          genomic-coords {
+            int {
+              from 140167974,
+              to 140170502,
+              strand plus,
+              id gi 528476642
+            }
+          },
+          seqs {
+            whole gi 14196467
+          },
+          products {
+            {
+              type peptide,
+              heading "Reference",
+              label "isoform 2",
+              accession "NP_114442",
+              version 1,
+              genomic-coords {
+                int {
+                  from 140167974,
+                  to 140170436,
+                  strand plus,
+                  id gi 528476642
+                }
+              },
+              seqs {
+                whole gi 14196468
+              }
+            }
+          }
+        }
+      }
+    },
+    {
+      type genomic,
+      heading "Alternate HuRef",
+      label "chromosome 5 alternate HuRef",
+      accession "AC_000137",
+      version 1,
+      seqs {
+        int {
+          from 135879842,
+          to 136037385,
+          strand plus,
+          id gi 157734151
+        }
+      },
+      products {
+        {
+          type mRNA,
+          heading "Reference",
+          label "transcript variant 1",
+          accession "NM_018917",
+          version 2,
+          genomic-coords {
+            mix {
+              int {
+                from 135879842,
+                to 135882262,
+                strand plus,
+                id gi 157734151
+              },
+              int {
+                from 136019211,
+                to 136019269,
+                strand plus,
+                id gi 157734151
+              },
+              int {
+                from 136029799,
+                to 136029887,
+                strand plus,
+                id gi 157734151
+              },
+              int {
+                from 136035353,
+                to 136037385,
+                strand plus,
+                id gi 157734151
+              }
+            }
+          },
+          seqs {
+            whole gi 14196466
+          },
+          products {
+            {
+              type peptide,
+              heading "Reference",
+              label "isoform 1 precursor",
+              accession "NP_061740",
+              version 1,
+              genomic-coords {
+                mix {
+                  int {
+                    from 135879842,
+                    to 135882262,
+                    strand plus,
+                    id gi 157734151
+                  },
+                  int {
+                    from 136019211,
+                    to 136019269,
+                    strand plus,
+                    id gi 157734151
+                  },
+                  int {
+                    from 136029799,
+                    to 136029887,
+                    strand plus,
+                    id gi 157734151
+                  },
+                  int {
+                    from 136035353,
+                    to 136035579,
+                    strand plus,
+                    id gi 157734151
+                  }
+                }
+              },
+              seqs {
+                whole gi 11056026
+              }
+            }
+          }
+        },
+        {
+          type mRNA,
+          heading "Reference",
+          label "transcript variant 2",
+          accession "NM_032053",
+          version 1,
+          genomic-coords {
+            int {
+              from 135879842,
+              to 135882370,
+              strand plus,
+              id gi 157734151
+            }
+          },
+          seqs {
+            whole gi 14196467
+          },
+          products {
+            {
+              type peptide,
+              heading "Reference",
+              label "isoform 2",
+              accession "NP_114442",
+              version 1,
+              genomic-coords {
+                int {
+                  from 135879842,
+                  to 135882304,
+                  strand plus,
+                  id gi 157734151
+                }
+              },
+              seqs {
+                whole gi 14196468
+              }
+            }
+          }
+        }
+      }
+    }
+  },
+  properties {
+    {
+      type comment,
+      label "Nomenclature",
+      source {
+        {
+          anchor "HUGO Gene Nomenclature Committee"
+        }
+      },
+      properties {
+        {
+          type property,
+          label "Official Symbol",
+          text "PCDHGA4"
+        },
+        {
+          type property,
+          label "Official Full Name",
+          text "protocadherin gamma subfamily A, 4"
+        }
+      }
+    },
+    {
+      type comment,
+      heading "GeneOntology",
+      source {
+        {
+          pre-text "Provided by",
+          anchor "GOA",
+          url "http://www.ebi.ac.uk/GOA/"
+        }
+      },
+      comment {
+        {
+          type comment,
+          label "Function",
+          comment {
+            {
+              type comment,
+              source {
+                {
+                  src {
+                    db "GO",
+                    tag id 5509
+                  },
+                  anchor "calcium ion binding",
+                  post-text "evidence: IEA"
+                }
+              }
+            }
+          }
+        },
+        {
+          type comment,
+          label "Process",
+          comment {
+            {
+              type comment,
+              source {
+                {
+                  src {
+                    db "GO",
+                    tag id 7156
+                  },
+                  anchor "homophilic cell adhesion",
+                  post-text "evidence: IEA"
+                }
+              }
+            }
+          }
+        },
+        {
+          type comment,
+          label "Component",
+          comment {
+            {
+              type comment,
+              source {
+                {
+                  src {
+                    db "GO",
+                    tag id 16021
+                  },
+                  anchor "integral to membrane",
+                  post-text "evidence: IEA"
+                }
+              }
+            },
+            {
+              type comment,
+              source {
+                {
+                  src {
+                    db "GO",
+                    tag id 5886
+                  },
+                  anchor "plasma membrane",
+                  post-text "evidence: IEA"
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  },
+  homology {
+    {
+      type comment,
+      heading "Mouse, Rat",
+      source {
+        {
+          src {
+            db "HomoloGene",
+            tag id 81866
+          },
+          anchor "Map Viewer",
+          url "http://www.ncbi.nlm.nih.gov/mapview/maps.cgi?taxid=9606&chr=5&M
+APS=genes-r-org/rat-chr/human%3A5,genes-r-org/mouse-chr/human%3A5,genes-r-org/
+human-chr5&query=e%3A56111[egene_id]+AND+gene[obj_type]&QSTR=pcdhga4&cmd=focus
+&fill=10"
+        }
+      }
+    }
+  },
+  comments {
+    {
+      type comment,
+      heading "RefSeq Status",
+      label "REVIEWED"
+    },
+    {
+      type comment,
+      refs {
+        pmid 16344560,
+        pmid 11230163,
+        pmid 10835267,
+        pmid 10817752,
+        pmid 10716726,
+        pmid 10380929
+      }
+    },
+    {
+      type comment,
+      heading "NCBI Reference Sequences (RefSeq)",
+      comment {
+        {
+          type comment,
+          heading "RefSeqs maintained independently of Annotated Genomes",
+          products {
+            {
+              type mRNA,
+              heading "mRNA Sequence",
+              accession "NM_018917",
+              version 3,
+              source {
+                {
+                  src {
+                    db "Nucleotide",
+                    tag id 523567547
+                  },
+                  anchor "NM_018917"
+                }
+              },
+              seqs {
+                whole gi 523567547
+              },
+              products {
+                {
+                  type peptide,
+                  heading "Product",
+                  accession "NP_061740",
+                  version 2,
+                  source {
+                    {
+                      src {
+                        db "Protein",
+                        tag id 523567548
+                      },
+                      anchor "NP_061740",
+                      post-text "protocadherin gamma-A4 isoform 1 precursor"
+                    }
+                  },
+                  seqs {
+                    whole gi 523567548
+                  },
+                  comment {
+                    {
+                      type other,
+                      heading "Conserved Domains",
+                      source {
+                        {
+                          pre-text "(6)",
+                          anchor "summary"
+                        }
+                      },
+                      comment {
+                        {
+                          type other,
+                          source {
+                            {
+                              src {
+                                db "CDD",
+                                tag id 206637
+                              },
+                              anchor "cd11304: Cadherin_repeat; Cadherin
+ tandem repeat domain"
+                            }
+                          },
+                          comment {
+                            {
+                              type other,
+                              text "Location: 277 - 374  Blast Score: 278"
+                            },
+                            {
+                              type other,
+                              text "Location: 393 - 479  Blast Score: 236"
+                            },
+                            {
+                              type other,
+                              text "Location: 170 - 269  Blast Score: 227"
+                            },
+                            {
+                              type other,
+                              text "Location: 610 - 697  Blast Score: 223"
+                            },
+                            {
+                              type other,
+                              text "Location: 487 - 589  Blast Score: 221"
+                            },
+                            {
+                              type other,
+                              text "Location: 64 - 160  Blast Score: 123"
+                            }
+                          }
+                        }
+                      }
+                    },
+                    {
+                      type other,
+                      heading "Related",
+                      source {
+                        {
+                          src {
+                            db "Ensembl",
+                            tag str "ENSP00000458570"
+                          }
+                        }
+                      }
+                    },
+                    {
+                      type other,
+                      heading "UniProtKB",
+                      source {
+                      },
+                      comment {
+                        {
+                          type other,
+                          source {
+                            {
+                              src {
+                                db "UniProtKB/Swiss-Prot",
+                                tag str "Q9Y5G9"
+                              },
+                              anchor "Q9Y5G9"
+                            }
+                          }
+                        }
+                      }
+                    },
+                    {
+                      type other,
+                      heading "Consensus CDS (CCDS)",
+                      source {
+                        {
+                          src {
+                            db "CCDS",
+                            tag str "CCDS58979.1"
+                          },
+                          anchor "CCDS58979.1"
+                        }
+                      },
+                      comment {
+                        {
+                          type other,
+                          heading "CCDS Note",
+                          text "The coding region has been updated to extend
+ the N-terminus to one that is more supported by the available transcript and
+ primate conservation data. "
+                        }
+                      }
+                    },
+                    {
+                      type other,
+                      heading "Related",
+                      source {
+                        {
+                          src {
+                            db "Vega",
+                            tag str "OTTHUMP00000257173"
+                          }
+                        }
+                      }
+                    }
+                  }
+                }
+              },
+              comment {
+                {
+                  type comment,
+                  label "RefSeq Status",
+                  text "REVIEWED"
+                },
+                {
+                  type comment,
+                  heading "Transcriptional Variant",
+                  comment {
+                    {
+                      type comment,
+                      text "Transcript Variant: This variant (1) includes the
+ constant region exons and encodes the longest isoform (1)."
+                    }
+                  }
+                },
+                {
+                  type other,
+                  heading "Source Sequence",
+                  source {
+                    {
+                      src {
+                        db "Nucleotide",
+                        tag str "AF152324,DA392480"
+                      },
+                      anchor "AF152324,DA392480"
+                    }
+                  }
+                },
+                {
+                  type other,
+                  heading "Related",
+                  source {
+                    {
+                      src {
+                        db "Ensembl",
+                        tag str "ENST00000571252"
+                      }
+                    }
+                  }
+                },
+                {
+                  type other,
+                  heading "Related",
+                  source {
+                    {
+                      src {
+                        db "Vega",
+                        tag str "OTTHUMT00000437959"
+                      }
+                    }
+                  }
+                }
+              }
+            },
+            {
+              type mRNA,
+              heading "mRNA Sequence",
+              accession "NM_032053",
+              version 2,
+              source {
+                {
+                  src {
+                    db "Nucleotide",
+                    tag id 523567549
+                  },
+                  anchor "NM_032053"
+                }
+              },
+              seqs {
+                whole gi 523567549
+              },
+              products {
+                {
+                  type peptide,
+                  heading "Product",
+                  accession "NP_114442",
+                  version 2,
+                  source {
+                    {
+                      src {
+                        db "Protein",
+                        tag id 523567550
+                      },
+                      anchor "NP_114442",
+                      post-text "protocadherin gamma-A4 isoform 2 precursor"
+                    }
+                  },
+                  seqs {
+                    whole gi 523567550
+                  },
+                  comment {
+                    {
+                      type other,
+                      heading "Conserved Domains",
+                      source {
+                        {
+                          pre-text "(6)",
+                          anchor "summary"
+                        }
+                      },
+                      comment {
+                        {
+                          type other,
+                          source {
+                            {
+                              src {
+                                db "CDD",
+                                tag id 206637
+                              },
+                              anchor "cd11304: Cadherin_repeat; Cadherin
+ tandem repeat domain"
+                            }
+                          },
+                          comment {
+                            {
+                              type other,
+                              text "Location: 277 - 374  Blast Score: 275"
+                            },
+                            {
+                              type other,
+                              text "Location: 393 - 479  Blast Score: 233"
+                            },
+                            {
+                              type other,
+                              text "Location: 170 - 269  Blast Score: 224"
+                            },
+                            {
+                              type other,
+                              text "Location: 610 - 697  Blast Score: 220"
+                            },
+                            {
+                              type other,
+                              text "Location: 487 - 589  Blast Score: 218"
+                            },
+                            {
+                              type other,
+                              text "Location: 64 - 160  Blast Score: 121"
+                            }
+                          }
+                        }
+                      }
+                    },
+                    {
+                      type other,
+                      heading "UniProtKB",
+                      source {
+                      },
+                      comment {
+                        {
+                          type other,
+                          source {
+                            {
+                              src {
+                                db "UniProtKB/Swiss-Prot",
+                                tag str "Q9Y5G9"
+                              },
+                              anchor "Q9Y5G9"
+                            }
+                          }
+                        }
+                      }
+                    }
+                  }
+                }
+              },
+              comment {
+                {
+                  type comment,
+                  label "RefSeq Status",
+                  text "REVIEWED"
+                },
+                {
+                  type comment,
+                  heading "Transcriptional Variant",
+                  comment {
+                    {
+                      type comment,
+                      text "Transcript Variant: This variant (2) utilizes the
+ large, first exon then continues into the downstream intron 1 sequence before
+ terminating. This one-exon transcript encodes the shorter isoform (2)."
+                    }
+                  }
+                },
+                {
+                  type other,
+                  heading "Source Sequence",
+                  source {
+                    {
+                      src {
+                        db "Nucleotide",
+                        tag str "AF152511,BX100615,DA392480"
+                      },
+                      anchor "AF152511,BX100615,DA392480"
+                    }
+                  }
+                }
+              }
+            }
+          },
+          comment {
+            {
+              type genomic,
+              heading "Reference",
+              accession "NG_000012",
+              version 2,
+              source {
+                {
+                  src {
+                    db "Nucleotide",
+                    tag id 50284693
+                  },
+                  anchor "NG_000012"
+                }
+              },
+              seqs {
+                int {
+                  from 65221,
+                  to 223175,
+                  strand plus,
+                  id gi 50284693
+                }
+              }
+            }
+          }
+        },
+        {
+          type comment,
+          heading "RefSeqs of Annotated Genomes: Homo sapiens Annotation
+ Release 105",
+          products {
+            {
+              type genomic,
+              heading "Reference GRCh37.p13 Primary Assembly",
+              accession "NC_000005",
+              version 9,
+              source {
+                {
+                  src {
+                    db "Nucleotide",
+                    tag id 224589817
+                  }
+                }
+              },
+              seqs {
+                int {
+                  from 140734767,
+                  to 140892545,
+                  strand plus,
+                  id gi 224589817
+                }
+              }
+            },
+            {
+              type genomic,
+              heading "Alternate HuRef",
+              accession "AC_000137",
+              version 1,
+              source {
+                {
+                  src {
+                    db "Nucleotide",
+                    tag id 157734151
+                  }
+                }
+              },
+              seqs {
+                int {
+                  from 135879842,
+                  to 136037385,
+                  strand plus,
+                  id gi 157734151
+                }
+              }
+            },
+            {
+              type genomic,
+              heading "Alternate CHM1_1.1",
+              accession "NC_018916",
+              version 2,
+              source {
+                {
+                  src {
+                    db "Nucleotide",
+                    tag id 528476642
+                  }
+                }
+              },
+              seqs {
+                int {
+                  from 140167974,
+                  to 140325822,
+                  strand plus,
+                  id gi 528476642
+                }
+              }
+            }
+          }
+        }
+      }
+    },
+    {
+      type comment,
+      heading "Related Sequences",
+      products {
+        {
+          type genomic,
+          heading "Genomic",
+          accession "ABBA01026410",
+          version 1,
+          source {
+            {
+              src {
+                db "Nucleotide",
+                tag id 148165753
+              },
+              anchor "ABBA01026410"
+            }
+          },
+          seqs {
+            int {
+              from 18242,
+              to 75873,
+              strand minus,
+              id gi 148165753
+            }
+          },
+          products {
+            {
+              type peptide,
+              text "None"
+            }
+          }
+        },
+        {
+          type genomic,
+          heading "Genomic",
+          accession "ABBA01026411",
+          version 1,
+          source {
+            {
+              src {
+                db "Nucleotide",
+                tag id 148165752
+              },
+              anchor "ABBA01026411"
+            }
+          },
+          products {
+            {
+              type peptide,
+              text "None"
+            }
+          }
+        },
+        {
+          type genomic,
+          heading "Genomic",
+          accession "ABBA01026412",
+          version 1,
+          source {
+            {
+              src {
+                db "Nucleotide",
+                tag id 148165751
+              },
+              anchor "ABBA01026412"
+            }
+          },
+          products {
+            {
+              type peptide,
+              text "None"
+            }
+          }
+        },
+        {
+          type genomic,
+          heading "Genomic",
+          accession "ABBA01026413",
+          version 1,
+          source {
+            {
+              src {
+                db "Nucleotide",
+                tag id 148165750
+              },
+              anchor "ABBA01026413"
+            }
+          },
+          products {
+            {
+              type peptide,
+              text "None"
+            }
+          }
+        },
+        {
+          type genomic,
+          heading "Genomic",
+          accession "ABBA01026414",
+          version 1,
+          source {
+            {
+              src {
+                db "Nucleotide",
+                tag id 148165749
+              },
+              anchor "ABBA01026414"
+            }
+          },
+          products {
+            {
+              type peptide,
+              text "None"
+            }
+          }
+        },
+        {
+          type genomic,
+          heading "Genomic",
+          accession "ABBA01026415",
+          version 1,
+          source {
+            {
+              src {
+                db "Nucleotide",
+                tag id 148165748
+              },
+              anchor "ABBA01026415"
+            }
+          },
+          products {
+            {
+              type peptide,
+              text "None"
+            }
+          }
+        },
+        {
+          type genomic,
+          heading "Genomic",
+          accession "ABBA01026416",
+          version 1,
+          source {
+            {
+              src {
+                db "Nucleotide",
+                tag id 148165747
+              },
+              anchor "ABBA01026416"
+            }
+          },
+          products {
+            {
+              type peptide,
+              text "None"
+            }
+          }
+        },
+        {
+          type genomic,
+          heading "Genomic",
+          accession "ABBA01026417",
+          version 1,
+          source {
+            {
+              src {
+                db "Nucleotide",
+                tag id 148165746
+              },
+              anchor "ABBA01026417"
+            }
+          },
+          products {
+            {
+              type peptide,
+              text "None"
+            }
+          }
+        },
+        {
+          type genomic,
+          heading "Genomic",
+          accession "AC005366",
+          version 1,
+          source {
+            {
+              src {
+                db "Nucleotide",
+                tag id 3367508
+              },
+              anchor "AC005366"
+            }
+          },
+          seqs {
+            int {
+              from 17974,
+              to 36136,
+              strand minus,
+              id gi 3367508
+            }
+          },
+          products {
+            {
+              type peptide,
+              text "None"
+            }
+          }
+        },
+        {
+          type genomic,
+          heading "Genomic",
+          accession "AC005618",
+          version 1,
+          source {
+            {
+              src {
+                db "Nucleotide",
+                tag id 3548785
+              },
+              anchor "AC005618"
+            }
+          },
+          seqs {
+            int {
+              from 66536,
+              to 176713,
+              strand plus,
+              id gi 3548785
+            }
+          },
+          products {
+            {
+              type peptide,
+              text "None"
+            }
+          }
+        },
+        {
+          type genomic,
+          heading "Genomic",
+          accession "AC008781",
+          version 7,
+          source {
+            {
+              src {
+                db "Nucleotide",
+                tag id 16303400
+              },
+              anchor "AC008781"
+            }
+          },
+          seqs {
+            int {
+              from 138117,
+              to 185893,
+              strand minus,
+              id gi 16303400
+            }
+          },
+          products {
+            {
+              type peptide,
+              text "None"
+            }
+          }
+        },
+        {
+          type genomic,
+          heading "Genomic",
+          accession "AL832028",
+          version 1,
+          source {
+            {
+              src {
+                db "Nucleotide",
+                tag id 21732568
+              },
+              anchor "AL832028"
+            }
+          },
+          seqs {
+            whole gi 21732568
+          },
+          products {
+            {
+              type peptide,
+              text "None"
+            }
+          }
+        },
+        {
+          type genomic,
+          heading "Genomic",
+          accession "AMYH02012344",
+          version 1,
+          source {
+            {
+              src {
+                db "Nucleotide",
+                tag id 511816418
+              },
+              anchor "AMYH02012344"
+            }
+          },
+          seqs {
+            int {
+              from 151138,
+              to 175836,
+              strand plus,
+              id gi 511816418
+            }
+          },
+          products {
+            {
+              type peptide,
+              text "None"
+            }
+          }
+        },
+        {
+          type genomic,
+          heading "Genomic",
+          accession "AMYH02012345",
+          version 1,
+          source {
+            {
+              src {
+                db "Nucleotide",
+                tag id 511816417
+              },
+              anchor "AMYH02012345"
+            }
+          },
+          products {
+            {
+              type peptide,
+              text "None"
+            }
+          }
+        },
+        {
+          type genomic,
+          heading "Genomic",
+          accession "AMYH02012346",
+          version 1,
+          source {
+            {
+              src {
+                db "Nucleotide",
+                tag id 511816416
+              },
+              anchor "AMYH02012346"
+            }
+          },
+          products {
+            {
+              type peptide,
+              text "None"
+            }
+          }
+        },
+        {
+          type genomic,
+          heading "Genomic",
+          accession "CH471062",
+          version 2,
+          source {
+            {
+              src {
+                db "Nucleotide",
+                tag id 74230048
+              },
+              anchor "CH471062"
+            }
+          },
+          seqs {
+            whole gi 74230048
+          },
+          products {
+            {
+              type peptide,
+              accession "EAW61957",
+              version 1,
+              source {
+                {
+                  src {
+                    db "Protein",
+                    tag id 119582361
+                  },
+                  anchor "EAW61957"
+                }
+              },
+              seqs {
+                whole gi 119582361
+              }
+            },
+            {
+              type peptide,
+              accession "EAW61964",
+              version 1,
+              source {
+                {
+                  src {
+                    db "Protein",
+                    tag id 119582368
+                  },
+                  anchor "EAW61964"
+                }
+              },
+              seqs {
+                whole gi 119582368
+              }
+            }
+          }
+        },
+        {
+          type mRNA,
+          heading "mRNA",
+          accession "AF152324",
+          version 1,
+          source {
+            {
+              src {
+                db "Nucleotide",
+                tag id 5456939
+              },
+              anchor "AF152324"
+            }
+          },
+          seqs {
+            whole gi 5456939
+          },
+          products {
+            {
+              type peptide,
+              accession "AAD43718",
+              version 1,
+              source {
+                {
+                  src {
+                    db "Protein",
+                    tag id 5456940
+                  },
+                  anchor "AAD43718"
+                }
+              },
+              seqs {
+                whole gi 5456940
+              }
+            }
+          }
+        },
+        {
+          type mRNA,
+          heading "mRNA",
+          accession "AF152511",
+          version 1,
+          source {
+            {
+              src {
+                db "Nucleotide",
+                tag id 5457069
+              },
+              anchor "AF152511"
+            }
+          },
+          seqs {
+            whole gi 5457069
+          },
+          products {
+            {
+              type peptide,
+              accession "AAD43771",
+              version 1,
+              source {
+                {
+                  src {
+                    db "Protein",
+                    tag id 5457070
+                  },
+                  anchor "AAD43771"
+                }
+              },
+              seqs {
+                whole gi 5457070
+              }
+            }
+          }
+        },
+        {
+          type mRNA,
+          heading "mRNA",
+          accession "AI805761",
+          version 1,
+          source {
+            {
+              src {
+                db "Nucleotide",
+                tag id 5392327
+              },
+              anchor "AI805761"
+            }
+          },
+          seqs {
+            whole gi 5392327
+          },
+          products {
+            {
+              type peptide,
+              text "None"
+            }
+          }
+        },
+        {
+          type mRNA,
+          heading "mRNA",
+          accession "BX100615",
+          version 1,
+          source {
+            {
+              src {
+                db "Nucleotide",
+                tag id 27830686
+              },
+              anchor "BX100615"
+            }
+          },
+          seqs {
+            whole gi 27830686
+          },
+          products {
+            {
+              type peptide,
+              text "None"
+            }
+          }
+        },
+        {
+          type mRNA,
+          heading "mRNA",
+          accession "DA392480",
+          version 1,
+          source {
+            {
+              src {
+                db "Nucleotide",
+                tag id 80578107
+              },
+              anchor "DA392480"
+            }
+          },
+          seqs {
+            whole gi 80578107
+          },
+          products {
+            {
+              type peptide,
+              text "None"
+            }
+          }
+        },
+        {
+          type other,
+          text "None",
+          products {
+            {
+              type peptide,
+              accession "Q9Y5G9",
+              version 1,
+              source {
+                {
+                  src {
+                    db "Protein",
+                    tag id 37999839
+                  }
+                },
+                {
+                  src {
+                    db "UniProtKB/Swiss-Prot",
+                    tag str "Q9Y5G9"
+                  }
+                }
+              },
+              seqs {
+                whole gi 37999839
+              }
+            }
+          }
+        },
+        {
+          type other-genetic,
+          heading "Synthetic",
+          accession "BC152812",
+          version 1,
+          source {
+            {
+              src {
+                db "Nucleotide",
+                tag id 157170235
+              },
+              anchor "BC152812"
+            }
+          },
+          seqs {
+            whole gi 157170235
+          },
+          products {
+            {
+              type peptide,
+              accession "AAI52813",
+              version 1,
+              source {
+                {
+                  src {
+                    db "Protein",
+                    tag id 157170236
+                  },
+                  anchor "AAI52813"
+                }
+              },
+              seqs {
+                whole gi 157170236
+              }
+            }
+          }
+        },
+        {
+          type other-genetic,
+          heading "Synthetic",
+          accession "BC156730",
+          version 1,
+          source {
+            {
+              src {
+                db "Nucleotide",
+                tag id 162318805
+              },
+              anchor "BC156730"
+            }
+          },
+          seqs {
+            whole gi 162318805
+          },
+          products {
+            {
+              type peptide,
+              accession "AAI56731",
+              version 1,
+              source {
+                {
+                  src {
+                    db "Protein",
+                    tag id 162318806
+                  },
+                  anchor "AAI56731"
+                }
+              },
+              seqs {
+                whole gi 162318806
+              }
+            }
+          }
+        }
+      }
+    },
+    {
+      type comment,
+      heading "Additional Links",
+      comment {
+        {
+          type comment,
+          source {
+            {
+              src {
+                db "Evidence Viewer",
+                tag str "56111"
+              },
+              anchor "Evidence Viewer",
+              url "http://www.ncbi.nlm.nih.gov/sutils/evv.cgi?taxid=9606&conti
+g=NT_029289.11&gene=PCDHGA4&lid=56111&from=1897694&to=2055472"
+            }
+          }
+        },
+        {
+          type comment,
+          text "MIM",
+          source {
+            {
+              src {
+                db "MIM",
+                tag id 606291
+              },
+              anchor "606291"
+            }
+          }
+        },
+        {
+          type comment,
+          source {
+            {
+              src {
+                db "AceView",
+                tag id 56111
+              },
+              anchor "AceView",
+              url "http://www.ncbi.nlm.nih.gov/IEB/Research/Acembly/av.cgi?c=g
+eneid&org=9606&l=56111"
+            }
+          }
+        },
+        {
+          type comment,
+          text "UCSC",
+          source {
+            {
+              src {
+                db "UCSC",
+                tag str "UCSC"
+              },
+              anchor "UCSC",
+              url "http://genome.ucsc.edu/cgi-bin/hgTracks?org=human&position=
+NM_018917"
+            }
+          }
+        },
+        {
+          type comment,
+          source {
+            {
+              src {
+                db "MGC",
+                tag str "BC152812,BC156730"
+              },
+              anchor "MGC",
+              url "http://mgc.nci.nih.gov/Genes/CloneList?ORG=Hs&LIST=BC152812
+,BC156730"
+            }
+          }
+        },
+        {
+          type comment,
+          source {
+            {
+              src {
+                db "KEGG",
+                tag str "hsa:56111"
+              },
+              url "http://www.genome.jp/dbget-bin/www_bget?hsa:56111"
+            }
+          }
+        },
+        {
+          type comment,
+          text "UniGene",
+          xtra-properties {
+            {
+              tag "UNIGENE",
+              value "Hs.368160"
+            }
+          },
+          source {
+            {
+              src {
+                db "UniGene",
+                tag str "Hs.368160"
+              },
+              anchor "Hs.368160",
+              url "http://www.ncbi.nlm.nih.gov/UniGene/clust.cgi?ORG=Hs&CID=36
+8160"
+            }
+          }
+        }
+      }
+    },
+    {
+      type comment,
+      heading "Markers (Sequence Tagged Sites/STS)",
+      comment {
+        {
+          type comment,
+          source {
+            {
+              src {
+                db "UniSTS",
+                tag id 68872
+              },
+              anchor "SHGC-76190",
+              post-text "(e-PCR)"
+            }
+          },
+          comment {
+            {
+              type other,
+              label "Alternate name",
+              text "HSA.981"
+            },
+            {
+              type other,
+              label "Alternate name",
+              text "RH101644"
+            },
+            {
+              type other,
+              label "Alternate name",
+              text "RH50318"
+            },
+            {
+              type other,
+              label "Alternate name",
+              text "STS-L11373"
+            },
+            {
+              type other,
+              label "Alternate name",
+              text "WI-18887"
+            }
+          }
+        },
+        {
+          type comment,
+          source {
+            {
+              src {
+                db "UniSTS",
+                tag id 58378
+              },
+              anchor "T03558",
+              post-text "(e-PCR)"
+            }
+          },
+          comment {
+            {
+              type other,
+              label "Alternate name",
+              text "IB475"
+            }
+          }
+        },
+        {
+          type comment,
+          source {
+            {
+              src {
+                db "UniSTS",
+                tag id 277566
+              },
+              anchor "PCDHGA9_1502",
+              post-text "(e-PCR)"
+            }
+          }
+        },
+        {
+          type comment,
+          source {
+            {
+              src {
+                db "UniSTS",
+                tag id 277567
+              },
+              anchor "PCDHGC3__1203",
+              post-text "(e-PCR)"
+            }
+          }
+        },
+        {
+          type comment,
+          source {
+            {
+              src {
+                db "UniSTS",
+                tag id 280897
+              },
+              anchor "PCDHGA4_2560",
+              post-text "(e-PCR)"
+            }
+          },
+          comment {
+            {
+              type other,
+              label "Alternate name",
+              text "PCDHGA4_2560.2"
+            }
+          }
+        },
+        {
+          type comment,
+          source {
+            {
+              src {
+                db "UniSTS",
+                tag id 280898
+              },
+              anchor "PCDHGA6_2010",
+              post-text "(e-PCR)"
+            }
+          }
+        },
+        {
+          type comment,
+          source {
+            {
+              src {
+                db "UniSTS",
+                tag id 280900
+              },
+              anchor "PCDHGB4_2544",
+              post-text "(e-PCR)"
+            }
+          }
+        },
+        {
+          type comment,
+          source {
+            {
+              src {
+                db "UniSTS",
+                tag id 280901
+              },
+              anchor "PCDHGC4_2483",
+              post-text "(e-PCR)"
+            }
+          }
+        },
+        {
+          type comment,
+          source {
+            {
+              src {
+                db "UniSTS",
+                tag id 47440
+              },
+              anchor "AF022190",
+              post-text "(e-PCR)"
+            }
+          }
+        },
+        {
+          type comment,
+          source {
+            {
+              src {
+                db "UniSTS",
+                tag id 87645
+              },
+              anchor "RH91455",
+              post-text "(e-PCR)"
+            }
+          },
+          comment {
+            {
+              type other,
+              label "Alternate name",
+              text "stSG44640"
+            }
+          }
+        },
+        {
+          type comment,
+          source {
+            {
+              src {
+                db "UniSTS",
+                tag id 256698
+              },
+              anchor "5q31-33_24",
+              post-text "(e-PCR)"
+            }
+          }
+        },
+        {
+          type comment,
+          source {
+            {
+              src {
+                db "UniSTS",
+                tag id 25793
+              },
+              anchor "AF053066",
+              post-text "(e-PCR)"
+            }
+          }
+        },
+        {
+          type comment,
+          source {
+            {
+              src {
+                db "UniSTS",
+                tag id 25794
+              },
+              anchor "AF022189",
+              post-text "(e-PCR)"
+            }
+          }
+        },
+        {
+          type comment,
+          source {
+            {
+              src {
+                db "UniSTS",
+                tag id 466384
+              },
+              anchor "PCDHGA10_7046",
+              post-text "(e-PCR)"
+            }
+          }
+        },
+        {
+          type comment,
+          source {
+            {
+              src {
+                db "UniSTS",
+                tag id 73201
+              },
+              anchor "D5S2538",
+              post-text "(e-PCR)"
+            }
+          },
+          comment {
+            {
+              type other,
+              label "Alternate name",
+              text "GDB:734416"
+            },
+            {
+              type other,
+              label "Alternate name",
+              text "RH34348"
+            },
+            {
+              type other,
+              label "Alternate name",
+              text "SHGC-5561"
+            }
+          }
+        },
+        {
+          type comment,
+          source {
+            {
+              src {
+                db "UniSTS",
+                tag id 256498
+              },
+              anchor "5q31-33_16",
+              post-text "(e-PCR)"
+            }
+          }
+        },
+        {
+          type comment,
+          source {
+            {
+              src {
+                db "UniSTS",
+                tag id 256499
+              },
+              anchor "5q31-33_17",
+              post-text "(e-PCR)"
+            }
+          }
+        },
+        {
+          type comment,
+          source {
+            {
+              src {
+                db "UniSTS",
+                tag id 50676
+              },
+              anchor "STS-R97031",
+              post-text "(e-PCR)"
+            }
+          },
+          comment {
+            {
+              type other,
+              label "Alternate name",
+              text "RH41214"
+            },
+            {
+              type other,
+              label "Alternate name",
+              text "sts-R97031"
+            }
+          }
+        }
+      }
+    },
+    {
+      type comment,
+      heading "Gene Location History",
+      comment {
+        {
+          type comment,
+          heading "Homo sapiens Annotation Release 105",
+          comment {
+            {
+              type assembly,
+              heading "GRCh37.p13",
+              label "Reference",
+              accession "GCF_000001405",
+              version 25,
+              comment {
+                {
+                  type assembly-unit,
+                  heading "Primary Assembly",
+                  accession "GCF_000001305",
+                  version 13,
+                  comment {
+                    {
+                      type genomic,
+                      label "chromosome Chromosome 5",
+                      accession "NC_000005",
+                      version 9,
+                      seqs {
+                        int {
+                          from 140734767,
+                          to 140892545,
+                          strand plus,
+                          id gi 224589817
+                        }
+                      }
+                    }
+                  }
+                }
+              }
+            },
+            {
+              type assembly,
+              heading "HuRef",
+              label "Alternate",
+              accession "GCF_000002125",
+              version 1,
+              comment {
+                {
+                  type genomic,
+                  label "chromosome Chromosome 5",
+                  accession "AC_000137",
+                  version 1,
+                  seqs {
+                    int {
+                      from 135879842,
+                      to 136037385,
+                      strand plus,
+                      id gi 157734151
+                    }
+                  }
+                }
+              }
+            },
+            {
+              type assembly,
+              heading "CHM1_1.1",
+              label "Alternate",
+              accession "GCF_000306695",
+              version 2,
+              comment {
+                {
+                  type genomic,
+                  label "chromosome Chromosome 5",
+                  accession "NC_018916",
+                  version 2,
+                  seqs {
+                    int {
+                      from 140167974,
+                      to 140325822,
+                      strand plus,
+                      id gi 528476642
+                    }
+                  }
+                }
+              }
+            }
+          }
+        },
+        {
+          type comment,
+          heading "Homo sapiens Annotation Release 104",
+          comment {
+            {
+              type assembly,
+              heading "GRCh37.p10",
+              label "Reference",
+              accession "GCF_000001405",
+              version 22,
+              comment {
+                {
+                  type assembly-unit,
+                  heading "Primary Assembly",
+                  accession "GCF_000001305",
+                  version 13,
+                  comment {
+                    {
+                      type genomic,
+                      label "chromosome Chromosome 5",
+                      accession "NC_000005",
+                      version 9,
+                      seqs {
+                        int {
+                          from 140734767,
+                          to 140892545,
+                          strand plus,
+                          id gi 224589817
+                        }
+                      }
+                    }
+                  }
+                }
+              }
+            },
+            {
+              type assembly,
+              heading "HuRef",
+              label "Alternate",
+              accession "GCF_000002125",
+              version 1,
+              comment {
+                {
+                  type genomic,
+                  label "chromosome Chromosome 5",
+                  accession "AC_000137",
+                  version 1,
+                  seqs {
+                    int {
+                      from 135879842,
+                      to 136037385,
+                      strand plus,
+                      id gi 157734151
+                    }
+                  }
+                }
+              }
+            },
+            {
+              type assembly,
+              heading "CHM1_1.0",
+              label "Alternate",
+              accession "GCF_000306695",
+              version 1,
+              comment {
+                {
+                  type genomic,
+                  label "chromosome Chromosome 5",
+                  accession "NC_018916",
+                  version 1,
+                  seqs {
+                    int {
+                      from 141011444,
+                      to 141169209,
+                      strand plus,
+                      id gi 409253459
+                    }
+                  }
+                }
+              }
+            }
+          }
+        },
+        {
+          type comment,
+          heading "Build 37.3",
+          comment {
+            {
+              type assembly,
+              heading "GRCh37.p5",
+              label "Reference",
+              accession "GCF_000001405",
+              version 17,
+              comment {
+                {
+                  type assembly-unit,
+                  heading "Primary Assembly",
+                  accession "GCF_000001305",
+                  version 13,
+                  comment {
+                    {
+                      type genomic,
+                      label "chromosome Chromosome 5",
+                      accession "NC_000005",
+                      version 9,
+                      seqs {
+                        int {
+                          from 140734767,
+                          to 140892545,
+                          strand plus,
+                          id gi 224589817
+                        }
+                      }
+                    }
+                  }
+                }
+              }
+            },
+            {
+              type assembly,
+              heading "HuRef",
+              label "Alternate",
+              accession "GCF_000002125",
+              version 1,
+              comment {
+                {
+                  type assembly-unit,
+                  heading "Primary Assembly",
+                  accession "GCF_000000025",
+                  version 1,
+                  comment {
+                    {
+                      type genomic,
+                      label "chromosome Chromosome 5",
+                      accession "AC_000137",
+                      version 1,
+                      seqs {
+                        int {
+                          from 135879842,
+                          to 136037385,
+                          strand plus,
+                          id gi 157734151
+                        }
+                      }
+                    }
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  },
+  unique-keys {
+    {
+      db "HGNC",
+      tag id 8702
+    },
+    {
+      db "LocusID",
+      tag id 56111
+    },
+    {
+      db "MIM",
+      tag id 606291
+    }
+  },
+  xtra-index-terms {
+    "LOC56111"
+  }
+}
@@ -1,33 +0,0 @@
-#mega
-!Title: Amino acid sequences of hemoglobin alpha chains;
-!Format datatype=protein identical=. indel=-;
-
-[
-M. Nei and S. Kumar (2000) Molecular Evolution and Phylogenetics.  
-Oxford University Press. New York.
-Data for Example 2.1.
-]
-
-
-
-#Human    V-LSPADKTN VKAAWGKVGA HAGEYGAEAL ERMFLSFPTT KTYFPHF-DL SHGSAQVKGH 
-#Horse    ....A..... .....S...G .......... .....G.... .......... ........A. 
-#Cow      ....A...G. .........G ..A....... .......... .......... .......... 
-#Kangaroo ....A...GH ...I.....G .....A..G. ..T.H..... .......... ......IQA. 
-#Newt     MK..AE..H. ..TT.DHIKG .EEAL..... F...T.L.A. R....AK... .E..SFLHS. 
-#Carp     S...DK..AA ..I..A.ISP K.DDI..... G..LTVY.Q. ....A.WA.. .P..GP..-. 
-
-#Human    GKKVA-DALT NAVAHVDDMP NALSALSDLH AHKLRVDPVN FKLLSHCLLV TLAAHLPAEF 
-#Horse    .......G.. L..G.L..L. G...D..N.. .......... .........S ...V...ND. 
-#Cow      .A....A... K..E.L..L. G...E..... .......... ......S... ...S...SD. 
-#Kangaroo ...I.....G Q..E.I..L. GT..K..... .......... .......... .F....GDA. 
-#Newt     ....M.G..S .....I..ID A..CK...K. .QD.M...A. .PK.A.NI.. VMGI..K.HL 
-#Carp     ....IMG.VG D..SKI..LV GG.AS..E.. .S......A. ..I.ANHIV. GIMFY..GD. 
-
-#Human    TPAVHASLDK FLASVSTVLT SKYR
-#Horse    .......... ..S....... ....
-#Cow      .......... ...N...... ....
-#Kangaroo ..E....... ...A...... ....
-#Newt     .YP..C.V.. ..DV.GH... ....
-#Carp     P.E..M.V.. .FQNLALA.S E...
-
@@ -17,7 +17,7 @@ Parsed for domains:
 Model    Domain  seq-f seq-t    hmm-f hmm-t      score  E-value
 -------- ------- ----- -----    ----- -----      -----  -------
 SEED       1/2      33   103 ..     1    77 []    71.2  2.2e-17
-SEED       2/2     124   194 ..     1    77 []    75.5  1.1e-18
+SEED       2/2     124   193 ..     1    77 []    75.5  1.1e-18
 
 Alignments of top-scoring domains:
 SEED: domain 1 of 2, from 33 to 103: score 71.2, E = 2.2e-17
@@ -29,13 +29,13 @@ SEED: domain 1 of 2, from 33 to 103: score 71.2, E = 2.2e-17
                    +F+++  ++  + A +    +++++gr+++    
   roa1_drome    75 GFITYSHSSMIDEAQK--SRpHKIDGRVVEP    103  
 
-SEED: domain 2 of 2, from 124 to 194: score 75.5, E = 1.1e-18
+SEED: domain 2 of 2, from 124 to 193: score 75.5, E = 1.1e-18
                    *->lfVgNLppdvteedLkdlFskfGpivsikivrDiiekpketgkskGf
                       lfVg L  d +e+ ++d+F++fG iv+i+iv+D     ketgk +Gf
   roa1_drome   124    LFVGALKDDHDEQSIRDYFQHFGNIVDINIVID-----KETGKKRGF 165  
 
                    aFVeFeseedAekAlealnGkelggrklrv<-*
                    aFVeF++++ ++k +     ++l+g+ + v   
-  roa1_drome   166 AFVEFDDYDPVDKVVL-QKQHQLNGKMVDV    194  
+  roa1_drome   166 AFVEFDDYDPVDKVVL--KQHQLNGKMVDV    193  
 
 //
@@ -150,3 +150,53 @@ Domain search space  (domZ):               7  [number of targets reported over t
 # CPU time: 0.74u 0.55s 00:00:01.29 Elapsed: 00:00:07.01
 # Mc/sec: 189.21
 //
+Query:       lcl|Test_ID.1|P1  [L=463]
+Description: 281521..282909 
+Scores for complete sequence (score includes all domains):
+   --- full sequence ---   --- best 1 domain ---    -#dom-
+    E-value  score  bias    E-value  score  bias    exp  N  Model        Description
+    ------- ------ -----    ------- ------ -----   ---- --  --------     -----------
+    2.2e-06   19.9   1.5    4.3e-06   18.9   1.0    1.4  1  IS4.original 
+    2.3e-06   19.7   1.5    4.3e-06   18.8   1.0    1.4  1  IS4.original 
+
+
+Domain annotation for each model (and alignments):
+>> IS4.original  
+   #    score  bias  c-Evalue  i-Evalue hmmfrom  hmm to    alifrom  ali to    envfrom  env to     acc
+ ---   ------ ----- --------- --------- ------- -------    ------- -------    ------- -------    ----
+   1 !   18.9   1.0   8.9e-08   4.3e-06     315     353 ..     335     369 ..     318     391 .. 0.75
+
+  Alignments for each domain:
+  == domain 1    score: 18.9 bits;  conditional E-value: 8.9e-08
+      IS4.original 315 filatnlddeldaediaelYrlRwqiElfFrelKsllgl 353
+                         lat+  +el+ae+i+ lY +Rw+iE +F+ lK   ++
+  lcl|Test_ID.1|P1 335 LLLATE--TELSAEEILRLYARRWGIEPLFHNLKR--WW 369
+                       345555..**************************7..44 PP
+
+>> IS4.original  
+   #    score  bias  c-Evalue  i-Evalue hmmfrom  hmm to    alifrom  ali to    envfrom  env to     acc
+ ---   ------ ----- --------- --------- ------- -------    ------- -------    ------- -------    ----
+   1 !   18.8   1.0     9e-08   4.3e-06     315     353 ..     335     369 ..     318     391 .. 0.75
+
+  Alignments for each domain:
+  == domain 1    score: 18.8 bits;  conditional E-value: 9e-08
+      IS4.original 315 filatnlddeldaediaelYrlRwqiElfFrelKsllgl 353
+                         lat+  +el+ae+i+ lY +Rw+iE +F+ lK   ++
+  lcl|Test_ID.1|P1 335 LLLATE--TELSAEEILRLYARRWGIEPLFHNLKR--WW 369
+                       345555..**************************7..44 PP
+
+
+
+Internal pipeline statistics summary:
+-------------------------------------
+Query sequence(s):                         1  (463 residues)
+Target model(s):                          96  (37031 nodes)
+Passed MSV filter:                        16  (0.166667); expected 1.9 (0.02)
+Passed bias filter:                       16  (0.166667); expected 1.9 (0.02)
+Passed Vit filter:                         9  (0.09375); expected 0.1 (0.001)
+Passed Fwd filter:                         2  (0.0208333); expected 0.0 (1e-05)
+Initial search space (Z):                 96  [actual number of targets]
+Domain search space  (domZ):               2  [number of targets reported over threshold]
+# CPU time: 0.03u 0.02s 00:00:00.04 Elapsed: 00:00:00.06
+# Mc/sec: 276.54
+//
@@ -0,0 +1,211 @@
+# hmmsearch :: search profile(s) against a sequence database
+# HMMER 3.0 (March 2010); http://hmmer.org/
+# Copyright (C) 2010 Howard Hughes Medical Institute.
+# Freely distributed under the GNU General Public License (GPLv3).
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+# query HMM file:                  Pfam-A.hmm
+# target sequence database:        test_seqs.seq_raw.txt
+# output directed to file:         hmmsearch.output.txt
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+Query:       1-cysPrx_C  [M=40]
+Accession:   PF10417.4
+Description: C-terminal domain of 1-Cys peroxiredoxin
+Scores for complete sequences (score includes all domains):
+   --- full sequence ---   --- best 1 domain ---    -#dom-
+    E-value  score  bias    E-value  score  bias    exp  N  Sequence Description
+    ------- ------ -----    ------- ------ -----   ---- --  -------- -----------
+
+   [No hits detected that satisfy reporting thresholds]
+
+
+Domain annotation for each sequence (and alignments):
+
+   [No targets detected that satisfy reporting thresholds]
+
+
+Internal pipeline statistics summary:
+-------------------------------------
+Query model(s):                            1  (40 nodes)
+Target sequences:                          3  (2141 residues)
+Passed MSV filter:                         0  (0); expected 0.1 (0.02)
+Passed bias filter:                        0  (0); expected 0.1 (0.02)
+Passed Vit filter:                         0  (0); expected 0.0 (0.001)
+Passed Fwd filter:                         0  (0); expected 0.0 (1e-05)
+Initial search space (Z):                  3  [actual number of targets]
+Domain search space  (domZ):               0  [number of targets reported over threshold]
+# CPU time: 0.00u 0.00s 00:00:00.00 Elapsed: 00:00:00.00
+# Mc/sec: 14.27
+//
+Query:       DUF4229  [M=69]
+Accession:   PF14012.1
+Description: Protein of unknown function (DUF4229)
+Scores for complete sequences (score includes all domains):
+   --- full sequence ---   --- best 1 domain ---    -#dom-
+    E-value  score  bias    E-value  score  bias    exp  N  Sequence             Description
+    ------- ------ -----    ------- ------ -----   ---- --  --------             -----------
+  ------ inclusion threshold ------
+          3  -17.8  37.0      0.019    3.0   2.5    4.3  5  lcl|Protein_ID1.3|M3 complement(48376..51420)
+
+
+Domain annotation for each sequence (and alignments):
+>> lcl|Protein_ID1.3|M3  complement(48376..51420)
+   #    score  bias  c-Evalue  i-Evalue hmmfrom  hmm to    alifrom  ali to    envfrom  env to     acc
+ ---   ------ ----- --------- --------- ------- -------    ------- -------    ------- -------    ----
+   1 ?   -4.3   1.7         1         3      34      40 ..     305     311 ..     277     337 .. 0.55
+   2 ?    2.6   2.1    0.0084     0.025      12      50 ..     382     418 ..     374     422 .. 0.69
+   3 ?   -1.1   0.6      0.12      0.36       4      36 ..     841     874 ..     841     882 .. 0.52
+   4 ?    3.0   2.5    0.0064     0.019       7      59 ..     872     925 ..     870     929 .. 0.90
+   5 ?   -0.7   0.9     0.087      0.26      31      50 ..     972     991 ..     937    1001 .. 0.56
+
+  Alignments for each domain:
+  == domain 1    score: -4.3 bits;  conditional E-value: 1
+               DUF4229  34 laallAl 40 
+                           la+l A+
+  lcl|Protein_ID1.3|M3 305 LAILSAI 311
+                           3333332 PP
+
+  == domain 2    score: 2.6 bits;  conditional E-value: 0.0084
+               DUF4229  12 fvvllavlvllgvligllvplllaallAlvvalplSfll 50 
+                           + v ++   l gv   l +p+  a++++++ +++lS  +
+  lcl|Protein_ID1.3|M3 382 VFVPMF--SLTGVPRYLFIPMAEAVIFGMLSSFVLSQTF 418
+                           333333..34455555449*****************776 PP
+
+  == domain 3    score: -1.1 bits;  conditional E-value: 0.12
+               DUF4229   4 YtalRlglfvvllav..lvllgvligllvplllaa 36 
+                           Y +l lgl++ + ++  lv+++ + +l+ p++++ 
+  lcl|Protein_ID1.3|M3 841 YRGLSLGLVASIILIyfLVVVNFESWLD-PFVIIT 874
+                           5566688888777774344444444444.554443 PP
+
+  == domain 4    score: 3.0 bits;  conditional E-value: 0.0064
+               DUF4229   7 lRlglfvvllavlvllgvligll.vplllaallAlvvalplSflllrklRrrat 59 
+                           +  +l ++l++++++l + +  l vp l  a++ + va + S+l+ +  R+r++
+  lcl|Protein_ID1.3|M3 872 IITALPAALAGIVWMLYLTGTTLsVPALTGAIMCMGVATANSILVISFARERLA 925
+                           56789999******9999999889*********************999999875 PP
+
+  == domain 5    score: -0.7 bits;  conditional E-value: 0.087
+               DUF4229  31 plllaallAlvvalplSfll 50 
+                           pl  a++ +l++a +  +++
+  lcl|Protein_ID1.3|M3 972 PLGRAVIGGLLLATIATLIF 991
+                           55555555555554444333 PP
+
+
+
+Internal pipeline statistics summary:
+-------------------------------------
+Query model(s):                            1  (69 nodes)
+Target sequences:                          3  (2141 residues)
+Passed MSV filter:                         1  (0.333333); expected 0.1 (0.02)
+Passed bias filter:                        1  (0.333333); expected 0.1 (0.02)
+Passed Vit filter:                         1  (0.333333); expected 0.0 (0.001)
+Passed Fwd filter:                         1  (0.333333); expected 0.0 (1e-05)
+Initial search space (Z):                  3  [actual number of targets]
+Domain search space  (domZ):               1  [number of targets reported over threshold]
+# CPU time: 0.00u 0.00s 00:00:00.00 Elapsed: 00:00:00.00
+# Mc/sec: 16.41
+//
+Query:       ACR_tran  [M=1021]
+Accession:   PF00873.14
+Description: AcrB/AcrD/AcrF family
+Scores for complete sequences (score includes all domains):
+   --- full sequence ---   --- best 1 domain ---    -#dom-
+    E-value  score  bias    E-value  score  bias    exp  N  Sequence             Description
+    ------- ------ -----    ------- ------ -----   ---- --  --------             -----------
+   9.3e-189  616.9  10.5   1.2e-188  616.6   7.2    1.0  1  lcl|Protein_ID1.3|M3 complement(48376..51420)
+
+
+Domain annotation for each sequence (and alignments):
+>> lcl|Protein_ID1.3|M3  complement(48376..51420)
+   #    score  bias  c-Evalue  i-Evalue hmmfrom  hmm to    alifrom  ali to    envfrom  env to     acc
+ ---   ------ ----- --------- --------- ------- -------    ------- -------    ------- -------    ----
+   1 !  616.6   7.2  3.9e-189  1.2e-188      71    1021 .]      11    1000 ..       2    1000 .. 0.93
+
+  Alignments for each domain:
+  == domain 1    score: 616.6 bits;  conditional E-value: 3.9e-189
+                            S-TTEEEEEEEETTSEEEEEEEESTTS-HHHHHHHHHHHHHHHGGGS-HHHHHH-EEEEEEECCECEEEEEEESSSTS-HHHHHHHH CS
+              ACR_tran   71 gldglkyvsSqSseglssitvtFedgtdidiArqqvqnrlqeaknkLPeevqepgiskiktssseilvlavtskdgsltktdlrdla 157 
+                             ++ +++++SqS  g   + + F+ + di  A+ qv++  q + +++P ++++p i   +++  +il+la++sk   l++  + dl 
+  lcl|Protein_ID1.3|M3   11 TVNDIEHIESQSLFGYGIVKIFFQPDVDIRTANAQVTAISQTVLKQMPPGITPPLILNYNAATVPILQLALSSK--VLSEDRIFDLG 95  
+                            578899********************************************************************..*********** PP
+
+                            HHCTHHHHHTSTTEEEEEESS.--EEEEEEE-HHHHHCTT--HHHHHHHHHHHSSB-EEEECTT-SB-EEEE-SB---SCCHHCT-E CS
+              ACR_tran  158 esnikdqlsrveGVgdvqliGgsekavriwldpqklaklgltltdvvsalkeqnvqvaaGqlegqqeelliraqgrlqsaediekii 244 
+                            ++ i++ql+ v G +    +Gg+ ++++i ldpq++++ +++++dv++al++qn   + G+ +  + e+++++++   +   ++++ 
+  lcl|Protein_ID1.3|M3   96 QNFIRPQLATVRGSAVPSPYGGKVRQIQIDLDPQAMQSKRVSPDDVARALSQQNLVLSPGTEKIGSFEYNVKINDSPDEFTLLNNLP 182 
+                            *************************************************************************************** PP
+
+                            EEETTSEEEEHHHCEEEEEEESSSS-EEEETTCEEEEEEEEEETTSBHHHHHHHHHHHHHCCGGGSSTTEEEEEEEESHHHHHHHHH CS
+              ACR_tran  245 vksqdgskvrlrDvAkvelgaeeeriaatlngkpavllavkklpganaievvkavkekleelketlPegveivvvydttefvrasie 331 
+                            +k+  g  + ++DvA+v +g   + ++++ +g   vl+++ k     ++++++  ke +++lketlP+++ ++vv d++ fv+++i+
+  lcl|Protein_ID1.3|M3  183 IKNVGGVTIFIHDVAHVRDGFPPQINVVRDDGRRSVLMTILKNGATSTLDIIQGTKELIPKLKETLPNNLVLKVVGDQSIFVKSAIS 269 
+                            *************************************************************************************** PP
+
+                            HHHHHHHHHHHHHHHHHHHHHSSHCCCHHHHHHHHHHHHHHHHHHHHTT--EEHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHCSS CS
+              ACR_tran  332 eVvktlleaivLvvlvlflFLqnlratlipaiavPlsllgtfavlkalglsiNlltlfgLvlAiGlvvDdAiVvvEnverkleeege 418 
+                             Vv +  +a +L  ++++lFL+++r+t+i+ +++Pl++l ++++l++ g ++N++tl+gL+lA+G++vDdA Vv+En+  +le+ g+
+  lcl|Protein_ID1.3|M3  270 GVVREGTIAGILTSVMILLFLGSWRSTIIISMSIPLAILSAIIFLSLTGNTLNVMTLGGLALAVGMLVDDATVVIENINHHLEM-GK 355 
+                            ************************************************************************************.** PP
+
+                            -HHHHHHHHHHHHCCHHHHHHHHHHHHCCGGGGSBHHHHHHHHHHHHHHHHHHHHHHHHHHCCHHHHHHHCS----TT-CC...... CS
+              ACR_tran  419 kpleaalksmkeiegalvaialvllavfvPilflgGveGklfrqfaltivlaillsvlvaltltPalcallLkarkeekek...... 499 
+                               +a++ ++++i  + + ++l++++vfvP+++l+Gv   lf ++a ++++ +l s +++ t++P ++  lLk + ++ ++      
+  lcl|Protein_ID1.3|M3  356 PTTKAIIDAARQIIQPALVSTLSICIVFVPMFSLTGVPRYLFIPMAEAVIFGMLSSFVLSQTFVPTVANKLLKYQTQHFKHehhtda 442 
+                            *************************************************************************8776544446799* PP
+
+                            ........................CHHHHHHHHHHHHHHHHHHHHHHHHHSCHHHHHHHHHHHHH.HHHHHCCS-BESS----TSEE CS
+              ACR_tran  500 ........................gffrefnrlfdalerrYekllekvlrhravvllvalllvvg.slllfvripkeflPeedegvl 561 
+                                                    ++ + f++ f ++   Y+ +l++ l hr+  ++++l +v++ ++ lf+ ++k+f+Pe d g++
+  lcl|Protein_ID1.3|M3  443 hrpehdpnfkvhrsvkasifqffiNIQQGFEKRFTKVRLVYRSILHFALDHRKKFITLFLGFVIVsCVTLFPLLGKNFFPEVDSGDM 529 
+                            *******************9655555578*************************999999887775899****************** PP
+
+                            EEEEE-STTC-HHHHHHHHHHHHHHHH...TTTTEEEEEEEESESSSS..E........CTTEEEEEEEE--CTTS-SCCCSHHHHH CS
+              ACR_tran  562 vtsvqlppgvsleqtekvlkqvekilk...ekpevesvfavtGfafagdta........gqnsakvfisLkpekerkeeektveali 637 
+                             ++++++ g+ +e+t+k  + +e++++    ++e + ++   G + +g +         g++ +++ i+L ++      ++  ++ +
+  lcl|Protein_ID1.3|M3  530 KIHIRVQVGTRIEETAKQFDLIENTIRrlvPQNELDTIVDNIGLSVSGINTaysstgtiGPQDGDILIHLNEN------HHPTKEYM 610 
+                            ************************8875446889999999999888774331111111134445555555444......45688999 PP
+
+                            HHHHHHC.CTSTSSEEEEEE-SSSCCCSSSSSEEEEEEE.TSSSCHHHHHHHHHHHHHHHCCSTTEECEEESS-S-EEEEEEEE-HH CS
+              ACR_tran  638 erlrkel.ekikganvellapiqlreletlsgvrlelqvklfgddleaLseareqllaalkqlpeladvrseqqedepqlqvkidre 723 
+                            ++lr+ l ++++g++ +++ p +++ +    gv + ++  + g ++++  + ++++l+ ++++p++ad+r++q ++ pq++v+idr 
+  lcl|Protein_ID1.3|M3  611 KKLRETLpRAFPGVS-FAFLPADITSQILNFGVPAPIDIRVDGPNHDNNLKFVRAILKDIRNVPGIADLRVQQATNYPQFNVDIDRS 696 
+                            999999945678887.7888999*999************************************************************ PP
+
+                            HHHHCTB-HHHHHHHHHHHHT-..EEEEEEEETTE...EEEEEEEE-GGGSSSGGGGCC-EEEETTSE.EEECGGCEEEEEEEE-SE CS
+              ACR_tran  724 kaaalGvsiadinetlstalgg..syvndfieegr...vvkvvvqleedlrsspedlkklyvrnkkgk.mvplsavakieeekgpns 804 
+                            +a+++G++  di + l + l g  +++ +f  +++    + +v+q+++ + +s+ dl+++++++k++  m  l+ + +ie+ ++ + 
+  lcl|Protein_ID1.3|M3  697 QAKNYGLTEGDITNSLVATLAGtsQVAPTFWLNNKngvSYPIVIQMPQYKINSLADLANIPITTKESSsMQVLGGLGSIERDQSDSV 783 
+                            ************8877666655434556776544422279***********************998764889*************** PP
+
+                            EEEETTCEEEEEEEEESTTS...-HHHHHHHHHHCCTT..SSTTEEEEEECHHHHHHHHCCCHHHHHHHHHHHHHHHHHHHCTSSST CS
+              ACR_tran  805 ierenglrsveisgevaegd...slgeaeeavekiakqvklPagvgiewtglseqeqeagnsllllvalalllvflvLaalyeslsd 888 
+                            i+++n ++s+ i ++++ +d   ++g++e+++++ +++  lP+gv+++ +g+    q ++  l+l ++++++l++++  + +es++d
+  lcl|Protein_ID1.3|M3  784 ISHYNIKPSFDIFASLQGRDlgsISGDIETIIQHHHQE--LPKGVSVKLQGQVPIMQDSYRGLSLGLVASIILIYFLVVVNFESWLD 868 
+                            ****************8876222578999999999888..*********************************************** PP
+
+                            CHHHHTTHHHHHHHHHHHHHHTT--BSHHHHHHHHHHHHHHHHHHHHHHHHHHHHHCTTTBHHHHHHHHHHHHCHHHHHHHHHHHHH CS
+              ACR_tran  889 pllvlltvPlalvGallalllrglelsviaqvGlilliGlavkNailivefakelrekeglsleeAileaaklRLrPiLMTalaail 975 
+                            p+++++ +P al+G +  l+l+g++lsv a+ G i+ +G+a  N il+++fa+e  +   ++  +A+lea+ +R+rP+LMTa a+++
+  lcl|Protein_ID1.3|M3  869 PFVIITALPAALAGIVWMLYLTGTTLSVPALTGAIMCMGVATANSILVISFARERLA-IVKDSTQAALEAGYTRFRPVLMTASAMLI 954 
+                            *********************************************************.888899*********************** PP
+
+                            CCHHHHTT-STTHHHHHHHHHHHHHHHHHHHHCHHHHHHHHHHHHH CS
+              ACR_tran  976 GvlPLalstGaGselqqplgivvlGGlvtstvLtlllvPvlYvlva 1021
+                            G++P+al+ G+G e   plg +v+GGl+++t+ tl +vPv++ +v+
+  lcl|Protein_ID1.3|M3  955 GMIPMALGLGDGGEQNAPLGRAVIGGLLLATIATLIFVPVVFSVVH 1000
+                            ******************************************9997 PP
+
+
+
+Internal pipeline statistics summary:
+-------------------------------------
+Query model(s):                            1  (1021 nodes)
+Target sequences:                          3  (2141 residues)
+Passed MSV filter:                         1  (0.333333); expected 0.1 (0.02)
+Passed bias filter:                        1  (0.333333); expected 0.1 (0.02)
+Passed Vit filter:                         1  (0.333333); expected 0.0 (0.001)
+Passed Fwd filter:                         1  (0.333333); expected 0.0 (1e-05)
+Initial search space (Z):                  3  [actual number of targets]
+Domain search space  (domZ):               1  [number of targets reported over threshold]
+# CPU time: 0.17u 0.03s 00:00:00.20 Elapsed: 00:00:00.19
+# Mc/sec: 11.27
+//
@@ -1,298 +0,0 @@
-;; saved by seaview on Wed Jan  7 11:14:33 1998
-;;# of segments=14 all seqs
-;; 25,25 27,27 30,30 96,96 98,98 117,117 149,149 160,160 164,164 173,173
-;; 258,258 282,282 289,289 291,291
-;no comment
-AK1H_ECOLI/114-431
-CPDSINAALICRGEKMSIAIMAGVLEARGH-N--VTVIDPVEKLLAVG-HYLESTVDIAE
-STRRIAASRIP------A-DHMVLMAGFTAGN-EKGELVVLGRNGSDYSAAVLAACLRAD
-CCEIWTDVNGVYTCDP-------------RQVPDARLLKSMSYQEAMELSY--FGAKVLH
-PRTITPIAQFQIPCLIKNTGNPQAPGTL-IG--ASRDEDELP----VKGISNLN------
-NMAMFSVSGP-GMKGMVGMAARVFAAMS-------RARISVVLITQSSSEYSISFCVPQS
-DCVRAERAMLEEFY-----LELKEGLLEPLAVAERLAIISV-VGDGLRTLRGISAKF---
----FAALARANINIVAIA
-;no comment
-AKH_HAEIN/114-431
------------------VEDAVKATIDCRGEKLSIAMMKAWFEARGY-S--VHIVDPVKQ
-LLAKG-GYLESSVEIEESTKRVDAANIA--K-DKVVLMAGF---TAGNEKGELVLLGRNG
-SDYSAAC-----------------LAACLGASVCEIWTDVDGVYTCDP--RLVPDARLLP
-TLSYREAMELSYFGAKVIHPRTIGPLLPQNIPCVIKNTGNPSAPGSI-ID--GNVKSESL
-Q----VKGITNLDNLAMFNVSGPGMQGM---VGMASRVFSAMSGAGISVILITQSSSEYS
----ISFCVPVKSAEVAKTVLETEFA-----NELNEHQLEPIEVIKDLSIISV-VGDGMKQ
-AKGIAARF------FSALAQANISIVAIA
-;no comment
-AKH1_MAIZE/117-440
------------------ATESFSDFVVGHGELWSAQMLSYAIQKSGT-P--CSWMDTREV
-LVVNPSGANQVDPDYLESEKRLEKWFSRC-P-AETIIATGF---IASTPENIPTTLKRDG
-SDFSAAI-----------------IGSLVKARQVTIWTDVDGVFSADP--RKVSEAVILS
-TLSYQEAWEMSYFGANVLHPRTIIPVMKYNIPIVIRNIFNTSAPGTM-IC--QQPANENG
-DLEACVKAFATIDKLALVNVEGTGMAGV---PGTANAIFGAVKDVGANVIMISQASSEHS
----VCFAVPEKEVALVSAALHARFR-----EALAAGRLSKVEVIHNCSILAT-VGLRMAS
-TPGVSATL------FDALAKANINVRAIA
-;no comment
-AK2H_ECOLI/112-431
------------------INDAVYAEVVGHGEVWSARLMSAVLNQQG-----LPAAWLDAR
-EFLRAERAAQPQVDEGLSYPLLQQLLVQH-P-GKRLVVTGF---ISRNNAGETVLLGRNG
-SDYSATQ-----------------IGALAGVSRVTIWSDVAGVYSADP--RKVKDACLLP
-LLRLDEASELARLAAPVLHARTLQPVSGSEIDLQLRCSYTPDQGSTRIERVLASGTGARI
-VTSHDDVCLI-EFQVPASQDFKLAHKEI--DQILKRAQVRPLAVGVHNDRQLLQFCYTSE
-VADSALKILDEAG---------LPGELRLRQGLALVAMVGAGVTRNPLHCHRFWQQLKGQ
-PVEFTWQSDDGISLVAVL
-;no comment
-AK1_BACSU/66-374
------------------ISPREQDLLLSCGETISSVVFTSMLLDNGVKA--AALTGAQAG
-FLTNDQHTNAKIIEMKPER--LFSVLAN----HDAVVVAGF---QGATEKGDTTTIGRGG
-SDTSAAA-----------------LGAAVDAEYIDIFTDVEGVMTADP--RVVENAKPLP
-VVTYTEICNLAYQGAKVISPRAVEIAMQAKVPIRVRSTYS-NDKGTLVTSHHSSKVGSDV
-FERLITGIAH-VKDVTQFKVPAKIGQYN-----VQTEVFKAMANAGISVDFFNITPSEIV
-YTVAGNKTETAQR------------ILMDMGYDPMVTRNCAKVSAVGAGIMGVPGVTSKI
-------VSALSEKEIPILQSA
-;no comment
-AK2_BACST/63-370
------------------KRE--MDMLLSTGEQVSIALLAMSLHEKGYKA--VSLTGWQAG
-ITTEEMHGNARIMNIDTT--RIRRCLDE----GAIVIVAGF---QGVTETGEITTLGRGG
-SDTTAVA-----------------LAAALKAEKCDIYTDVTGVFTTDP--RYVKTARKIK
-EISYDEMLELANLGAGVLHPRAVEFAKNYEVPLEVRSSME-NERGTMVK--EEVSMEQHL
-IVRGIAFEDQ-VTRVTVVGIEKYLQSVA--------TIFTALANRGINVDIIIQNA----
-----------------TNSETAS--VSFSIRTEDLPETLQVLQ-------------ALEG
-ADVHYESGLAKVSI-VGSGMISNPGVAARV------FEVLADQGIEIKMVS
-;no comment
-AK2_BACSU/63-373
------------------KRE--MDMLLATGEQVTISLLSMALQEKGYDA--VSYTGWQAG
-IRTEAIHGNARITDIDTS--VLADQLEK----GKIVIVAGF---QGMTEDCEITTLGRGG
-SDTTAVA-----------------LAAALKVDKCDIYTDVPGVFTTDP--RYVKSARKLE
-GISYDEMLELANLGAGVLHPRAVEFAKNYQVPLEVRSSTE-TEAGTLIE--EESSMEQNL
-IVRGIAFEDQ-ITRVTIYGLTSGLTTLS--------TIFTTLAKRNINVDIIIQTQ----
-----------------AEDKTG---ISFSVKTEDADQTVAVLEEYK---------DALEF
-EKIETESKLAKVSI-VGSGMVSNPGVAAEM------FAVLAQKNILIKMVS
-;no comment
-AKAB_CORFL/63-379
------------------ARE--MDMLLTAGERISNALVAMAIESLGAEA--QSFTGSQAG
-VLTTERHGNARIVDVTPG--RVREALDE----GKICIVAGF--QGVNKETRDVTTLGRGG
-SDTTAVA-----------------LAAALNADVCEIYSDVDGVYTADP--RIVPNAQKLE
-KLSFEEMLELAAVGSKILVLRSVEYARAFNVPLRVRSSYS-NDPGTLIAGSMEDIPVEEA
-VLTGVATDKS-EAKVTVLGISDKPGEAA--------KVFRALADAEINIDMVLQNV----
-----------------SSVEDGTTDITFTCPRADGRRAMEILKKLQ---------VQGNW
-TNVLYDDQVDKVSL-VGAGMKSHPGVTAEF------MEALRDVNVNIELIS
-;no comment
-AKAB_MYCSM/63-379
------------------PRE--MDMLLTAGERISNALVAMAIESLGAQA--RSFTGSQAG
-VITTGTHGNAKIIDVTPG--RLRDALDE----GQIVLVAGF--QGVSQDSKDVTTLGRGG
-SDTTAVA-----------------VAAALDADVCEIYTDVDGIFTADP--RIVPNARHLD
-TVSFEEMLEMAACGAKVLMLRCVEYARRYNVPIHVRSSYS-DKPGTIVKGSIEDIPMEDA
-ILTGVAHDRS-EAKVTVVGLPDVPGYAA--------KVFRAVAEADVNIDMVLQNI----
-----------------SKIEDGKTDITFTCARDNGPRAVEKLSALK---------SEIGF
-SQVLYDDHIGKVSL-IGAGMRSHPGVTATF------CEALAEAGINIDLIS
-;no comment
-AK3_ECOLI/106-407
------------------TSPALTDELVSHGELMSTLLFVEILRERD--V--QAQWFDVRK
-VMRTNDRFGRAEPDIAALAELAALQLLPR-LNEGLVITQGF---IGSENKGRTTTLGRGG
-SDYTAAL-----------------LAEALHASRVDIWTDVPGIYTTDP--RVVSAAKRID
-EIAFAEAAEMATFGAKVLHPATLLPAVRSDIPVFVGSSKDPRAGGTLVCNKTENPPLFRA
-LAL--RRNQT-LLTLHSLNMLHSRGFLA--------EVFGILARHNISVDLITTSEVSVA
-LTLDTTGSTSTG----------DTLLTQSLLMELSALCRVEVEEGLALVALIG-------
----NDLSKACGVGKEVF
-;no comment
-AK_YEAST/134-472
------------------VSSRTVDLVMSCGEKLSCLFMTALCNDRGCKAKYVDLSHIVPS
-DFSASALDNSFYTFLVQALKEKLAPFVSA-KERIVPVFTGF---FGLVPTGLLNGVGRGY
-TDLCAAL-----------------IAVAVNADELQVWKEVDGIFTADP--RKVPEARLLD
-SVTPEEASELTYYGSEVIHPFTMEQVIRAKIPIRIKNVQNPLGNGTIIYPDNVAKKGEST
-PPHPPENLSS----SFYEKRKRGATAITTKN----DIFVINIHSNKKTLSHGFLAQIFTI
-LDKYKLVVDLISTSEVHVSMALPIPDADS-LKSLRQAEEKLRILGSVDITKKLSIVSLVG
-KHMKQYIGIAG---TMFTTLAEEGINIEMIS
-;no comment
-PROB_BACSU/1-278
--------------------MKKQRIVVKIGSSSLTNSKGS------------IDEQNQRA
-CSAISVLKKAG---------------------HEMILITS-----------GAVAAGFSS
-LGYPSRP---------VTIKGKQAAAAVGQTLLMQQYMNQFKQYSLTPGQILLTRNDFSK
-RERYRNAYA---TIMELLERGVIPIINENDSTSVEELTFGDNDMLSALVSGLIHADQLMI
-LTDINGLYDANPNEILSERFDYLPEITPELL-GYAGSAGSKVGTGGMKSKLLATQTALSL
-GVKVFIGTGSGEQKLADILDGRGDG-TYIGDKELSSVN-NT------RQWIQFHSPISGE
-II
-;no comment
-PROB_CORGL/1-288
---------------MRERISNAKRVVVKIGSSSLTNDEDG------------HTVDPN-R
-INTIVNALQARMEAG-----------------SDLIVVSS-----------GAVAAGMAP
-LGLSTRP---------TELAVKQAAAAVGQVHLMHQWGRSFARYGRPIGQVLLTAADAGK
-RDRARNAQR---TIDKLRILGAVPIVNENDTVATTGVNFGDNDRLAAIVAHLVSADALVL
-LSDVD----------GLFDKNPTDPTAKFISEVRDGNDLKGVIAGDGGKVGTGGMASKVS
-AARLASRSG--VPVLLTSAANIGPALEDAQVGTVFHPKDNRLSAWKFWALYA------AD
-TAGKIRLDDGAVE
-;no comment
-PROB_ECOLI/1-253
-------------------MSDSQTLVVKLGTSVLTGGSRR-----LNRAHI----VEL--
-VRQCAQLHAAGHR---------------------IVIVTS-----------GAIAAGREH
-LGYPELP---------ATIASKQLLAAVGQSRLIQLWEQLFSIYGIHVGQMLLTRADMED
-RERFLNARD---TLRALLDNNIVPVINENDAVATAAIKVGDNDNLSALAAILAGADKLLL
-LTDQK----------GLYTADPRSNPQAE-----LIKDVYGIDDALRAIAGDSVSGLGTG
-----------GMSTKLQAADVACRAGID-TIIAAGSKP-------------GVIGDVMEG
-ISVGT
-;no comment
-PROB_HAEIN/1-243
--------------------MNKKTIVVKFGTSTLTQGSPK-----LNSPHM----MEI--
-VRQIAQLHNDGFR---------------------IVIVTS-----------GAIAAGRHY
-LNHPQLP---------PTIASKQLLAAVGQSQLIQAWEKLFAIYDIHIGQLLLTRADIED
-RERFLNARD---TLYALLDNHIIPVINENDAVATAEIKVGDNDNLSALVAILVQAEQLYL
-LTDQQ----------GLFDSDPRKNPEAK-----LIPVVEQITDHIRSIAGGSGTNLGTG
-----------GMMTKIIAADVATRSGIE-TIIAPGNRP-------------NVIAD----
------
-;no comment
-PROB_YEAST/1-264
--------------MKDANESKSYTIVIKLGSSSLVDEKTKE----PKLAIM----SLI--
-VETVVKLRRMGHK---------------------VIIVSS-----------GGIAVGLRT
-MRMNKRP---------KHLAEVQAIAAIGQGRLIGRWDLLFSQFDQRIAQILLTRNDILD
-WTQYKNAQN---TINELLNMGVIPIVNENDTLSVREIKFGDNDTLSAITSALIHADYLFL
-LTDVD----------CLYTDNPRTNPDAM-----PILVVPDLSKGLPGVNTAGGSGSDVG
-TG----------GMETKLVAADLATNAGVH-TLIMKSDTPAN----------IGRIVEYM
-QTLELDD
-;no comment
-YHJ3_YEAST/1-259
-------------------MTKAYTIVIKLGSSSLVDESTKE----PKLSIM----TLI--
-VETVTNLKRMGHK---------------------VIIVSS-----------GGIAVGLDA
-LNIPHKP---------KQLSEVQAIAAVGQGRLIARWNMLFSQYGEQTAQILLTRNDILR
-WNQYNNARN---TINELLAMGVIPIVNENDTLSISEIEFGDNDTLSAITAALVGADFLFL
-LTDVD----------CLYTDNPRTNPDAR-----PIVLVPELSEGLPGVNTSSGSGSEVG
-TG----------GMRTKLIAADLASNAGIE-TIVMKSDRPEY----------VPKIVDYI
-QHHFRPP
-;no comment
-PYRH_ECOLI/1-226
--------------------PVYKRILLKLSGEALQGTEGFGIDASILDR----------M
-AQEIKE--------------------LVELGIQVGVVIGGG----NLFRGAGLAKAGMNR
-VVGDHMGMLATVMNGLAMRDALHRAYVNARLMSAIPLNGVCDSYSWAEAISLL-----RN
-NRVVI------------LSAGTGNPFFTTDSAACLRGIEIEADVVLKATKVDGVFTA-DP
-AKD---------PTATMYEQLTYSEVLEKELKVMDLAAFTLARDHKLPIRVF-NMNKPGA
-LRRVVMG
-;no comment
-PYRH_HAEIN/1-229
-----------------MSQPIYKRILLKLSGEALQGEDGLGIDPAILDR----------M
-AVEIKE--------------------LVEMGVEVSVVLGGG----NLFRGAKLAKAGMNR
-VVGDHMGMLATVMNGLAMRDSLFRADVNAKLMSAFQLNGICDTYNWSEAIKML-----RE
-KRVVI------------FSAGTGNPFFTTDSTACLRGIEIEADVVLKATKVDGVYDC-DP
-AKN---------PDAKLYKNLSYAEVIDKELKVMDLSAFTLARDHGMPIRVF-NMGKPGA
-LRQVVTG
-;no comment
-PYRH_MYCTU/1-237
-P-------ASTGAASAAQLSGYSRVLLKLGGEMFGGGQ-VGLDPDVVAQ----------V
-ARQIAD--------------------VVRGGVQIAVVIGGG----NFFRGAQLQQLGMER
-TRSDYMGMLGTVMNSLALQDFLEKEGIVTRVQTAITMGQVAEPYLPLRAVRHL-----EK
-GRVVI------------FGAGMGLPYFSTDTTAAQRALEIGADVVLMAKAVDGVFAE-DP
-RVN---------PEAELLTAVSHREVLDRGLRVADATAFSLCMDNGMPILVF-NLLTDGN
-IARAVRG
-;no comment
-P5C1_ARATH/320-639
-ILLDIADALEANVTTIKAENELDVASAQEAG--LEESMVARLVMTPG-KISSLAASVRKL
-AD-MEDPIGRVL-KKTEVADGLVLEK-TSSPLGVLLIVFESRPDALVQIASLAIRSGNGL
-LLKGGKE-----------------ARRSNAILHKVITDAIPETVG--GKLIGLVTS--RE
-EIPDL-----------------LKLDDVIDLVI-PRGSNKLVTQIKNTTK-IPVLGHADG
-I-------------CHVYVDKACDTDMAKRIVSDAKLDYPAACNAMETLLVHKDLEQNAV
-LNELIF--ALQSNGVTLYGGPRASKILNIP-------EARSFNHEYCAKACTVEVVED-V
-YGAIDHIHRHGSAH------TDCIVTEDHEVAELF
-;no comment
-P5CS_VIGAC/321-640
-ILLKIADALEANEKIIRIENEADVTAAQEAG--YEKSLVARLALKPG-KIASLANNMRII
-AN-MEDPIGRVL-KRTELSDGLILEK-TSSPLGVLLIVFESRPDALVQIASLAIRSGNGL
-LLKGGKE-----------------AKRSNAILHKVIIEAIPDNVG--GKLIGLVTS--RE
-EIPEL-----------------LKLDDVIDLVI-PRGSNKLVSQIKSSTK-IPVLGHADG
-I-------------CHVYVDKSANVEMAKRIVLDAKVDYPAACNAMETLLIHKDLIEKGW
-LKEIIL--DLRTEGVILYGGPVASSLLNIP-------QAHSFHHEYSSLACTAEIVDD-V
-YAAIDHINLYGSAH------TDSIVAEDNEVANVF
-;no comment
-PROA_SYNY3/1-318
-----IADGLTAAMPEILAANQEDCAAAEAMG--IAKPLYNRLLLGES-KLKSTIAGVKDV
-EH-LPDPLGQVT-LHRQLDEGLVLKR-VGCPLGVLGVIFEARPEALIQISSLAIKSGNAV
-ILKGGRE-----------------ATRSCQVLTEVIQTALAKTVV-SPEAINLLTT--RE
-EIREL-----------------LGLNQYVDLII-PRGSNEFVQYIQQNTQ-IPVLGHADG
-I-------------CHLYLDAQADLSKAIPITVDAKTQYPAACNAIETLLVHQAIAAEFL
-PPLAQ--ALGEKGVSLRGDSGTQKLIDCEP-----ATEADWCTEYSDLILSIKIVDS-LE
-AAIDHINQYGSKH------TDGIISEDLTAAEQF
-;no comment
-PROA_YEAST/1-343
-ILYKIHDALKANAHAIEEANKIDLAVAKETG--LADSLLKRLDLFKGDKFEVMLQGIKDV
-AE-LEDPVGKVK-MARELDDGLTLYQ-VTAPVGVLLVIFESRPEVIANITALSIKSGNAA
-ILKGGKE-------------SVNTFREMAKIVNDTIAQFQSETGV-PVGSVQLIET--RQ
-DVSDL-----------------LDQDEYIDLVV-PRGSNALVRKIKDTTK-IPVLGHADG
-I-------------CSIYLDEDADLIKAKRISLDAKTNYPAGCNAMETLLINPKFSKWWE
-VLENLTLEGGVTIHATKDLKT--AYFDKLNELGKLTEAIQCKTVDA-----DEEQDFDKE
-FLSLDLAAKFVTS-TESAIQHINTHSSRH------TDAIVTENKANAEKF
-;no comment
-P5CS_CAEEL/305-630
-MVRHLAALLVDKEKYIIEANQTDLANAKSAG--LDPQLLNRLKMTPE-KIQDLHAGLNTI
-ADSAETLVGRVL-KKVKISEGLFLEQ-VTVPIGSLMVIFESRPDCLPQVASLAMASGNAL
-LLKGGKE-----------------AEESNKALHALVQEALGTHGFEMRDAVTLVRS--RE
-DVADL-----------------LQLKDLIDLII-PRGSSDLVRSMQEKSKGIPVLGHAEG
-V-------------WHVYIDKDCDEQKAIQIVRDSKCDYPSACNAAETILIHKDLA----
------------TAPFFDSLCS--MFKAEGVKLHAGPKLAALLKFAP-----PPAESMSFE
-YGSLECTLEVVDN-VEEAVAHIIRYGSGH------TESIITENTNTAEHF
-;no comment
-P5CS_HUMAN/323-645
-IIHHLADLLTDQRDEILLANKKDLEEAEGR---LAAPLLKRLSLSTS-KLNSLAIGLRQI
-AASSQDSVGRVL-RRTRIAKNLELEQ-VTVPIGVLLVIFESRPDCPTPGGSFAIASGNGL
-LLKGGKE-----------------AAHSNRILHLLTQEALSIHGV--KEAVQLVNT--RE
-EVEDL-----------------CRLDKMIDLII-PRGSSQLVRDIQKAAKGIPVMGHSEG
-I-------------CHMYVDSEASVDKVTRLVRDSKCEYPAACNALETLLIHRDLL----
------------RTPLFDQIID--MLRVEQVKIHAGPKFASYLTFSP-----SEVKSLRTE
-YGDLELCIEVVDN-VQDAIDHIHKYGSSH------TDVIVTEDENTAEFF
-;no comment
-PROA_BACSU/1-308
------------------AENAKDIVNGKENG--LTPDIIDRLSLDEK-RIRDIADAVELL
-ID-LADPIGDSL-ETIEKENGLFIQK-IRVPLGVVGMIYEARPNVTVDAATLCLKTGNAV
-VLRGSSS-----------------AIHSNKALVSVIYRALEQSAL-PIHTVQLIEDTSRE
-TAKEL-----------------FTLNDGLDVLI-PRGGKKLIDLVVREST-VPVLETGAG
-N-------------CHIFIDETAKPQMAEKVVVNAKTQRPSVCNAIESLLIHKAWA----
-------------RQNGKELLD--QLENAGVEIRG--DELVCELHP--SSKQASKEDWETE
-FLAPVLSVKTVEN-VQEAVKHIQQYGTNH------SEAILTENDKNAVYF
-;no comment
-PROA_CORGL/6-332
-ILRAAADELVARSAEIIEANASDIEAGRANG--MEESMIDRLALDES-RIEGIAGGLRQV
-AG-LTDPVGEVL-RGHVMENGIQMKQ-VRVPLGVMGMVYEARPNVTVDAFALALKSGNVA
-FVRGSST-----------------AVHSNTKLVEILQDVLERFEL-PRETVQLLPCQTRG
-SVQDL-----------------ITARGLVDVVI-PRGGAGLINAVVTGAT-VPTIETGTG
-N-------------CHFYIDAEAKLGQAIAMVINGKTRRCSVCNATETALLDAALS----
-------------DSDKLAVVQ--ALQEAGVTIHGRVAELEAFGAT--DVVEATETDWDSE
-YLSFDIAVAVVDG-VDGALAHIAKYSTKH------TEAIATQNIETAQRF
-;no comment
-PROA_ECOLI/1-328
--LEKIADELEAQSEIILNANAQDVADARANG--LSEAMLDRLALTPA-RLKGIADDVRQV
-CN-LADPVGQVI-DGGVLDSGLRLER-RRVPLGVIGVIYEARPNVTVDVASLCLKTGNAV
-ILRGGKE-----------------TCRTNAATVAVIQDALKSCGL-PAGAVQAIDNPDRA
-LVSEM-----------------LRMDKYIDMLI-PRGGAGLHKLCREQST-IPVITGGIG
-V-------------CHIYVDESVEIAEALKVIVNAKTQRPSTCNTVETLLVNKNIA----
-------------DSFLPALSK--QMAESGVTLHADAAALAQLQAGPAKVVAVKAEEYDDE
-FLSLDLNVKIVSD-LDDAIAHIREHGTQH------SDAILTRDMRNAQRF
-;no comment
-PROA_SERMA/1-325
-----MADRLEANSEAILLANEQDMAQARATG--MSEALLDRLLLTPA-RLAAIANDVRQV
-CR-LNDPVGHVL-DGNLLDSGLKLER-RRVPLGVIGVIYEARPNVTIDVASLCLKTGNAV
-ILRGGKE-----------------THNTNQATVKVIQQALEQCGL-PAAAVQAIDSPDRA
-LVNEL-----------------LRLDRYVDMLI-PRGGAGLHKLCREQST-IPVITGGIG
-V-------------CHTYVDADVDFDKALTVIENAKIQRPSACNSLETLLVNRSIA----
-------------AEFLPALSA--KMAAAGVTLHAAENALPLLQGGPATVVPVNAEDYDDE
-WLSLDLNVLLVDD-IDQAIDHIRTHGTNH------SDAILTRSLSSAEHF
-;no comment
-PROA_HAEIN/1-314
----------------ILAENAKDIELAKQNG--LSDALIDRLLLTQE-RLQGIANDVRHV
-IS-LADPVGKII-DGGTLDSGLKIER-VRTPLGVIGTIYEARPNVTIDVASLCLKTGNAV
-ILRGGKE-----------------TQFSNKILIEVVQNALEQAGL-PKFAVQAITDPNRE
-LVMQL-----------------LKLDRYVDMII-PRGGSGLHELCKQHST-IPVIVGGVG
-V-------------CHTFVEKSADQNKAIFVIDNAKTQRPSTCNTLETLLVQHSIA----
-------------EEFLPKLVS--HLSAKNVKYHAKSTALNILKQAGANVCEVTEKELRKE
-WGSLDLNVVVVED-IHAAIEHIRQYGTQH------SESILTSSQSLARQF
-;no comment
-PROA_THETH/1-320
-----MADLLEARWEEVLRANREDLEEAERTG--LPKAKLDRLALKEK-DLKTLTEGLRQI
-AR-LPDPLGRIE-GLAKRPNGLRVGR-MRVPLGLIGFIYEARPGATVEAVSVALKAGNAM
-LLRGGKE-----------------AFRSNRALVALWHEALEEAGL-PEEAVTLVPTTDRE
-AVLEM-----------------CRLE-LLDLLI-PRGGEELIRLVQQEAR-VPVLAHAKG
-V-------------NHLYVDEKADLSMALRLALNGKTQRPAVCNALEAVLVHEKVA----
-------------EAFLPRLEK--AMREKGVELRACPRALPLLKEA----VPAREDEWDRE
-YLDLVLRVKVVSG-LEEALAHIARYGSRH------TEAICTEDPKAAWRF
-;no comment
-PROA_CAMJE/1-281
-------------RILALCEGLEKIAYIEDP--------------------IGKISKGWKN
-Y-------------------AGLNIQKISIPLGLICVIYEARPSLSAEIAALMIKSSNAC
-VFKGGSE-----------------AKFTNEAIFTLVNKVLKEFDL--QDCFAMFTQ--RD
-EILQI-----------------LAFDDLIDVII-PRGSSNMIQEIANNTK-IPLIKQNKG
-L-------------CHAFVDQSANLDMALKIILNAKCQRVSVCNALETLLIHEKIAKN--
---------------FISLLIP--EFEKFKVKIHAHENTLAYFNNSNLEIFKANENTFDTE
-WLDFALSVKLVKD-CDEAIEHINKHSSLH------SETIISNDASNIAKF
@@ -1,38 +0,0 @@
-TASM_BFDV/6-67            RLTELLCLPV.......TATAADIKTAYRRTALKYHPDKGGD.................EEKMKELNTLMEEFRETEGLRADETLE
-TASM_SV40/12-75           QLMDLLGLERS.....AWGNIPLMRKAYLKKCKEFHPDKGGD.................EEKMKKMNTLYKKMEDGVKYAHQPDFG
-TASM_POVLY/12-75          ELMDLLQITRA.....AWGNLSMMKKAYKNVSKLYHPDKGGD.................SAKMQRLNELFQRVQVTLMEIRSQCGS
-TASM_POVMA/12-75          RLLELLKLPRQ.....LWGDFGRMQQAYKQQSLLLHPDKGGS.................HALMQELNSLWGTFKTEVYNLRMNLGG
-TAMI_POVHA/12-75          ALISLLDLEPQ.....YWGDYGRMQKCYKKKCLQLHPDKGGN.................EELMQQLNTLWTKLKDGLYRVRLLLGP
-TASM_POVBO/10-71          ELRGLLGTPD.......IGNADTLKKAFLKACKVHHPDKGGN.................EEAMKRLLYLYNKAKIAASATTSQVWY
-DNJ1_HUMAN/4-68           DYYQTLGLAR.......GASDEEIKRAYRRQALRYHPDKNKE..............PGAEEKFKEIAEAYDVLSDPRKREIFDRYG
-DNAJ_HAEDU/5-70           DYYEVLGLQK.......GATEKDIKRAYKRLAAKYHPDKNQG.............SKDSEEKFKQITEAYEILTDDQKRAAYDQYG
-DNJ2_ALLPO/13-74          KYYEVLGVSK.......NATPEDLKKAYRKAAIKNHPDKGGD.................PEKFKEIGQAYEVLNDPEKREIYDQYG
-PSI_SCHPO/6-68            KLYDCLEVRP.......EASEAELKKAYRKLALKYHPDKNPN................GEKKFKEISLAYEVLSDPQRRKLYDQYG
-XDJ1_YEAST/9-77           RLYDVLGVTR.......DATVQEIKTAYRKLALKHHPDKYVDQD..........SKEVNEIKFKEITAAYEILSDPEKKSHYDLYG
-DNAJ_BORBU/4-69           DYYEILGLSK.......GASKDEIKKAYRKIAIKYHPDRNQG.............NEEAASIFKEATQAYEILIDDNKKAKYDRFG
-CSP_RAT/15-80             SLYHVLGLDK.......NATSDDIKKSYRKLALKYHPDKNPD.............NPEAADKFKEINNAHAILTDATKRNIYDKYG
-HLJ1_YEAST/21-85          EFYEILKVDR.......KATDSEIKKAYRKLAIKLHPDKNSH..............PKAGEAFKVINRAFEVLSNEEKRSIYDRIG
-CAJ1_YEAST/6-71           EYYDILGIKP.......EATPTEIKKAYRRKAMETHPDKHPD.............DPDAQAKFQAVGEAYQVLSDPGLRSKYDQFG
-YIS4_YEAST/6-71           EYYDLLGVST.......TASSIEIKKAYRKKSIQEHPDKNPN.............DPTATERFQAISEAYQVLGDDDLRAKYDKYG
-YNW7_YEAST/4-70           CYYELLGVET.......HASDLELKKAYRKKALQYHPDKNPDN............VEEATQKFAVIRAAYEVLSDPQERAWYDSHK
-DNAJ_ERYRH/6-70           DFYEILGVSK.......SATDAEIKKAYRQLAKKYHPDINKE..............DGAEAKFKEVQEAYEVLSDSQKRANYDQFG
-YLW5_CAEEL/531-595        DYYKTLGVDK.......KSDAKAIKKAYFQLAKKYHPDVNKT..............KEAQTKFQEISEAYEVLSDDTKRQEYDAYG
-CBPA_ECOLI/5-69           DYYAIMGVKP.......TDDLKTIKTAYRRLARKYHPDVSKE..............PDAEARFKEVAEAWEVLSDEQRRAEYDQMW
-DNAJ_CAUCR/3-68           DYYEILGVTR.......TIDEAGLKSRVRKLAMEHHPDRNGG.............CENAAGRFKEINEAYSVLSDSQKRAAYDRFG
-DNJM_MYCGE/7-71           DYYEVLGITP.......DADQSEIKKAFRKLAKKYHPDRNNA..............PDAAKIFAEINEANDVLSNPKKRANYDKYG
-DNAJ_SYNP7/6-71           DYYALLGIPQ.......SADQAAIKAAFRKLARQCHPDLNPG.............DRQAEERFKQISEAYEILSDPDRRAEYQRFS
-DNAJ_STRCO/10-75          DYYKVLGVPK.......DATEAEIKKAYRKLARENHPDANKG.............NVKAEERFKEISEANDILGDPKKRKEYDEAR
-YJH3_YEAST/585-655        DYYKILGVSP.......SASSKEIRKAYLNLTKKYHPDKIKANHN........DKQESIHETMSQINEAYETLSDDDKRKEYDLSR
-DNJL_MYCGE/2-64           NLYDLLELPT.......TASIKEIKIAYKRLAKRYHPDVNKL................GSQTFVEINNAYSILSDPNQKEKYDSML
-YFL1_YEAST/44-108         NFYKFLKLPKL.....QNSSTKEITKNLRKLSKKYHPDKNPK................YRKLYERLNLATQILSNSSNRKIYDYYL
-YGM8_YEAST/79-151         NLYDVLELPTPLDVHTIYDDLPQIKRKYRTLALKYHPDKHPD.............NPSIIHKFHLLSTATNILTNADVRPHYDRWL
-YD1J_SCHPO/32-110         TPYEILELPR.......TCTANDIKRKYIELVKKHHPDKMKNASQLAPTESPPEINKHNEEYFRLLLAANALLSDKRRREEYDRFG
-YJQ2_YEAST/13-77          TYYSILGLTS.......NATSSEVHKSYLKLARLLHPDKTKS..............DKSEELFKAVVHAHSILTDEDQKLRYDRDL
-NPL1_YEAST/125-196        DPYEILGIST.......SASDRDIKSAYRKLSVKFHPDKLAKGLT.......PDEKSVMEETYVQITKAYESLTDELVRQNYLKYG
-YJ67_YEAST/8-76           THYEILRIPS.......DATQDEIKKAYRNRLLNTHPDKLSKSI..........HDTVSNVTINKIQDAYKILSNIKTRREYDRLI
-ZUO1_YEAST/97-168         DLYAAMGLSKLR....FRATESQIIKAHRKQVVKYHPDKQSAAG..........GSLDQDGFFKIIQKAFETLTDSNKRAQYDSCD
-ZRF1_MOUSE/88-161         DHYAVLGLGHVR....YTATQRQIKAAHKAMVLKHHPDKRKAAGE........PIKEGDNDYFTCITKAYEMLSDPVKRRAFNSVD
-RESA_PLAFF/523-587        LYYDILGVGV.......NADMNEITERYFKLAENYYPYQRSG..............STVFHNFRKVNEAYQVLGDIDKKRWYNKYG
-YQ07_CAEEL/562-626        DAYSVFGLRS.......DCSDDDIKRNYKRLAALVSPDKCTI..............DAADQVYELVDVAFSAIGYKDSRSEYTLEN
-YFHE_ECOLI/2-74           DYFTLFGLPAR.....YQLDTQALSLRFQDLQRQYHPDKFASGSQ........AEQLAAVQQSATINQAWQTLRHPLMRAEYLLSL
-YGB8_YEAST/13-82          TFYELFPKTFPKKLPIWTIDQSRLRKEYRQLQAQHHPDMAQQ................GSEQSSTLNQAYHTLKDPLRRSQYMLKL
@@ -1,66 +0,0 @@
-CLUSTAL W (1.74) multiple sequence alignment
-
-
-P84139                MNEGEHQIKLDELFEKLLRARKIFKNKDVLRHSYTPKDLPLRHEQIETLAQILVPVLRGE
-P814153               MNEGMHQIKLDVLFEKLLRARKIFKNKDVLRHSYTPKDLPHRHEQIETLAQILVPVLRGE
-P851414               ------------------------------------------------------------
-P841414               ------------------------------------------------------------
-BAB68554              --------------------MLTEDDKQLIQHVWEKVLEHQEDFGAEALERMFIVYPSTK
-gb|443893|124775      -MRFRFGVVVPPAVAGARPELLVVGSRPELG-RWEPRGAVRLRPAGTAAGDGALALQEPG
-                                                                                  
-
-P84139                TPSNIFVYG-KTGTGKTVTVK-FVTEELKRISEKYNIPVDVIYINCEIVDTHYRVLANIV
-P814153               TPSNIFVYG-KTGTGKTVTVK-FVTEELKRISEKYNIPVDVIYINCEIVDTHYRVLANIV
-P851414               -MKIVWCGH-ACFLVEDRGTK-ILIDPYPDVDEDRIGKVDYILQTHEHMD-HYGKTPLIA
-P841414               -MKIVWCGH-ACFLVEDRGTK-ILIDPYPDVDEDRIGKVDYILVTHEHMD-HYGKTPLIA
-BAB68554              TYFPHFDLHHDSEQIRHHGKK-VVGALGDAVKHIDNLSATLSELSNLHCY-NLRVDPVNF
-gb|443893|124775      LWLGEVELA-AEEAAQDGAEPGRVDTFWYKFLKREPGGELSWEGNGPHHDRCCTYNENNL
-                                     .       :      . .           .               
-
-P84139                NYFKDETGIGVPMVGWPTDEVYAKLKQVIDMKERFVIIVLDEIDKLVKKSGDEVLYSLTR
-P814153               NYFKDETGIEVPMVGWPTDEVYAKLKQVIDMKERFVIIVLDEIDKLVKKSGDEVLYSLTR
-P851414               KLSD--------------------------------------------------------
-P841414               KLSD--------------------------------------------------------
-BAB68554              KLLSHCFQVVLGAHLG--REYTPQVQVAYDKFLAAVSAVLAEKYR---------------
-gb|443893|124775      VDGVYCLPIG---HWGEATGHTNEMKHTTDFYFNIAGHQAMHYSRILPNIWLGSCPRQVE
-                                                                                  
-
-P84139                INTELKRAKVSVIGISNDLKFKEYLDPRVLSSLSEEEVVFPPYDANQLRDILTQRAEEAF
-P814153               INTELKRAKVSVIGISNDLKFKEYLDPRVLSSLSEEEVVFPPYDANQLRDILTQRAEEAF
-P851414               ------------------------------------------------------------
-P841414               ------------------------------------------------------------
-BAB68554              ------------------------------------------------------------
-gb|443893|124775      HVTIKLKHELGITAVMN-FQTEWDIVQNSSGCNRYPEPMTPDTMIKLYREEGLAYIWMP-
-                                                                                  
-
-P84139                YPGVLDEGVIPLCAALAAREHGDARKALDLLRVAGEIAEREGASKVTEKHVWKAQEKIEQ
-P814153               YPGVLDEGVIPLCAALAAREHGDARKALDLLRVAGEIAEREGASKVTEKHVWKAQEKIEQ
-P851414               ------------------------------------------------------------
-P841414               ------------------------------------------------------------
-BAB68554              ------------------------------------------------------------
-gb|443893|124775      TPDMSTEGRVQMLPQAVCLLHALLEKGHIVY-----VHCNAGVGRSTAAVCGWLQYVMGW
-                                                                                  
-
-P84139                DMMEEVIKTRPLQSKVLLYAIVLLDENGDLPANTGDVYAVYRELCEYIDLEPLTQRRISD
-P814153               DMMEEVIKTLPLQSKVLLYAIVLLDENGDLPANTGDVYAVYRELCEYIDLEPLTQRRISD
-P851414               ------------------------------------------------------------
-P841414               ------------------------------------------------------------
-BAB68554              ------------------------------------------------------------
-gb|443893|124775      NLRKVQYFLMAKRPAVYIDEEALARAQEDFFQKFGKVRSSVCSL----------------
-                                                                                  
-
-P84139                LINELDMLGIINAKVVSKGRYGRTKEIRLNVTSYKIRNVLRYDYSIQPLLTISLKSEQRR
-P814153               LINELDMLGIINAKVVSKGRYGRTKEIRLMVTSYKIRNVLRYDYSIQPLLTISLKSEQRR
-P851414               ------------------------------------------------------------
-P841414               ------------------------------------------------------------
-BAB68554              ------------------------------------------------------------
-gb|443893|124775      ------------------------------------------------------------
-                                                                                  
-
-P84139                LI
-P814153               LI
-P851414               --
-P841414               --
-BAB68554              --
-gb|443893|124775      --
-                        
@@ -0,0 +1,66 @@
+CLUSTAL W (1.74) multiple sequence alignment
+
+
+P84139                MNEGEHQIKLDELFEKLLRARKIFKNKDVLRHSYTPKDLPLRHEQIETLAQILVPVLRGE
+P814153               MNEGMHQIKLDVLFEKLLRARKIFKNKDVLRHSYTPKDLPHRHEQIETLAQILVPVLRGE
+P851414               ------------------------------------------------------------
+P841414               ------------------------------------------------------------
+BAB68554              --------------------MLTEDDKQLIQHVWEKVLEHQEDFGAEALERMFIVYPSTK
+gb|443893|124775      -MRFRFGVVVPPAVAGARPELLVVGSRPELG-RWEPRGAVRLRPAGTAAGDGALALQEPG
+                                                                                  
+
+P84139                TPSNIFVYG-KTGTGKTVTVK-FVTEELKRISEKYNIPVDVIYINCEIVDTHYRVLANIV
+P814153               TPSNIFVYG-KTGTGKTVTVK-FVTEELKRISEKYNIPVDVIYINCEIVDTHYRVLANIV
+P851414               -MKIVWCGH-ACFLVEDRGTK-ILIDPYPDVDEDRIGKVDYILQTHEHMD-HYGKTPLIA
+P841414               -MKIVWCGH-ACFLVEDRGTK-ILIDPYPDVDEDRIGKVDYILVTHEHMD-HYGKTPLIA
+BAB68554              TYFPHFDLHHDSEQIRHHGKK-VVGALGDAVKHIDNLSATLSELSNLHCY-NLRVDPVNF
+gb|443893|124775      LWLGEVELA-AEEAAQDGAEPGRVDTFWYKFLKREPGGELSWEGNGPHHDRCCTYNENNL
+                                     .       :      . .           .               
+
+P84139                NYFKDETGIGVPMVGWPTDEVYAKLKQVIDMKERFVIIVLDEIDKLVKKSGDEVLYSLTR
+P814153               NYFKDETGIEVPMVGWPTDEVYAKLKQVIDMKERFVIIVLDEIDKLVKKSGDEVLYSLTR
+P851414               KLSD--------------------------------------------------------
+P841414               KLSD--------------------------------------------------------
+BAB68554              KLLSHCFQVVLGAHLG--REYTPQVQVAYDKFLAAVSAVLAEKYR---------------
+gb|443893|124775      VDGVYCLPIG---HWGEATGHTNEMKHTTDFYFNIAGHQAMHYSRILPNIWLGSCPRQVE
+                                                                                  
+
+P84139                INTELKRAKVSVIGISNDLKFKEYLDPRVLSSLSEEEVVFPPYDANQLRDILTQRAEEAF
+P814153               INTELKRAKVSVIGISNDLKFKEYLDPRVLSSLSEEEVVFPPYDANQLRDILTQRAEEAF
+P851414               ------------------------------------------------------------
+P841414               ------------------------------------------------------------
+BAB68554              ------------------------------------------------------------
+gb|443893|124775      HVTIKLKHELGITAVMN-FQTEWDIVQNSSGCNRYPEPMTPDTMIKLYREEGLAYIWMP-
+                                                                                  
+
+P84139                YPGVLDEGVIPLCAALAAREHGDARKALDLLRVAGEIAEREGASKVTEKHVWKAQEKIEQ
+P814153               YPGVLDEGVIPLCAALAAREHGDARKALDLLRVAGEIAEREGASKVTEKHVWKAQEKIEQ
+P851414               ------------------------------------------------------------
+P841414               ------------------------------------------------------------
+BAB68554              ------------------------------------------------------------
+gb|443893|124775      TPDMSTEGRVQMLPQAVCLLHALLEKGHIVY-----VHCNAGVGRSTAAVCGWLQYVMGW
+                                                                                  
+
+P84139                DMMEEVIKTRPLQSKVLLYAIVLLDENGDLPANTGDVYAVYRELCEYIDLEPLTQRRISD
+P814153               DMMEEVIKTLPLQSKVLLYAIVLLDENGDLPANTGDVYAVYRELCEYIDLEPLTQRRISD
+P851414               ------------------------------------------------------------
+P841414               ------------------------------------------------------------
+BAB68554              ------------------------------------------------------------
+gb|443893|124775      NLRKVQYFLMAKRPAVYIDEEALARAQEDFFQKFGKVRSSVCSL----------------
+                                                                                  
+
+P84139                LINELDMLGIINAKVVSKGRYGRTKEIRLNVTSYKIRNVLRYDYSIQPLLTISLKSEQRR
+P814153               LINELDMLGIINAKVVSKGRYGRTKEIRLMVTSYKIRNVLRYDYSIQPLLTISLKSEQRR
+P851414               ------------------------------------------------------------
+P841414               ------------------------------------------------------------
+BAB68554              ------------------------------------------------------------
+gb|443893|124775      ------------------------------------------------------------
+                                                                                  
+
+P84139                LI
+P814153               LI
+P851414               --
+P841414               --
+BAB68554              --
+gb|443893|124775      --
+                        
@@ -0,0 +1,33 @@
+#mega
+!Title: Amino acid sequences of hemoglobin alpha chains;
+!Format datatype=protein identical=. indel=-;
+
+[
+M. Nei and S. Kumar (2000) Molecular Evolution and Phylogenetics.  
+Oxford University Press. New York.
+Data for Example 2.1.
+]
+
+
+
+#Human    V-LSPADKTN VKAAWGKVGA HAGEYGAEAL ERMFLSFPTT KTYFPHF-DL SHGSAQVKGH 
+#Horse    ....A..... .....S...G .......... .....G.... .......... ........A. 
+#Cow      ....A...G. .........G ..A....... .......... .......... .......... 
+#Kangaroo ....A...GH ...I.....G .....A..G. ..T.H..... .......... ......IQA. 
+#Newt     MK..AE..H. ..TT.DHIKG .EEAL..... F...T.L.A. R....AK... .E..SFLHS. 
+#Carp     S...DK..AA ..I..A.ISP K.DDI..... G..LTVY.Q. ....A.WA.. .P..GP..-. 
+
+#Human    GKKVA-DALT NAVAHVDDMP NALSALSDLH AHKLRVDPVN FKLLSHCLLV TLAAHLPAEF 
+#Horse    .......G.. L..G.L..L. G...D..N.. .......... .........S ...V...ND. 
+#Cow      .A....A... K..E.L..L. G...E..... .......... ......S... ...S...SD. 
+#Kangaroo ...I.....G Q..E.I..L. GT..K..... .......... .......... .F....GDA. 
+#Newt     ....M.G..S .....I..ID A..CK...K. .QD.M...A. .PK.A.NI.. VMGI..K.HL 
+#Carp     ....IMG.VG D..SKI..LV GG.AS..E.. .S......A. ..I.ANHIV. GIMFY..GD. 
+
+#Human    TPAVHASLDK FLASVSTVLT SKYR
+#Horse    .......... ..S....... ....
+#Cow      .......... ...N...... ....
+#Kangaroo ..E....... ...A...... ....
+#Newt     .YP..C.V.. ..DV.GH... ....
+#Carp     P.E..M.V.. .FQNLALA.S E...
+