.\" Automatically generated by Pod::Man 4.14 (Pod::Simple 3.42) .\" .\" Standard preamble: .\" ======================================================================== .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Vb \" Begin verbatim text .ft CW .nf .ne \\$1 .. .de Ve \" End verbatim text .ft R .fi .. .\" Set up some character translations and predefined strings. \*(-- will .\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left .\" double quote, and \*(R" will give a right double quote. \*(C+ will .\" give a nicer C++. Capital omega is used to do unbreakable dashes and .\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff, .\" nothing in troff, for use with C<>. .tr \(*W- .ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' .ie n \{\ . ds -- \(*W- . ds PI pi . if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch . if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch . ds L" "" . ds R" "" . ds C` "" . ds C' "" 'br\} .el\{\ . ds -- \|\(em\| . ds PI \(*p . ds L" `` . ds R" '' . ds C` . ds C' 'br\} .\" .\" Escape single quotes in literal strings from groff's Unicode transform. .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" .\" If the F register is >0, we'll generate index entries on stderr for .\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index .\" entries marked with X<> in POD. Of course, you'll have to process the .\" output yourself in some meaningful fashion. .\" .\" Avoid warning from groff about undefined register 'F'. .de IX .. .nr rF 0 .if \n(.g .if rF .nr rF 1 .if (\n(rF:(\n(.g==0)) \{\ . if \nF \{\ . de IX . tm Index:\\$1\t\\n%\t"\\$2" .. . if !\nF==2 \{\ . nr % 0 . nr F 2 . \} . \} .\} .rr rF .\" .\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). .\" Fear. Run. Save yourself. No user-serviceable parts. . \" fudge factors for nroff and troff .if n \{\ . ds #H 0 . ds #V .8m . ds #F .3m . ds #[ \f1 . ds #] \fP .\} .if t \{\ . ds #H ((1u-(\\\\n(.fu%2u))*.13m) . ds #V .6m . ds #F 0 . ds #[ \& . ds #] \& .\} . \" simple accents for nroff and troff .if n \{\ . ds ' \& . ds ` \& . ds ^ \& . ds , \& . ds ~ ~ . ds / .\} .if t \{\ . ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" . ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' . ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' . ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' . ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' . ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' .\} . \" troff and (daisy-wheel) nroff accents .ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' .ds 8 \h'\*(#H'\(*b\h'-\*(#H' .ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] .ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' .ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' .ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] .ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] .ds ae a\h'-(\w'a'u*4/10)'e .ds Ae A\h'-(\w'A'u*4/10)'E . \" corrections for vroff .if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' .if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' . \" for low resolution devices (crt and lpr) .if \n(.H>23 .if \n(.V>19 \ \{\ . ds : e . ds 8 ss . ds o a . ds d- d\h'-1'\(ga . ds D- D\h'-1'\(hy . ds th \o'bp' . ds Th \o'LP' . ds ae ae . ds Ae AE .\} .rm #[ #] #H #V #F C .\" ======================================================================== .\" .IX Title "Package::Locator 3pm" .TH Package::Locator 3pm "2022-06-16" "perl v5.34.0" "User Contributed Perl Documentation" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l .nh .SH "NAME" Package::Locator \- Find a package among CPAN\-like repositories .SH "VERSION" .IX Header "VERSION" version 0.010 .SH "SYNOPSIS" .IX Header "SYNOPSIS" .Vb 1 \& use Package::Locator; \& \& # Basic search... \& my $locator = Package::Locator\->new(); \& my $url = locator\->locate( package => \*(AqTest::More\*(Aq ); \& \& # Search for first within multiple repositories: \& my $repos = [ qw(http://cpan.pair.com http://my.company.com/DPAN) ]; \& my $locator = Package::Locator\->new( repository_urls => $repos ); \& my $url = locator\->locate( package => \*(AqTest::More\*(Aq ); \& \& # Search for first where version >= 0.34: \& my $repos = [ qw(http://cpan.pair.com http://my.company.com/DPAN) ]; \& my $locator = Package::Locator\->new( repository_urls => $repos ); \& my $url = locator\->locate( package => \*(AqTest::More\*(Aq version => 0.34); \& \& # Search for latest where version >= 0.34: \& my $repos = [ qw(http://cpan.pair.com http://my.company.com/DPAN) ]; \& my $locator = Package::Locator\->new( repository_urls => $repos ); \& my $url = locator\->locate( package => \*(AqTest::More\*(Aq version => 0.34, latest => 1); \& \& # Search for specific dist on multiple repositories...: \& my $repos = [ qw(http://cpan.pair.com http://my.company.com/DPAN) ]; \& my $locator = Package::Locator\->new( repository_urls => $repos ); \& my $url = locator\->locate( distribution => \*(AqA/AU/AUTHOR/Foo\-1.0.tar.gz\*(Aq); .Ve .SH "DESCRIPTION" .IX Header "DESCRIPTION" Package::Locator attempts to answer the question: \*(L"Where can I find a distribution that will provide this package?\*(R" The answer is divined by searching the indexes for one or more CPAN-like repositories. If you also provide a specific version number, Package::Locator will attempt to find a distribution with that version of the package, or higher. You can also ask to find the latest version of a package across all the indexes. .PP Package::Locator only looks at the index files for each repository, and those indexes only contain information about the latest versions of the packages within that repository. So Package::Locator is not BackPAN magic \*(-- you cannot use it to find precisely which distribution a particular package (or file) came from. For that stuff, see \f(CW"/See Also"\fR. .SH "CONSTRUCTOR" .IX Header "CONSTRUCTOR" .ie n .SS "new( %attributes )" .el .SS "new( \f(CW%attributes\fP )" .IX Subsection "new( %attributes )" All the attributes listed below can be passed to the constructor, and retrieved via accessor methods with the same name. All attributes are read-only, and cannot be changed once the object is constructed. .SH "ATTRIBUTES" .IX Header "ATTRIBUTES" .SS "repository_urls => [ qw(http://somewhere http://somewhere.else) ]" .IX Subsection "repository_urls => [ qw(http://somewhere http://somewhere.else) ]" An array reference containing the base URLs of the repositories you want to search. These are usually \s-1CPAN\s0 mirrors, but can be any website or local directory that is organized in a CPAN-like structure. For each request, repositories are searched in the order you specified them here. This defaults to http://cpan.perl.org. .ie n .SS "user_agent => $user_agent_obj" .el .SS "user_agent => \f(CW$user_agent_obj\fP" .IX Subsection "user_agent => $user_agent_obj" The LWP::UserAgent object that will fetch index files. If you do not provide a user agent, then a default one will be constructed for you. .SS "cache_dir => '/some/directory/path'" .IX Subsection "cache_dir => '/some/directory/path'" The path (as a string or Path::Class::Dir object) to a directory where the index file will be cached. If the directory does not exist, it will be created for you. If you do not specify a cache directory, then a temporary directory will be used. The temporary directory will be deleted when your application terminates. .ie n .SS "force => $boolean" .el .SS "force => \f(CW$boolean\fP" .IX Subsection "force => $boolean" Causes any cached index files to be removed, thus forcing a new one to be downloaded when the object is constructed. This only has effect if you specified the \f(CW\*(C`cache_dir\*(C'\fR attribute. The default is false. .SH "METHODS" .IX Header "METHODS" .SS "\fBindexes()\fP" .IX Subsection "indexes()" Returns a list of Package::Locator::Index objects representing the indexes of each of the repositories. The indexes are only populated on-demand when the \f(CW\*(C`locate\*(C'\fR method is called. The order of the indexes is the same as the order of the repositories defined by the \&\f(CW\*(C`repository_urls\*(C'\fR attribute. .SS "locate( package => 'Foo::Bar' )" .IX Subsection "locate( package => 'Foo::Bar' )" .SS "locate( package => 'Foo::Bar', latest => 1 )" .IX Subsection "locate( package => 'Foo::Bar', latest => 1 )" .SS "locate( package => 'Foo::Bar', version => '1.2')" .IX Subsection "locate( package => 'Foo::Bar', version => '1.2')" .SS "locate( package => 'Foo::Bar', version => '1.2', latest => 1 )" .IX Subsection "locate( package => 'Foo::Bar', version => '1.2', latest => 1 )" .SS "locate ( distribution => 'A/AU/AUTHOR/Foo\-Bar\-1.0.tar.gz' )" .IX Subsection "locate ( distribution => 'A/AU/AUTHOR/Foo-Bar-1.0.tar.gz' )" Given the name of a package, searches all the repository indexes and returns the \s-1URL\s0 to a distribution containing that requested package, or the distribution you requested. .PP If you also specify a \f(CW\*(C`version\*(C'\fR, then you'll always get a distribution that contains that version of the package or higher. If you also specify \f(CW\*(C`latest\*(C'\fR then you'll always get the distribution that contains the latest version of the package that can be found in all the indexes. Otherwise you'll just get the first distribution we can find that satisfies your request. .PP If you give a distribution path instead, then you'll just get back the \&\s-1URL\s0 to the first distribution we find at that path in any of the repository indexes. .PP If neither the package nor the distribution path can be found in any of the indexes, returns undef. .SS "\fBclear_cache()\fP" .IX Subsection "clear_cache()" Deletes the cached index files. Any subsequent calls to the \f(CW\*(C`locate\*(C'\fR method will cause the index files to be fetched anew. .SH "MOTIVATION" .IX Header "MOTIVATION" The \s-1CPAN\s0 module also provides a mechanism for locating packages or distributions, much like Package::Locator does. However, \s-1CPAN\s0 assumes that all repositories are \s-1CPAN\s0 mirrors, so it only searches the first repository that it can contact. .PP My secret ambition is to fill the world with lots of DarkPAN repositories \*(-- each with its own set of distributions. For that scenario, I need to search multiple repositories at the same time. .SH "SEE ALSO" .IX Header "SEE ALSO" If you need to locate a distribution that contains a precise version of a file rather than just a version that is \*(L"new enough\*(R", then look at some of these: .PP Dist::Surveyor .PP BackPAN::Index .PP BackPAN::Version::Discover .SH "SUPPORT" .IX Header "SUPPORT" .SS "Perldoc" .IX Subsection "Perldoc" You can find documentation for this module with the perldoc command. .PP .Vb 1 \& perldoc Package::Locator .Ve .SS "Websites" .IX Subsection "Websites" The following websites have more information about this module, and may be of help to you. As always, in addition to those websites please use your favorite search engine to discover more resources. .IP "\(bu" 4 Search \s-1CPAN\s0 .Sp The default \s-1CPAN\s0 search engine, useful to view \s-1POD\s0 in \s-1HTML\s0 format. .Sp .IP "\(bu" 4 \&\s-1CPAN\s0 Ratings .Sp The \s-1CPAN\s0 Ratings is a website that allows community ratings and reviews of Perl modules. .Sp .IP "\(bu" 4 \&\s-1CPAN\s0 Testers .Sp The \s-1CPAN\s0 Testers is a network of smokers who run automated tests on uploaded \s-1CPAN\s0 distributions. .Sp .IP "\(bu" 4 \&\s-1CPAN\s0 Testers Matrix .Sp The \s-1CPAN\s0 Testers Matrix is a website that provides a visual overview of the test results for a distribution on various Perls/platforms. .Sp .IP "\(bu" 4 \&\s-1CPAN\s0 Testers Dependencies .Sp The \s-1CPAN\s0 Testers Dependencies is a website that shows a chart of the test results of all dependencies for a distribution. .Sp .SS "Bugs / Feature Requests" .IX Subsection "Bugs / Feature Requests" .SS "Source Code" .IX Subsection "Source Code" .PP .Vb 1 \& git clone git://github.com/thaljef/Package\-Locator.git .Ve .SH "AUTHOR" .IX Header "AUTHOR" Jeffrey Ryan Thalhammer .SH "COPYRIGHT AND LICENSE" .IX Header "COPYRIGHT AND LICENSE" This software is copyright (c) 2011 by Imaginative Software Systems. .PP This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.