+ my @parts;
+ ($parts[0], my $subversion) = split /\./, $version, 2;
+ $subversion =~ s/\.//g;
+ my $pat = sprintf '.{1,%d}', $step || 1;
+ push @parts, $subversion =~ /($pat)/g;
+
+ s/^0+([^0]|0\z)/$1/ for @parts;
+ $version = join '.', @parts;
+
+ $version .= '_rc' if $is_dev;
+
+ return $version;
+};
+
+my $simple_cleanup = sub {
+ my ($version) = @_;
+
+ my $is_dev = $version =~ /_/;
+
+ for ($version) {
+ s/^v//;
+ y/_-//d;
+ s/^\.*//;
+ s/\.*\z//;
+ s/\.+/./g;
+ }
+
+ $version .= '_rc' if $is_dev;
+
+ return $version;
+};
+
+my $simple_and_correct_suffixes = sub {
+ my ($version) = @_;
+
+ $version = $simple_cleanup->($version);
+ $version =~ s/(?<!_)((?:alpha|beta|pre|rc|p)\d*)\b/_$1/g;
+
+ return $version;
+};
+
+my $simple_and_strip_letters = sub {
+ my ($version) = @_;
+
+ $version = $simple_cleanup->($version);
+ $version =~ s/(?<=\d)[a-z]+//g;
+
+ return $version;
+};
+
+my $simple_and_letters_as_suffix = sub {
+ my ($version) = @_;
+
+ $version = $simple_cleanup->($version);
+ $version =~ s/(?<=\d)b(?=\d)/_beta/g;
+
+ return $version;
+};
+
+my %version_mismatch;
+
+$version_mismatch{$_} = $default_but_ignore_v for qw<
+ Net-DNS-Resolver-Programmable
+>;
+
+$version_mismatch{$_} = $default_but_no_strip_1 for qw<
+ Crypt-RC4
+ File-Grep
+ MogileFS-Client-Async
+ MogileFS-Network
+>;
+
+$version_mismatch{$_} = $default_but_no_strip_2 for qw<
+ Net-IMAP-Simple
+>;
+
+$version_mismatch{$_} = sub { $insert_dot_every->($_[0], 1) } for qw<
+ HTTP-Cookies
+ HTTP-Negotiate
+>;
+
+$version_mismatch{$_} = sub { $insert_dot_every->($_[0], 3) } for qw<
+ POE-Component-IKC
+>;
+
+$version_mismatch{$_} = $simple_cleanup for qw<
+ Alien-SDL
+ CGI-SpeedyCGI
+ Class-ISA
+ Data-Uniqid
+ ExtUtils-Install
+ File-Path
+ Getopt-GUI-Long
+ Gtk2-Notify
+ HTML-Table
+ I18N-LangTags
+ IO
+ IPC-System-Simple
+ Lab-Measurement
+ Log-TraceMessages
+ MusicBrainz-DiscID
+ Net-IRC
+ Net-Ping
+ SDL
+ SOAP-WSDL
+ TeX-Encode
+ Tie-Simple
+ Time-Piece
+ WattsUp-Daemon
+>;
+
+$version_mismatch{$_} = $simple_and_correct_suffixes for qw<
+ Gimp
+ XML-Grove
+>;
+
+$version_mismatch{$_} = $simple_and_strip_letters for qw<
+ DelimMatch
+ SGMLSpm
+>;
+
+$version_mismatch{$_} = $simple_and_letters_as_suffix for qw<
+ Frontier-RPC
+>;
+
+sub version_c2g {
+ my ($n, $v) = @_;
+
+ return unless defined $v;
+
+ my $handler;
+ $handler = $version_mismatch{$n} if defined $n;
+ $handler = $default_mapping unless defined $handler;
+
+ return $handler->($v);
+}
+
+=head2 C<perl_version_c2g $version>
+
+Converts a perl version number as you can find it in CPAN prerequisites to a Gentoo version number.
+
+=cut
+
+sub perl_version_c2g {
+ my ($v) = @_;
+
+ return unless defined $v and $v =~ /^[0-9\.]+$/;
+
+ my @parts;
+ if (my ($version, $subversion) = $v =~ /^([0-9]+)\.(0[^\.]+)$/) {
+ my $len = length $subversion;
+ if (my $pad = $len % 3) {
+ $subversion .= '0' x (3 - $pad);