# BioPerl module for Bio::AlignIO::prodom

#   based on the Bio::SeqIO::prodom module
#       by Ewan Birney <birney@ebi.ac.uk>
#       and Lincoln Stein  <lstein@cshl.org>
#       and the SimpleAlign.pm module of Ewan Birney
# Copyright Peter Schattner
# You may distribute this module under the same terms as perl itself
# _history
# September 5, 2000
# POD documentation - main docs before the code

=head1 NAME

Bio::AlignIO::prodom - prodom sequence input/output stream


Do not use this module directly.  Use it via the L<Bio::AlignIO> class.


This object can transform L<Bio::Align::AlignI> objects to and from prodom flat
file databases.


=head2 Support 

Please direct usage questions or support issues to the mailing list:


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


=head1 AUTHORS - Peter Schattner

Email: schattner@alum.mit.edu


The rest of the documentation details each of the object
methods. Internal methods are usually preceded with a _


# Let the code begin...

package Bio::AlignIO::prodom;
$Bio::AlignIO::prodom::VERSION = '1.7.8';
use strict;

use base qw(Bio::AlignIO);

=head2 next_aln

 Title   : next_aln
 Usage   : $aln = $stream->next_aln()
 Function: returns the next alignment in the stream.
 Returns : L<Bio::Align::AlignI> object
 Args    : NONE


sub next_aln {
    my $self = shift;
    my $entry;
    my ($acc, $fake_id, $start, $end, $seq, $add, %names);

    my $aln =  Bio::SimpleAlign->new(-source => 'prodom');

    while( $entry = $self->_readline) {

       if ($entry =~ /^AC\s+(\S+)\s*$/) {         #ps 9/12/00
	   $aln->id( $1 );
       elsif ($entry =~ /^AL\s+(\S+)\|(\S+)\s+(\d+)\s+(\d+)\s+\S+\s+(\S+)\s*$/){    #ps 9/12/00
	   $fake_id=$2;  # Accessions have _species appended

	   $names{'fake_id'} = $fake_id;

	   $add = Bio::LocatableSeq->new('-seq'      => $seq,
					 '-id'       => $acc,
					 '-start'    => $start,
					 '-end'      => $end,
					 '-alphabet' => $self->alphabet,

       elsif ($entry =~ /^CO/) {
	   # the consensus line marks the end of the alignment part of the entry
   return $aln if $aln->num_sequences;

=head2 write_aln

 Title   : write_aln
 Usage   : $stream->write_aln(@aln)
 Function: writes the $aln object into the stream in prodom format  ###Not yet implemented!###
 Returns : 1 for success and 0 for error
 Args    : L<Bio::Align::AlignI> object


sub write_aln {
    my ($self,@aln) = @_;