package
Maker;
our
$_caller
=
scalar
(
caller
(1));
sub
is_script { !
$_caller
}
our
$_has_errors
= 0;
sub
has_errors {
$_has_errors
}
our
$has_been_imported
= 0;
sub
import
{
if
(
$has_been_imported
) {
return
1;
}
else
{
strict->
import
;
warnings->
import
;
&use_module_install
;
$has_been_imported
= 1;
}
}
sub
installer_mode { -e
'META.yml'
}
sub
_use_module_install {
inc::Module::Install->
import
;
}
sub
_try_use_module_install {
eval
{
_use_module_install;
1;
}
}
sub
use_module_install {
if
(
&installer_mode
) {
_use_module_install;
}
else
{
_try_use_module_install
|| log_missing_author_dependencies(
'Module::Install'
);
}
}
sub
module_install_author_plugins {
'Module::Install::ReadmeMarkdownFromPod'
=>
'readme_markdown_from_pod'
,
'Module::Install::Repository'
=>
'auto_set_repository'
,
'Module::Install::Homepage'
=>
'auto_set_homepage'
,
'Module::Install::ManifestSkip'
=> [
manifest_skip
=>
qw(clean)
],
'Module::Install::AutoManifest'
=>
'auto_manifest'
;
}
sub
extra_author_dependencies {
'App::cpanminus'
,
'local::lib'
,
'App::local::lib::helper'
,
'Module::Install'
,
'App::cpanoutdated'
,
'CPAN::Uploader'
}
sub
list_author_dependencies {
my
%module_install_author_plugins
= module_install_author_plugins;
my
@deps
= (
&extra_author_dependencies
,
keys
%module_install_author_plugins
);
print
join
"\n"
,
@deps
;
print
"\n"
;
}
sub
finalize_makefile {
unless
(
&installer_mode
) {
my
%module_install_author_plugins
= module_install_author_plugins;
my
@missing
=
grep
{ !
eval
"package main; use $_; 1"
}
keys
%module_install_author_plugins
;
log_missing_author_dependencies(
@missing
)
if
@missing
;
foreach
my
$method_proto
(
values
%module_install_author_plugins
) {
my
(
$method
,
@args
) =
ref
$method_proto
?
@$method_proto
: (
$method_proto
);
SCOPE_NO_STRICT_REFS: {
no
strict
'refs'
;
&{
"main::$method"
}(
@args
);
}
}
}
SCOPE_DO_POSTAMBLE: {
no
strict
'refs'
;
&{
"main::postamble"
}(
&generate_postamble
);
}
SCOPE_DO_FINALIZE_CMDS: {
no
strict
'refs'
;
&{
"main::auto_install"
}();
&{
"main::WriteAll"
}();
}
}
sub
generate_postamble {
<<"EOP";
updatedeps :
\tcpan-outdated -p | cpanm
pushtags :
\tgit commit -a -m "Release commit for $(VERSION)"
\tgit tag v$(VERSION) -m "release $(VERSION)"
\tgit push --tags
\tgit push
EOP
}
sub
log_missing_author_dependencies {
my
@missing_modules
=
map
{
"\t$_\n"
}
@_
;
$_has_errors
= 1;
print
<<"ERR";
You are in author mode but are missing the following modules:
@missing_modules
You are getting an error message because you are in author mode and are missing
some author only dependencies. You should only see this message if you have
checked this code out from a repository. If you are just trying to install
the code please use the CPAN version. If you are an author you will need to
install the missing modules, or you can bootstrap all the requirements using
Task::BeLike::JJNAPIORK with:
cpanm Task::BeLike::JJNAPIORK
If you think you are seeing this this message in error, please report it as a
bug to the author.
ERR
exit
;
}
sub
run {
my
$parser
= Getopt::Long::Parser->new(
config
=> [
"no_ignore_case"
,
"pass_through"
],
);
my
(
$show_help
,
$show_authordeps
);
$parser
->getoptions(
'help|?'
=> \
$show_help
,
'authordeps'
=> \
$show_authordeps
,
);
Pod::Usage::pod2usage(1)
if
$show_help
;
list_author_dependencies
if
$show_authordeps
;
return
1;
}
sub
run_if_script {
my
@caller
=
caller
(1);
if
(is_script) {
&run
;
}
elsif
(
$caller
[1] =~m/Makefile\.PL$/) {
__PACKAGE__->
import
;
}
else
{
1;
}
}
END {
finalize_makefile
unless
is_script || has_errors;
}
__PACKAGE__->run_if_script;