rjbs and I have been working on something that involves referring to things on CPAN, both real files and abtract things (modules, dists without versions, etc.). Here's what we have working so far:
URI::cpan (isa URI::_generic) reblesses into several packages based on its 'authority'. cpan://package/ -> URI::cpan::package cpan://package/Foo::Bar cpan://package/Foo::Bar/1.23 cpan://dist/ -> URI::cpan::dist cpan://dist/Foo-Bar cpan://dist/Foo-Bar/1.23 both package and dist urls have accessor/mutators for 'name' and 'version': my $url = URI->new('cpan://package/Foo::Bar'); print $url->name; # Foo::Bar print $url->version; # undef $url->version("1.23"); # this works print $url; # cpan://package/Foo::Bar/1.23 cpan://^[A-Z]+$/ -> URI::cpan::author cpan://HDP/Foo-Bar-1.23.tar.gz cpan://HDP/some/subdir/random/file.txt It's up to an application to convert between them, since that would probably require access to 02packages. Some author urls *could* be automatically converted to dist urls using CPAN::DistnameInfo, but that isn't included. author urls can be easily used to download things: my $cpan_url = URI->new("cpan://HDP/Foo-Bar-1.23.tar.gz"); my $http_url = URI->new_abs( $cpan_url->full_path_url, "http://www.cpan.org", # or your favorite mirror ); Is there anything else that should be included? hdp.