=head1 LICENSE

  Copyright (c) 1999-2012 The European Bioinformatics Institute and
  Genome Research Limited.  All rights reserved.

  This software is distributed under a modified Apache license.
  For license details, please see

    http://www.ensembl.org/info/about/code_licence.html

=head1 CONTACT

  Please email comments or questions to the public Ensembl
  developers list at <dev@ensembl.org>.

  Questions may also be sent to the Ensembl help desk at
  <helpdesk@ensembl.org>.

=cut

=head1 NAME

Bio::EnsEMBL::IdMapping::TinyFeature - lightweight feature object

=head1 SYNOPSIS

This object isn't instantiated. See objects which inherit from it
(TinyGene, TinyTranscript, etc.) for examples.

=head1 DESCRIPTION

This is the base class for the lightweight feature objects used by the
stable Id maping application. For performance reasons, these objects
are instantiated using a new_fast() method. The internal implementation
is an arrayref (rather than the more common hashref), which optimises
memory usage.

There are no adaptors to fetch TinyFeatures from the database. You
rather use the normal feature adaptors and then create the TinyFeatures
from the heavy objects you get. The memory saving will therefore mainly
take effect when serialising and reloading these objects.

Also note that TinyFeatures don't have a slice attached to them - all
location information (where required) is stored on the feature object
directly.

=head1 METHODS

  new_fast
  id
  stable_id
  version
  created_date
  modified_date
  to_string

=cut

package Bio::EnsEMBL::IdMapping::TinyFeature;

# internal data structure (array indices):
#
#  0  dbID
#  1  stable_id
#  2  version
#  3  created_date
#  4  modified_date
#
# other instance variables differ by subclass implementation, so look there.


use strict;
use warnings;
no warnings 'uninitialized';

use Bio::EnsEMBL::Utils::Exception qw(throw warning);


=head2 new_fast

  Arg[1]      : Arrayref $array_ref - the arrayref to bless into the new object 
  Description : Constructor.
  Return type : Bio::EnsEMBL::IdMapping::TinyFeature implementing class
  Exceptions  : none
  Caller      : Bio::EnsEMBL::IdMapping::Cache
  Status      : At Risk
              : under development

=cut

sub new_fast {
  my $class = shift;
  my $array_ref = shift;
  return bless $array_ref, $class;
}


=head2 id

  Arg[1]      : (optional) Int - the feature's internal Id ("dbID")
  Description : Getter/setter for the feature's internal Id.
  Return type : Int
  Exceptions  : none
  Caller      : Bio::EnsEMBL::IdMapping::Cache
  Status      : At Risk
              : under development

=cut

sub id {
  my $self = shift;
  $self->[0] = shift if (@_);
  return $self->[0];
}


=head2 stable_id

  Arg[1]      : (optional) String - the feature's stable Id
  Description : Getter/setter for the feature's stable Id.
  Return type : String
  Exceptions  : none
  Caller      : Bio::EnsEMBL::IdMapping::Cache
  Status      : At Risk
              : under development

=cut

sub stable_id {
  my $self = shift;
  $self->[1] = shift if (@_);
  return $self->[1];
}


=head2 version

  Arg[1]      : (optional) Int - the feature's stable Id version
  Description : Getter/setter for the feature's stable Id version.
  Return type : Int
  Exceptions  : none
  Caller      : Bio::EnsEMBL::IdMapping::Cache
  Status      : At Risk
              : under development

=cut

sub version {
  my $self = shift;
  $self->[2] = shift if (@_);
  return $self->[2];
}


=head2 created_date

  Arg[1]      : (optional) String - the feature's stable Id creation date
  Description : Getter/setter for the feature's stable Id creation date.
  Return type : String
  Exceptions  : none
  Caller      : Bio::EnsEMBL::IdMapping::Cache
  Status      : At Risk
              : under development

=cut

sub created_date {
  my $self = shift;
  $self->[3] = shift if (@_);
  return $self->[3];
}


=head2 modified_date

  Arg[1]      : (optional) String - the feature's stable Id modification date
  Description : Getter/setter for the feature's stable Id modification date.
  Return type : String
  Exceptions  : none
  Caller      : Bio::EnsEMBL::IdMapping::Cache
  Status      : At Risk
              : under development

=cut

sub modified_date {
  my $self = shift;
  $self->[4] = shift if (@_);
  return $self->[4];
}


=head2 to_string

  Example     : print LOG "Created ", $f->to_string, "\n";
  Description : Prints a string representation of the feature for debug
                purposes.
  Return type : String
  Exceptions  : none
  Caller      : general
  Status      : At Risk
              : under development

=cut

sub to_string {
  my $self = shift;
  return $self->id.':'.$self->stable_id.'.'.$self->version;
}


1;

