From 1c5632a0aef47995a59e504b8be863e925d93007 Mon Sep 17 00:00:00 2001 From: Packit Date: Sep 16 2020 16:01:20 +0000 Subject: perl-Sub-Install-0.928 base --- diff --git a/Changes b/Changes new file mode 100644 index 0000000..ce2f97d --- /dev/null +++ b/Changes @@ -0,0 +1,54 @@ +Revision history for Sub-Install + +0.928 2014-06-26 18:57:27-04:00 America/New_York + - cope with subroutines with spaces in their names when catching + warnings + - don't assume that the source sub isn't blessed in tests (!) + +0.927 2013-10-15 22:46:38 America/New_York + rebuild using Dist::Zilla, update links to repo, metadata, etc. + + typo fixes, thanks David Steinbrunner + +0.926 2012-02-26 + cope with terminal dots from new Carp + +0.925 2009-01-16 + add repo loc to metadata + +0.924 2006-11-13 + packaging improvements + +0.922 2006-07-21 + fix filename-matching in output tests for win32 (20617, thanks Jerry + Gay!) (Couldn't reproduce this one. Argh!) + +0.921 2006-07-16 + fix filename-matching in output tests for win32 (20484, thanks Alex + Chorny!) + +0.92 2006-05-11 + allow other users to build exporters like our tiny one (&exporter) + rename _CALLABLE to _CODELIKE to keep up with Params::Util + +0.91 2006-04-30 + use _CALLABLE to determine callability of code, not ref + +0.90 2006-04-15 + rewrite warning handling: + reinstall suppresses fewer warnings: only sub redefinition + relevant warnings warn from caller (like Carp) + YOUR CODE MAY BREAK: + the test/code and documentation differed on install_installers + the code has been changed to match the documentation + +0.03 2005-11-22 19:00 + install_installers to make Sub::Installer history + +0.02 2005-11-22 11:26 + improved detection of sub names via B + 100% coverage + +0.01 2005-11-21 22:28 + the first version + diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..039a36e --- /dev/null +++ b/LICENSE @@ -0,0 +1,379 @@ +This software is copyright (c) 2005 by Ricardo SIGNES. + +This is free software; you can redistribute it and/or modify it under +the same terms as the Perl 5 programming language system itself. + +Terms of the Perl programming language system itself + +a) the GNU General Public License as published by the Free + Software Foundation; either version 1, or (at your option) any + later version, or +b) the "Artistic License" + +--- The GNU General Public License, Version 1, February 1989 --- + +This software is Copyright (c) 2005 by Ricardo SIGNES. + +This is free software, licensed under: + + The GNU General Public License, Version 1, February 1989 + + GNU GENERAL PUBLIC LICENSE + Version 1, February 1989 + + Copyright (C) 1989 Free Software Foundation, Inc. + 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The license agreements of most software companies try to keep users +at the mercy of those companies. By contrast, our General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. The +General Public License applies to the Free Software Foundation's +software and to any other program whose authors commit to using it. +You can use it for your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Specifically, the General Public License is designed to make +sure that you have the freedom to give away or sell copies of free +software, that you receive source code or can get it if you want it, +that you can change the software or use pieces of it in new free +programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of a such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must tell them their rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any program or other work which +contains a notice placed by the copyright holder saying it may be +distributed under the terms of this General Public License. The +"Program", below, refers to any such program or work, and a "work based +on the Program" means either the Program or any work containing the +Program or a portion of it, either verbatim or with modifications. Each +licensee is addressed as "you". + + 1. You may copy and distribute verbatim copies of the Program's source +code as you receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice and +disclaimer of warranty; keep intact all the notices that refer to this +General Public License and to the absence of any warranty; and give any +other recipients of the Program a copy of this General Public License +along with the Program. You may charge a fee for the physical act of +transferring a copy. + + 2. You may modify your copy or copies of the Program or any portion of +it, and copy and distribute such modifications under the terms of Paragraph +1 above, provided that you also do the following: + + a) cause the modified files to carry prominent notices stating that + you changed the files and the date of any change; and + + b) cause the whole of any work that you distribute or publish, that + in whole or in part contains the Program or any part thereof, either + with or without modifications, to be licensed at no charge to all + third parties under the terms of this General Public License (except + that you may choose to grant warranty protection to some or all + third parties, at your option). + + c) If the modified program normally reads commands interactively when + run, you must cause it, when started running for such interactive use + in the simplest and most usual way, to print or display an + announcement including an appropriate copyright notice and a notice + that there is no warranty (or else, saying that you provide a + warranty) and that users may redistribute the program under these + conditions, and telling the user how to view a copy of this General + Public License. + + d) You may charge a fee for the physical act of transferring a + copy, and you may at your option offer warranty protection in + exchange for a fee. + +Mere aggregation of another independent work with the Program (or its +derivative) on a volume of a storage or distribution medium does not bring +the other work under the scope of these terms. + + 3. You may copy and distribute the Program (or a portion or derivative of +it, under Paragraph 2) in object code or executable form under the terms of +Paragraphs 1 and 2 above provided that you also do one of the following: + + a) accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of + Paragraphs 1 and 2 above; or, + + b) accompany it with a written offer, valid for at least three + years, to give any third party free (except for a nominal charge + for the cost of distribution) a complete machine-readable copy of the + corresponding source code, to be distributed under the terms of + Paragraphs 1 and 2 above; or, + + c) accompany it with the information you received as to where the + corresponding source code may be obtained. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form alone.) + +Source code for a work means the preferred form of the work for making +modifications to it. For an executable file, complete source code means +all the source code for all modules it contains; but, as a special +exception, it need not include source code for modules which are standard +libraries that accompany the operating system on which the executable +file runs, or for standard header files or definitions files that +accompany that operating system. + + 4. You may not copy, modify, sublicense, distribute or transfer the +Program except as expressly provided under this General Public License. +Any attempt otherwise to copy, modify, sublicense, distribute or transfer +the Program is void, and will automatically terminate your rights to use +the Program under this License. However, parties who have received +copies, or rights to use copies, from you under this General Public +License will not have their licenses terminated so long as such parties +remain in full compliance. + + 5. By copying, distributing or modifying the Program (or any work based +on the Program) you indicate your acceptance of this license to do so, +and all its terms and conditions. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the original +licensor to copy, distribute or modify the Program subject to these +terms and conditions. You may not impose any further restrictions on the +recipients' exercise of the rights granted herein. + + 7. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of the license which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +the license, you may choose any version ever published by the Free Software +Foundation. + + 8. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 9. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 10. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + Appendix: How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to humanity, the best way to achieve this is to make it +free software which everyone can redistribute and change under these +terms. + + To do so, attach the following notices to the program. It is safest to +attach them to the start of each source file to most effectively convey +the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) 19yy + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 1, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) 19xx name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the +appropriate parts of the General Public License. Of course, the +commands you use may be called something other than `show w' and `show +c'; they could even be mouse-clicks or menu items--whatever suits your +program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + program `Gnomovision' (a program to direct compilers to make passes + at assemblers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +That's all there is to it! + + +--- The Artistic License 1.0 --- + +This software is Copyright (c) 2005 by Ricardo SIGNES. + +This is free software, licensed under: + + The Artistic License 1.0 + +The Artistic License + +Preamble + +The intent of this document is to state the conditions under which a Package +may be copied, such that the Copyright Holder maintains some semblance of +artistic control over the development of the package, while giving the users of +the package the right to use and distribute the Package in a more-or-less +customary fashion, plus the right to make reasonable modifications. + +Definitions: + + - "Package" refers to the collection of files distributed by the Copyright + Holder, and derivatives of that collection of files created through + textual modification. + - "Standard Version" refers to such a Package if it has not been modified, + or has been modified in accordance with the wishes of the Copyright + Holder. + - "Copyright Holder" is whoever is named in the copyright or copyrights for + the package. + - "You" is you, if you're thinking about copying or distributing this Package. + - "Reasonable copying fee" is whatever you can justify on the basis of media + cost, duplication charges, time of people involved, and so on. (You will + not be required to justify it to the Copyright Holder, but only to the + computing community at large as a market that must bear the fee.) + - "Freely Available" means that no fee is charged for the item itself, though + there may be fees involved in handling the item. It also means that + recipients of the item may redistribute it under the same conditions they + received it. + +1. You may make and give away verbatim copies of the source form of the +Standard Version of this Package without restriction, provided that you +duplicate all of the original copyright notices and associated disclaimers. + +2. You may apply bug fixes, portability fixes and other modifications derived +from the Public Domain or from the Copyright Holder. A Package modified in such +a way shall still be considered the Standard Version. + +3. You may otherwise modify your copy of this Package in any way, provided that +you insert a prominent notice in each changed file stating how and when you +changed that file, and provided that you do at least ONE of the following: + + a) place your modifications in the Public Domain or otherwise make them + Freely Available, such as by posting said modifications to Usenet or an + equivalent medium, or placing the modifications on a major archive site + such as ftp.uu.net, or by allowing the Copyright Holder to include your + modifications in the Standard Version of the Package. + + b) use the modified Package only within your corporation or organization. + + c) rename any non-standard executables so the names do not conflict with + standard executables, which must also be provided, and provide a separate + manual page for each non-standard executable that clearly documents how it + differs from the Standard Version. + + d) make other distribution arrangements with the Copyright Holder. + +4. You may distribute the programs of this Package in object code or executable +form, provided that you do at least ONE of the following: + + a) distribute a Standard Version of the executables and library files, + together with instructions (in the manual page or equivalent) on where to + get the Standard Version. + + b) accompany the distribution with the machine-readable source of the Package + with your modifications. + + c) accompany any non-standard executables with their corresponding Standard + Version executables, giving the non-standard executables non-standard + names, and clearly documenting the differences in manual pages (or + equivalent), together with instructions on where to get the Standard + Version. + + d) make other distribution arrangements with the Copyright Holder. + +5. You may charge a reasonable copying fee for any distribution of this +Package. You may charge any fee you choose for support of this Package. You +may not charge a fee for this Package itself. However, you may distribute this +Package in aggregate with other (possibly commercial) programs as part of a +larger (possibly commercial) software distribution provided that you do not +advertise this Package as a product of your own. + +6. The scripts and library files supplied as input to or produced as output +from the programs of this Package do not automatically fall under the copyright +of this Package, but belong to whomever generated them, and may be sold +commercially, and may be aggregated with this Package. + +7. C or perl subroutines supplied by you and linked into this Package shall not +be considered part of this Package. + +8. The name of the Copyright Holder may not be used to endorse or promote +products derived from this software without specific prior written permission. + +9. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED +WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF +MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. + +The End + diff --git a/MANIFEST b/MANIFEST new file mode 100644 index 0000000..b8a7875 --- /dev/null +++ b/MANIFEST @@ -0,0 +1,21 @@ +# This file was automatically generated by Dist::Zilla::Plugin::Manifest v5.019. +Changes +LICENSE +MANIFEST +META.json +META.yml +Makefile.PL +README +dist.ini +lib/Sub/Install.pm +t/000-report-versions-tiny.t +t/SI_install.t +t/SI_reinstall.t +t/auto_as.t +t/export.t +t/inst-blessed.t +t/install.t +t/misc_errors.t +t/reinstall.t +xt/release/changes_has_content.t +xt/release/pod-syntax.t diff --git a/META.json b/META.json new file mode 100644 index 0000000..13d320e --- /dev/null +++ b/META.json @@ -0,0 +1,487 @@ +{ + "abstract" : "install subroutines into packages easily", + "author" : [ + "Ricardo SIGNES " + ], + "dynamic_config" : 0, + "generated_by" : "Dist::Zilla version 5.019, CPAN::Meta::Converter version 2.141520", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Sub-Install", + "prereqs" : { + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.30" + } + }, + "develop" : { + "requires" : { + "Test::Pod" : "1.41", + "version" : "0.9901" + } + }, + "runtime" : { + "requires" : { + "B" : "0", + "Carp" : "0", + "Scalar::Util" : "0", + "strict" : "0", + "warnings" : "0" + } + }, + "test" : { + "requires" : { + "Test::More" : "0.96" + } + } + }, + "release_status" : "stable", + "resources" : { + "bugtracker" : { + "web" : "https://github.com/rjbs/Sub-Install/issues" + }, + "homepage" : "https://github.com/rjbs/Sub-Install", + "repository" : { + "type" : "git", + "url" : "https://github.com/rjbs/Sub-Install.git", + "web" : "https://github.com/rjbs/Sub-Install" + } + }, + "version" : "0.928", + "x_Dist_Zilla" : { + "perl" : { + "version" : "5.021001" + }, + "plugins" : [ + { + "class" : "Dist::Zilla::Plugin::Git::GatherDir", + "config" : { + "Dist::Zilla::Plugin::Git::GatherDir" : { + "include_untracked" : "0" + }, + "Dist::Zilla::Role::Git::Repo" : { + "repo_root" : "." + } + }, + "name" : "@RJBS/Git::GatherDir", + "version" : "2.023" + }, + { + "class" : "Dist::Zilla::Plugin::CheckPrereqsIndexed", + "name" : "@RJBS/CheckPrereqsIndexed", + "version" : "0.012" + }, + { + "class" : "Dist::Zilla::Plugin::CheckExtraTests", + "name" : "@RJBS/CheckExtraTests", + "version" : "0.021" + }, + { + "class" : "Dist::Zilla::Plugin::PromptIfStale", + "config" : { + "Dist::Zilla::Plugin::PromptIfStale" : { + "check_all_plugins" : 0, + "check_all_prereqs" : 0, + "modules" : [ + "Dist::Zilla::PluginBundle::RJBS" + ], + "phase" : "build", + "skip" : [] + } + }, + "name" : "@RJBS/RJBS-Outdated", + "version" : "0.023" + }, + { + "class" : "Dist::Zilla::Plugin::PromptIfStale", + "config" : { + "Dist::Zilla::Plugin::PromptIfStale" : { + "check_all_plugins" : "1", + "check_all_prereqs" : 0, + "modules" : [], + "phase" : "release", + "skip" : [] + } + }, + "name" : "@RJBS/CPAN-Outdated", + "version" : "0.023" + }, + { + "class" : "Dist::Zilla::Plugin::PruneCruft", + "name" : "@RJBS/@Filter/PruneCruft", + "version" : "5.019" + }, + { + "class" : "Dist::Zilla::Plugin::ManifestSkip", + "name" : "@RJBS/@Filter/ManifestSkip", + "version" : "5.019" + }, + { + "class" : "Dist::Zilla::Plugin::MetaYAML", + "name" : "@RJBS/@Filter/MetaYAML", + "version" : "5.019" + }, + { + "class" : "Dist::Zilla::Plugin::License", + "name" : "@RJBS/@Filter/License", + "version" : "5.019" + }, + { + "class" : "Dist::Zilla::Plugin::Readme", + "name" : "@RJBS/@Filter/Readme", + "version" : "5.019" + }, + { + "class" : "Dist::Zilla::Plugin::ExecDir", + "name" : "@RJBS/@Filter/ExecDir", + "version" : "5.019" + }, + { + "class" : "Dist::Zilla::Plugin::ShareDir", + "name" : "@RJBS/@Filter/ShareDir", + "version" : "5.019" + }, + { + "class" : "Dist::Zilla::Plugin::Manifest", + "name" : "@RJBS/@Filter/Manifest", + "version" : "5.019" + }, + { + "class" : "Dist::Zilla::Plugin::TestRelease", + "name" : "@RJBS/@Filter/TestRelease", + "version" : "5.019" + }, + { + "class" : "Dist::Zilla::Plugin::ConfirmRelease", + "name" : "@RJBS/@Filter/ConfirmRelease", + "version" : "5.019" + }, + { + "class" : "Dist::Zilla::Plugin::UploadToCPAN", + "name" : "@RJBS/@Filter/UploadToCPAN", + "version" : "5.019" + }, + { + "class" : "Dist::Zilla::Plugin::MakeMaker", + "config" : { + "Dist::Zilla::Role::TestRunner" : { + "default_jobs" : 9 + } + }, + "name" : "@RJBS/MakeMaker", + "version" : "5.019" + }, + { + "class" : "Dist::Zilla::Plugin::AutoPrereqs", + "name" : "@RJBS/AutoPrereqs", + "version" : "5.019" + }, + { + "class" : "Dist::Zilla::Plugin::Git::NextVersion", + "config" : { + "Dist::Zilla::Plugin::Git::NextVersion" : { + "first_version" : "0.001", + "version_by_branch" : "0", + "version_regexp" : "(?^:^([0-9]+\\.[0-9]+)$)" + }, + "Dist::Zilla::Role::Git::Repo" : { + "repo_root" : "." + } + }, + "name" : "@RJBS/Git::NextVersion", + "version" : "2.023" + }, + { + "class" : "Dist::Zilla::Plugin::PkgVersion", + "name" : "@RJBS/PkgVersion", + "version" : "5.019" + }, + { + "class" : "Dist::Zilla::Plugin::MetaConfig", + "name" : "@RJBS/MetaConfig", + "version" : "5.019" + }, + { + "class" : "Dist::Zilla::Plugin::MetaJSON", + "name" : "@RJBS/MetaJSON", + "version" : "5.019" + }, + { + "class" : "Dist::Zilla::Plugin::NextRelease", + "name" : "@RJBS/NextRelease", + "version" : "5.019" + }, + { + "class" : "Dist::Zilla::Plugin::Test::ChangesHasContent", + "name" : "@RJBS/Test::ChangesHasContent", + "version" : "0.006" + }, + { + "class" : "Dist::Zilla::Plugin::PodSyntaxTests", + "name" : "@RJBS/PodSyntaxTests", + "version" : "5.019" + }, + { + "class" : "Dist::Zilla::Plugin::ReportVersions::Tiny", + "name" : "@RJBS/ReportVersions::Tiny", + "version" : "1.10" + }, + { + "class" : "Dist::Zilla::Plugin::Prereqs", + "config" : { + "Dist::Zilla::Plugin::Prereqs" : { + "phase" : "test", + "type" : "requires" + } + }, + "name" : "@RJBS/TestMoreWithSubtests", + "version" : "5.019" + }, + { + "class" : "Dist::Zilla::Plugin::PodWeaver", + "config" : { + "Dist::Zilla::Plugin::PodWeaver" : { + "config_plugins" : [ + "@RJBS" + ], + "finder" : [ + ":InstallModules", + ":ExecFiles" + ], + "plugins" : [ + { + "class" : "Pod::Weaver::Plugin::EnsurePod5", + "name" : "@CorePrep/EnsurePod5", + "version" : "4.006" + }, + { + "class" : "Pod::Weaver::Plugin::H1Nester", + "name" : "@CorePrep/H1Nester", + "version" : "4.006" + }, + { + "class" : "Pod::Weaver::Plugin::SingleEncoding", + "name" : "@RJBS/SingleEncoding", + "version" : "4.006" + }, + { + "class" : "Pod::Weaver::Section::Name", + "name" : "@RJBS/Name", + "version" : "4.006" + }, + { + "class" : "Pod::Weaver::Section::Version", + "name" : "@RJBS/Version", + "version" : "4.006" + }, + { + "class" : "Pod::Weaver::Section::Region", + "name" : "@RJBS/Prelude", + "version" : "4.006" + }, + { + "class" : "Pod::Weaver::Section::Generic", + "name" : "@RJBS/Synopsis", + "version" : "4.006" + }, + { + "class" : "Pod::Weaver::Section::Generic", + "name" : "@RJBS/Description", + "version" : "4.006" + }, + { + "class" : "Pod::Weaver::Section::Generic", + "name" : "@RJBS/Overview", + "version" : "4.006" + }, + { + "class" : "Pod::Weaver::Section::Generic", + "name" : "@RJBS/Stability", + "version" : "4.006" + }, + { + "class" : "Pod::Weaver::Section::Collect", + "name" : "Attributes", + "version" : "4.006" + }, + { + "class" : "Pod::Weaver::Section::Collect", + "name" : "Methods", + "version" : "4.006" + }, + { + "class" : "Pod::Weaver::Section::Collect", + "name" : "Functions", + "version" : "4.006" + }, + { + "class" : "Pod::Weaver::Section::Leftovers", + "name" : "@RJBS/Leftovers", + "version" : "4.006" + }, + { + "class" : "Pod::Weaver::Section::Region", + "name" : "@RJBS/postlude", + "version" : "4.006" + }, + { + "class" : "Pod::Weaver::Section::Authors", + "name" : "@RJBS/Authors", + "version" : "4.006" + }, + { + "class" : "Pod::Weaver::Section::Legal", + "name" : "@RJBS/Legal", + "version" : "4.006" + }, + { + "class" : "Pod::Weaver::Plugin::Transformer", + "name" : "@RJBS/List", + "version" : "4.006" + } + ] + } + }, + "name" : "@RJBS/PodWeaver", + "version" : "4.005" + }, + { + "class" : "Dist::Zilla::Plugin::GithubMeta", + "name" : "@RJBS/GithubMeta", + "version" : "0.46" + }, + { + "class" : "Dist::Zilla::Plugin::Git::Check", + "config" : { + "Dist::Zilla::Plugin::Git::Check" : { + "untracked_files" : "die" + }, + "Dist::Zilla::Role::Git::DirtyFiles" : { + "allow_dirty" : [ + "dist.ini", + "Changes" + ], + "allow_dirty_match" : [], + "changelog" : "Changes" + }, + "Dist::Zilla::Role::Git::Repo" : { + "repo_root" : "." + } + }, + "name" : "@RJBS/@Git/Check", + "version" : "2.023" + }, + { + "class" : "Dist::Zilla::Plugin::Git::Commit", + "config" : { + "Dist::Zilla::Plugin::Git::Commit" : { + "add_files_in" : [], + "commit_msg" : "v%v%n%n%c", + "time_zone" : "local" + }, + "Dist::Zilla::Role::Git::DirtyFiles" : { + "allow_dirty" : [ + "dist.ini", + "Changes" + ], + "allow_dirty_match" : [], + "changelog" : "Changes" + }, + "Dist::Zilla::Role::Git::Repo" : { + "repo_root" : "." + } + }, + "name" : "@RJBS/@Git/Commit", + "version" : "2.023" + }, + { + "class" : "Dist::Zilla::Plugin::Git::Tag", + "config" : { + "Dist::Zilla::Plugin::Git::Tag" : { + "branch" : null, + "signed" : 0, + "tag" : "0.928", + "tag_format" : "%v", + "tag_message" : "v%v", + "time_zone" : "local" + }, + "Dist::Zilla::Role::Git::Repo" : { + "repo_root" : "." + } + }, + "name" : "@RJBS/@Git/Tag", + "version" : "2.023" + }, + { + "class" : "Dist::Zilla::Plugin::Git::Push", + "config" : { + "Dist::Zilla::Plugin::Git::Push" : { + "push_to" : [ + "origin :", + "github :" + ], + "remotes_must_exist" : 0 + }, + "Dist::Zilla::Role::Git::Repo" : { + "repo_root" : "." + } + }, + "name" : "@RJBS/@Git/Push", + "version" : "2.023" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":InstallModules", + "version" : "5.019" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":IncModules", + "version" : "5.019" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":TestFiles", + "version" : "5.019" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":ExecFiles", + "version" : "5.019" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":ShareFiles", + "version" : "5.019" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":MainModule", + "version" : "5.019" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":AllFiles", + "version" : "5.019" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":NoFiles", + "version" : "5.019" + } + ], + "zilla" : { + "class" : "Dist::Zilla::Dist::Builder", + "config" : { + "is_trial" : "0" + }, + "version" : "5.019" + } + } +} + diff --git a/META.yml b/META.yml new file mode 100644 index 0000000..ad9891e --- /dev/null +++ b/META.yml @@ -0,0 +1,355 @@ +--- +abstract: 'install subroutines into packages easily' +author: + - 'Ricardo SIGNES ' +build_requires: + Test::More: '0.96' +configure_requires: + ExtUtils::MakeMaker: '6.30' +dynamic_config: 0 +generated_by: 'Dist::Zilla version 5.019, CPAN::Meta::Converter version 2.141520' +license: perl +meta-spec: + url: http://module-build.sourceforge.net/META-spec-v1.4.html + version: '1.4' +name: Sub-Install +requires: + B: '0' + Carp: '0' + Scalar::Util: '0' + strict: '0' + warnings: '0' +resources: + bugtracker: https://github.com/rjbs/Sub-Install/issues + homepage: https://github.com/rjbs/Sub-Install + repository: https://github.com/rjbs/Sub-Install.git +version: '0.928' +x_Dist_Zilla: + perl: + version: '5.021001' + plugins: + - + class: Dist::Zilla::Plugin::Git::GatherDir + config: + Dist::Zilla::Plugin::Git::GatherDir: + include_untracked: '0' + Dist::Zilla::Role::Git::Repo: + repo_root: . + name: '@RJBS/Git::GatherDir' + version: '2.023' + - + class: Dist::Zilla::Plugin::CheckPrereqsIndexed + name: '@RJBS/CheckPrereqsIndexed' + version: '0.012' + - + class: Dist::Zilla::Plugin::CheckExtraTests + name: '@RJBS/CheckExtraTests' + version: '0.021' + - + class: Dist::Zilla::Plugin::PromptIfStale + config: + Dist::Zilla::Plugin::PromptIfStale: + check_all_plugins: 0 + check_all_prereqs: 0 + modules: + - Dist::Zilla::PluginBundle::RJBS + phase: build + skip: [] + name: '@RJBS/RJBS-Outdated' + version: '0.023' + - + class: Dist::Zilla::Plugin::PromptIfStale + config: + Dist::Zilla::Plugin::PromptIfStale: + check_all_plugins: '1' + check_all_prereqs: 0 + modules: [] + phase: release + skip: [] + name: '@RJBS/CPAN-Outdated' + version: '0.023' + - + class: Dist::Zilla::Plugin::PruneCruft + name: '@RJBS/@Filter/PruneCruft' + version: '5.019' + - + class: Dist::Zilla::Plugin::ManifestSkip + name: '@RJBS/@Filter/ManifestSkip' + version: '5.019' + - + class: Dist::Zilla::Plugin::MetaYAML + name: '@RJBS/@Filter/MetaYAML' + version: '5.019' + - + class: Dist::Zilla::Plugin::License + name: '@RJBS/@Filter/License' + version: '5.019' + - + class: Dist::Zilla::Plugin::Readme + name: '@RJBS/@Filter/Readme' + version: '5.019' + - + class: Dist::Zilla::Plugin::ExecDir + name: '@RJBS/@Filter/ExecDir' + version: '5.019' + - + class: Dist::Zilla::Plugin::ShareDir + name: '@RJBS/@Filter/ShareDir' + version: '5.019' + - + class: Dist::Zilla::Plugin::Manifest + name: '@RJBS/@Filter/Manifest' + version: '5.019' + - + class: Dist::Zilla::Plugin::TestRelease + name: '@RJBS/@Filter/TestRelease' + version: '5.019' + - + class: Dist::Zilla::Plugin::ConfirmRelease + name: '@RJBS/@Filter/ConfirmRelease' + version: '5.019' + - + class: Dist::Zilla::Plugin::UploadToCPAN + name: '@RJBS/@Filter/UploadToCPAN' + version: '5.019' + - + class: Dist::Zilla::Plugin::MakeMaker + config: + Dist::Zilla::Role::TestRunner: + default_jobs: 9 + name: '@RJBS/MakeMaker' + version: '5.019' + - + class: Dist::Zilla::Plugin::AutoPrereqs + name: '@RJBS/AutoPrereqs' + version: '5.019' + - + class: Dist::Zilla::Plugin::Git::NextVersion + config: + Dist::Zilla::Plugin::Git::NextVersion: + first_version: '0.001' + version_by_branch: '0' + version_regexp: (?^:^([0-9]+\.[0-9]+)$) + Dist::Zilla::Role::Git::Repo: + repo_root: . + name: '@RJBS/Git::NextVersion' + version: '2.023' + - + class: Dist::Zilla::Plugin::PkgVersion + name: '@RJBS/PkgVersion' + version: '5.019' + - + class: Dist::Zilla::Plugin::MetaConfig + name: '@RJBS/MetaConfig' + version: '5.019' + - + class: Dist::Zilla::Plugin::MetaJSON + name: '@RJBS/MetaJSON' + version: '5.019' + - + class: Dist::Zilla::Plugin::NextRelease + name: '@RJBS/NextRelease' + version: '5.019' + - + class: Dist::Zilla::Plugin::Test::ChangesHasContent + name: '@RJBS/Test::ChangesHasContent' + version: '0.006' + - + class: Dist::Zilla::Plugin::PodSyntaxTests + name: '@RJBS/PodSyntaxTests' + version: '5.019' + - + class: Dist::Zilla::Plugin::ReportVersions::Tiny + name: '@RJBS/ReportVersions::Tiny' + version: '1.10' + - + class: Dist::Zilla::Plugin::Prereqs + config: + Dist::Zilla::Plugin::Prereqs: + phase: test + type: requires + name: '@RJBS/TestMoreWithSubtests' + version: '5.019' + - + class: Dist::Zilla::Plugin::PodWeaver + config: + Dist::Zilla::Plugin::PodWeaver: + config_plugins: + - '@RJBS' + finder: + - ':InstallModules' + - ':ExecFiles' + plugins: + - + class: Pod::Weaver::Plugin::EnsurePod5 + name: '@CorePrep/EnsurePod5' + version: '4.006' + - + class: Pod::Weaver::Plugin::H1Nester + name: '@CorePrep/H1Nester' + version: '4.006' + - + class: Pod::Weaver::Plugin::SingleEncoding + name: '@RJBS/SingleEncoding' + version: '4.006' + - + class: Pod::Weaver::Section::Name + name: '@RJBS/Name' + version: '4.006' + - + class: Pod::Weaver::Section::Version + name: '@RJBS/Version' + version: '4.006' + - + class: Pod::Weaver::Section::Region + name: '@RJBS/Prelude' + version: '4.006' + - + class: Pod::Weaver::Section::Generic + name: '@RJBS/Synopsis' + version: '4.006' + - + class: Pod::Weaver::Section::Generic + name: '@RJBS/Description' + version: '4.006' + - + class: Pod::Weaver::Section::Generic + name: '@RJBS/Overview' + version: '4.006' + - + class: Pod::Weaver::Section::Generic + name: '@RJBS/Stability' + version: '4.006' + - + class: Pod::Weaver::Section::Collect + name: Attributes + version: '4.006' + - + class: Pod::Weaver::Section::Collect + name: Methods + version: '4.006' + - + class: Pod::Weaver::Section::Collect + name: Functions + version: '4.006' + - + class: Pod::Weaver::Section::Leftovers + name: '@RJBS/Leftovers' + version: '4.006' + - + class: Pod::Weaver::Section::Region + name: '@RJBS/postlude' + version: '4.006' + - + class: Pod::Weaver::Section::Authors + name: '@RJBS/Authors' + version: '4.006' + - + class: Pod::Weaver::Section::Legal + name: '@RJBS/Legal' + version: '4.006' + - + class: Pod::Weaver::Plugin::Transformer + name: '@RJBS/List' + version: '4.006' + name: '@RJBS/PodWeaver' + version: '4.005' + - + class: Dist::Zilla::Plugin::GithubMeta + name: '@RJBS/GithubMeta' + version: '0.46' + - + class: Dist::Zilla::Plugin::Git::Check + config: + Dist::Zilla::Plugin::Git::Check: + untracked_files: die + Dist::Zilla::Role::Git::DirtyFiles: + allow_dirty: + - dist.ini + - Changes + allow_dirty_match: [] + changelog: Changes + Dist::Zilla::Role::Git::Repo: + repo_root: . + name: '@RJBS/@Git/Check' + version: '2.023' + - + class: Dist::Zilla::Plugin::Git::Commit + config: + Dist::Zilla::Plugin::Git::Commit: + add_files_in: [] + commit_msg: v%v%n%n%c + time_zone: local + Dist::Zilla::Role::Git::DirtyFiles: + allow_dirty: + - dist.ini + - Changes + allow_dirty_match: [] + changelog: Changes + Dist::Zilla::Role::Git::Repo: + repo_root: . + name: '@RJBS/@Git/Commit' + version: '2.023' + - + class: Dist::Zilla::Plugin::Git::Tag + config: + Dist::Zilla::Plugin::Git::Tag: + branch: ~ + signed: 0 + tag: '0.928' + tag_format: '%v' + tag_message: v%v + time_zone: local + Dist::Zilla::Role::Git::Repo: + repo_root: . + name: '@RJBS/@Git/Tag' + version: '2.023' + - + class: Dist::Zilla::Plugin::Git::Push + config: + Dist::Zilla::Plugin::Git::Push: + push_to: + - 'origin :' + - 'github :' + remotes_must_exist: 0 + Dist::Zilla::Role::Git::Repo: + repo_root: . + name: '@RJBS/@Git/Push' + version: '2.023' + - + class: Dist::Zilla::Plugin::FinderCode + name: ':InstallModules' + version: '5.019' + - + class: Dist::Zilla::Plugin::FinderCode + name: ':IncModules' + version: '5.019' + - + class: Dist::Zilla::Plugin::FinderCode + name: ':TestFiles' + version: '5.019' + - + class: Dist::Zilla::Plugin::FinderCode + name: ':ExecFiles' + version: '5.019' + - + class: Dist::Zilla::Plugin::FinderCode + name: ':ShareFiles' + version: '5.019' + - + class: Dist::Zilla::Plugin::FinderCode + name: ':MainModule' + version: '5.019' + - + class: Dist::Zilla::Plugin::FinderCode + name: ':AllFiles' + version: '5.019' + - + class: Dist::Zilla::Plugin::FinderCode + name: ':NoFiles' + version: '5.019' + zilla: + class: Dist::Zilla::Dist::Builder + config: + is_trial: '0' + version: '5.019' diff --git a/Makefile.PL b/Makefile.PL new file mode 100644 index 0000000..ba48f4e --- /dev/null +++ b/Makefile.PL @@ -0,0 +1,61 @@ + +# This file was automatically generated by Dist::Zilla::Plugin::MakeMaker v5.019. +use strict; +use warnings; + + + +use ExtUtils::MakeMaker 6.30; + + + +my %WriteMakefileArgs = ( + "ABSTRACT" => "install subroutines into packages easily", + "AUTHOR" => "Ricardo SIGNES ", + "CONFIGURE_REQUIRES" => { + "ExtUtils::MakeMaker" => "6.30" + }, + "DISTNAME" => "Sub-Install", + "EXE_FILES" => [], + "LICENSE" => "perl", + "NAME" => "Sub::Install", + "PREREQ_PM" => { + "B" => 0, + "Carp" => 0, + "Scalar::Util" => 0, + "strict" => 0, + "warnings" => 0 + }, + "TEST_REQUIRES" => { + "Test::More" => "0.96" + }, + "VERSION" => "0.928", + "test" => { + "TESTS" => "t/*.t" + } +); + + +my %FallbackPrereqs = ( + "B" => 0, + "Carp" => 0, + "Scalar::Util" => 0, + "Test::More" => "0.96", + "strict" => 0, + "warnings" => 0 +); + + +unless ( eval { ExtUtils::MakeMaker->VERSION(6.63_03) } ) { + delete $WriteMakefileArgs{TEST_REQUIRES}; + delete $WriteMakefileArgs{BUILD_REQUIRES}; + $WriteMakefileArgs{PREREQ_PM} = \%FallbackPrereqs; +} + +delete $WriteMakefileArgs{CONFIGURE_REQUIRES} + unless eval { ExtUtils::MakeMaker->VERSION(6.52) }; + +WriteMakefile(%WriteMakefileArgs); + + + diff --git a/README b/README new file mode 100644 index 0000000..610c86e --- /dev/null +++ b/README @@ -0,0 +1,15 @@ + + +This archive contains the distribution Sub-Install, +version 0.928: + + install subroutines into packages easily + +This software is copyright (c) 2005 by Ricardo SIGNES. + +This is free software; you can redistribute it and/or modify it under +the same terms as the Perl 5 programming language system itself. + + +This README file was generated by Dist::Zilla::Plugin::Readme v5.019. + diff --git a/dist.ini b/dist.ini new file mode 100644 index 0000000..d28de63 --- /dev/null +++ b/dist.ini @@ -0,0 +1,7 @@ +name = Sub-Install +author = Ricardo SIGNES +license = Perl_5 +copyright_holder = Ricardo SIGNES +copyright_year = 2005 + +[@RJBS] diff --git a/lib/Sub/Install.pm b/lib/Sub/Install.pm new file mode 100644 index 0000000..a77b77e --- /dev/null +++ b/lib/Sub/Install.pm @@ -0,0 +1,451 @@ +use strict; +use warnings; +package Sub::Install; +# ABSTRACT: install subroutines into packages easily +$Sub::Install::VERSION = '0.928'; +use Carp; +use Scalar::Util (); + +#pod =head1 SYNOPSIS +#pod +#pod use Sub::Install; +#pod +#pod Sub::Install::install_sub({ +#pod code => sub { ... }, +#pod into => $package, +#pod as => $subname +#pod }); +#pod +#pod =head1 DESCRIPTION +#pod +#pod This module makes it easy to install subroutines into packages without the +#pod unsightly mess of C or typeglobs lying about where just anyone can +#pod see them. +#pod +#pod =func install_sub +#pod +#pod Sub::Install::install_sub({ +#pod code => \&subroutine, +#pod into => "Finance::Shady", +#pod as => 'launder', +#pod }); +#pod +#pod This routine installs a given code reference into a package as a normal +#pod subroutine. The above is equivalent to: +#pod +#pod no strict 'refs'; +#pod *{"Finance::Shady" . '::' . "launder"} = \&subroutine; +#pod +#pod If C is not given, the sub is installed into the calling package. +#pod +#pod If C is not a code reference, it is looked for as an existing sub in the +#pod package named in the C parameter. If C is not given, it will look +#pod in the calling package. +#pod +#pod If C is not given, and if C is a name, C will default to C. +#pod If C is not given, but if C is a code ref, Sub::Install will try to +#pod find the name of the given code ref and use that as C. +#pod +#pod That means that this code: +#pod +#pod Sub::Install::install_sub({ +#pod code => 'twitch', +#pod from => 'Person::InPain', +#pod into => 'Person::Teenager', +#pod as => 'dance', +#pod }); +#pod +#pod is the same as: +#pod +#pod package Person::Teenager; +#pod +#pod Sub::Install::install_sub({ +#pod code => Person::InPain->can('twitch'), +#pod as => 'dance', +#pod }); +#pod +#pod =func reinstall_sub +#pod +#pod This routine behaves exactly like C>, but does not emit a +#pod warning if warnings are on and the destination is already defined. +#pod +#pod =cut + +sub _name_of_code { + my ($code) = @_; + require B; + my $name = B::svref_2object($code)->GV->NAME; + return $name unless $name =~ /\A__ANON__/; + return; +} + +# See also Params::Util, to which this code was donated. +sub _CODELIKE { + (Scalar::Util::reftype($_[0])||'') eq 'CODE' + || Scalar::Util::blessed($_[0]) + && (overload::Method($_[0],'&{}') ? $_[0] : undef); +} + +# do the heavy lifting +sub _build_public_installer { + my ($installer) = @_; + + sub { + my ($arg) = @_; + my ($calling_pkg) = caller(0); + + # I'd rather use ||= but I'm whoring for Devel::Cover. + for (qw(into from)) { $arg->{$_} = $calling_pkg unless $arg->{$_} } + + # This is the only absolutely required argument, in many cases. + Carp::croak "named argument 'code' is not optional" unless $arg->{code}; + + if (_CODELIKE($arg->{code})) { + $arg->{as} ||= _name_of_code($arg->{code}); + } else { + Carp::croak + "couldn't find subroutine named $arg->{code} in package $arg->{from}" + unless my $code = $arg->{from}->can($arg->{code}); + + $arg->{as} = $arg->{code} unless $arg->{as}; + $arg->{code} = $code; + } + + Carp::croak "couldn't determine name under which to install subroutine" + unless $arg->{as}; + + $installer->(@$arg{qw(into as code) }); + } +} + +# do the ugly work + +my $_misc_warn_re; +my $_redef_warn_re; +BEGIN { + $_misc_warn_re = qr/ + Prototype\ mismatch:\ sub\ .+? | + Constant subroutine .+? redefined + /x; + $_redef_warn_re = qr/Subroutine\ .+?\ redefined/x; +} + +my $eow_re; +BEGIN { $eow_re = qr/ at .+? line \d+\.\Z/ }; + +sub _do_with_warn { + my ($arg) = @_; + my $code = delete $arg->{code}; + my $wants_code = sub { + my $code = shift; + sub { + my $warn = $SIG{__WARN__} ? $SIG{__WARN__} : sub { warn @_ }; ## no critic + local $SIG{__WARN__} = sub { + my ($error) = @_; + for (@{ $arg->{suppress} }) { + return if $error =~ $_; + } + for (@{ $arg->{croak} }) { + if (my ($base_error) = $error =~ /\A($_) $eow_re/x) { + Carp::croak $base_error; + } + } + for (@{ $arg->{carp} }) { + if (my ($base_error) = $error =~ /\A($_) $eow_re/x) { + return $warn->(Carp::shortmess $base_error); + } + } + ($arg->{default} || $warn)->($error); + }; + $code->(@_); + }; + }; + return $wants_code->($code) if $code; + return $wants_code; +} + +sub _installer { + sub { + my ($pkg, $name, $code) = @_; + no strict 'refs'; ## no critic ProhibitNoStrict + *{"$pkg\::$name"} = $code; + return $code; + } +} + +BEGIN { + *_ignore_warnings = _do_with_warn({ + carp => [ $_misc_warn_re, $_redef_warn_re ] + }); + + *install_sub = _build_public_installer(_ignore_warnings(_installer)); + + *_carp_warnings = _do_with_warn({ + carp => [ $_misc_warn_re ], + suppress => [ $_redef_warn_re ], + }); + + *reinstall_sub = _build_public_installer(_carp_warnings(_installer)); + + *_install_fatal = _do_with_warn({ + code => _installer, + croak => [ $_redef_warn_re ], + }); +} + +#pod =func install_installers +#pod +#pod This routine is provided to allow Sub::Install compatibility with +#pod Sub::Installer. It installs C and C methods into +#pod the package named by its argument. +#pod +#pod Sub::Install::install_installers('Code::Builder'); # just for us, please +#pod Code::Builder->install_sub({ name => $code_ref }); +#pod +#pod Sub::Install::install_installers('UNIVERSAL'); # feeling lucky, punk? +#pod Anything::At::All->install_sub({ name => $code_ref }); +#pod +#pod The installed installers are similar, but not identical, to those provided by +#pod Sub::Installer. They accept a single hash as an argument. The key/value pairs +#pod are used as the C and C parameters to the C routine +#pod detailed above. The package name on which the method is called is used as the +#pod C parameter. +#pod +#pod Unlike Sub::Installer's C will not eval strings into code, but +#pod will look for named code in the calling package. +#pod +#pod =cut + +sub install_installers { + my ($into) = @_; + + for my $method (qw(install_sub reinstall_sub)) { + my $code = sub { + my ($package, $subs) = @_; + my ($caller) = caller(0); + my $return; + for (my ($name, $sub) = %$subs) { + $return = Sub::Install->can($method)->({ + code => $sub, + from => $caller, + into => $package, + as => $name + }); + } + return $return; + }; + install_sub({ code => $code, into => $into, as => $method }); + } +} + +#pod =head1 EXPORTS +#pod +#pod Sub::Install exports C and C only if they are +#pod requested. +#pod +#pod =head2 exporter +#pod +#pod Sub::Install has a never-exported subroutine called C, which is used +#pod to implement its C routine. It takes a hashref of named arguments, +#pod only one of which is currently recognize: C. This must be an arrayref +#pod of subroutines to offer for export. +#pod +#pod This routine is mainly for Sub::Install's own consumption. Instead, consider +#pod L. +#pod +#pod =cut + +sub exporter { + my ($arg) = @_; + + my %is_exported = map { $_ => undef } @{ $arg->{exports} }; + + sub { + my $class = shift; + my $target = caller; + for (@_) { + Carp::croak "'$_' is not exported by $class" if !exists $is_exported{$_}; + install_sub({ code => $_, from => $class, into => $target }); + } + } +} + +BEGIN { *import = exporter({ exports => [ qw(install_sub reinstall_sub) ] }); } + +#pod =head1 SEE ALSO +#pod +#pod =over +#pod +#pod =item L +#pod +#pod This module is (obviously) a reaction to Damian Conway's Sub::Installer, which +#pod does the same thing, but does it by getting its greasy fingers all over +#pod UNIVERSAL. I was really happy about the idea of making the installation of +#pod coderefs less ugly, but I couldn't bring myself to replace the ugliness of +#pod typeglobs and loosened strictures with the ugliness of UNIVERSAL methods. +#pod +#pod =item L +#pod +#pod This is a complete Exporter.pm replacement, built atop Sub::Install. +#pod +#pod =back +#pod +#pod =head1 EXTRA CREDITS +#pod +#pod Several of the tests are adapted from tests that shipped with Damian Conway's +#pod Sub-Installer distribution. +#pod +#pod =cut + +1; + +__END__ + +=pod + +=encoding UTF-8 + +=head1 NAME + +Sub::Install - install subroutines into packages easily + +=head1 VERSION + +version 0.928 + +=head1 SYNOPSIS + + use Sub::Install; + + Sub::Install::install_sub({ + code => sub { ... }, + into => $package, + as => $subname + }); + +=head1 DESCRIPTION + +This module makes it easy to install subroutines into packages without the +unsightly mess of C or typeglobs lying about where just anyone can +see them. + +=head1 FUNCTIONS + +=head2 install_sub + + Sub::Install::install_sub({ + code => \&subroutine, + into => "Finance::Shady", + as => 'launder', + }); + +This routine installs a given code reference into a package as a normal +subroutine. The above is equivalent to: + + no strict 'refs'; + *{"Finance::Shady" . '::' . "launder"} = \&subroutine; + +If C is not given, the sub is installed into the calling package. + +If C is not a code reference, it is looked for as an existing sub in the +package named in the C parameter. If C is not given, it will look +in the calling package. + +If C is not given, and if C is a name, C will default to C. +If C is not given, but if C is a code ref, Sub::Install will try to +find the name of the given code ref and use that as C. + +That means that this code: + + Sub::Install::install_sub({ + code => 'twitch', + from => 'Person::InPain', + into => 'Person::Teenager', + as => 'dance', + }); + +is the same as: + + package Person::Teenager; + + Sub::Install::install_sub({ + code => Person::InPain->can('twitch'), + as => 'dance', + }); + +=head2 reinstall_sub + +This routine behaves exactly like C>, but does not emit a +warning if warnings are on and the destination is already defined. + +=head2 install_installers + +This routine is provided to allow Sub::Install compatibility with +Sub::Installer. It installs C and C methods into +the package named by its argument. + + Sub::Install::install_installers('Code::Builder'); # just for us, please + Code::Builder->install_sub({ name => $code_ref }); + + Sub::Install::install_installers('UNIVERSAL'); # feeling lucky, punk? + Anything::At::All->install_sub({ name => $code_ref }); + +The installed installers are similar, but not identical, to those provided by +Sub::Installer. They accept a single hash as an argument. The key/value pairs +are used as the C and C parameters to the C routine +detailed above. The package name on which the method is called is used as the +C parameter. + +Unlike Sub::Installer's C will not eval strings into code, but +will look for named code in the calling package. + +=head1 EXPORTS + +Sub::Install exports C and C only if they are +requested. + +=head2 exporter + +Sub::Install has a never-exported subroutine called C, which is used +to implement its C routine. It takes a hashref of named arguments, +only one of which is currently recognize: C. This must be an arrayref +of subroutines to offer for export. + +This routine is mainly for Sub::Install's own consumption. Instead, consider +L. + +=head1 SEE ALSO + +=over + +=item L + +This module is (obviously) a reaction to Damian Conway's Sub::Installer, which +does the same thing, but does it by getting its greasy fingers all over +UNIVERSAL. I was really happy about the idea of making the installation of +coderefs less ugly, but I couldn't bring myself to replace the ugliness of +typeglobs and loosened strictures with the ugliness of UNIVERSAL methods. + +=item L + +This is a complete Exporter.pm replacement, built atop Sub::Install. + +=back + +=head1 EXTRA CREDITS + +Several of the tests are adapted from tests that shipped with Damian Conway's +Sub-Installer distribution. + +=head1 AUTHOR + +Ricardo SIGNES + +=head1 COPYRIGHT AND LICENSE + +This software is copyright (c) 2005 by Ricardo SIGNES. + +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 diff --git a/t/000-report-versions-tiny.t b/t/000-report-versions-tiny.t new file mode 100644 index 0000000..2b20610 --- /dev/null +++ b/t/000-report-versions-tiny.t @@ -0,0 +1,76 @@ +use strict; +use warnings; +use Test::More 0.88; +# This is a relatively nice way to avoid Test::NoWarnings breaking our +# expectations by adding extra tests, without using no_plan. It also helps +# avoid any other test module that feels introducing random tests, or even +# test plans, is a nice idea. +our $success = 0; +END { $success && done_testing; } + +# List our own version used to generate this +my $v = "\nGenerated by Dist::Zilla::Plugin::ReportVersions::Tiny v1.10\n"; + +eval { # no excuses! + # report our Perl details + my $want = "any version"; + $v .= "perl: $] (wanted $want) on $^O from $^X\n\n"; +}; +defined($@) and diag("$@"); + +# Now, our module version dependencies: +sub pmver { + my ($module, $wanted) = @_; + $wanted = " (want $wanted)"; + my $pmver; + eval "require $module;"; + if ($@) { + if ($@ =~ m/Can't locate .* in \@INC/) { + $pmver = 'module not found.'; + } else { + diag("${module}: $@"); + $pmver = 'died during require.'; + } + } else { + my $version; + eval { $version = $module->VERSION; }; + if ($@) { + diag("${module}: $@"); + $pmver = 'died during VERSION check.'; + } elsif (defined $version) { + $pmver = "$version"; + } else { + $pmver = ''; + } + } + + # So, we should be good, right? + return sprintf('%-45s => %-10s%-15s%s', $module, $pmver, $wanted, "\n"); +} + +eval { $v .= pmver('B','any version') }; +eval { $v .= pmver('Carp','any version') }; +eval { $v .= pmver('ExtUtils::MakeMaker','6.30') }; +eval { $v .= pmver('Scalar::Util','any version') }; +eval { $v .= pmver('Test::More','0.96') }; +eval { $v .= pmver('strict','any version') }; +eval { $v .= pmver('warnings','any version') }; + + +# All done. +$v .= <<'EOT'; + +Thanks for using my code. I hope it works for you. +If not, please try and include this output in the bug report. +That will help me reproduce the issue and solve your problem. + +EOT + +diag($v); +ok(1, "we really didn't test anything, just reporting data"); +$success = 1; + +# Work around another nasty module on CPAN. :/ +no warnings 'once'; +$Template::Test::NO_FLUSH = 1; +exit 0; diff --git a/t/SI_install.t b/t/SI_install.t new file mode 100644 index 0000000..6d52d92 --- /dev/null +++ b/t/SI_install.t @@ -0,0 +1,47 @@ +use Sub::Install; +Sub::Install::install_installers('UNIVERSAL'); + +# This test, from here on out, is the verbatim "install.t" test from +# Sub::Installer 0.0.2 + +use Test::More 'no_plan'; +use Scalar::Util qw/reftype/; +use warnings; + +# Install a sub in a package... + +my $sub_ref = main->install_sub({ ok1 => \&ok }); + +is reftype $sub_ref, 'CODE' => 'install returns code ref'; + +is_deeply \&ok, $sub_ref => 'install returns correct code ref'; + +ok1(1 => 'installed sub runs'); + + +# Install the same sub in the same package... + +$SIG{__WARN__} = sub { ok 1 => 'warned as expected' if $_[0] =~ /redefined/ }; + + +$sub_ref = main->install_sub({ ok1 => \&is }); + +is reftype $sub_ref, 'CODE' => 'install2 returns code ref'; + +is_deeply \&is, $sub_ref => 'install2 returns correct code ref'; + +ok1(1,1 => 'installed sub reruns'); + +# Install in another package... + +$sub_ref = Other->install_sub({ ok2 => \&ok }); + +is reftype $sub_ref, 'CODE' => 'install2 returns code ref'; + +is_deeply \&ok, $sub_ref => 'install2 returns correct code ref'; + +ok1(1,1 => 'installed sub reruns'); + +package Other; + +ok2(1 => 'remotely installed sub runs'); diff --git a/t/SI_reinstall.t b/t/SI_reinstall.t new file mode 100644 index 0000000..887e077 --- /dev/null +++ b/t/SI_reinstall.t @@ -0,0 +1,46 @@ +use Sub::Install; +Sub::Install::install_installers('UNIVERSAL'); + +# This test, from here on out, is the verbatim "reinstall.t" test from +# Sub::Installer 0.0.2 + +use Test::More 'no_plan'; +use Scalar::Util qw/reftype/; +use warnings; + +# Install a sub in a package... + +my $sub_ref = main->reinstall_sub({ ok1 => \&ok }); + +is reftype $sub_ref, 'CODE' => 'reinstall returns code ref'; + +is_deeply \&ok, $sub_ref => 'reinstall returns correct code ref'; + +ok1(1 => 'reinstalled sub runs'); + + +# Install the same sub in the same package... + +$SIG{__WARN__} = sub { ok 0 => "warned unexpected: @_" if $_[0] =~ /redefined/ }; + +$sub_ref = main->reinstall_sub({ ok1 => \&is }); + +is reftype $sub_ref, 'CODE' => 'reinstall2 returns code ref'; + +is_deeply \&is, $sub_ref => 'reinstall2 returns correct code ref'; + +ok1(1,1 => 'reinstalled sub reruns'); + +# Install in another package... + +$sub_ref = Other->reinstall_sub({ ok2 => \&ok }); + +is reftype $sub_ref, 'CODE' => 'reinstall2 returns code ref'; + +is_deeply \&ok, $sub_ref => 'reinstall2 returns correct code ref'; + +ok1(1,1 => 'reinstalled sub reruns'); + +package Other; + +ok2(1 => 'remotely reinstalled sub runs'); diff --git a/t/auto_as.t b/t/auto_as.t new file mode 100644 index 0000000..fea40b4 --- /dev/null +++ b/t/auto_as.t @@ -0,0 +1,30 @@ +use Sub::Install qw(install_sub); +use Test::More 'no_plan'; + +use strict; +use warnings; + +sub source_method { + my ($package) = @_; + return $package; +} + +{ # install named method and let the name be the same + install_sub({ code => "source_method", into => "By::Name" }); + + is( + By::Name->source_method, + 'By::Name', + "method installed by name" + ); +} + +{ # install via a coderef and let name be looked up + install_sub({ code => \&source_method, into => "By::Ref" }); + + is( + By::Ref->source_method, + 'By::Ref', + "method installed by ref, without name" + ); +} diff --git a/t/export.t b/t/export.t new file mode 100644 index 0000000..05b911a --- /dev/null +++ b/t/export.t @@ -0,0 +1,24 @@ +use Sub::Install; +use Test::More tests => 4; + +use strict; +use warnings; + +BEGIN { use_ok('Sub::Install'); } + +package Bar; +{ no warnings 'once'; + *import = Sub::Install::exporter { exports => [ qw(foo) ] }; +} +sub foo { return 10; } + +package main; + +eval { Bar->import('bar'); }; +like($@, qr/'bar' is not exported/, "exception on bad import"); + +eval { foo(); }; +like($@, qr/Undefined subroutine/, "foo isn't imported yet"); + +Bar->import(qw(foo)); +is(foo(), 10, "foo imported from Bar OK"); diff --git a/t/inst-blessed.t b/t/inst-blessed.t new file mode 100644 index 0000000..952c705 --- /dev/null +++ b/t/inst-blessed.t @@ -0,0 +1,19 @@ +use Sub::Install; +use Test::More 'no_plan'; + +use strict; +use warnings; + +BEGIN { use_ok("Sub::Install"); } + +my $code = sub { return 'FOO' }; + +bless $code, "Sub::Install::Bogus"; + +Sub::Install::install_sub({ + code => $code, + as => 'code', +}); + +is(code(), "FOO", "installed sub is OK"); + diff --git a/t/install.t b/t/install.t new file mode 100644 index 0000000..d8557a2 --- /dev/null +++ b/t/install.t @@ -0,0 +1,113 @@ +use Sub::Install; +use Test::More tests => 17; + +use strict; +use warnings; + +# These tests largely copied from Damian Conway's Sub::Installer tests. + +{ # Install a sub in a package... + my $sub_ref = Sub::Install::install_sub({ code => \&ok, as => 'ok1' }); + + isa_ok($sub_ref, 'CODE', 'return value of first install_sub'); + + is_deeply($sub_ref, \&ok, 'it returns the correct code ref'); + + ok1(1, 'installed sub runs'); +} + +{ + my $to_avail = eval "use Test::Output; 1"; + SKIP: { + skip "can't run this test without Test::Output", 1 unless $to_avail; + Sub::Install::install_sub({ code => \&ok, as => 'tmp_ok' }); + + my $expected_warning = <<'END_WARNING'; +Subroutine main::tmp_ok redefined at t/install.t line 31 +Prototype mismatch: sub main::tmp_ok ($;$) vs ($$;$) at t/install.t line 31 +END_WARNING + + my $stderr = Test::Output::stderr_from( + sub { Sub::Install::install_sub({ code => \&is, as => 'tmp_ok' }) } + ); + + $stderr =~ s!\.$!!gm; + $stderr =~ s!\\!/!g; + is( + $stderr, + $expected_warning, + "got expected warning", + ); + } +} + +{ # Install the same sub in the same package... + my $redef = 0; + my $proto = 0; + + local $SIG{__WARN__} = sub { + return ($redef = 1) if $_[0] =~ m{Subroutine \S+ redef.+t.install\.t}; + return ($proto = 1) if $_[0] =~ m{Prototype mismatch.+t.install\.t}; + # pass("warned as expected: $_[0]") if $_[0] =~ /redefined/; + die "unexpected warning: @_"; + }; + + my $sub_ref = Sub::Install::install_sub({ code => \&is, as => 'ok1' }); + + ok($redef, 'correct redefinition warning went to $SIG{__WARN__}'); + ok($proto, 'correct prototype warning went to $SIG{__WARN__}'); + + isa_ok($sub_ref, 'CODE', 'return value of second install_sub'); + + is_deeply($sub_ref, \&is, 'install2 returns correct code ref'); + + ok1(1,1, 'installed sub runs (with new arguments)'); +} + +{ # Install in another package... + my $sub_ref = Sub::Install::install_sub({ + code => \&ok, + into => 'Other', + as => 'ok1' + }); + + isa_ok($sub_ref, 'CODE', 'return value of third install_sub'); + + is_deeply($sub_ref, \&ok, 'it returns the correct code ref'); + + ok1(1,1, 'sub previously installed into main still runs properly'); + + package Other; + ok1(1, 'remotely installed sub runs properly'); +} + +{ # cross-package installation + sub Other::Another::foo { return $_[0] } + + my $sub_ref = Sub::Install::install_sub({ + code => 'foo', + from => 'Other::Another', + into => 'Other::YetAnother', + as => 'return_lhs' + }); + + isa_ok($sub_ref, 'CODE', 'return value of fourth install_sub'); + + is_deeply( + $sub_ref, + \&Other::Another::foo, + 'it returns the correct code ref' + ); + + is( + Other::Another->foo, + 'Other::Another', + 'the original code does what we want', + ); + + is( + Other::YetAnother->return_lhs, + 'Other::YetAnother', + 'and the installed code works, too', + ); +} diff --git a/t/misc_errors.t b/t/misc_errors.t new file mode 100644 index 0000000..09892a5 --- /dev/null +++ b/t/misc_errors.t @@ -0,0 +1,23 @@ +use Sub::Install qw(install_sub); +use Test::More 'no_plan'; + +use strict; +use warnings; + +{ # you have to install /something/! + eval { install_sub({ into => "Doesn't::Matter" }); }; + + like($@, qr/code.+not optional/, "you must supply something to install"); +} + +{ # you can't just make names up and expect Sub::Install to know what you mean + eval { install_sub({ code => 'none_such', into => 'Whatever' }); }; + + like($@, qr/couldn't find subroutine/, "error on unfound sub name"); +} + +{ # can't install anonymous subs without a name + eval { install_sub({ code => sub { return 1; } }); }; + + like($@, qr/couldn't determine name/, "anon subs need names to install"); +} diff --git a/t/reinstall.t b/t/reinstall.t new file mode 100644 index 0000000..9e99400 --- /dev/null +++ b/t/reinstall.t @@ -0,0 +1,89 @@ +use Sub::Install qw(reinstall_sub); +use Test::More tests => 15; + +use strict; +use warnings; + +# These tests largely copied from Damian Conway's Sub::Installer tests. + +{ # Install a sub in a package... + + my $sub_ref = reinstall_sub({ code => \&ok, as => 'ok1' }); + + isa_ok($sub_ref, 'CODE', 'return value of first install_sub'); + + is_deeply($sub_ref, \&Test::More::ok, 'it returned the right coderef'); + + $sub_ref->(1, 'returned code ref runs'); + ok1(1, "reinstalled sub runs"); +} + +{ + my $to_avail = eval "use Test::Output; 1"; + SKIP: { + skip "can't run this test without Test::Output", 1 unless $to_avail; + Sub::Install::reinstall_sub({ code => \&ok, as => 'tmp_ok' }); + + my $expected_warning = <<'END_WARNING'; +Prototype mismatch: sub main::tmp_ok ($;$) vs ($$;$) at t/reinstall.t line 32 +END_WARNING + + my $stderr = Test::Output::stderr_from( + sub { Sub::Install::reinstall_sub({ code => \&is, as => 'tmp_ok' }) } + ); + + $stderr =~ s!\\!/!g; + $stderr =~ s!\.$!!g; + is( + $stderr, + $expected_warning, + "got expected warning", + ); + } +} + +{ # Install the same sub in the same package... + my $proto = 0; + + local $SIG{__WARN__} = sub { + return ($proto = 1) if $_[0] =~ m{Prototype mismatch.+t.reinstall\.t}; + die "unexpected warning: @_"; + }; + + my $sub_ref = reinstall_sub({ code => \&is, as => 'ok1' }); + + ok($proto, 'correct warning went to $SIG{__WARN__}'); + + isa_ok($sub_ref, 'CODE', 'return value of second install_sub'); + + is_deeply($sub_ref, \&Test::More::is, 'it returned the right coderef'); + + $sub_ref->(1, 1, 'returned code ref runs'); + ok1(1,1, 'reinstalled sub reruns'); +} + +{ # Install in another package... + my $new_code = sub { ok(1, "remotely installed sub runs") }; + + my $sub_ref = reinstall_sub({ + code => $new_code, + into => 'Other', + as => 'ok1', + }); + + isa_ok($sub_ref, 'CODE', 'return value of third install_sub'); + + is_deeply($sub_ref, $new_code, 'it returned the right coderef'); + + ok1(1,1, 'reinstalled sub reruns'); + + package Other; + ok1(); +} + +eval { + my $arg = { code => sub {}, into => 'Other', as => 'ok1' }; + Sub::Install::_build_public_installer(\&Sub::Install::_install_fatal)->($arg); +}; + +like($@, qr/redefine/, "(experimental fatal installer should croak)"); diff --git a/xt/release/changes_has_content.t b/xt/release/changes_has_content.t new file mode 100644 index 0000000..e84749c --- /dev/null +++ b/xt/release/changes_has_content.t @@ -0,0 +1,41 @@ +#!perl + +use Test::More tests => 2; + +note 'Checking Changes'; +my $changes_file = 'Changes'; +my $newver = '0.928'; +my $trial_token = '-TRIAL'; + +SKIP: { + ok(-e $changes_file, "$changes_file file exists") + or skip 'Changes is missing', 1; + + ok(_get_changes($newver), "$changes_file has content for $newver"); +} + +done_testing; + +# _get_changes copied and adapted from Dist::Zilla::Plugin::Git::Commit +# by Jerome Quelin +sub _get_changes +{ + my $newver = shift; + + # parse changelog to find commit message + open(my $fh, '<', $changes_file) or die "cannot open $changes_file: $!"; + my $changelog = join('', <$fh>); + close $fh; + + my @content = + grep { /^$newver(?:$trial_token)?(?:\s+|$)/ ... /^\S/ } # from newver to un-indented + split /\n/, $changelog; + shift @content; # drop the version line + + # drop unindented last line and trailing blank lines + pop @content while ( @content && $content[-1] =~ /^(?:\S|\s*$)/ ); + + # return number of non-blank lines + return scalar @content; +} + diff --git a/xt/release/pod-syntax.t b/xt/release/pod-syntax.t new file mode 100644 index 0000000..f0468f1 --- /dev/null +++ b/xt/release/pod-syntax.t @@ -0,0 +1,6 @@ +#!perl +# This file was automatically generated by Dist::Zilla::Plugin::PodSyntaxTests. +use Test::More; +use Test::Pod 1.41; + +all_pod_files_ok();