package Farly::Transport::Protocol;

use 5.008008;
use strict;
use warnings;
use Carp;

our $VERSION = '0.26';

sub new {
    my ( $class, $protocol ) = @_;

    confess "protocol number required" unless ( defined $protocol );

    $protocol =~ s/\s+//g;

    confess "$protocol is not a number"
      unless ( $protocol =~ /^\d+$/ );

    confess "invalid protocol $protocol"
      unless ( ( $protocol >= 0 && $protocol <= 255 ) );

    return bless( \$protocol, $class );
}

sub protocol {
    return ${ $_[0] };
}

sub as_string {
    return ${ $_[0] };
}

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

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

        return $self->protocol() == $other->protocol();
    }
}

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

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

        if ( $self->protocol() == 0 ) {
            return 1;
        }

        return $self->equals($other);
    }
}

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

    if ( $self->contains($other) || $other->contains($self) ) {
        return 1;
    }
}

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

    if ( $other->isa('Farly::Transport::Protocol') ) {
        return $self->protocol() <=> $other->protocol();
    }
}

1;
__END__

=head1 NAME

Farly::Transport::Protocol - TCP/IP protocol class

=head1 DESCRIPTION

Represents an 8 bit TCP/IP protocol integer as an object

=head1 METHODS

=head2 new()

The constructor.

   my $protocol = Farly::Transport::Protocol->new();

No arguments.

=head2 protocol()

Returns the integer protocol number.

  my $8_bit_int = $protocol->protocol();

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

Returns true if the protocols are equal.

  $protocol->equals( $protocol_2 );

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

Returns true if $protocol is "ip" or all protocols.
Returns true if the protocols are equal.

  $protocol->contains( $protocol_2 );

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

Returns true if the protocols are equal.

  $protocol->intersects( $protocol_2 );

=head2 as_string()

Returns the string value

  $protocol->as_string();

=head1 COPYRIGHT AND LICENSE

Farly::Transport::Protocol
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 L<http://www.gnu.org/licenses/>.