#!perl

our $DATE = '2014-09-16'; # DATE
our $VERSION = '0.28'; # VERSION

use 5.010;
use strict;
use warnings;

use App::PMUtils;
use Perinci::CmdLine::Any -prefer_lite=>1;

our %SPEC;
$SPEC{pmbin} = {
    v => 1.1,
    summary => 'Given an installed Perl module, list scripts that '.
        'come with its distribution',
    description => <<'_',

Does this happen often with you: you install a CPAN module:

    % cpanm -n Finance::Bank::ID::BCA

The CPAN distribution is supposed to contain some CLI utilities, but it is not
obvious what the name is. So you do:

    % man Finance::Bank::ID::BCA

to find out, and even the module's POD doesn't give the name of the utility
sometimes. You might even open your browser and go to MetaCPAN. Or
download+extract+view the tarball just to find out.

Now there's a simpler alternative:

    % pmbin Finance::Bank::ID::BCA
    download-bca
    parse-bca-statement

Show full path, process multiple modules at once:

    % pmbin -P Finance/Bank/ID/BCA Finance::Bank::ID::Mandiri
    /home/user/perl5/perlbrew/perls/perl-5.18.2/bin/download-bca
    /home/user/perl5/perlbrew/perls/perl-5.18.2/bin/parse-bca-statement
    /home/user/perl5/perlbrew/perls/perl-5.18.2/bin/download-mandiri
    /home/user/perl5/perlbrew/perls/perl-5.18.2/bin/parse-mandiri-statement

You even get tab completion for free.

`pmbin` works by locating the `.packlist` file for the module (which contains
the list of installed files) and filter only the `/(bin,scripts?)/` ones.

_
    args => {
        module => {
            schema => ['array*', of=>'str*', min_len=>1],
            req    => 1,
            pos    => 0,
            greedy => 1,
            element_completion => $App::PMUtils::_complete_module,
        },
        full_path => {
            summary => 'Show full path instead of just filenames',
            schema => 'bool',
            cmdline_aliases => {P=>{}},
        },
    },
    "cmdline.default_format" => 'text-simple',
};
sub pmbin {
    require SHARYANTO::Dist::Util;
    my %args = @_;

    my $mods = $args{module};
    my $res = [];
    my $found;

    for my $mod (@{$mods}) {
        my $path = SHARYANTO::Dist::Util::packlist_for($mod);
        next unless $path && (-f $path);
        $found++;
        open my $fh, "<", $path or do {
            warn "Can't open $path: $!\n";
            next;
        };
        for (<$fh>) {
            chomp;
            next unless m!/(bin|scripts?)/!;
            s!.+/!! unless $args{full_path};
            push @$res, $_;
        }
    }

    if ($found) {
        [200, "OK", $res];
    } else {
        [404, "Can't find .packlist for module(s)"];
    }
}

Perinci::CmdLine::Any->new(
    url => '/main/pmbin',
)->run;

# ABSTRACT: Given an installed Perl module, list scripts that come with its distribution
# PODNAME: pmbin

__END__

=pod

=encoding UTF-8

=head1 NAME

pmbin - Given an installed Perl module, list scripts that come with its distribution

=head1 VERSION

This document describes version 0.28 of pmbin (from Perl distribution App-PMUtils), released on 2014-09-16.

=head1 SYNOPSIS

Basic usage:

 % pmbin Some::Module

Return full path instead of just names:

 % pmbin -P Some::Module

See all other options:

 % pmbin --help

To active bash completion:

 % complete -C pmbin pmbin ; # can be put in bash startup file e.g. .bashrc
 % pmbin Some<tab>
 % pmbin app/pmunins<tab>  ; # resolve to App/pmuninstall, can resolve case
 % pmbin "App::pm<tab>    ; # use quote (' or ") if you want to use :: as separator

=head1 HOMEPAGE

Please visit the project's homepage at L<https://metacpan.org/release/App-PMUtils>.

=head1 SOURCE

Source repository is at L<https://github.com/perlancar/perl-App-PMUtils>.

=head1 BUGS

Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=App-PMUtils>

When submitting a bug or request, please include a test-file or a
patch to an existing test-file that illustrates the bug or desired
feature.

=head1 AUTHOR

perlancar <perlancar@cpan.org>

=head1 COPYRIGHT AND LICENSE

This software is copyright (c) 2014 by perlancar@cpan.org.

This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.

=cut
