package Farly::Transport::Object;

use 5.008008;
use strict;
use warnings;

our $VERSION = '0.26';

sub size {
    return $_[0]->last - $_[0]->first;
}

sub equals {
    my ( $self, $other ) = @_;

    if ( $other->isa('Farly::Transport::Object') ) {

        return $self->first == $other->first
          && $self->last == $other->last;
    }
}

sub contains {
    my ( $self, $other ) = @_;

    if ( $other->isa('Farly::Transport::Object') ) {

        return $self->first <= $other->first
          && $self->last >= $other->last;
    }
}

sub intersects {
    my ( $self, $other ) = @_;

    if ( $other->isa('Farly::Transport::Object') ) {

        return ( $self->first <= $other->first && $other->first <= $self->last )
          || ( $self->first <= $other->last && $other->last <= $self->last )
          || ( $other->first <= $self->first && $self->first <= $other->last );
    }
}

sub gt {
    my ( $self, $other ) = @_;

    if ( $other->isa('Farly::Transport::Object') ) {

        return $self->first > $other->last;
    }
}

sub lt {
    my ( $self, $other ) = @_;

    if ( $other->isa('Farly::Transport::Object') ) {

        return $self->last < $other->first;
    }
}

sub adjacent {
    my ( $self, $other ) = @_;

    if ( $other->isa('Farly::Transport::Object') ) {

        return $self->size() == $other->size()
          && ( $self->last + 1 ) == $other->first;
    }
}

sub compare {
    my ( $self, $other ) = @_;

    if ( $other->isa('Farly::Transport::Object') ) {

        return ( $self->first() <=> $other->first()
              || $other->last() <=> $self->last() );
    }
}

1;
__END__

=head1 NAME

Farly::Transport::Object - Transport base class

=head1 DESCRIPTION

This is an abstract base class for Farly::Transport classes. It can not be used directly.

=head1 METHODS
  
=head2 adjacent( <Farly::Transport::Object> )

Returns true if current Transport object is adjacent to the other Transport object

  $port_range->adjacent( $port );

=head2 contains( <Farly::Transport::Object> )

Returns true if current Transport object contains the other Transport object

  $port_range->contains( $port );

=head2 equals( <Farly::Transport::Object> )

Returns true if current Transport object contains the other Transport object

  $port_1->equals( $port_2 );

=head2 intersects( <Farly::Transport::Object> )

Returns true if current Transport object intersects the other Transport object

  $port_range_1->intersects( $port_range_2 );

=head2 gt( <Farly::Transport::Object> )

Returns true if current Transport object port or ports are greater
than the other Transport object port or ports.

  $port_range->gt( $port );

=head2 lt( <Farly::Transport::Object> )

Returns true if current Transport object port or ports are less
than the other Transport object port or ports.

  $port_range->lt( $port );

=head2 size( <Farly::Transport::Object> )

Returns the number of ports represented by the current Transport object

  my $number_of_ports = $port_range->size();

=head1 COPYRIGHT AND LICENSE

Farly::Transport::Object
Copyright (C) 2012  Trystan Johnson

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.