package Sequence; use strict; use warnings; use Carp; use base qw(Root); sub id { my ( $self, $id ) = @_; defined $id ? $self->{ __PACKAGE__ . "id" } = $id : return $self->{ __PACKAGE__ . "id" }; } sub seq { my ( $self, @entries ) = @_; if (@entries) { $self->{ __PACKAGE__ . "seq" } = [@entries] } else { if (wantarray) { return defined $self->{ __PACKAGE__ . "seq" } ? @{ $self->{ __PACKAGE__ . "seq" } } : (); } else { return $self->{ __PACKAGE__ . "seq" }; } } } sub length { my ($self) = @_; return scalar @{ [ $self->seq ] }; } #sub numeric { # my ($self, $set) = @_; # return $set ? # $self->{__PACKAGE__."numeric"} = $set : # $self->{__PACKAGE__."numeric"}; #} # #use Scalar::Util qw(looks_like_number); #sub seq_compress { # my ($self, @entries) = @_; # if (@entries) { # my $numeric = grep { looks_like_number $_ } @entries; # if ($numeric != 0 && $numeric != @entries) { # die "Can't compress both numeric and non-numeric data"; # } # # if ($numeric) { # $self->numeric(1); # $self->seq(pack "d*", @entries) # } # else { $self->seq(join '', @entries) } # } # else { # return $self->seq # } #} sub sub_seq { my ( $self, @segments ) = @_; my $package = ref $self; return $self->seq unless @segments; confess "Passed an uneven number of segments" unless @segments % 2 == 0; { my %segments = @segments; # Find out if there are overlapping segments for my $pri ( sort keys %segments ) { for my $test ( sort keys %segments ) { next if $pri == $test; croak "Overlapping segments" if $test < $segments{$pri}; } } } my @sections; my ( $i, @seq ) = ( 0, $self->seq ); do { my ( $start, $end ) = @segments[ $i, $i + 1 ]; # Create a new sequence object in the correct package, and put the # segment into it my $new_seq = $package->new( id => $self->id ); $new_seq->seq( @seq[ $start .. $end ] ); push @sections, $new_seq; $i += 2; } while ( $i < @segments ); return @sections; } 1; __END__ =head1 NAME Sequence - Holds information about a sequence =head1 EXAMPLE my $seq = Sequence->new; $seq->id("Big wobbly molecule"); my @residues = split //, "ASEQENCE"; $seq->seq(@residues); =head1 INHERITANCE Inherits from the Root class. =head1 METHODS =head2 id() Accessor for the sequence ID. =head2 seq(@sequence_data) Accessor for the sequence. Pass the information in as an array, one piece per position. Returns an array reference if called in a scalar context, otherwise an array of the information. =head2 length() Returns the length of the sequence. =head1 AUTHOR Jonathan Barber =cut