Bivio::Type::ForumName
# Copyright (c) 2005-2008 bivio Software, Inc. All Rights Reserved.
# $Id$
package Bivio::Type::ForumName;
use strict;
use Bivio::Base 'Type.Name';
my($_SEP) = __PACKAGE__->use('Type.RealmName')->SPECIAL_SEPARATOR;
sub FIRST_CHAR_REGEXP {
return qr{[a-z]};
}
sub SEP_CHAR_REGEXP {
return qr{$_SEP};
}
sub REGEXP {
my($proto) = @_;
my($c) = $proto->FIRST_CHAR_REGEXP;
my($s) = $proto->SEP_CHAR_REGEXP;
return qr/^($c\w{2,})(?:$s(\w+($s\w+)*)|)$/is;
}
sub extract_rest {
my($proto, $value) = @_;
return ($value =~ $proto->REGEXP)[1];
}
sub extract_top {
my($proto, $value) = @_;
return ($value =~ $proto->REGEXP)[0];
}
sub from_literal {
my($proto, $value) = @_;
$value =~ s/^\s+|\s+$//sg
if defined($value);
my($v, $e) = $proto->SUPER::from_literal($value);
return ($v, $e)
unless defined($v);
return (undef, Bivio::TypeError->FORUM_NAME)
unless $v =~ $proto->REGEXP;
return lc($v);
}
sub get_min_width {
return 3;
}
sub is_top {
my($proto, $value) = @_;
return $proto->extract_top($value) eq $value ? 1 : 0;
}
sub join {
my($proto, @parts) = @_;
return lc(join($_SEP, @parts));
}
sub join_top_unless_exists {
my($proto, $top, $value) = @_;
return $value
if $proto->is_equal($proto->extract_top($value), $top);
return $proto->join($top, $value);
}
sub split {
my($proto, $value) = @_;
return split($_SEP, lc($value));
}
1;