+=head2 ValueIncludeURL
+
+Returns a filled in URL template for this ObjectCustomFieldValue, suitable for
+constructing a hyperlink in RT's webui. Returns undef if this custom field doesn't have
+a IncludeContentForValue
+
+=cut
+
+sub IncludeContentForValue {
+ my $self = shift;
+ return $self->_FillInTemplateURL($self->CustomFieldObj->IncludeContentForValue);
+}
+
+
+sub ParseIPRange {
+ my $self = shift;
+ my $value = shift or return;
+ $value = lc $value;
+ $value =~ s!^\s+!!;
+ $value =~ s!\s+$!!;
+
+ if ( $value =~ /^$RE{net}{CIDR}{IPv4}{-keep}$/go ) {
+ my $cidr = join( '.', map $_||0, (split /\./, $1)[0..3] ) ."/$2";
+ $value = (Net::CIDR::cidr2range( $cidr ))[0] || $value;
+ }
+ elsif ( $value =~ /^$IPv6_re(?:\/\d+)?$/o ) {
+ $value = (Net::CIDR::cidr2range( $value ))[0] || $value;
+ }
+
+ my ($sIP, $eIP);
+ if ( $value =~ /^($RE{net}{IPv4})$/o ) {
+ $sIP = $eIP = sprintf "%03d.%03d.%03d.%03d", split /\./, $1;
+ }
+ elsif ( $value =~ /^($RE{net}{IPv4})-($RE{net}{IPv4})$/o ) {
+ $sIP = sprintf "%03d.%03d.%03d.%03d", split /\./, $1;
+ $eIP = sprintf "%03d.%03d.%03d.%03d", split /\./, $2;
+ }
+ elsif ( $value =~ /^($IPv6_re)$/o ) {
+ $sIP = $self->ParseIP( $1 );
+ $eIP = $sIP;
+ }
+ elsif ( $value =~ /^($IPv6_re)-($IPv6_re)$/o ) {
+ ($sIP, $eIP) = ( $1, $2 );
+ $sIP = $self->ParseIP( $sIP );
+ $eIP = $self->ParseIP( $eIP );
+ }
+ else {
+ return;
+ }
+
+ ($sIP, $eIP) = ($eIP, $sIP) if $sIP gt $eIP;
+
+ return $sIP, $eIP;
+}
+
+sub ParseIP {
+ my $self = shift;
+ my $value = shift or return;
+ $value = lc $value;
+ $value =~ s!^\s+!!;
+ $value =~ s!\s+$!!;
+
+ if ( $value =~ /^($RE{net}{IPv4})$/o ) {
+ return sprintf "%03d.%03d.%03d.%03d", split /\./, $1;
+ }
+ elsif ( $value =~ /^$IPv6_re$/o ) {
+
+ # up_fields are before '::'
+ # low_fields are after '::' but without v4
+ # v4_fields are the v4
+ my ( @up_fields, @low_fields, @v4_fields );
+ my $v6;
+ if ( $value =~ /(.*:)(\d+\..*)/ ) {
+ ( $v6, my $v4 ) = ( $1, $2 );
+ chop $v6 unless $v6 =~ /::$/;
+ while ( $v4 =~ /(\d+)\.(\d+)/g ) {
+ push @v4_fields, sprintf '%.2x%.2x', $1, $2;
+ }
+ }
+ else {
+ $v6 = $value;
+ }
+
+ my ( $up, $low );
+ if ( $v6 =~ /::/ ) {
+ ( $up, $low ) = split /::/, $v6;
+ }
+ else {
+ $up = $v6;
+ }
+
+ @up_fields = split /:/, $up;
+ @low_fields = split /:/, $low if $low;
+
+ my @zero_fields =
+ ('0000') x ( 8 - @v4_fields - @up_fields - @low_fields );
+ my @fields = ( @up_fields, @zero_fields, @low_fields, @v4_fields );
+
+ return join ':', map { sprintf "%.4x", hex "0x$_" } @fields;
+ }
+ return;
+}
+
+