The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Bio::SFF::Entry;
{
  $Bio::SFF::Entry::VERSION = '0.007';
}

use Moo;
use Sub::Name;

use Scalar::Util qw/looks_like_number/;

for my $attr (qw/clip_qual_left clip_qual_right clip_adaptor_left clip_adaptor_right/) {
	has $attr => (
		is => 'ro',
		required => 1,
		isa => sub {
			return looks_like_number($_[0]);
		},
	);
}

for my $attr (qw/name bases/){ 
	has $attr => (
		is => 'ro',
		required => 1,
		isa => sub {
			return defined && ref($_[0]) eq '';
		},
	);
}

my %unpack = (
	flowgram_values     => 'n*',
	flow_index_per_base => 'C*',
	quality_scores      => 'C*',
);

for my $attr(qw/flowgram_values flow_index_per_base quality_scores/) {
	my $raw = "${attr}_raw";
	has $raw => (
		is => 'ro',
		required => 1,
		init_arg => $attr,
		isa => sub {
			return defined && ref($_[0]) eq '';
		},
	);
	my $meth = "_$attr";
	has "_$attr" => (
		is => 'ro',
		init_arg => undef,
		lazy => 1,
		default => sub {
			return [ unpack $unpack{$attr}, $_[0]->$raw ];
		},
	);
	no strict 'refs';
	*{$attr} = subname($attr, sub {
		return @{ $_[0]->$meth };
	});
}

1;

#ABSTRACT: An SFF entry

__END__

=pod

=head1 NAME

Bio::SFF::Entry - An SFF entry

=head1 VERSION

version 0.007

=head1 SYNOPSIS

 while(my $entry = $reader->next_entry) {
     say '>', $entry->name;
     say $entry->bases;
 }

=head1 DESCRIPTION

This object represents an entry in an SFF file. It contains both processed data (the nucleotides and quality scores) and raw data (e.g. flowgram values).

=head1 ATTRIBUTES

=head2 name

The name of this sequence

=head2 bases

The nucleotides of this sequence

=head2 flowgram_values

Returns an array containing all flowgram values. 

=head2 flow_index_per_base

This contains the flow positions for each base in the called sequence (i.e., for each base, the position in the flowgram whose estimate resulted in that base being called). These values are "incremental" values, meaning that the stored position is the offset from the previous flow index in the field. All position values (prior to their incremental encoding) use 1-based indexing, so the first flow is flow 1.

=head2 quality_scores

The quality scores for each of the bases in the sequence, where the values use the standard -log10 probability scale.

=head2 clip_qual_left

The first base after the clipping point for quality, using 1-based indexing.

=head2 clip_qual_right

The last base before the clipping point for quality, using 1-based indexing.

=head2 clip_adaptor_left

The first base after the clipping point for quality, using 1-based indexing.

=head2 clip_adaptor_right

The last base before the clipping point for quality, using 1-based indexing.

=for Pod::Coverage flow_index_per_base_raw
flowgram_values_raw
quality_scores_raw

=head1 AUTHOR

Leon Timmermans <leont@cpan.org>

=head1 COPYRIGHT AND LICENSE

This software is copyright (c) 2011 by Leon Timmermans, Utrecht University.

This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.

=cut