Net-TinyIp

 view release on metacpan or  search on metacpan

lib/Net/TinyIp.pm  view on Meta::CPAN

package Net::TinyIp;
use strict;
use warnings;
use Net::TinyIp::Address;

use overload q{""} => \&human_readable;

our $VERSION = "0.08";

sub import {
    my $class = shift;
    my @tags  = @_;

    foreach my $tag ( @tags ) {
        my $module = join q{::}, $class, "Util", join q{}, map { ucfirst } split m{_}, $tag;
        eval "require $module"
            or die;
        $module->import;
    }
}

sub new {
    my $class   = shift;
    my $address = shift;
    my %self;

    my( $host, $cidr ) = split m{/}, $address;

    my $version = $host =~ m{[.]} ? 4 : $host =~ m{[:]} ? 6 : undef;
    my $module  = join q{::}, $class, "Address", "v$version";

    unless ( defined $cidr ) {
        $cidr = $module->get( "bits_length" );
    }

    $self{host} = $module->from_string( $host );
    $self{mask} = $module->from_cidr( $cidr );

    return bless \%self, $class;
}

sub network {
    my $self    = shift;
    my $network = $self->host & $self->mask;

    return $network;
}

sub broadcast {
    my $self = shift;
    my $neg  = ( ref $self->mask )
        ->from_bin( "0b1" )
        ->blsft( $self->mask->get( "bits_length" ) )
        ->bsub( 1 )
        ->bxor( $self->mask );

    return $self->network | $neg;
}

sub host {
    my $self = shift;

    if ( @_ ) {
        $self->{host} = shift;
    }

    return $self->{host};
}

sub mask {
    my $self = shift;

    if ( @_ ) {
        $self->{mask} = shift;
    }

    return $self->{mask};
}

sub human_readable {
    my $self = shift;

    return join q{/}, $self->host, $self->mask->cidr;
}

1;
__END__



( run in 1.653 second using v1.01-cache-2.11-cpan-71847e10f99 )