Version 0.02003
[dbsrgits/DBIx-Class-InflateColumn-IP.git] / lib / DBIx / Class / InflateColumn / IP.pm
index ea7ed81..9928586 100644 (file)
@@ -2,13 +2,16 @@ package DBIx::Class::InflateColumn::IP;
 
 use warnings;
 use strict;
+use 5.008001;
 
-our $VERSION = '0.02000';
+our $VERSION = '0.02003';
 
 use base qw/DBIx::Class/;
 __PACKAGE__->mk_classdata(ip_format => 'addr');
 __PACKAGE__->mk_classdata(ip_class  => 'NetAddr::IP');
 
+=encoding utf-8
+
 =head1 NAME
 
 DBIx::Class::InflateColumn::IP - Auto-create NetAddr::IP objects from columns.
@@ -22,7 +25,7 @@ appropriate format.
     __PACKAGE__->load_components(qw/InflateColumn::IP Core/);
     __PACKAGE__->add_columns(
         ip_address => {
-            data_type => 'integer',
+            data_type => 'bigint',
             is_nullable => 0,
             is_ip => 1,
             ip_format => 'numeric',
@@ -46,6 +49,12 @@ Then you can treat the specified column as a NetAddr::IP object.
     print 'IP address: ', $host->ip_address->addr;
     print 'Address type: ', $host->ip_address->iptype;
 
+DBIx::Class::InflateColumn::IP supports a limited amount of
+auto-detection of the format based on the column type. If the type
+begins with C<int> or C<bigint>, it's assumed to be numeric, while
+C<inet> and C<cidr> (as used by e.g. PostgreSQL) are assumed to be
+C<cidr> format.
+
 =head1 METHODS
 
 =head2 ip_class
@@ -86,8 +95,9 @@ sub register_column {
 
     return unless defined $info->{'is_ip'};
 
-    my $ip_format = $info->{ip_format} || $self->ip_format || 'addr';
-    my $ip_class = $info->{ip_class} || $self->ip_class || 'NetAddr::IPf';
+    my $ip_format = $info->{ip_format} || _default_format($info->{data_type})
+        || $self->ip_format || 'addr';
+    my $ip_class = $info->{ip_class} || $self->ip_class || 'NetAddr::IP';
 
     eval "use $ip_class";
     $self->throw_exception("Error loading $ip_class: $@") if $@;
@@ -102,6 +112,19 @@ sub register_column {
     );
 }
 
+my @format_map = (
+  { type => qr/^(?:big)?int/i, format => 'numeric' },
+  { type => qr{^(?:inet|cidr)$}i, format => 'cidr' },
+);
+
+sub _default_format {
+    my ($type) = @_;
+
+    for my $match (@format_map) {
+        return $match->{format} if $type =~ $match->{type};
+    }
+}
+
 =head1 AUTHOR
 
 Dagfinn Ilmari MannsÃ¥ker, C<< <ilmari at ilmari.org> >>