The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Legacy::DB::SyntenyBlock;

use strict;
use constant SRC    => 0;
use constant SEQID  => 1;
use constant START  => 2;
use constant STOP   => 3;
use constant STRAND => 4;
use constant SEQ    => 5;

*ref = \&seqid;

sub new {
  my $class = shift;
  my $name  = shift;
  return bless {
		src     => [undef,undef,undef,undef,undef,undef],
		tgt     => [undef,undef,undef,undef,undef,undef],
		name    => $name,
		},ref($class) || $class;
}

sub name    { shift->{name}      }
sub src1    { shift->{src}[SRC]  }
sub src2    { shift->{tgt}[SRC]  }

sub seqid   { shift->{src}[SEQID]  }
sub strand  { shift->{src}[STRAND] }
sub target  { shift->{tgt}[SEQID]  }
sub seq     { shift->{src}[SEQ]    }
sub tseq    { shift->{tgt}[SEQ]    }
sub length  { 
  my $self = shift;
  return $self->end - $self->start;
}
sub tlength {
  my $self = shift;
  return $self->tend - $self->tstart;
}


# make these getter/setters in case they
# must be adjusted later
sub start   { 
  my $self = shift;
  my $value = shift;
  $self->{src}[START] = $value if $value;
  return $self->{src}[START];
}

sub end     {
  my $self = shift;
  my $value = shift;
  $self->{src}[STOP] = $value if $value;
  return $self->{src}[STOP];
}

sub tstart  {
  my $self = shift;
  my $value = shift;
  $self->{tgt}[START] = $value if $value;
  return $self->{tgt}[START];
}
sub tend  { 
  my $self = shift;
  my $value = shift;
  $self->{tgt}[STOP] = $value if $value;
  return $self->{tgt}[STOP];
}

sub tstrand { shift->{tgt}[STRAND] }

# sorted parts list
sub parts   { 
  my $self = shift;
  my $parts = $self->{parts} ? [sort {$a->start <=> $b->start} @{$self->{parts}}]
      : [$self];
  return $parts; 
}

sub src     { shift->{src}         }
sub tgt     { shift->{tgt}         }

sub coordinates {
  my $self = shift;
  return @{$self->{src}},@{$self->{tgt}};
}

sub add_part {
  my $self = shift;
  my ($src,$tgt) = @_;
  for (['src',$src],['tgt',$tgt]) {
    my $parent   = $self->{$_->[0]};
    my $part     = $_->[1];
    $parent->[SRC]    ||= $part->[SRC];
    $parent->[SEQID]  ||= $part->[SEQID];
    $parent->[STRAND] ||= $part->[STRAND];
    $parent->[SEQ]    ||= $part->[SEQ];
    $parent->[START]   = $part->[START] if !defined($parent->[START])  or $parent->[START] > $part->[START];
    $parent->[STOP]    = $part->[STOP]  if !defined($parent->[STOP])   or $parent->[STOP]  < $part->[STOP];
  }
  if (++$self->{cardinality} > 1) {
    my $subpart = $self->new($self->name . ".$self->{cardinality}");
    $subpart->add_part($src,$tgt);
    $self->{parts} ||= [];
    push @{$self->{parts}},$subpart;
    return $subpart->name;
  }
}

1;