Class-Method-Modifiers-2.15000755000766000024 014401224375 15241 5ustar00etherstaff000000000000README100644000766000024 57414401224375 16170 0ustar00etherstaff000000000000Class-Method-Modifiers-2.15This archive contains the distribution Class-Method-Modifiers, version 2.15: Provides Moose-like method modifiers This software is copyright (c) 2007 by Shawn M Moore. 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 v6.030. Changes100640000766000024 1105414401224375 16632 0ustar00etherstaff000000000000Class-Method-Modifiers-2.15Revision history for Class-Method-Modifiers 2.15 2023-03-05 23:42:48Z - localize $SIG{__DIE__} before calling eval (closes RT#146848; Yves Orton) 2.14 2023-01-16 21:26:04Z - remove Test::Fatal and Test::Needs from test prereqs (PRs #7, #8, Graham Knop) 2.13 2019-08-10 00:18:50Z - bypass prototypes when testing for lvalue attribute - fixed a class name in tests to avoid conflicting with a core module 2.12 2016-03-04 22:12:15Z - minor documentation tweaks 2.11 2014-08-16 05:21:30Z - add documentation for modifying multiple methods at once (mannih, github #2) 2.10 2014-03-04 19:04:00Z - installation switched to using only ExtUtils::MakeMaker, to allow for use on perl 5.6 2.09 2013-12-14 18:08:35Z - refresh configure_requires checking in generated Makefile.PL; new CONTRIBUTING file; updated tests (compile test now only runs for authors; check-deps test replaced by information-only report-prereqs test) 2.08 2013-10-11 00:30:32Z - remove requirement on perl 5.8 in metadata - repository migrated to the github moose organization - remove t/00-check-deps.t, which fails on old toolchains that do not understand configure_requires 2.07 2013-09-22 22:09:32Z - removed dependency on Test::Warnings in tests (now reserved for author testing) - now packaged with a Build.PL (for Module::Build::Tiny), and a Makefile.PL (for legacy 5.6 and 5.8 users; prints a warning on invocation) 2.06 2013-09-17 19:43:09Z - packaging the dist again with EUMM rather than MBT 2.05 2013-09-11 03:50:28Z - Support for handling lvalue methods (Graham Knop) - convert to building with Dist::Zilla 2.04 2013-03-30 - Remove erroneous perl 5.8 requirement 2.03 2013-02-02 - New build to fix missing files in inc/ 2.02 2013-02-01 - Dist improvements (Karen Etheridge) 2.01 2013-01-27 - Test for and fix $_ corruption (Vladimir Timofeev) 2.00 2012-12-29 - New 'fresh' modifier (Aaron Crane) 1.12 2012-10-28 - Another MANIFEST fix 1.11 2012-10-28 - Re-release with proper distribution contents and MANIFEST 1.10 2012-10-23 - Avoid "Variable "$..." will not stay shared" warnings under 5.8.x - (from changes in 1.09) [#80194] (Karen Etheridge) 1.09 2012-04-02 - Install modified subs in the proper namespace [#74569] (Karen Etheridge) 1.08 2011-10-16 - Document install_modifier (requested by Tokuhiro Matsuno) 1.07 2011-02-23 - Move from Test::Exception to Test::Fatal (Justin Hunter) 1.06 2010-11-26 - Add support for: modifier ["name1", "name2"] => sub {} 1.05 2009-10-21 14:01:11 - Add install_modifier as a public API (Goro Fuji) 1.04 2009-06-15 11:33:31 - We need parens around confess if we're going to delay-load Carp, affects only 5.10 (reported by David Raab) 1.03 2009-06-14 14:44:25 - Modernize the dist - Fix possible test failures - Only load Carp if we have to 1.02 2009-05-31 23:33:42 - Fix for void context (reported by tokuhirom) - Lift dependency on on MRO::Compat 1.01 2008-06-26 22:22:30 - Revert the caching fix. It makes wrapping parent-class methods painfully slower. - Remove the prototypes, newer Perls (rightly) warn about (@&) 1.00 2008-06-11 06:10:51 - Complete reimplementation. Half the code. Faster than Moose. - Remove 'guard' for now. - *All* internals are changed. 0.07 2007-09-12 21:55:16 - Add 'guard' modifier to facilitate bailing out in some conditions 0.06 2007-09-09 23:27:50 - You may now modify a method in the same class as it is defined 0.05 2007-08-17 23:26:53 - More internals fixes (I'm abusing this module a bit, you see) - Grammar fixes 0.04 2007-08-17 17:49:55 - Internals changes 0.03 2007-08-06 22:57:13 - Can now use multiple modifiers of the same type in one class - Should handle C3 MRO now - Can now handle: before 'left', 'right' => sub { ... } 0.02 2007-08-05 16:42:43 - No need to shallow-copy @_ - Don't stick a super method in UNIVERSAL (mst) - Let multiple modifiers coexist in one class - Better error checking 0.01 2007-08-05 06:10:30 - First version, released on an unsuspecting world. LICENSE100644000766000024 4365314401224375 16362 0ustar00etherstaff000000000000Class-Method-Modifiers-2.15This software is copyright (c) 2007 by Shawn M Moore. 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) 2007 by Shawn M Moore. 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) 2007 by Shawn M Moore. 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 MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. The End INSTALL100644000766000024 466514401224375 16366 0ustar00etherstaff000000000000Class-Method-Modifiers-2.15This is the Perl distribution Class-Method-Modifiers. Installing Class-Method-Modifiers is straightforward. ## Installation with cpanm If you have cpanm, you only need one line: % cpanm Class::Method::Modifiers If it does not have permission to install modules to the current perl, cpanm will automatically set up and install to a local::lib in your home directory. See the local::lib documentation (https://metacpan.org/pod/local::lib) for details on enabling it in your environment. ## Installing with the CPAN shell Alternatively, if your CPAN shell is set up, you should just be able to do: % cpan Class::Method::Modifiers ## Manual installation As a last resort, you can manually install it. If you have not already downloaded the release tarball, you can find the download link on the module's MetaCPAN page: https://metacpan.org/pod/Class::Method::Modifiers Untar the tarball, install configure prerequisites (see below), then build it: % perl Makefile.PL % make && make test Then install it: % make install On Windows platforms, you should use `dmake` or `nmake`, instead of `make`. If your perl is system-managed, you can create a local::lib in your home directory to install modules to. For details, see the local::lib documentation: https://metacpan.org/pod/local::lib The prerequisites of this distribution will also have to be installed manually. The prerequisites are listed in one of the files: `MYMETA.yml` or `MYMETA.json` generated by running the manual build process described above. ## Configure Prerequisites This distribution requires other modules to be installed before this distribution's installer can be run. They can be found under the "configure_requires" key of META.yml or the "{prereqs}{configure}{requires}" key of META.json. ## Other Prerequisites This distribution may require additional modules to be installed after running Makefile.PL. Look for prerequisites in the following phases: * to run make, PHASE = build * to use the module code itself, PHASE = runtime * to run tests, PHASE = test They can all be found in the "PHASE_requires" key of MYMETA.yml or the "{prereqs}{PHASE}{requires}" key of MYMETA.json. ## Documentation Class-Method-Modifiers documentation is available as POD. You can run `perldoc` from a shell to read the documentation: % perldoc Class::Method::Modifiers For more information on installing Perl modules via CPAN, please see: https://www.cpan.org/modules/INSTALL.html dist.ini100640000766000024 171314401224375 16764 0ustar00etherstaff000000000000Class-Method-Modifiers-2.15name = Class-Method-Modifiers author = Shawn M Moore copyright_holder = Shawn M Moore copyright_year = 2007 license = Perl_5 [@Author::ETHER] :version = 0.119 installer = MakeMaker ; stay 5.6-friendly authority = cpan:SARTAK Test::MinimumVersion.max_target_perl = 5.006000 Test::ReportPrereqs.include[0] = Moose Test::ReportPrereqs.include[1] = Moo Test::ReportPrereqs.include[2] = Role::Tiny Test::ReportPrereqs.include[3] = Sub::Install Test::ReportPrereqs.include[4] = Sub::Name Test::ReportPrereqs.include[5] = namespace::clean Test::ReportPrereqs.include[6] = namespace::autoclean -remove = Test::Pod::No404s ; temporary? aaroncrane.co.uk is unreachable [Prereqs / RuntimeRequires] Exporter = 0 [Prereqs / DevelopRequires] Test::Warnings = 0 Perl::MinimumVersion = 1.35 ; for RT#89173 [OnlyCorePrereqs] phase = configure phase = build phase = runtime phase = test check_dual_life_versions = 0 META.yml100644000766000024 6452614401224375 16630 0ustar00etherstaff000000000000Class-Method-Modifiers-2.15--- abstract: 'Provides Moose-like method modifiers' author: - 'Shawn M Moore ' build_requires: ExtUtils::MakeMaker: '0' File::Spec: '0' Test::More: '0.88' if: '0' perl: '5.006' configure_requires: ExtUtils::MakeMaker: '0' perl: '5.006' dynamic_config: 0 generated_by: 'Dist::Zilla version 6.030, CPAN::Meta::Converter version 2.150010' keywords: - method - wrap - modification - patch license: perl meta-spec: url: http://module-build.sourceforge.net/META-spec-v1.4.html version: '1.4' name: Class-Method-Modifiers no_index: directory: - t - xt provides: Class::Method::Modifiers: file: lib/Class/Method/Modifiers.pm version: '2.15' requires: B: '0' Carp: '0' Exporter: '0' base: '0' perl: '5.006' strict: '0' warnings: '0' resources: bugtracker: https://rt.cpan.org/Public/Dist/Display.html?Name=Class-Method-Modifiers homepage: https://github.com/moose/Class-Method-Modifiers repository: https://github.com/moose/Class-Method-Modifiers.git version: '2.15' x_Dist_Zilla: perl: version: '5.037009' plugins: - class: Dist::Zilla::Plugin::Prereqs config: Dist::Zilla::Plugin::Prereqs: phase: develop type: recommends name: '@Author::ETHER/pluginbundle version' version: '6.030' - class: Dist::Zilla::Plugin::PromptIfStale config: Dist::Zilla::Plugin::PromptIfStale: check_all_plugins: 0 check_all_prereqs: 0 modules: - Dist::Zilla::PluginBundle::Author::ETHER phase: build run_under_travis: 0 skip: [] name: '@Author::ETHER/stale modules, build' version: '0.057' - class: Dist::Zilla::Plugin::FileFinder::ByName name: '@Author::ETHER/Examples' version: '6.030' - class: Dist::Zilla::Plugin::Git::GatherDir config: Dist::Zilla::Plugin::GatherDir: exclude_filename: - CONTRIBUTING - INSTALL - LICENSE - README.pod exclude_match: [] follow_symlinks: 0 include_dotfiles: 0 prefix: '' prune_directory: [] root: . Dist::Zilla::Plugin::Git::GatherDir: include_untracked: 0 name: '@Author::ETHER/Git::GatherDir' version: '2.048' - class: Dist::Zilla::Plugin::MetaYAML name: '@Author::ETHER/MetaYAML' version: '6.030' - class: Dist::Zilla::Plugin::MetaJSON name: '@Author::ETHER/MetaJSON' version: '6.030' - class: Dist::Zilla::Plugin::Readme name: '@Author::ETHER/Readme' version: '6.030' - class: Dist::Zilla::Plugin::Manifest name: '@Author::ETHER/Manifest' version: '6.030' - class: Dist::Zilla::Plugin::License name: '@Author::ETHER/License' version: '6.030' - class: Dist::Zilla::Plugin::GenerateFile::FromShareDir config: Dist::Zilla::Plugin::GenerateFile::FromShareDir: destination_filename: CONTRIBUTING dist: Dist-Zilla-PluginBundle-Author-ETHER encoding: UTF-8 has_xs: 0 location: build source_filename: CONTRIBUTING Dist::Zilla::Role::RepoFileInjector: allow_overwrite: 1 repo_root: . version: '0.009' name: '@Author::ETHER/generate CONTRIBUTING' version: '0.015' - class: Dist::Zilla::Plugin::InstallGuide config: Dist::Zilla::Role::ModuleMetadata: Module::Metadata: '1.000037' version: '0.006' name: '@Author::ETHER/InstallGuide' version: '1.200014' - class: Dist::Zilla::Plugin::Test::Compile config: Dist::Zilla::Plugin::Test::Compile: bail_out_on_fail: 1 fail_on_warning: author fake_home: 0 filename: xt/author/00-compile.t module_finder: - ':InstallModules' needs_display: 0 phase: develop script_finder: - ':PerlExecFiles' - '@Author::ETHER/Examples' skips: [] switch: [] name: '@Author::ETHER/Test::Compile' version: '2.058' - class: Dist::Zilla::Plugin::Test::NoTabs config: Dist::Zilla::Plugin::Test::NoTabs: filename: xt/author/no-tabs.t finder: - ':InstallModules' - ':ExecFiles' - '@Author::ETHER/Examples' - ':TestFiles' - ':ExtraTestFiles' name: '@Author::ETHER/Test::NoTabs' version: '0.15' - class: Dist::Zilla::Plugin::Test::EOL config: Dist::Zilla::Plugin::Test::EOL: filename: xt/author/eol.t finder: - ':ExecFiles' - ':ExtraTestFiles' - ':InstallModules' - ':TestFiles' - '@Author::ETHER/Examples' trailing_whitespace: 1 name: '@Author::ETHER/Test::EOL' version: '0.19' - class: Dist::Zilla::Plugin::MetaTests name: '@Author::ETHER/MetaTests' version: '6.030' - class: Dist::Zilla::Plugin::Test::CPAN::Changes config: Dist::Zilla::Plugin::Test::CPAN::Changes: changelog: Changes name: '@Author::ETHER/Test::CPAN::Changes' version: '0.012' - class: Dist::Zilla::Plugin::Test::ChangesHasContent name: '@Author::ETHER/Test::ChangesHasContent' version: '0.011' - class: Dist::Zilla::Plugin::Test::MinimumVersion config: Dist::Zilla::Plugin::Test::MinimumVersion: max_target_perl: '5.006000' name: '@Author::ETHER/Test::MinimumVersion' version: '2.000010' - class: Dist::Zilla::Plugin::PodSyntaxTests name: '@Author::ETHER/PodSyntaxTests' version: '6.030' - class: Dist::Zilla::Plugin::PodCoverageTests name: '@Author::ETHER/PodCoverageTests' version: '6.030' - class: Dist::Zilla::Plugin::Test::PodSpelling config: Dist::Zilla::Plugin::Test::PodSpelling: directories: - examples - lib - script - t - xt spell_cmd: '' stopwords: - irc wordlist: Pod::Wordlist name: '@Author::ETHER/Test::PodSpelling' version: '2.007005' - class: Dist::Zilla::Plugin::Test::Kwalitee config: Dist::Zilla::Plugin::Test::Kwalitee: filename: xt/author/kwalitee.t skiptest: [] name: '@Author::ETHER/Test::Kwalitee' version: '2.12' - class: Dist::Zilla::Plugin::MojibakeTests name: '@Author::ETHER/MojibakeTests' version: '0.8' - class: Dist::Zilla::Plugin::Test::ReportPrereqs name: '@Author::ETHER/Test::ReportPrereqs' version: '0.029' - class: Dist::Zilla::Plugin::Test::Portability config: Dist::Zilla::Plugin::Test::Portability: options: '' name: '@Author::ETHER/Test::Portability' version: '2.001001' - class: Dist::Zilla::Plugin::Test::CleanNamespaces config: Dist::Zilla::Plugin::Test::CleanNamespaces: filename: xt/author/clean-namespaces.t skips: [] name: '@Author::ETHER/Test::CleanNamespaces' version: '0.006' - class: Dist::Zilla::Plugin::Git::Describe name: '@Author::ETHER/Git::Describe' version: '0.008' - class: Dist::Zilla::Plugin::PodWeaver config: Dist::Zilla::Plugin::PodWeaver: config_plugins: - '@Author::ETHER' finder: - ':InstallModules' - ':PerlExecFiles' plugins: - class: Pod::Weaver::Plugin::EnsurePod5 name: '@Author::ETHER/EnsurePod5' version: '4.019' - class: Pod::Weaver::Plugin::H1Nester name: '@Author::ETHER/H1Nester' version: '4.019' - class: Pod::Weaver::Plugin::SingleEncoding name: '@Author::ETHER/SingleEncoding' version: '4.019' - class: Pod::Weaver::Plugin::Transformer name: '@Author::ETHER/List' version: '4.019' - class: Pod::Weaver::Plugin::Transformer name: '@Author::ETHER/Verbatim' version: '4.019' - class: Pod::Weaver::Section::Region name: '@Author::ETHER/header' version: '4.019' - class: Pod::Weaver::Section::Name name: '@Author::ETHER/Name' version: '4.019' - class: Pod::Weaver::Section::Version name: '@Author::ETHER/Version' version: '4.019' - class: Pod::Weaver::Section::Region name: '@Author::ETHER/prelude' version: '4.019' - class: Pod::Weaver::Section::Generic name: SYNOPSIS version: '4.019' - class: Pod::Weaver::Section::Generic name: DESCRIPTION version: '4.019' - class: Pod::Weaver::Section::Generic name: OVERVIEW version: '4.019' - class: Pod::Weaver::Section::Collect name: ATTRIBUTES version: '4.019' - class: Pod::Weaver::Section::Collect name: METHODS version: '4.019' - class: Pod::Weaver::Section::Collect name: FUNCTIONS version: '4.019' - class: Pod::Weaver::Section::Collect name: TYPES version: '4.019' - class: Pod::Weaver::Section::Leftovers name: '@Author::ETHER/Leftovers' version: '4.019' - class: Pod::Weaver::Section::Region name: '@Author::ETHER/postlude' version: '4.019' - class: Pod::Weaver::Section::GenerateSection name: '@Author::ETHER/generate SUPPORT' version: '4.019' - class: Pod::Weaver::Section::Authors name: '@Author::ETHER/Authors' version: '4.019' - class: Pod::Weaver::Section::AllowOverride name: '@Author::ETHER/allow override AUTHOR' version: '0.05' - class: Pod::Weaver::Section::Contributors name: '@Author::ETHER/Contributors' version: '0.009' - class: Pod::Weaver::Section::Legal name: '@Author::ETHER/Legal' version: '4.019' - class: Pod::Weaver::Section::Region name: '@Author::ETHER/footer' version: '4.019' name: '@Author::ETHER/PodWeaver' version: '4.010' - class: Dist::Zilla::Plugin::GithubMeta name: '@Author::ETHER/GithubMeta' version: '0.58' - class: Dist::Zilla::Plugin::AutoMetaResources name: '@Author::ETHER/AutoMetaResources' version: '1.21' - class: Dist::Zilla::Plugin::Authority name: '@Author::ETHER/Authority' version: '1.009' - class: Dist::Zilla::Plugin::MetaNoIndex name: '@Author::ETHER/MetaNoIndex' version: '6.030' - class: Dist::Zilla::Plugin::MetaProvides::Package config: Dist::Zilla::Plugin::MetaProvides::Package: finder: - ':InstallModules' finder_objects: - class: Dist::Zilla::Plugin::FinderCode name: ':InstallModules' version: '6.030' include_underscores: 0 Dist::Zilla::Role::MetaProvider::Provider: $Dist::Zilla::Role::MetaProvider::Provider::VERSION: '2.002004' inherit_missing: 0 inherit_version: 0 meta_noindex: 1 Dist::Zilla::Role::ModuleMetadata: Module::Metadata: '1.000037' version: '0.006' name: '@Author::ETHER/MetaProvides::Package' version: '2.004003' - class: Dist::Zilla::Plugin::MetaConfig name: '@Author::ETHER/MetaConfig' version: '6.030' - class: Dist::Zilla::Plugin::Keywords config: Dist::Zilla::Plugin::Keywords: keywords: - method - wrap - modification - patch name: '@Author::ETHER/Keywords' version: '0.007' - class: Dist::Zilla::Plugin::UseUnsafeInc config: Dist::Zilla::Plugin::UseUnsafeInc: dot_in_INC: 0 name: '@Author::ETHER/UseUnsafeInc' version: '0.002' - class: Dist::Zilla::Plugin::AutoPrereqs name: '@Author::ETHER/AutoPrereqs' version: '6.030' - class: Dist::Zilla::Plugin::Prereqs::AuthorDeps name: '@Author::ETHER/Prereqs::AuthorDeps' version: '0.007' - class: Dist::Zilla::Plugin::MinimumPerl name: '@Author::ETHER/MinimumPerl' version: '1.006' - class: Dist::Zilla::Plugin::MakeMaker config: Dist::Zilla::Role::TestRunner: default_jobs: 9 name: '@Author::ETHER/MakeMaker' version: '6.030' - class: Dist::Zilla::Plugin::Git::Contributors config: Dist::Zilla::Plugin::Git::Contributors: git_version: 2.39.1 include_authors: 0 include_releaser: 1 order_by: commits paths: [] name: '@Author::ETHER/Git::Contributors' version: '0.036' - class: Dist::Zilla::Plugin::StaticInstall config: Dist::Zilla::Plugin::StaticInstall: dry_run: 1 mode: auto name: '@Author::ETHER/StaticInstall' version: '0.012' - class: Dist::Zilla::Plugin::RunExtraTests config: Dist::Zilla::Role::TestRunner: default_jobs: 9 name: '@Author::ETHER/RunExtraTests' version: '0.029' - class: Dist::Zilla::Plugin::CheckSelfDependency config: Dist::Zilla::Plugin::CheckSelfDependency: finder: - ':InstallModules' Dist::Zilla::Role::ModuleMetadata: Module::Metadata: '1.000037' version: '0.006' name: '@Author::ETHER/CheckSelfDependency' version: '0.011' - class: Dist::Zilla::Plugin::Run::AfterBuild config: Dist::Zilla::Plugin::Run::Role::Runner: fatal_errors: 1 quiet: 1 run: - "bash -c \"test -e .ackrc && grep -q -- '--ignore-dir=.latest' .ackrc || echo '--ignore-dir=.latest' >> .ackrc; if [[ `dirname '%d'` != .build ]]; then test -e .ackrc && grep -q -- '--ignore-dir=%d' .ackrc || echo '--ignore-dir=%d' >> .ackrc; fi\"" version: '0.048' name: '@Author::ETHER/.ackrc' version: '0.048' - class: Dist::Zilla::Plugin::Run::AfterBuild config: Dist::Zilla::Plugin::Run::Role::Runner: eval: - "if ('%d' =~ /^%n-[.[:xdigit:]]+$/) { unlink '.latest'; symlink '%d', '.latest'; }" fatal_errors: 0 quiet: 1 version: '0.048' name: '@Author::ETHER/.latest' version: '0.048' - class: Dist::Zilla::Plugin::CheckStrictVersion name: '@Author::ETHER/CheckStrictVersion' version: '0.001' - class: Dist::Zilla::Plugin::CheckMetaResources name: '@Author::ETHER/CheckMetaResources' version: '0.001' - class: Dist::Zilla::Plugin::EnsureLatestPerl config: Dist::Zilla::Plugin::EnsureLatestPerl: Module::CoreList: '5.20230220' name: '@Author::ETHER/EnsureLatestPerl' version: '0.010' - class: Dist::Zilla::Plugin::PromptIfStale config: Dist::Zilla::Plugin::PromptIfStale: check_all_plugins: 1 check_all_prereqs: 1 modules: [] phase: release run_under_travis: 0 skip: [] name: '@Author::ETHER/stale modules, release' version: '0.057' - class: Dist::Zilla::Plugin::Git::Check config: Dist::Zilla::Plugin::Git::Check: untracked_files: die Dist::Zilla::Role::Git::DirtyFiles: allow_dirty: [] allow_dirty_match: [] changelog: Changes Dist::Zilla::Role::Git::Repo: git_version: 2.39.1 repo_root: . name: '@Author::ETHER/initial check' version: '2.048' - class: Dist::Zilla::Plugin::Git::CheckFor::MergeConflicts config: Dist::Zilla::Role::Git::Repo: git_version: 2.39.1 repo_root: . name: '@Author::ETHER/Git::CheckFor::MergeConflicts' version: '0.014' - class: Dist::Zilla::Plugin::Git::CheckFor::CorrectBranch config: Dist::Zilla::Role::Git::Repo: git_version: 2.39.1 repo_root: . name: '@Author::ETHER/Git::CheckFor::CorrectBranch' version: '0.014' - class: Dist::Zilla::Plugin::Git::Remote::Check name: '@Author::ETHER/Git::Remote::Check' version: 0.1.2 - class: Dist::Zilla::Plugin::CheckPrereqsIndexed name: '@Author::ETHER/CheckPrereqsIndexed' version: '0.022' - class: Dist::Zilla::Plugin::TestRelease name: '@Author::ETHER/TestRelease' version: '6.030' - class: Dist::Zilla::Plugin::Git::Check config: Dist::Zilla::Plugin::Git::Check: untracked_files: die Dist::Zilla::Role::Git::DirtyFiles: allow_dirty: [] allow_dirty_match: [] changelog: Changes Dist::Zilla::Role::Git::Repo: git_version: 2.39.1 repo_root: . name: '@Author::ETHER/after tests' version: '2.048' - class: Dist::Zilla::Plugin::CheckIssues name: '@Author::ETHER/CheckIssues' version: '0.011' - class: Dist::Zilla::Plugin::UploadToCPAN name: '@Author::ETHER/UploadToCPAN' version: '6.030' - class: Dist::Zilla::Plugin::CopyFilesFromRelease config: Dist::Zilla::Plugin::CopyFilesFromRelease: filename: - CONTRIBUTING - INSTALL - LICENCE - LICENSE - ppport.h match: [] name: '@Author::ETHER/copy generated files' version: '0.007' - class: Dist::Zilla::Plugin::ReadmeAnyFromPod config: Dist::Zilla::Role::FileWatcher: version: '0.006' name: '@Author::ETHER/ReadmeAnyFromPod' version: '0.163250' - class: Dist::Zilla::Plugin::Prereqs config: Dist::Zilla::Plugin::Prereqs: phase: develop type: recommends name: '@Author::ETHER/@Git::VersionManager/pluginbundle version' version: '6.030' - class: Dist::Zilla::Plugin::RewriteVersion::Transitional config: Dist::Zilla::Plugin::RewriteVersion: add_tarball_name: 0 finders: - ':ExecFiles' - ':InstallModules' global: 1 skip_version_provider: 0 Dist::Zilla::Plugin::RewriteVersion::Transitional: {} name: '@Author::ETHER/@Git::VersionManager/RewriteVersion::Transitional' version: '0.009' - class: Dist::Zilla::Plugin::MetaProvides::Update name: '@Author::ETHER/@Git::VersionManager/MetaProvides::Update' version: '0.007' - class: Dist::Zilla::Plugin::CopyFilesFromRelease config: Dist::Zilla::Plugin::CopyFilesFromRelease: filename: - Changes match: [] name: '@Author::ETHER/@Git::VersionManager/CopyFilesFromRelease' version: '0.007' - class: Dist::Zilla::Plugin::Git::Commit config: Dist::Zilla::Plugin::Git::Commit: add_files_in: - . commit_msg: '%N-%v%t%n%n%c' signoff: 0 Dist::Zilla::Role::Git::DirtyFiles: allow_dirty: - CONTRIBUTING - Changes - INSTALL - LICENSE - README.pod allow_dirty_match: [] changelog: Changes Dist::Zilla::Role::Git::Repo: git_version: 2.39.1 repo_root: . Dist::Zilla::Role::Git::StringFormatter: time_zone: local name: '@Author::ETHER/@Git::VersionManager/release snapshot' version: '2.048' - class: Dist::Zilla::Plugin::Git::Tag config: Dist::Zilla::Plugin::Git::Tag: branch: ~ changelog: Changes signed: 0 tag: v2.15 tag_format: v%V tag_message: v%v%t Dist::Zilla::Role::Git::Repo: git_version: 2.39.1 repo_root: . Dist::Zilla::Role::Git::StringFormatter: time_zone: local name: '@Author::ETHER/@Git::VersionManager/Git::Tag' version: '2.048' - class: Dist::Zilla::Plugin::BumpVersionAfterRelease::Transitional config: Dist::Zilla::Plugin::BumpVersionAfterRelease: finders: - ':InstallModules' global: 1 munge_makefile_pl: 1 Dist::Zilla::Plugin::BumpVersionAfterRelease::Transitional: {} name: '@Author::ETHER/@Git::VersionManager/BumpVersionAfterRelease::Transitional' version: '0.009' - class: Dist::Zilla::Plugin::NextRelease name: '@Author::ETHER/@Git::VersionManager/NextRelease' version: '6.030' - class: Dist::Zilla::Plugin::Git::Commit config: Dist::Zilla::Plugin::Git::Commit: add_files_in: [] commit_msg: 'increment $VERSION after %v release' signoff: 0 Dist::Zilla::Role::Git::DirtyFiles: allow_dirty: - Build.PL - Changes - Makefile.PL allow_dirty_match: - (?^:^lib/.*\.pm$) changelog: Changes Dist::Zilla::Role::Git::Repo: git_version: 2.39.1 repo_root: . Dist::Zilla::Role::Git::StringFormatter: time_zone: local name: '@Author::ETHER/@Git::VersionManager/post-release commit' version: '2.048' - class: Dist::Zilla::Plugin::Prereqs config: Dist::Zilla::Plugin::Prereqs: phase: x_Dist_Zilla type: requires name: '@Author::ETHER/@Git::VersionManager/prereqs for @Git::VersionManager' version: '6.030' - class: Dist::Zilla::Plugin::Git::Push config: Dist::Zilla::Plugin::Git::Push: push_to: - origin remotes_must_exist: 1 Dist::Zilla::Role::Git::Repo: git_version: 2.39.1 repo_root: . name: '@Author::ETHER/Git::Push' version: '2.048' - class: Dist::Zilla::Plugin::GitHub::Update config: Dist::Zilla::Plugin::GitHub::Update: metacpan: 1 name: '@Author::ETHER/GitHub::Update' version: '0.48' - class: Dist::Zilla::Plugin::Run::AfterRelease config: Dist::Zilla::Plugin::Run::Role::Runner: fatal_errors: 0 quiet: 0 run: - REDACTED version: '0.048' name: '@Author::ETHER/install release' version: '0.048' - class: Dist::Zilla::Plugin::Run::AfterRelease config: Dist::Zilla::Plugin::Run::Role::Runner: eval: - 'print "release complete!\xa"' fatal_errors: 1 quiet: 1 version: '0.048' name: '@Author::ETHER/release complete' version: '0.048' - class: Dist::Zilla::Plugin::ConfirmRelease name: '@Author::ETHER/ConfirmRelease' version: '6.030' - class: Dist::Zilla::Plugin::Prereqs config: Dist::Zilla::Plugin::Prereqs: phase: x_Dist_Zilla type: requires name: '@Author::ETHER/prereqs for @Author::ETHER' version: '6.030' - class: Dist::Zilla::Plugin::Prereqs config: Dist::Zilla::Plugin::Prereqs: phase: runtime type: requires name: RuntimeRequires version: '6.030' - class: Dist::Zilla::Plugin::Prereqs config: Dist::Zilla::Plugin::Prereqs: phase: develop type: requires name: DevelopRequires version: '6.030' - class: Dist::Zilla::Plugin::OnlyCorePrereqs config: Dist::Zilla::Plugin::OnlyCorePrereqs: also_disallow: [] check_dual_life_versions: '0' deprecated_ok: 0 phases: - configure - build - runtime - test skips: [] starting_version: 'to be determined from perl prereq' name: OnlyCorePrereqs version: '0.024' - class: Dist::Zilla::Plugin::FinderCode name: ':InstallModules' version: '6.030' - class: Dist::Zilla::Plugin::FinderCode name: ':IncModules' version: '6.030' - class: Dist::Zilla::Plugin::FinderCode name: ':TestFiles' version: '6.030' - class: Dist::Zilla::Plugin::FinderCode name: ':ExtraTestFiles' version: '6.030' - class: Dist::Zilla::Plugin::FinderCode name: ':ExecFiles' version: '6.030' - class: Dist::Zilla::Plugin::FinderCode name: ':PerlExecFiles' version: '6.030' - class: Dist::Zilla::Plugin::FinderCode name: ':ShareFiles' version: '6.030' - class: Dist::Zilla::Plugin::FinderCode name: ':MainModule' version: '6.030' - class: Dist::Zilla::Plugin::FinderCode name: ':AllFiles' version: '6.030' - class: Dist::Zilla::Plugin::FinderCode name: ':NoFiles' version: '6.030' - class: Dist::Zilla::Plugin::VerifyPhases name: '@Author::ETHER/PHASE VERIFICATION' version: '0.016' zilla: class: Dist::Zilla::Dist::Builder config: is_trial: 0 version: '6.030' x_authority: cpan:SARTAK x_contributors: - 'Karen Etheridge ' - 'Shawn M Moore ' - 'Graham Knop ' - 'Aaron Crane ' - 'Peter Rabbitson ' - 'David Steinbrunner ' - 'gfx ' - 'Justin Hunter ' - 'mannih ' - 'Yves Orton ' x_generated_by_perl: v5.37.9 x_serialization_backend: 'YAML::Tiny version 1.73' x_spdx_expression: 'Artistic-1.0-Perl OR GPL-1.0-or-later' x_use_unsafe_inc: 0 MANIFEST100644000766000024 223414401224375 16454 0ustar00etherstaff000000000000Class-Method-Modifiers-2.15# This file was automatically generated by Dist::Zilla::Plugin::Manifest v6.030. CONTRIBUTING Changes INSTALL LICENSE MANIFEST META.json META.yml Makefile.PL README dist.ini lib/Class/Method/Modifiers.pm t/00-report-prereqs.dd t/00-report-prereqs.t t/000-load.t t/001-error.t t/002-cache.t t/003-basic.t t/004-around.t t/005-return.t t/010-before-args.t t/011-after-args.t t/012-around-args.t t/020-multiple-inheritance.t t/030-multiple-before.t t/031-multiple-after.t t/032-multiple-around.t t/034-multiple-everything.t t/035-multiple-everything-twice.t t/040-twice-orig.t t/041-modify-parent.t t/051-undef-list-ctxt.t t/060-caller.t t/070-modify-multiple-at-once.t t/080-multiple-modifiers.t t/081-sub-and-modifier.t t/090-diamond.t t/100-class-mop-method-modifiers.t t/110-namespace-clean.t t/120-fresh.t t/130-clean-underscore.t t/140-lvalue.t xt/author/00-compile.t xt/author/clean-namespaces.t xt/author/distmeta.t xt/author/eol.t xt/author/kwalitee.t xt/author/minimum-version.t xt/author/mojibake.t xt/author/no-tabs.t xt/author/pod-coverage.t xt/author/pod-spell.t xt/author/pod-syntax.t xt/author/portability.t xt/release/changes_has_content.t xt/release/cpan-changes.t META.json100644000766000024 13261114401224375 17007 0ustar00etherstaff000000000000Class-Method-Modifiers-2.15{ "abstract" : "Provides Moose-like method modifiers", "author" : [ "Shawn M Moore " ], "dynamic_config" : 0, "generated_by" : "Dist::Zilla version 6.030, CPAN::Meta::Converter version 2.150010", "keywords" : [ "method", "wrap", "modification", "patch" ], "license" : [ "perl_5" ], "meta-spec" : { "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", "version" : 2 }, "name" : "Class-Method-Modifiers", "no_index" : { "directory" : [ "t", "xt" ] }, "prereqs" : { "configure" : { "requires" : { "ExtUtils::MakeMaker" : "0", "perl" : "5.006" } }, "develop" : { "recommends" : { "Dist::Zilla::PluginBundle::Author::ETHER" : "0.162", "Dist::Zilla::PluginBundle::Git::VersionManager" : "0.007" }, "requires" : { "Encode" : "0", "File::Spec" : "0", "IO::Handle" : "0", "IPC::Open3" : "0", "Perl::MinimumVersion" : "1.35", "Pod::Coverage::TrustPod" : "0", "Pod::Wordlist" : "0", "Test::CPAN::Changes" : "0.19", "Test::CPAN::Meta" : "0", "Test::CleanNamespaces" : "0.15", "Test::EOL" : "0", "Test::Kwalitee" : "1.21", "Test::MinimumVersion" : "0", "Test::Mojibake" : "0", "Test::More" : "0.96", "Test::NoTabs" : "0", "Test::Pod" : "1.41", "Test::Pod::Coverage" : "1.08", "Test::Portability::Files" : "0", "Test::Spelling" : "0.12", "Test::Warnings" : "0", "perl" : "5.006" } }, "runtime" : { "requires" : { "B" : "0", "Carp" : "0", "Exporter" : "0", "base" : "0", "perl" : "5.006", "strict" : "0", "warnings" : "0" } }, "test" : { "recommends" : { "CPAN::Meta" : "2.120900" }, "requires" : { "ExtUtils::MakeMaker" : "0", "File::Spec" : "0", "Test::More" : "0.88", "if" : "0", "perl" : "5.006" } }, "x_Dist_Zilla" : { "requires" : { "Dist::Zilla" : "5", "Dist::Zilla::Plugin::Authority" : "1.009", "Dist::Zilla::Plugin::AutoMetaResources" : "0", "Dist::Zilla::Plugin::AutoPrereqs" : "5.038", "Dist::Zilla::Plugin::BumpVersionAfterRelease::Transitional" : "0.004", "Dist::Zilla::Plugin::CheckIssues" : "0", "Dist::Zilla::Plugin::CheckMetaResources" : "0", "Dist::Zilla::Plugin::CheckPrereqsIndexed" : "0.019", "Dist::Zilla::Plugin::CheckSelfDependency" : "0", "Dist::Zilla::Plugin::CheckStrictVersion" : "0", "Dist::Zilla::Plugin::ConfirmRelease" : "0", "Dist::Zilla::Plugin::CopyFilesFromRelease" : "0", "Dist::Zilla::Plugin::EnsureLatestPerl" : "0", "Dist::Zilla::Plugin::FileFinder::ByName" : "0", "Dist::Zilla::Plugin::GenerateFile::FromShareDir" : "0", "Dist::Zilla::Plugin::Git::Check" : "0", "Dist::Zilla::Plugin::Git::CheckFor::CorrectBranch" : "0.004", "Dist::Zilla::Plugin::Git::CheckFor::MergeConflicts" : "0", "Dist::Zilla::Plugin::Git::Commit" : "2.020", "Dist::Zilla::Plugin::Git::Contributors" : "0.029", "Dist::Zilla::Plugin::Git::Describe" : "0.004", "Dist::Zilla::Plugin::Git::GatherDir" : "2.016", "Dist::Zilla::Plugin::Git::Push" : "0", "Dist::Zilla::Plugin::Git::Remote::Check" : "0", "Dist::Zilla::Plugin::Git::Tag" : "0", "Dist::Zilla::Plugin::GitHub::Update" : "0.40", "Dist::Zilla::Plugin::GithubMeta" : "0.54", "Dist::Zilla::Plugin::InstallGuide" : "1.200005", "Dist::Zilla::Plugin::Keywords" : "0.004", "Dist::Zilla::Plugin::License" : "5.038", "Dist::Zilla::Plugin::MakeMaker" : "0", "Dist::Zilla::Plugin::Manifest" : "0", "Dist::Zilla::Plugin::MetaConfig" : "0", "Dist::Zilla::Plugin::MetaJSON" : "0", "Dist::Zilla::Plugin::MetaNoIndex" : "0", "Dist::Zilla::Plugin::MetaProvides::Package" : "1.15000002", "Dist::Zilla::Plugin::MetaTests" : "0", "Dist::Zilla::Plugin::MetaYAML" : "0", "Dist::Zilla::Plugin::MinimumPerl" : "1.006", "Dist::Zilla::Plugin::MojibakeTests" : "0.8", "Dist::Zilla::Plugin::NextRelease" : "5.033", "Dist::Zilla::Plugin::OnlyCorePrereqs" : "0", "Dist::Zilla::Plugin::PodCoverageTests" : "5.040", "Dist::Zilla::Plugin::PodSyntaxTests" : "5.040", "Dist::Zilla::Plugin::PodWeaver" : "4.008", "Dist::Zilla::Plugin::Prereqs" : "0", "Dist::Zilla::Plugin::Prereqs::AuthorDeps" : "0.006", "Dist::Zilla::Plugin::PromptIfStale" : "0", "Dist::Zilla::Plugin::Readme" : "0", "Dist::Zilla::Plugin::ReadmeAnyFromPod" : "0.142180", "Dist::Zilla::Plugin::RewriteVersion::Transitional" : "0.006", "Dist::Zilla::Plugin::Run::AfterBuild" : "0.041", "Dist::Zilla::Plugin::Run::AfterRelease" : "0.038", "Dist::Zilla::Plugin::RunExtraTests" : "0.024", "Dist::Zilla::Plugin::StaticInstall" : "0.005", "Dist::Zilla::Plugin::Test::CPAN::Changes" : "0.012", "Dist::Zilla::Plugin::Test::ChangesHasContent" : "0", "Dist::Zilla::Plugin::Test::CleanNamespaces" : "0.006", "Dist::Zilla::Plugin::Test::Compile" : "2.039", "Dist::Zilla::Plugin::Test::EOL" : "0.17", "Dist::Zilla::Plugin::Test::Kwalitee" : "2.10", "Dist::Zilla::Plugin::Test::MinimumVersion" : "2.000010", "Dist::Zilla::Plugin::Test::NoTabs" : "0.08", "Dist::Zilla::Plugin::Test::PodSpelling" : "2.006003", "Dist::Zilla::Plugin::Test::Portability" : "2.000007", "Dist::Zilla::Plugin::Test::ReportPrereqs" : "0.022", "Dist::Zilla::Plugin::TestRelease" : "0", "Dist::Zilla::Plugin::UploadToCPAN" : "0", "Dist::Zilla::Plugin::UseUnsafeInc" : "0", "Dist::Zilla::PluginBundle::Author::ETHER" : "0.119", "Dist::Zilla::PluginBundle::Git::VersionManager" : "0.007", "Software::License::Perl_5" : "0" } } }, "provides" : { "Class::Method::Modifiers" : { "file" : "lib/Class/Method/Modifiers.pm", "version" : "2.15" } }, "release_status" : "stable", "resources" : { "bugtracker" : { "mailto" : "bug-Class-Method-Modifiers@rt.cpan.org", "web" : "https://rt.cpan.org/Public/Dist/Display.html?Name=Class-Method-Modifiers" }, "homepage" : "https://github.com/moose/Class-Method-Modifiers", "repository" : { "type" : "git", "url" : "https://github.com/moose/Class-Method-Modifiers.git", "web" : "https://github.com/moose/Class-Method-Modifiers" } }, "version" : "2.15", "x_Dist_Zilla" : { "perl" : { "version" : "5.037009" }, "plugins" : [ { "class" : "Dist::Zilla::Plugin::Prereqs", "config" : { "Dist::Zilla::Plugin::Prereqs" : { "phase" : "develop", "type" : "recommends" } }, "name" : "@Author::ETHER/pluginbundle version", "version" : "6.030" }, { "class" : "Dist::Zilla::Plugin::PromptIfStale", "config" : { "Dist::Zilla::Plugin::PromptIfStale" : { "check_all_plugins" : 0, "check_all_prereqs" : 0, "modules" : [ "Dist::Zilla::PluginBundle::Author::ETHER" ], "phase" : "build", "run_under_travis" : 0, "skip" : [] } }, "name" : "@Author::ETHER/stale modules, build", "version" : "0.057" }, { "class" : "Dist::Zilla::Plugin::FileFinder::ByName", "name" : "@Author::ETHER/Examples", "version" : "6.030" }, { "class" : "Dist::Zilla::Plugin::Git::GatherDir", "config" : { "Dist::Zilla::Plugin::GatherDir" : { "exclude_filename" : [ "CONTRIBUTING", "INSTALL", "LICENSE", "README.pod" ], "exclude_match" : [], "follow_symlinks" : 0, "include_dotfiles" : 0, "prefix" : "", "prune_directory" : [], "root" : "." }, "Dist::Zilla::Plugin::Git::GatherDir" : { "include_untracked" : 0 } }, "name" : "@Author::ETHER/Git::GatherDir", "version" : "2.048" }, { "class" : "Dist::Zilla::Plugin::MetaYAML", "name" : "@Author::ETHER/MetaYAML", "version" : "6.030" }, { "class" : "Dist::Zilla::Plugin::MetaJSON", "name" : "@Author::ETHER/MetaJSON", "version" : "6.030" }, { "class" : "Dist::Zilla::Plugin::Readme", "name" : "@Author::ETHER/Readme", "version" : "6.030" }, { "class" : "Dist::Zilla::Plugin::Manifest", "name" : "@Author::ETHER/Manifest", "version" : "6.030" }, { "class" : "Dist::Zilla::Plugin::License", "name" : "@Author::ETHER/License", "version" : "6.030" }, { "class" : "Dist::Zilla::Plugin::GenerateFile::FromShareDir", "config" : { "Dist::Zilla::Plugin::GenerateFile::FromShareDir" : { "destination_filename" : "CONTRIBUTING", "dist" : "Dist-Zilla-PluginBundle-Author-ETHER", "encoding" : "UTF-8", "has_xs" : 0, "location" : "build", "source_filename" : "CONTRIBUTING" }, "Dist::Zilla::Role::RepoFileInjector" : { "allow_overwrite" : 1, "repo_root" : ".", "version" : "0.009" } }, "name" : "@Author::ETHER/generate CONTRIBUTING", "version" : "0.015" }, { "class" : "Dist::Zilla::Plugin::InstallGuide", "config" : { "Dist::Zilla::Role::ModuleMetadata" : { "Module::Metadata" : "1.000037", "version" : "0.006" } }, "name" : "@Author::ETHER/InstallGuide", "version" : "1.200014" }, { "class" : "Dist::Zilla::Plugin::Test::Compile", "config" : { "Dist::Zilla::Plugin::Test::Compile" : { "bail_out_on_fail" : 1, "fail_on_warning" : "author", "fake_home" : 0, "filename" : "xt/author/00-compile.t", "module_finder" : [ ":InstallModules" ], "needs_display" : 0, "phase" : "develop", "script_finder" : [ ":PerlExecFiles", "@Author::ETHER/Examples" ], "skips" : [], "switch" : [] } }, "name" : "@Author::ETHER/Test::Compile", "version" : "2.058" }, { "class" : "Dist::Zilla::Plugin::Test::NoTabs", "config" : { "Dist::Zilla::Plugin::Test::NoTabs" : { "filename" : "xt/author/no-tabs.t", "finder" : [ ":InstallModules", ":ExecFiles", "@Author::ETHER/Examples", ":TestFiles", ":ExtraTestFiles" ] } }, "name" : "@Author::ETHER/Test::NoTabs", "version" : "0.15" }, { "class" : "Dist::Zilla::Plugin::Test::EOL", "config" : { "Dist::Zilla::Plugin::Test::EOL" : { "filename" : "xt/author/eol.t", "finder" : [ ":ExecFiles", ":ExtraTestFiles", ":InstallModules", ":TestFiles", "@Author::ETHER/Examples" ], "trailing_whitespace" : 1 } }, "name" : "@Author::ETHER/Test::EOL", "version" : "0.19" }, { "class" : "Dist::Zilla::Plugin::MetaTests", "name" : "@Author::ETHER/MetaTests", "version" : "6.030" }, { "class" : "Dist::Zilla::Plugin::Test::CPAN::Changes", "config" : { "Dist::Zilla::Plugin::Test::CPAN::Changes" : { "changelog" : "Changes" } }, "name" : "@Author::ETHER/Test::CPAN::Changes", "version" : "0.012" }, { "class" : "Dist::Zilla::Plugin::Test::ChangesHasContent", "name" : "@Author::ETHER/Test::ChangesHasContent", "version" : "0.011" }, { "class" : "Dist::Zilla::Plugin::Test::MinimumVersion", "config" : { "Dist::Zilla::Plugin::Test::MinimumVersion" : { "max_target_perl" : "5.006000" } }, "name" : "@Author::ETHER/Test::MinimumVersion", "version" : "2.000010" }, { "class" : "Dist::Zilla::Plugin::PodSyntaxTests", "name" : "@Author::ETHER/PodSyntaxTests", "version" : "6.030" }, { "class" : "Dist::Zilla::Plugin::PodCoverageTests", "name" : "@Author::ETHER/PodCoverageTests", "version" : "6.030" }, { "class" : "Dist::Zilla::Plugin::Test::PodSpelling", "config" : { "Dist::Zilla::Plugin::Test::PodSpelling" : { "directories" : [ "examples", "lib", "script", "t", "xt" ], "spell_cmd" : "", "stopwords" : [ "irc" ], "wordlist" : "Pod::Wordlist" } }, "name" : "@Author::ETHER/Test::PodSpelling", "version" : "2.007005" }, { "class" : "Dist::Zilla::Plugin::Test::Kwalitee", "config" : { "Dist::Zilla::Plugin::Test::Kwalitee" : { "filename" : "xt/author/kwalitee.t", "skiptest" : [] } }, "name" : "@Author::ETHER/Test::Kwalitee", "version" : "2.12" }, { "class" : "Dist::Zilla::Plugin::MojibakeTests", "name" : "@Author::ETHER/MojibakeTests", "version" : "0.8" }, { "class" : "Dist::Zilla::Plugin::Test::ReportPrereqs", "name" : "@Author::ETHER/Test::ReportPrereqs", "version" : "0.029" }, { "class" : "Dist::Zilla::Plugin::Test::Portability", "config" : { "Dist::Zilla::Plugin::Test::Portability" : { "options" : "" } }, "name" : "@Author::ETHER/Test::Portability", "version" : "2.001001" }, { "class" : "Dist::Zilla::Plugin::Test::CleanNamespaces", "config" : { "Dist::Zilla::Plugin::Test::CleanNamespaces" : { "filename" : "xt/author/clean-namespaces.t", "skips" : [] } }, "name" : "@Author::ETHER/Test::CleanNamespaces", "version" : "0.006" }, { "class" : "Dist::Zilla::Plugin::Git::Describe", "name" : "@Author::ETHER/Git::Describe", "version" : "0.008" }, { "class" : "Dist::Zilla::Plugin::PodWeaver", "config" : { "Dist::Zilla::Plugin::PodWeaver" : { "config_plugins" : [ "@Author::ETHER" ], "finder" : [ ":InstallModules", ":PerlExecFiles" ], "plugins" : [ { "class" : "Pod::Weaver::Plugin::EnsurePod5", "name" : "@Author::ETHER/EnsurePod5", "version" : "4.019" }, { "class" : "Pod::Weaver::Plugin::H1Nester", "name" : "@Author::ETHER/H1Nester", "version" : "4.019" }, { "class" : "Pod::Weaver::Plugin::SingleEncoding", "name" : "@Author::ETHER/SingleEncoding", "version" : "4.019" }, { "class" : "Pod::Weaver::Plugin::Transformer", "name" : "@Author::ETHER/List", "version" : "4.019" }, { "class" : "Pod::Weaver::Plugin::Transformer", "name" : "@Author::ETHER/Verbatim", "version" : "4.019" }, { "class" : "Pod::Weaver::Section::Region", "name" : "@Author::ETHER/header", "version" : "4.019" }, { "class" : "Pod::Weaver::Section::Name", "name" : "@Author::ETHER/Name", "version" : "4.019" }, { "class" : "Pod::Weaver::Section::Version", "name" : "@Author::ETHER/Version", "version" : "4.019" }, { "class" : "Pod::Weaver::Section::Region", "name" : "@Author::ETHER/prelude", "version" : "4.019" }, { "class" : "Pod::Weaver::Section::Generic", "name" : "SYNOPSIS", "version" : "4.019" }, { "class" : "Pod::Weaver::Section::Generic", "name" : "DESCRIPTION", "version" : "4.019" }, { "class" : "Pod::Weaver::Section::Generic", "name" : "OVERVIEW", "version" : "4.019" }, { "class" : "Pod::Weaver::Section::Collect", "name" : "ATTRIBUTES", "version" : "4.019" }, { "class" : "Pod::Weaver::Section::Collect", "name" : "METHODS", "version" : "4.019" }, { "class" : "Pod::Weaver::Section::Collect", "name" : "FUNCTIONS", "version" : "4.019" }, { "class" : "Pod::Weaver::Section::Collect", "name" : "TYPES", "version" : "4.019" }, { "class" : "Pod::Weaver::Section::Leftovers", "name" : "@Author::ETHER/Leftovers", "version" : "4.019" }, { "class" : "Pod::Weaver::Section::Region", "name" : "@Author::ETHER/postlude", "version" : "4.019" }, { "class" : "Pod::Weaver::Section::GenerateSection", "name" : "@Author::ETHER/generate SUPPORT", "version" : "4.019" }, { "class" : "Pod::Weaver::Section::Authors", "name" : "@Author::ETHER/Authors", "version" : "4.019" }, { "class" : "Pod::Weaver::Section::AllowOverride", "name" : "@Author::ETHER/allow override AUTHOR", "version" : "0.05" }, { "class" : "Pod::Weaver::Section::Contributors", "name" : "@Author::ETHER/Contributors", "version" : "0.009" }, { "class" : "Pod::Weaver::Section::Legal", "name" : "@Author::ETHER/Legal", "version" : "4.019" }, { "class" : "Pod::Weaver::Section::Region", "name" : "@Author::ETHER/footer", "version" : "4.019" } ] } }, "name" : "@Author::ETHER/PodWeaver", "version" : "4.010" }, { "class" : "Dist::Zilla::Plugin::GithubMeta", "name" : "@Author::ETHER/GithubMeta", "version" : "0.58" }, { "class" : "Dist::Zilla::Plugin::AutoMetaResources", "name" : "@Author::ETHER/AutoMetaResources", "version" : "1.21" }, { "class" : "Dist::Zilla::Plugin::Authority", "name" : "@Author::ETHER/Authority", "version" : "1.009" }, { "class" : "Dist::Zilla::Plugin::MetaNoIndex", "name" : "@Author::ETHER/MetaNoIndex", "version" : "6.030" }, { "class" : "Dist::Zilla::Plugin::MetaProvides::Package", "config" : { "Dist::Zilla::Plugin::MetaProvides::Package" : { "finder" : [ ":InstallModules" ], "finder_objects" : [ { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":InstallModules", "version" : "6.030" } ], "include_underscores" : 0 }, "Dist::Zilla::Role::MetaProvider::Provider" : { "$Dist::Zilla::Role::MetaProvider::Provider::VERSION" : "2.002004", "inherit_missing" : 0, "inherit_version" : 0, "meta_noindex" : 1 }, "Dist::Zilla::Role::ModuleMetadata" : { "Module::Metadata" : "1.000037", "version" : "0.006" } }, "name" : "@Author::ETHER/MetaProvides::Package", "version" : "2.004003" }, { "class" : "Dist::Zilla::Plugin::MetaConfig", "name" : "@Author::ETHER/MetaConfig", "version" : "6.030" }, { "class" : "Dist::Zilla::Plugin::Keywords", "config" : { "Dist::Zilla::Plugin::Keywords" : { "keywords" : [ "method", "wrap", "modification", "patch" ] } }, "name" : "@Author::ETHER/Keywords", "version" : "0.007" }, { "class" : "Dist::Zilla::Plugin::UseUnsafeInc", "config" : { "Dist::Zilla::Plugin::UseUnsafeInc" : { "dot_in_INC" : 0 } }, "name" : "@Author::ETHER/UseUnsafeInc", "version" : "0.002" }, { "class" : "Dist::Zilla::Plugin::AutoPrereqs", "name" : "@Author::ETHER/AutoPrereqs", "version" : "6.030" }, { "class" : "Dist::Zilla::Plugin::Prereqs::AuthorDeps", "name" : "@Author::ETHER/Prereqs::AuthorDeps", "version" : "0.007" }, { "class" : "Dist::Zilla::Plugin::MinimumPerl", "name" : "@Author::ETHER/MinimumPerl", "version" : "1.006" }, { "class" : "Dist::Zilla::Plugin::MakeMaker", "config" : { "Dist::Zilla::Role::TestRunner" : { "default_jobs" : 9 } }, "name" : "@Author::ETHER/MakeMaker", "version" : "6.030" }, { "class" : "Dist::Zilla::Plugin::Git::Contributors", "config" : { "Dist::Zilla::Plugin::Git::Contributors" : { "git_version" : "2.39.1", "include_authors" : 0, "include_releaser" : 1, "order_by" : "commits", "paths" : [] } }, "name" : "@Author::ETHER/Git::Contributors", "version" : "0.036" }, { "class" : "Dist::Zilla::Plugin::StaticInstall", "config" : { "Dist::Zilla::Plugin::StaticInstall" : { "dry_run" : 1, "mode" : "auto" } }, "name" : "@Author::ETHER/StaticInstall", "version" : "0.012" }, { "class" : "Dist::Zilla::Plugin::RunExtraTests", "config" : { "Dist::Zilla::Role::TestRunner" : { "default_jobs" : 9 } }, "name" : "@Author::ETHER/RunExtraTests", "version" : "0.029" }, { "class" : "Dist::Zilla::Plugin::CheckSelfDependency", "config" : { "Dist::Zilla::Plugin::CheckSelfDependency" : { "finder" : [ ":InstallModules" ] }, "Dist::Zilla::Role::ModuleMetadata" : { "Module::Metadata" : "1.000037", "version" : "0.006" } }, "name" : "@Author::ETHER/CheckSelfDependency", "version" : "0.011" }, { "class" : "Dist::Zilla::Plugin::Run::AfterBuild", "config" : { "Dist::Zilla::Plugin::Run::Role::Runner" : { "fatal_errors" : 1, "quiet" : 1, "run" : [ "bash -c \"test -e .ackrc && grep -q -- '--ignore-dir=.latest' .ackrc || echo '--ignore-dir=.latest' >> .ackrc; if [[ `dirname '%d'` != .build ]]; then test -e .ackrc && grep -q -- '--ignore-dir=%d' .ackrc || echo '--ignore-dir=%d' >> .ackrc; fi\"" ], "version" : "0.048" } }, "name" : "@Author::ETHER/.ackrc", "version" : "0.048" }, { "class" : "Dist::Zilla::Plugin::Run::AfterBuild", "config" : { "Dist::Zilla::Plugin::Run::Role::Runner" : { "eval" : [ "if ('%d' =~ /^%n-[.[:xdigit:]]+$/) { unlink '.latest'; symlink '%d', '.latest'; }" ], "fatal_errors" : 0, "quiet" : 1, "version" : "0.048" } }, "name" : "@Author::ETHER/.latest", "version" : "0.048" }, { "class" : "Dist::Zilla::Plugin::CheckStrictVersion", "name" : "@Author::ETHER/CheckStrictVersion", "version" : "0.001" }, { "class" : "Dist::Zilla::Plugin::CheckMetaResources", "name" : "@Author::ETHER/CheckMetaResources", "version" : "0.001" }, { "class" : "Dist::Zilla::Plugin::EnsureLatestPerl", "config" : { "Dist::Zilla::Plugin::EnsureLatestPerl" : { "Module::CoreList" : "5.20230220" } }, "name" : "@Author::ETHER/EnsureLatestPerl", "version" : "0.010" }, { "class" : "Dist::Zilla::Plugin::PromptIfStale", "config" : { "Dist::Zilla::Plugin::PromptIfStale" : { "check_all_plugins" : 1, "check_all_prereqs" : 1, "modules" : [], "phase" : "release", "run_under_travis" : 0, "skip" : [] } }, "name" : "@Author::ETHER/stale modules, release", "version" : "0.057" }, { "class" : "Dist::Zilla::Plugin::Git::Check", "config" : { "Dist::Zilla::Plugin::Git::Check" : { "untracked_files" : "die" }, "Dist::Zilla::Role::Git::DirtyFiles" : { "allow_dirty" : [], "allow_dirty_match" : [], "changelog" : "Changes" }, "Dist::Zilla::Role::Git::Repo" : { "git_version" : "2.39.1", "repo_root" : "." } }, "name" : "@Author::ETHER/initial check", "version" : "2.048" }, { "class" : "Dist::Zilla::Plugin::Git::CheckFor::MergeConflicts", "config" : { "Dist::Zilla::Role::Git::Repo" : { "git_version" : "2.39.1", "repo_root" : "." } }, "name" : "@Author::ETHER/Git::CheckFor::MergeConflicts", "version" : "0.014" }, { "class" : "Dist::Zilla::Plugin::Git::CheckFor::CorrectBranch", "config" : { "Dist::Zilla::Role::Git::Repo" : { "git_version" : "2.39.1", "repo_root" : "." } }, "name" : "@Author::ETHER/Git::CheckFor::CorrectBranch", "version" : "0.014" }, { "class" : "Dist::Zilla::Plugin::Git::Remote::Check", "name" : "@Author::ETHER/Git::Remote::Check", "version" : "0.1.2" }, { "class" : "Dist::Zilla::Plugin::CheckPrereqsIndexed", "name" : "@Author::ETHER/CheckPrereqsIndexed", "version" : "0.022" }, { "class" : "Dist::Zilla::Plugin::TestRelease", "name" : "@Author::ETHER/TestRelease", "version" : "6.030" }, { "class" : "Dist::Zilla::Plugin::Git::Check", "config" : { "Dist::Zilla::Plugin::Git::Check" : { "untracked_files" : "die" }, "Dist::Zilla::Role::Git::DirtyFiles" : { "allow_dirty" : [], "allow_dirty_match" : [], "changelog" : "Changes" }, "Dist::Zilla::Role::Git::Repo" : { "git_version" : "2.39.1", "repo_root" : "." } }, "name" : "@Author::ETHER/after tests", "version" : "2.048" }, { "class" : "Dist::Zilla::Plugin::CheckIssues", "name" : "@Author::ETHER/CheckIssues", "version" : "0.011" }, { "class" : "Dist::Zilla::Plugin::UploadToCPAN", "name" : "@Author::ETHER/UploadToCPAN", "version" : "6.030" }, { "class" : "Dist::Zilla::Plugin::CopyFilesFromRelease", "config" : { "Dist::Zilla::Plugin::CopyFilesFromRelease" : { "filename" : [ "CONTRIBUTING", "INSTALL", "LICENCE", "LICENSE", "ppport.h" ], "match" : [] } }, "name" : "@Author::ETHER/copy generated files", "version" : "0.007" }, { "class" : "Dist::Zilla::Plugin::ReadmeAnyFromPod", "config" : { "Dist::Zilla::Role::FileWatcher" : { "version" : "0.006" } }, "name" : "@Author::ETHER/ReadmeAnyFromPod", "version" : "0.163250" }, { "class" : "Dist::Zilla::Plugin::Prereqs", "config" : { "Dist::Zilla::Plugin::Prereqs" : { "phase" : "develop", "type" : "recommends" } }, "name" : "@Author::ETHER/@Git::VersionManager/pluginbundle version", "version" : "6.030" }, { "class" : "Dist::Zilla::Plugin::RewriteVersion::Transitional", "config" : { "Dist::Zilla::Plugin::RewriteVersion" : { "add_tarball_name" : 0, "finders" : [ ":ExecFiles", ":InstallModules" ], "global" : 1, "skip_version_provider" : 0 }, "Dist::Zilla::Plugin::RewriteVersion::Transitional" : {} }, "name" : "@Author::ETHER/@Git::VersionManager/RewriteVersion::Transitional", "version" : "0.009" }, { "class" : "Dist::Zilla::Plugin::MetaProvides::Update", "name" : "@Author::ETHER/@Git::VersionManager/MetaProvides::Update", "version" : "0.007" }, { "class" : "Dist::Zilla::Plugin::CopyFilesFromRelease", "config" : { "Dist::Zilla::Plugin::CopyFilesFromRelease" : { "filename" : [ "Changes" ], "match" : [] } }, "name" : "@Author::ETHER/@Git::VersionManager/CopyFilesFromRelease", "version" : "0.007" }, { "class" : "Dist::Zilla::Plugin::Git::Commit", "config" : { "Dist::Zilla::Plugin::Git::Commit" : { "add_files_in" : [ "." ], "commit_msg" : "%N-%v%t%n%n%c", "signoff" : 0 }, "Dist::Zilla::Role::Git::DirtyFiles" : { "allow_dirty" : [ "CONTRIBUTING", "Changes", "INSTALL", "LICENSE", "README.pod" ], "allow_dirty_match" : [], "changelog" : "Changes" }, "Dist::Zilla::Role::Git::Repo" : { "git_version" : "2.39.1", "repo_root" : "." }, "Dist::Zilla::Role::Git::StringFormatter" : { "time_zone" : "local" } }, "name" : "@Author::ETHER/@Git::VersionManager/release snapshot", "version" : "2.048" }, { "class" : "Dist::Zilla::Plugin::Git::Tag", "config" : { "Dist::Zilla::Plugin::Git::Tag" : { "branch" : null, "changelog" : "Changes", "signed" : 0, "tag" : "v2.15", "tag_format" : "v%V", "tag_message" : "v%v%t" }, "Dist::Zilla::Role::Git::Repo" : { "git_version" : "2.39.1", "repo_root" : "." }, "Dist::Zilla::Role::Git::StringFormatter" : { "time_zone" : "local" } }, "name" : "@Author::ETHER/@Git::VersionManager/Git::Tag", "version" : "2.048" }, { "class" : "Dist::Zilla::Plugin::BumpVersionAfterRelease::Transitional", "config" : { "Dist::Zilla::Plugin::BumpVersionAfterRelease" : { "finders" : [ ":InstallModules" ], "global" : 1, "munge_makefile_pl" : 1 }, "Dist::Zilla::Plugin::BumpVersionAfterRelease::Transitional" : {} }, "name" : "@Author::ETHER/@Git::VersionManager/BumpVersionAfterRelease::Transitional", "version" : "0.009" }, { "class" : "Dist::Zilla::Plugin::NextRelease", "name" : "@Author::ETHER/@Git::VersionManager/NextRelease", "version" : "6.030" }, { "class" : "Dist::Zilla::Plugin::Git::Commit", "config" : { "Dist::Zilla::Plugin::Git::Commit" : { "add_files_in" : [], "commit_msg" : "increment $VERSION after %v release", "signoff" : 0 }, "Dist::Zilla::Role::Git::DirtyFiles" : { "allow_dirty" : [ "Build.PL", "Changes", "Makefile.PL" ], "allow_dirty_match" : [ "(?^:^lib/.*\\.pm$)" ], "changelog" : "Changes" }, "Dist::Zilla::Role::Git::Repo" : { "git_version" : "2.39.1", "repo_root" : "." }, "Dist::Zilla::Role::Git::StringFormatter" : { "time_zone" : "local" } }, "name" : "@Author::ETHER/@Git::VersionManager/post-release commit", "version" : "2.048" }, { "class" : "Dist::Zilla::Plugin::Prereqs", "config" : { "Dist::Zilla::Plugin::Prereqs" : { "phase" : "x_Dist_Zilla", "type" : "requires" } }, "name" : "@Author::ETHER/@Git::VersionManager/prereqs for @Git::VersionManager", "version" : "6.030" }, { "class" : "Dist::Zilla::Plugin::Git::Push", "config" : { "Dist::Zilla::Plugin::Git::Push" : { "push_to" : [ "origin" ], "remotes_must_exist" : 1 }, "Dist::Zilla::Role::Git::Repo" : { "git_version" : "2.39.1", "repo_root" : "." } }, "name" : "@Author::ETHER/Git::Push", "version" : "2.048" }, { "class" : "Dist::Zilla::Plugin::GitHub::Update", "config" : { "Dist::Zilla::Plugin::GitHub::Update" : { "metacpan" : 1 } }, "name" : "@Author::ETHER/GitHub::Update", "version" : "0.48" }, { "class" : "Dist::Zilla::Plugin::Run::AfterRelease", "config" : { "Dist::Zilla::Plugin::Run::Role::Runner" : { "fatal_errors" : 0, "quiet" : 0, "run" : [ "REDACTED" ], "version" : "0.048" } }, "name" : "@Author::ETHER/install release", "version" : "0.048" }, { "class" : "Dist::Zilla::Plugin::Run::AfterRelease", "config" : { "Dist::Zilla::Plugin::Run::Role::Runner" : { "eval" : [ "print \"release complete!\\xa\"" ], "fatal_errors" : 1, "quiet" : 1, "version" : "0.048" } }, "name" : "@Author::ETHER/release complete", "version" : "0.048" }, { "class" : "Dist::Zilla::Plugin::ConfirmRelease", "name" : "@Author::ETHER/ConfirmRelease", "version" : "6.030" }, { "class" : "Dist::Zilla::Plugin::Prereqs", "config" : { "Dist::Zilla::Plugin::Prereqs" : { "phase" : "x_Dist_Zilla", "type" : "requires" } }, "name" : "@Author::ETHER/prereqs for @Author::ETHER", "version" : "6.030" }, { "class" : "Dist::Zilla::Plugin::Prereqs", "config" : { "Dist::Zilla::Plugin::Prereqs" : { "phase" : "runtime", "type" : "requires" } }, "name" : "RuntimeRequires", "version" : "6.030" }, { "class" : "Dist::Zilla::Plugin::Prereqs", "config" : { "Dist::Zilla::Plugin::Prereqs" : { "phase" : "develop", "type" : "requires" } }, "name" : "DevelopRequires", "version" : "6.030" }, { "class" : "Dist::Zilla::Plugin::OnlyCorePrereqs", "config" : { "Dist::Zilla::Plugin::OnlyCorePrereqs" : { "also_disallow" : [], "check_dual_life_versions" : "0", "deprecated_ok" : 0, "phases" : [ "configure", "build", "runtime", "test" ], "skips" : [], "starting_version" : "to be determined from perl prereq" } }, "name" : "OnlyCorePrereqs", "version" : "0.024" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":InstallModules", "version" : "6.030" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":IncModules", "version" : "6.030" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":TestFiles", "version" : "6.030" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":ExtraTestFiles", "version" : "6.030" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":ExecFiles", "version" : "6.030" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":PerlExecFiles", "version" : "6.030" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":ShareFiles", "version" : "6.030" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":MainModule", "version" : "6.030" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":AllFiles", "version" : "6.030" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":NoFiles", "version" : "6.030" }, { "class" : "Dist::Zilla::Plugin::VerifyPhases", "name" : "@Author::ETHER/PHASE VERIFICATION", "version" : "0.016" } ], "zilla" : { "class" : "Dist::Zilla::Dist::Builder", "config" : { "is_trial" : 0 }, "version" : "6.030" } }, "x_authority" : "cpan:SARTAK", "x_contributors" : [ "Karen Etheridge ", "Shawn M Moore ", "Graham Knop ", "Aaron Crane ", "Peter Rabbitson ", "David Steinbrunner ", "gfx ", "Justin Hunter ", "mannih ", "Yves Orton " ], "x_generated_by_perl" : "v5.37.9", "x_serialization_backend" : "Cpanel::JSON::XS version 4.36", "x_spdx_expression" : "Artistic-1.0-Perl OR GPL-1.0-or-later", "x_use_unsafe_inc" : 0 } Makefile.PL100644000766000024 252414401224375 17277 0ustar00etherstaff000000000000Class-Method-Modifiers-2.15# This file was automatically generated by Dist::Zilla::Plugin::MakeMaker v6.030. use strict; use warnings; use 5.006; use ExtUtils::MakeMaker; my %WriteMakefileArgs = ( "ABSTRACT" => "Provides Moose-like method modifiers", "AUTHOR" => "Shawn M Moore ", "CONFIGURE_REQUIRES" => { "ExtUtils::MakeMaker" => 0 }, "DISTNAME" => "Class-Method-Modifiers", "LICENSE" => "perl", "MIN_PERL_VERSION" => "5.006", "NAME" => "Class::Method::Modifiers", "PREREQ_PM" => { "B" => 0, "Carp" => 0, "Exporter" => 0, "base" => 0, "strict" => 0, "warnings" => 0 }, "TEST_REQUIRES" => { "ExtUtils::MakeMaker" => 0, "File::Spec" => 0, "Test::More" => "0.88", "if" => 0 }, "VERSION" => "2.15", "test" => { "TESTS" => "t/*.t" } ); my %FallbackPrereqs = ( "B" => 0, "Carp" => 0, "Exporter" => 0, "ExtUtils::MakeMaker" => 0, "File::Spec" => 0, "Test::More" => "0.88", "base" => 0, "if" => 0, "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); t000755000766000024 014401224375 15425 5ustar00etherstaff000000000000Class-Method-Modifiers-2.15000-load.t100644000766000024 46614401224375 17154 0ustar00etherstaff000000000000Class-Method-Modifiers-2.15/tuse strict; use warnings; use Test::More 0.88; use if $ENV{AUTHOR_TESTING}, 'Test::Warnings'; do { package Class; use Class::Method::Modifiers; sub foo { } before foo => sub { }; after foo => sub { }; around foo => sub { }; }; pass("loaded correctly"); done_testing; CONTRIBUTING100644000766000024 777214401224375 17171 0ustar00etherstaff000000000000Class-Method-Modifiers-2.15 CONTRIBUTING Thank you for considering contributing to this distribution. This file contains instructions that will help you work with the source code. PLEASE NOTE that if you have any questions or difficulties, you can reach the maintainer(s) through the bug queue described later in this document (preferred), or by emailing the releaser directly. You are not required to follow any of the steps in this document to submit a patch or bug report; these are just recommendations, intended to help you (and help us help you faster). The distribution is managed with Dist::Zilla (https://metacpan.org/release/Dist-Zilla). This means than many of the usual files you might expect are not in the repository, but are generated at release time (e.g. Makefile.PL). However, you can run tests directly using the 'prove' tool: $ prove -l $ prove -lv t/some_test_file.t $ prove -lvr t/ In most cases, 'prove' is entirely sufficient for you to test any patches you have. You may need to satisfy some dependencies. The easiest way to satisfy dependencies is to install the last release -- this is available at https://metacpan.org/release/Class-Method-Modifiers If you use cpanminus, you can do it without downloading the tarball first: $ cpanm --reinstall --installdeps --with-recommends Class::Method::Modifiers Dist::Zilla is a very powerful authoring tool, but requires a number of author-specific plugins. If you would like to use it for contributing, install it from CPAN, then run one of the following commands, depending on your CPAN client: $ cpan `dzil authordeps --missing` or $ dzil authordeps --missing | cpanm You should then also install any additional requirements not needed by the dzil build but may be needed by tests or other development: $ cpan `dzil listdeps --author --missing` or $ dzil listdeps --author --missing | cpanm Or, you can use the 'dzil stale' command to install all requirements at once: $ cpan Dist::Zilla::App::Command::stale $ cpan `dzil stale --all` or $ cpanm Dist::Zilla::App::Command::stale $ dzil stale --all | cpanm You can also do this via cpanm directly: $ cpanm --reinstall --installdeps --with-develop --with-recommends Class::Method::Modifiers Once installed, here are some dzil commands you might try: $ dzil build $ dzil test $ dzil test --release $ dzil xtest $ dzil listdeps --json $ dzil build --notgz You can learn more about Dist::Zilla at http://dzil.org/. The code for this distribution is hosted at GitHub. The repository is: https://github.com/moose/Class-Method-Modifiers You can submit code changes by forking the repository, pushing your code changes to your clone, and then submitting a pull request. Please include a suitable end-user-oriented entry in the Changes file describing your change. Detailed instructions for doing that is available here: https://help.github.com/articles/creating-a-pull-request All pull requests for this distribution will be automatically tested on Linux by Travis at: https://travis-ci.com/moose/Class-Method-Modifiers Results will be visible in the pull request on GitHub. Follow the appropriate links for details when tests fail. Changes will not be mergeable until all tests pass. If you have found a bug, but do not have an accompanying patch to fix it, you can submit an issue report here: https://rt.cpan.org/Public/Dist/Display.html?Name=Class-Method-Modifiers or via email: bug-Class-Method-Modifiers@rt.cpan.org This is a good place to send your questions about the usage of this distribution. If you send me a patch or pull request, your name and email address will be included in the documentation as a contributor (using the attribution on the commit or patch), unless you specifically request for it not to be. If you wish to be listed under a different name or address, you should submit a pull request to the .mailmap file to contain the correct mapping. This file was generated via Dist::Zilla::Plugin::GenerateFile::FromShareDir 0.015 from a template file originating in Dist-Zilla-PluginBundle-Author-ETHER-0.162. 001-error.t100640000766000024 173614401224375 17404 0ustar00etherstaff000000000000Class-Method-Modifiers-2.15/tuse strict; use warnings; use Test::More 0.88; use if $ENV{AUTHOR_TESTING}, 'Test::Warnings'; do { package Class1; use Class::Method::Modifiers; eval { before foo => sub {}; }; ::like($@, qr/The method 'foo' is not found in the inheritance hierarchy for class Class1/, ); }; do { package Class2; use Class::Method::Modifiers; eval { after foo => sub {}; }; ::like( $@, qr/The method 'foo' is not found in the inheritance hierarchy for class Class2/, ); }; do { package Class3; use Class::Method::Modifiers; eval { around foo => sub {}; }; ::like( $@, qr/The method 'foo' is not found in the inheritance hierarchy for class Class3/, ); }; do { package Class4; use Class::Method::Modifiers; sub foo {} eval { around 'foo', 'bar' => sub {}; }; ::like( $@, qr/The method 'bar' is not found in the inheritance hierarchy for class Class4/, ); }; done_testing; 002-cache.t100644000766000024 402114401224375 17311 0ustar00etherstaff000000000000Class-Method-Modifiers-2.15/tuse strict; use warnings; use Test::More 0.88; use if $ENV{AUTHOR_TESTING}, 'Test::Warnings'; my $orig; my $code = sub { die }; do { package Class; use Class::Method::Modifiers; sub method {} $orig = Class->can('method'); before method => $code; }; is_deeply(\%Class::Method::Modifiers::MODIFIER_CACHE, { Class => { method => { before => [$code], after => [], around => [], orig => $orig, wrapped => $orig, }, }, }); my $code2 = sub { 1 + 1 }; do { package Child; BEGIN { our @ISA = 'Class' } use Class::Method::Modifiers; after method => $code2; }; my $fake = $Class::Method::Modifiers::MODIFIER_CACHE{Child}{method}{wrapped}; is_deeply(\%Class::Method::Modifiers::MODIFIER_CACHE, { Class => { method => { before => [$code], after => [], around => [], orig => $orig, wrapped => $orig, }, }, Child => { method => { before => [], after => [$code2], around => [], orig => undef, wrapped => $fake, }, }, }); my $around1 = sub { "around1" }; my $around2 = sub { "around2" }; do { package Class; use Class::Method::Modifiers; around method => $around1; around method => $around2; }; # XXX: hard to test, we have no other way of getting at this coderef my $wrapped = $Class::Method::Modifiers::MODIFIER_CACHE{Class}{method}{wrapped}; is_deeply(\%Class::Method::Modifiers::MODIFIER_CACHE, { Class => { method => { around => [$around2, $around1], before => [$code], after => [], orig => $orig, wrapped => $wrapped, }, }, Child => { method => { before => [], after => [$code2], around => [], orig => undef, wrapped => $fake, }, }, }); done_testing; 003-basic.t100600000766000024 421614401224375 17326 0ustar00etherstaff000000000000Class-Method-Modifiers-2.15/tuse strict; use warnings; use Test::More 0.88; use if $ENV{AUTHOR_TESTING}, 'Test::Warnings'; my @calls; do { package MyParent; use Class::Method::Modifiers; sub original { push @calls, 'MyParent::original' } before original => sub { push @calls, 'before MyParent::original' }; after original => sub { push @calls, 'after MyParent::original' }; }; MyParent->original; is_deeply([splice @calls], [ 'before MyParent::original', 'MyParent::original', 'after MyParent::original', ]); do { package MyParent; use Class::Method::Modifiers; before original => sub { push @calls, 'before before MyParent::original' }; after original => sub { push @calls, 'after after MyParent::original' }; }; MyParent->original; is_deeply([splice @calls], [ 'before before MyParent::original', 'before MyParent::original', 'MyParent::original', 'after MyParent::original', 'after after MyParent::original', ]); do { package Child; BEGIN { our @ISA = 'MyParent' } }; MyParent->original; is_deeply([splice @calls], [ 'before before MyParent::original', 'before MyParent::original', 'MyParent::original', 'after MyParent::original', 'after after MyParent::original', ]); Child->original; is_deeply([splice @calls], [ 'before before MyParent::original', 'before MyParent::original', 'MyParent::original', 'after MyParent::original', 'after after MyParent::original', ]); do { package Child; use Class::Method::Modifiers; before original => sub { push @calls, 'before Child::original' }; after original => sub { push @calls, 'after Child::original' }; }; MyParent->original; is_deeply([splice @calls], [ 'before before MyParent::original', 'before MyParent::original', 'MyParent::original', 'after MyParent::original', 'after after MyParent::original', ]); Child->original; is_deeply([splice @calls], [ 'before Child::original', 'before before MyParent::original', 'before MyParent::original', 'MyParent::original', 'after MyParent::original', 'after after MyParent::original', 'after Child::original', ]); done_testing; 120-fresh.t100640000766000024 464414401224375 17365 0ustar00etherstaff000000000000Class-Method-Modifiers-2.15/tuse strict; use warnings; use Test::More 0.88; use if $ENV{AUTHOR_TESTING}, 'Test::Warnings'; use B 'svref_2object'; BEGIN { package P1; sub new { bless {}, shift } sub m1 { 'P1/m1' } package P2; our @ISA = 'P1'; use Class::Method::Modifiers 'fresh'; sub m6 { 'P2/m6' } fresh m2 => sub { 'P2/m2' }; fresh [qw(m3 m4)] => sub { 'P2/m3/m4' }; my $closee = 'closee'; fresh m5 => sub { "P2/m5/$closee" }; } BEGIN { package P3; # like P2, but using install_modifier our @ISA = 'P1'; sub m6 { 'P3/m6' } package main; use Class::Method::Modifiers 'install_modifier'; install_modifier P3 => fresh => m2 => sub { 'P3/m2' }; install_modifier P3 => fresh => [qw(m3 m4)] => sub { 'P3/m3/m4' }; my $closee = 'closee'; install_modifier P3 => fresh => m5 => sub { "P3/m5/$closee" }; } can_ok(P2->new, @$_) for [ qw(m2), # single-name call to fresh qw(m3 m4), # multi-name call qw(m5), # code ref is closure ]; is(P2->new->m5, 'P2/m5/closee', 'closure works'); can_ok(P3->new, qw(m2 m3 m4 m5)); is(P3->new->m5, 'P3/m5/closee', 'closure works with install_modifier'); for my $class (qw(P2 P3)) { my $method = $class->can('m5'); is(svref_2object($method)->GV->STASH->NAME, $class, "method installed in $class has correct stash name"); } { package P2; eval { fresh m1 => sub {} }; ::like($@, qr/^Class P2 already has a method named 'm1'/, 'fresh: exception when inherited method exists'); eval { fresh m6 => sub {} }; ::like($@, qr/^Class P2 already has a method named 'm6'/, 'fresh: exception when local method exists'); eval { fresh '=:=' => sub {} }; ::like($@, qr/^Invalid method name '=:='/, 'fresh: exception when name invalid'); } eval { install_modifier P3 => fresh => m1 => sub {} }; like($@, qr/^Class P3 already has a method named 'm1'/, 'install_modifier: exception when inherited method exists'); eval { install_modifier P3 => fresh => m6 => sub {} }; like($@, qr/^Class P3 already has a method named 'm6'/, 'install_modifier: exception when local method exists'); eval { install_modifier P3 => fresh => '=:=' => sub {} }; like($@, qr/^Invalid method name '=:='/, 'install_modifier: exception when name invalid'); done_testing; 004-around.t100600000766000024 253314401224375 17536 0ustar00etherstaff000000000000Class-Method-Modifiers-2.15/tuse strict; use warnings; use Test::More 0.88; use if $ENV{AUTHOR_TESTING}, 'Test::Warnings'; my @calls; do { package Class; use Class::Method::Modifiers; sub original { push @calls, 'Class::original' } around original => sub { push @calls, 'around Class::original' }; }; Class->original; is_deeply([splice @calls], [ 'around Class::original', ]); do { package MyParent; use Class::Method::Modifiers; sub original { push @calls, 'MyParent::original' } around original => sub { my $orig = shift; push @calls, 'around/before MyParent::original'; $orig->(@_); push @calls, 'around/after MyParent::original'; }; }; MyParent->original; is_deeply([splice @calls], [ 'around/before MyParent::original', 'MyParent::original', 'around/after MyParent::original', ]); do { package MyParent; use Class::Method::Modifiers; around original => sub { my $orig = shift; push @calls, '2 around/before MyParent::original'; $orig->(@_); push @calls, '2 around/after MyParent::original'; }; }; MyParent->original; is_deeply([splice @calls], [ '2 around/before MyParent::original', 'around/before MyParent::original', 'MyParent::original', 'around/after MyParent::original', '2 around/after MyParent::original', ]); done_testing; 005-return.t100644000766000024 71114401224375 17552 0ustar00etherstaff000000000000Class-Method-Modifiers-2.15/tuse strict; use warnings; use Test::More 0.88; use if $ENV{AUTHOR_TESTING}, 'Test::Warnings'; do { package Fib; sub onacci { (1, 1, 2) } }; is_deeply([Fib->onacci], [1, 1, 2]); do { package Fib; use Class::Method::Modifiers; before onacci => sub {}; }; is_deeply([Fib->onacci], [1, 1, 2]); do { package Fib; use Class::Method::Modifiers; after onacci => sub {}; }; is_deeply([Fib->onacci], [1, 1, 2]); done_testing; 060-caller.t100600000766000024 224314401224375 17510 0ustar00etherstaff000000000000Class-Method-Modifiers-2.15/tuse strict; use warnings; use Test::More 0.88; use if $ENV{AUTHOR_TESTING}, 'Test::Warnings'; my ($parent_caller, $before_caller, $around_caller, $after_caller); my $parent = MyParent->new(); $parent->orig(); is($parent_caller, 'main', "parent with no modifiers sees 'main' as caller"); my $child = Child->new(); $child->orig(); TODO: { local $TODO = "caller magic not implemented yet"; is($parent_caller, 'main', "parent with modifiers sees 'main' as caller"); is($before_caller, 'main', "before modifiers sees 'main' as caller"); is($around_caller, 'main', "around modifiers sees 'main' as caller"); is($after_caller, 'main', "after modifiers sees 'main' as caller"); } BEGIN { package MyParent; sub new { bless {}, shift } sub orig { $parent_caller = caller; } } BEGIN { package Child; our @ISA = 'MyParent'; use Class::Method::Modifiers; before 'orig' => sub { $before_caller = caller; }; after 'orig' => sub { $after_caller = caller; }; around 'orig' => sub { my $orig = shift; $around_caller = caller; $orig->(); }; } done_testing; 140-lvalue.t100640000766000024 402314401224375 17537 0ustar00etherstaff000000000000Class-Method-Modifiers-2.15/tuse strict; use warnings; use Test::More 0.88; use if $ENV{AUTHOR_TESTING}, 'Test::Warnings'; { package WithLvalue; my $f; sub lvalue_method :lvalue { $f } sub other_method { 1 } my @array; sub array_lvalue :lvalue { @array } } { package Around; use Class::Method::Modifiers; our @ISA = qw(WithLvalue); around lvalue_method => sub :lvalue { my $orig = shift; $orig->(@_); }; my $d; around other_method => sub :lvalue { $d; }; around array_lvalue => sub :lvalue { $_[0]->(@_[1..$#_]); }; } Around->lvalue_method = 1; is(Around->lvalue_method, 1, 'around on an lvalue attribute is maintained'); Around->other_method = 2; is(Around->other_method, 2, 'around adding an lvalue attribute works'); (Around->array_lvalue) = (1,2); is_deeply([WithLvalue->array_lvalue], [1,2], 'around on array lvalue attribute works'); { package Before; use Class::Method::Modifiers; our @ISA = qw(WithLvalue); before lvalue_method => sub {}; } Before->lvalue_method = 3; is(Before->lvalue_method, 3, 'before maintains lvalue attribute'); { package After; use Class::Method::Modifiers; our @ISA = qw(WithLvalue); after lvalue_method => sub {}; after array_lvalue => sub {}; } After->lvalue_method = 4; is(After->lvalue_method, 4, 'after maintains lvalue attribute'); { local $TODO = "can't apply after to array lvalue method"; ok eval { (After->array_lvalue) = (3,4); 1 }, 'assigning to array lvalue attribute causes no errors' or diag 'error: ', $@; is_deeply([After->array_lvalue], [3,4], 'after array lvalue attribute sets values'); } { package LvalueWithProto; use Class::Method::Modifiers; my $f; sub lvalue_proto_method ($) :lvalue { $f } local $SIG{__WARN__} = sub {}; after lvalue_proto_method => sub {}; } ok eval { LvalueWithProto->lvalue_proto_method = 4; 1 }, 'after maintains lvalue attribute with prototype present' or diag 'error: ', $@; is(LvalueWithProto->lvalue_proto_method, 4, 'after with lvalue and prototype correctly assigns'); done_testing; 090-diamond.t100644000766000024 125314401224375 17674 0ustar00etherstaff000000000000Class-Method-Modifiers-2.15/tuse strict; use warnings; use Test::More 0.88; use if $ENV{AUTHOR_TESTING}, 'Test::Warnings'; my $Fourth = Fourth->new(); is($Fourth->orig, "FourthSecondFirst", "Third not called"); BEGIN { package First; sub new { bless {}, shift } sub orig { "First" } package Second; use Class::Method::Modifiers; our @ISA = ('First'); around orig => sub { "Second" . shift->() }; package Third; use Class::Method::Modifiers; our @ISA = ('First'); around orig => sub { "Third" . shift->() }; package Fourth; use Class::Method::Modifiers; our @ISA = ('Second', 'Third'); around orig => sub { "Fourth" . shift->() }; } done_testing; author000755000766000024 014401224375 17117 5ustar00etherstaff000000000000Class-Method-Modifiers-2.15/xteol.t100644000766000024 301214401224375 20217 0ustar00etherstaff000000000000Class-Method-Modifiers-2.15/xt/authoruse strict; use warnings; # this test was generated with Dist::Zilla::Plugin::Test::EOL 0.19 use Test::More 0.88; use Test::EOL; my @files = ( 'lib/Class/Method/Modifiers.pm', 't/00-report-prereqs.dd', 't/00-report-prereqs.t', 't/000-load.t', 't/001-error.t', 't/002-cache.t', 't/003-basic.t', 't/004-around.t', 't/005-return.t', 't/010-before-args.t', 't/011-after-args.t', 't/012-around-args.t', 't/020-multiple-inheritance.t', 't/030-multiple-before.t', 't/031-multiple-after.t', 't/032-multiple-around.t', 't/034-multiple-everything.t', 't/035-multiple-everything-twice.t', 't/040-twice-orig.t', 't/041-modify-parent.t', 't/051-undef-list-ctxt.t', 't/060-caller.t', 't/070-modify-multiple-at-once.t', 't/080-multiple-modifiers.t', 't/081-sub-and-modifier.t', 't/090-diamond.t', 't/100-class-mop-method-modifiers.t', 't/110-namespace-clean.t', 't/120-fresh.t', 't/130-clean-underscore.t', 't/140-lvalue.t', 'xt/author/00-compile.t', 'xt/author/clean-namespaces.t', 'xt/author/distmeta.t', 'xt/author/eol.t', 'xt/author/kwalitee.t', 'xt/author/minimum-version.t', 'xt/author/mojibake.t', 'xt/author/no-tabs.t', 'xt/author/pod-coverage.t', 'xt/author/pod-spell.t', 'xt/author/pod-syntax.t', 'xt/author/portability.t', 'xt/release/changes_has_content.t', 'xt/release/cpan-changes.t' ); eol_unix_ok($_, { trailing_whitespace => 1 }) foreach @files; done_testing; 011-after-args.t100600000766000024 140514401224375 20274 0ustar00etherstaff000000000000Class-Method-Modifiers-2.15/tuse strict; use warnings; use Test::More 0.88; use if $ENV{AUTHOR_TESTING}, 'Test::Warnings'; my $after_saw_orig_args = 0; my $storage = "Foo"; my $child = Child->new(); is($child->orig($storage), "orig", "after didn't affect orig's return"); ok($after_saw_orig_args, "after saw original arguments"); BEGIN { package MyParent; sub new { bless {}, shift } sub orig { my $self = shift; $_[0] =~ s/Foo/bAR/; return "orig"; } } BEGIN { package Child; our @ISA = 'MyParent'; use Class::Method::Modifiers; after 'orig' => sub { my $self = shift; my $arg = shift; $after_saw_orig_args = $arg eq "bAR"; return sub { die "somehow a closure was executed" }; }; } done_testing; 040-twice-orig.t100600000766000024 75314401224375 20301 0ustar00etherstaff000000000000Class-Method-Modifiers-2.15/tuse strict; use warnings; use Test::More 0.88; use if $ENV{AUTHOR_TESTING}, 'Test::Warnings'; my @seen; eval { ChildCMM->new->orig() }; is_deeply(\@seen, ["orig", "orig"], "CMM: calling orig twice in one around works"); BEGIN { package MyParent; sub new { bless {}, shift } sub orig { push @seen, "orig" } package ChildCMM; our @ISA = 'MyParent'; use Class::Method::Modifiers; around 'orig' => sub { my $orig = shift; $orig->(); $orig->(); }; } done_testing; 010-before-args.t100600000766000024 126314401224375 20436 0ustar00etherstaff000000000000Class-Method-Modifiers-2.15/tuse strict; use warnings; use Test::More 0.88; use if $ENV{AUTHOR_TESTING}, 'Test::Warnings'; my $storage = "Foo"; my $child = Child->new(); is($child->orig($storage), "before foo", "before affected orig's args a little"); BEGIN { package MyParent; sub new { bless {}, shift } sub orig { my $self = shift; return lc shift; } } BEGIN { package Child; our @ISA = 'MyParent'; use Class::Method::Modifiers; before 'orig' => sub { my $self = shift; $_[0] = 'Before ' . $_[0]; my $discard = shift; $discard = "will never be seen"; return ["lc on an arrayref? ha ha ha"]; }; } done_testing; 012-around-args.t100600000766000024 133714401224375 20470 0ustar00etherstaff000000000000Class-Method-Modifiers-2.15/tuse strict; use warnings; use Test::More 0.88; use if $ENV{AUTHOR_TESTING}, 'Test::Warnings'; my $child = Child->new(); my @words = split ' ', $child->orig("param"); is($words[0], "before"); is($words[1], "PARAM-orig"); is($words[2], "after"); BEGIN { package MyParent; sub new { bless {}, shift } sub orig { my $self = shift; my $arg = shift; return "$arg-orig"; } } BEGIN { package Child; our @ISA = 'MyParent'; use Class::Method::Modifiers; around 'orig' => sub { my $orig = shift; my $self = shift; my $arg = shift; join ' ', "before", $orig->($self, uc $arg), "after"; }; } done_testing; no-tabs.t100644000766000024 276014401224375 21014 0ustar00etherstaff000000000000Class-Method-Modifiers-2.15/xt/authoruse strict; use warnings; # this test was generated with Dist::Zilla::Plugin::Test::NoTabs 0.15 use Test::More 0.88; use Test::NoTabs; my @files = ( 'lib/Class/Method/Modifiers.pm', 't/00-report-prereqs.dd', 't/00-report-prereqs.t', 't/000-load.t', 't/001-error.t', 't/002-cache.t', 't/003-basic.t', 't/004-around.t', 't/005-return.t', 't/010-before-args.t', 't/011-after-args.t', 't/012-around-args.t', 't/020-multiple-inheritance.t', 't/030-multiple-before.t', 't/031-multiple-after.t', 't/032-multiple-around.t', 't/034-multiple-everything.t', 't/035-multiple-everything-twice.t', 't/040-twice-orig.t', 't/041-modify-parent.t', 't/051-undef-list-ctxt.t', 't/060-caller.t', 't/070-modify-multiple-at-once.t', 't/080-multiple-modifiers.t', 't/081-sub-and-modifier.t', 't/090-diamond.t', 't/100-class-mop-method-modifiers.t', 't/110-namespace-clean.t', 't/120-fresh.t', 't/130-clean-underscore.t', 't/140-lvalue.t', 'xt/author/00-compile.t', 'xt/author/clean-namespaces.t', 'xt/author/distmeta.t', 'xt/author/eol.t', 'xt/author/kwalitee.t', 'xt/author/minimum-version.t', 'xt/author/mojibake.t', 'xt/author/no-tabs.t', 'xt/author/pod-coverage.t', 'xt/author/pod-spell.t', 'xt/author/pod-syntax.t', 'xt/author/portability.t', 'xt/release/changes_has_content.t', 'xt/release/cpan-changes.t' ); notabs_ok($_) foreach @files; done_testing; distmeta.t100644000766000024 22314401224375 21233 0ustar00etherstaff000000000000Class-Method-Modifiers-2.15/xt/author#!perl # This file was automatically generated by Dist::Zilla::Plugin::MetaTests. use strict; use warnings; use Test::CPAN::Meta; meta_yaml_ok(); kwalitee.t100644000766000024 27514401224375 21235 0ustar00etherstaff000000000000Class-Method-Modifiers-2.15/xt/author# this test was generated with Dist::Zilla::Plugin::Test::Kwalitee 2.12 use strict; use warnings; use Test::More 0.88; use Test::Kwalitee 1.21 'kwalitee_ok'; kwalitee_ok(); done_testing; mojibake.t100644000766000024 15114401224375 21202 0ustar00etherstaff000000000000Class-Method-Modifiers-2.15/xt/author#!perl use strict; use warnings qw(all); use Test::More; use Test::Mojibake; all_files_encoding_ok(); 041-modify-parent.t100600000766000024 174614401224375 21032 0ustar00etherstaff000000000000Class-Method-Modifiers-2.15/tuse strict; use warnings; use Test::More 0.88; use if $ENV{AUTHOR_TESTING}, 'Test::Warnings'; my @calls; do { package MyParent; sub foo { push @calls, 'MyParent::foo' } package Child; use Class::Method::Modifiers; our @ISA = 'MyParent'; around foo => sub { push @calls, 'before Child::foo'; shift->(@_); push @calls, 'after Child::foo'; }; }; Child->foo; is_deeply([splice @calls], [ 'before Child::foo', 'MyParent::foo', 'after Child::foo', ]); do { package MyParent; use Class::Method::Modifiers; around foo => sub { push @calls, 'before MyParent::foo'; shift->(@_); push @calls, 'after MyParent::foo'; }; }; Child->foo; TODO: { local $TODO = "pending discussion with stevan"; is_deeply([splice @calls], [ 'before Child::foo', 'before MyParent::foo', 'MyParent::foo', 'after MyParent::foo', 'after Child::foo', ]); } done_testing; pod-spell.t100644000766000024 74014401224375 21324 0ustar00etherstaff000000000000Class-Method-Modifiers-2.15/xt/authoruse strict; use warnings; use Test::More; # generated by Dist::Zilla::Plugin::Test::PodSpelling 2.007005 use Test::Spelling 0.12; use Pod::Wordlist; add_stopwords(); all_pod_files_spelling_ok( qw( examples lib script t xt ) ); __DATA__ Aaron Class Crane David Etheridge Graham Hunter Justin Karen Knop Method Modifiers Moore Orton Peter Rabbitson Shawn Steinbrunner Yves arc code demerphq dsteinbrunner ether gfuji gfx github haarg irc justin lib mannih ribasushi sartak 00-report-prereqs.t100644000766000024 1410014401224375 21175 0ustar00etherstaff000000000000Class-Method-Modifiers-2.15/t#!perl use strict; use warnings; # This test was generated by Dist::Zilla::Plugin::Test::ReportPrereqs 0.029 use Test::More tests => 1; use ExtUtils::MakeMaker; use File::Spec; # from $version::LAX my $lax_version_re = qr/(?: undef | (?: (?:[0-9]+) (?: \. | (?:\.[0-9]+) (?:_[0-9]+)? )? | (?:\.[0-9]+) (?:_[0-9]+)? ) | (?: v (?:[0-9]+) (?: (?:\.[0-9]+)+ (?:_[0-9]+)? )? | (?:[0-9]+)? (?:\.[0-9]+){2,} (?:_[0-9]+)? ) )/x; # hide optional CPAN::Meta modules from prereq scanner # and check if they are available my $cpan_meta = "CPAN::Meta"; my $cpan_meta_pre = "CPAN::Meta::Prereqs"; my $HAS_CPAN_META = eval "require $cpan_meta; $cpan_meta->VERSION('2.120900')" && eval "require $cpan_meta_pre"; ## no critic # Verify requirements? my $DO_VERIFY_PREREQS = 1; sub _max { my $max = shift; $max = ( $_ > $max ) ? $_ : $max for @_; return $max; } sub _merge_prereqs { my ($collector, $prereqs) = @_; # CPAN::Meta::Prereqs object if (ref $collector eq $cpan_meta_pre) { return $collector->with_merged_prereqs( CPAN::Meta::Prereqs->new( $prereqs ) ); } # Raw hashrefs for my $phase ( keys %$prereqs ) { for my $type ( keys %{ $prereqs->{$phase} } ) { for my $module ( keys %{ $prereqs->{$phase}{$type} } ) { $collector->{$phase}{$type}{$module} = $prereqs->{$phase}{$type}{$module}; } } } return $collector; } my @include = qw( Encode File::Temp JSON::PP Module::Runtime Pod::Coverage Sub::Name YAML autodie Moose Moo Role::Tiny Sub::Install Sub::Name namespace::clean namespace::autoclean ); my @exclude = qw( ); # Add static prereqs to the included modules list my $static_prereqs = do './t/00-report-prereqs.dd'; # Merge all prereqs (either with ::Prereqs or a hashref) my $full_prereqs = _merge_prereqs( ( $HAS_CPAN_META ? $cpan_meta_pre->new : {} ), $static_prereqs ); # Add dynamic prereqs to the included modules list (if we can) my ($source) = grep { -f } 'MYMETA.json', 'MYMETA.yml'; my $cpan_meta_error; if ( $source && $HAS_CPAN_META && (my $meta = eval { CPAN::Meta->load_file($source) } ) ) { $full_prereqs = _merge_prereqs($full_prereqs, $meta->prereqs); } else { $cpan_meta_error = $@; # capture error from CPAN::Meta->load_file($source) $source = 'static metadata'; } my @full_reports; my @dep_errors; my $req_hash = $HAS_CPAN_META ? $full_prereqs->as_string_hash : $full_prereqs; # Add static includes into a fake section for my $mod (@include) { $req_hash->{other}{modules}{$mod} = 0; } for my $phase ( qw(configure build test runtime develop other) ) { next unless $req_hash->{$phase}; next if ($phase eq 'develop' and not $ENV{AUTHOR_TESTING}); for my $type ( qw(requires recommends suggests conflicts modules) ) { next unless $req_hash->{$phase}{$type}; my $title = ucfirst($phase).' '.ucfirst($type); my @reports = [qw/Module Want Have/]; for my $mod ( sort keys %{ $req_hash->{$phase}{$type} } ) { next if grep { $_ eq $mod } @exclude; my $want = $req_hash->{$phase}{$type}{$mod}; $want = "undef" unless defined $want; $want = "any" if !$want && $want == 0; if ($mod eq 'perl') { push @reports, ['perl', $want, $]]; next; } my $req_string = $want eq 'any' ? 'any version required' : "version '$want' required"; my $file = $mod; $file =~ s{::}{/}g; $file .= ".pm"; my ($prefix) = grep { -e File::Spec->catfile($_, $file) } @INC; if ($prefix) { my $have = MM->parse_version( File::Spec->catfile($prefix, $file) ); $have = "undef" unless defined $have; push @reports, [$mod, $want, $have]; if ( $DO_VERIFY_PREREQS && $HAS_CPAN_META && $type eq 'requires' ) { if ( $have !~ /\A$lax_version_re\z/ ) { push @dep_errors, "$mod version '$have' cannot be parsed ($req_string)"; } elsif ( ! $full_prereqs->requirements_for( $phase, $type )->accepts_module( $mod => $have ) ) { push @dep_errors, "$mod version '$have' is not in required range '$want'"; } } } else { push @reports, [$mod, $want, "missing"]; if ( $DO_VERIFY_PREREQS && $type eq 'requires' ) { push @dep_errors, "$mod is not installed ($req_string)"; } } } if ( @reports ) { push @full_reports, "=== $title ===\n\n"; my $ml = _max( map { length $_->[0] } @reports ); my $wl = _max( map { length $_->[1] } @reports ); my $hl = _max( map { length $_->[2] } @reports ); if ($type eq 'modules') { splice @reports, 1, 0, ["-" x $ml, "", "-" x $hl]; push @full_reports, map { sprintf(" %*s %*s\n", -$ml, $_->[0], $hl, $_->[2]) } @reports; } else { splice @reports, 1, 0, ["-" x $ml, "-" x $wl, "-" x $hl]; push @full_reports, map { sprintf(" %*s %*s %*s\n", -$ml, $_->[0], $wl, $_->[1], $hl, $_->[2]) } @reports; } push @full_reports, "\n"; } } } if ( @full_reports ) { diag "\nVersions for all modules listed in $source (including optional ones):\n\n", @full_reports; } if ( $cpan_meta_error || @dep_errors ) { diag "\n*** WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING ***\n"; } if ( $cpan_meta_error ) { my ($orig_source) = grep { -f } 'MYMETA.json', 'MYMETA.yml'; diag "\nCPAN::Meta->load_file('$orig_source') failed with: $cpan_meta_error\n"; } if ( @dep_errors ) { diag join("\n", "\nThe following REQUIRED prerequisites were not satisfied:\n", @dep_errors, "\n" ); } pass('Reported prereqs'); # vim: ts=4 sts=4 sw=4 et: 031-multiple-after.t100600000766000024 116214401224375 21175 0ustar00etherstaff000000000000Class-Method-Modifiers-2.15/tuse strict; use warnings; use Test::More 0.88; use if $ENV{AUTHOR_TESTING}, 'Test::Warnings'; my @seen; my @expected = ("orig", "after 1", "after 2"); my $child = Child->new; $child->orig; is_deeply(\@seen, \@expected, "multiple afters called in the right order"); BEGIN { package MyParent; sub new { bless {}, shift } sub orig { push @seen, "orig"; } } BEGIN { package Child; our @ISA = 'MyParent'; use Class::Method::Modifiers; after orig => sub { push @seen, "after 1"; }; after orig => sub { push @seen, "after 2"; }; } done_testing; 00-compile.t100644000766000024 255714401224375 21322 0ustar00etherstaff000000000000Class-Method-Modifiers-2.15/xt/authoruse 5.006; use strict; use warnings; # this test was generated with Dist::Zilla::Plugin::Test::Compile 2.058 use Test::More 0.94; plan tests => 2; my @module_files = ( 'Class/Method/Modifiers.pm' ); # no fake home requested my @switches = ( -d 'blib' ? '-Mblib' : '-Ilib', ); use File::Spec; use IPC::Open3; use IO::Handle; open my $stdin, '<', File::Spec->devnull or die "can't open devnull: $!"; my @warnings; for my $lib (@module_files) { # see L my $stderr = IO::Handle->new; diag('Running: ', join(', ', map { my $str = $_; $str =~ s/'/\\'/g; q{'} . $str . q{'} } $^X, @switches, '-e', "require q[$lib]")) if $ENV{PERL_COMPILE_TEST_DEBUG}; my $pid = open3($stdin, '>&STDERR', $stderr, $^X, @switches, '-e', "require q[$lib]"); binmode $stderr, ':crlf' if $^O eq 'MSWin32'; my @_warnings = <$stderr>; waitpid($pid, 0); is($?, 0, "$lib loaded ok"); shift @_warnings if @_warnings and $_warnings[0] =~ /^Using .*\bblib/ and not eval { +require blib; blib->VERSION('1.01') }; if (@_warnings) { warn @_warnings; push @warnings, @_warnings; } } is(scalar(@warnings), 0, 'no warnings found') or diag 'got warnings: ', explain(\@warnings); BAIL_OUT("Compilation problems") if !Test::More->builder->is_passing; pod-syntax.t100644000766000024 25214401224375 21531 0ustar00etherstaff000000000000Class-Method-Modifiers-2.15/xt/author#!perl # This file was automatically generated by Dist::Zilla::Plugin::PodSyntaxTests. use strict; use warnings; use Test::More; use Test::Pod 1.41; all_pod_files_ok(); 00-report-prereqs.dd100644000766000024 2323214401224375 21327 0ustar00etherstaff000000000000Class-Method-Modifiers-2.15/tdo { my $x = { 'configure' => { 'requires' => { 'ExtUtils::MakeMaker' => '0', 'perl' => '5.006' } }, 'develop' => { 'recommends' => { 'Dist::Zilla::PluginBundle::Author::ETHER' => '0.162', 'Dist::Zilla::PluginBundle::Git::VersionManager' => '0.007' }, 'requires' => { 'Encode' => '0', 'File::Spec' => '0', 'IO::Handle' => '0', 'IPC::Open3' => '0', 'Perl::MinimumVersion' => '1.35', 'Pod::Coverage::TrustPod' => '0', 'Pod::Wordlist' => '0', 'Test::CPAN::Changes' => '0.19', 'Test::CPAN::Meta' => '0', 'Test::CleanNamespaces' => '0.15', 'Test::EOL' => '0', 'Test::Kwalitee' => '1.21', 'Test::MinimumVersion' => '0', 'Test::Mojibake' => '0', 'Test::More' => '0.96', 'Test::NoTabs' => '0', 'Test::Pod' => '1.41', 'Test::Pod::Coverage' => '1.08', 'Test::Portability::Files' => '0', 'Test::Spelling' => '0.12', 'Test::Warnings' => '0', 'perl' => '5.006' } }, 'runtime' => { 'requires' => { 'B' => '0', 'Carp' => '0', 'Exporter' => '0', 'base' => '0', 'perl' => '5.006', 'strict' => '0', 'warnings' => '0' } }, 'test' => { 'recommends' => { 'CPAN::Meta' => '2.120900' }, 'requires' => { 'ExtUtils::MakeMaker' => '0', 'File::Spec' => '0', 'Test::More' => '0.88', 'if' => '0', 'perl' => '5.006' } }, 'x_Dist_Zilla' => { 'requires' => { 'Dist::Zilla' => '5', 'Dist::Zilla::Plugin::Authority' => '1.009', 'Dist::Zilla::Plugin::AutoMetaResources' => '0', 'Dist::Zilla::Plugin::AutoPrereqs' => '5.038', 'Dist::Zilla::Plugin::BumpVersionAfterRelease::Transitional' => '0.004', 'Dist::Zilla::Plugin::CheckIssues' => '0', 'Dist::Zilla::Plugin::CheckMetaResources' => '0', 'Dist::Zilla::Plugin::CheckPrereqsIndexed' => '0.019', 'Dist::Zilla::Plugin::CheckSelfDependency' => '0', 'Dist::Zilla::Plugin::CheckStrictVersion' => '0', 'Dist::Zilla::Plugin::ConfirmRelease' => '0', 'Dist::Zilla::Plugin::CopyFilesFromRelease' => '0', 'Dist::Zilla::Plugin::EnsureLatestPerl' => '0', 'Dist::Zilla::Plugin::FileFinder::ByName' => '0', 'Dist::Zilla::Plugin::GenerateFile::FromShareDir' => '0', 'Dist::Zilla::Plugin::Git::Check' => '0', 'Dist::Zilla::Plugin::Git::CheckFor::CorrectBranch' => '0.004', 'Dist::Zilla::Plugin::Git::CheckFor::MergeConflicts' => '0', 'Dist::Zilla::Plugin::Git::Commit' => '2.020', 'Dist::Zilla::Plugin::Git::Contributors' => '0.029', 'Dist::Zilla::Plugin::Git::Describe' => '0.004', 'Dist::Zilla::Plugin::Git::GatherDir' => '2.016', 'Dist::Zilla::Plugin::Git::Push' => '0', 'Dist::Zilla::Plugin::Git::Remote::Check' => '0', 'Dist::Zilla::Plugin::Git::Tag' => '0', 'Dist::Zilla::Plugin::GitHub::Update' => '0.40', 'Dist::Zilla::Plugin::GithubMeta' => '0.54', 'Dist::Zilla::Plugin::InstallGuide' => '1.200005', 'Dist::Zilla::Plugin::Keywords' => '0.004', 'Dist::Zilla::Plugin::License' => '5.038', 'Dist::Zilla::Plugin::MakeMaker' => '0', 'Dist::Zilla::Plugin::Manifest' => '0', 'Dist::Zilla::Plugin::MetaConfig' => '0', 'Dist::Zilla::Plugin::MetaJSON' => '0', 'Dist::Zilla::Plugin::MetaNoIndex' => '0', 'Dist::Zilla::Plugin::MetaProvides::Package' => '1.15000002', 'Dist::Zilla::Plugin::MetaTests' => '0', 'Dist::Zilla::Plugin::MetaYAML' => '0', 'Dist::Zilla::Plugin::MinimumPerl' => '1.006', 'Dist::Zilla::Plugin::MojibakeTests' => '0.8', 'Dist::Zilla::Plugin::NextRelease' => '5.033', 'Dist::Zilla::Plugin::OnlyCorePrereqs' => '0', 'Dist::Zilla::Plugin::PodCoverageTests' => '5.040', 'Dist::Zilla::Plugin::PodSyntaxTests' => '5.040', 'Dist::Zilla::Plugin::PodWeaver' => '4.008', 'Dist::Zilla::Plugin::Prereqs' => '0', 'Dist::Zilla::Plugin::Prereqs::AuthorDeps' => '0.006', 'Dist::Zilla::Plugin::PromptIfStale' => '0', 'Dist::Zilla::Plugin::Readme' => '0', 'Dist::Zilla::Plugin::ReadmeAnyFromPod' => '0.142180', 'Dist::Zilla::Plugin::RewriteVersion::Transitional' => '0.006', 'Dist::Zilla::Plugin::Run::AfterBuild' => '0.041', 'Dist::Zilla::Plugin::Run::AfterRelease' => '0.038', 'Dist::Zilla::Plugin::RunExtraTests' => '0.024', 'Dist::Zilla::Plugin::StaticInstall' => '0.005', 'Dist::Zilla::Plugin::Test::CPAN::Changes' => '0.012', 'Dist::Zilla::Plugin::Test::ChangesHasContent' => '0', 'Dist::Zilla::Plugin::Test::CleanNamespaces' => '0.006', 'Dist::Zilla::Plugin::Test::Compile' => '2.039', 'Dist::Zilla::Plugin::Test::EOL' => '0.17', 'Dist::Zilla::Plugin::Test::Kwalitee' => '2.10', 'Dist::Zilla::Plugin::Test::MinimumVersion' => '2.000010', 'Dist::Zilla::Plugin::Test::NoTabs' => '0.08', 'Dist::Zilla::Plugin::Test::PodSpelling' => '2.006003', 'Dist::Zilla::Plugin::Test::Portability' => '2.000007', 'Dist::Zilla::Plugin::Test::ReportPrereqs' => '0.022', 'Dist::Zilla::Plugin::TestRelease' => '0', 'Dist::Zilla::Plugin::UploadToCPAN' => '0', 'Dist::Zilla::Plugin::UseUnsafeInc' => '0', 'Dist::Zilla::PluginBundle::Author::ETHER' => '0.119', 'Dist::Zilla::PluginBundle::Git::VersionManager' => '0.007', 'Software::License::Perl_5' => '0' } } }; $x; }030-multiple-before.t100600000766000024 117114401224375 21335 0ustar00etherstaff000000000000Class-Method-Modifiers-2.15/tuse strict; use warnings; use Test::More 0.88; use if $ENV{AUTHOR_TESTING}, 'Test::Warnings'; my @seen; my @expected = ("before 2", "before 1", "orig"); my $child = Child->new; $child->orig; is_deeply(\@seen, \@expected, "multiple befores called in the right order"); BEGIN { package MyParent; sub new { bless {}, shift } sub orig { push @seen, "orig"; } } BEGIN { package Child; our @ISA = 'MyParent'; use Class::Method::Modifiers; before orig => sub { push @seen, "before 1"; }; before orig => sub { push @seen, "before 2"; }; } done_testing; 032-multiple-around.t100600000766000024 153714401224375 21373 0ustar00etherstaff000000000000Class-Method-Modifiers-2.15/tuse strict; use warnings; use Test::More 0.88; use if $ENV{AUTHOR_TESTING}, 'Test::Warnings'; my @seen; my @expected = ("around 2 before", "around 1 before", "orig", "around 1 after", "around 2 after"); my $child = Child->new; $child->orig; is_deeply(\@seen, \@expected, "multiple arounds called in the right order"); BEGIN { package MyParent; sub new { bless {}, shift } sub orig { push @seen, "orig"; } } BEGIN { package Child; our @ISA = 'MyParent'; use Class::Method::Modifiers; around orig => sub { my $orig = shift; push @seen, "around 1 before"; $orig->(); push @seen, "around 1 after"; }; around orig => sub { my $orig = shift; push @seen, "around 2 before"; $orig->(); push @seen, "around 2 after"; }; } done_testing; 051-undef-list-ctxt.t100600000766000024 162414401224375 21302 0ustar00etherstaff000000000000Class-Method-Modifiers-2.15/tuse strict; use warnings; use Test::More 0.88; use if $ENV{AUTHOR_TESTING}, 'Test::Warnings'; my ($after_called, $orig_called) = (0, 0); my $child = Child->new(); my @results = $child->orig(); ok($orig_called, "original method called"); ok($after_called, "after-modifier called"); is(@results, 0, "list context with after doesn't screw up 'return'"); ($after_called, $orig_called) = (0, 0); my $result = $child->orig(); ok($orig_called, "original method called"); ok($after_called, "after-modifier called"); is($result, undef, "scalar context with after doesn't screw up 'return'"); BEGIN { package MyParent; sub new { bless {}, shift } sub orig { my $self = shift; $orig_called = 1; return; } } BEGIN { package Child; our @ISA = 'MyParent'; use Class::Method::Modifiers; after 'orig' => sub { $after_called = 1; }; } done_testing; 110-namespace-clean.t100640000766000024 346114401224375 21265 0ustar00etherstaff000000000000Class-Method-Modifiers-2.15/tuse strict; use warnings; use Test::More 0.88; use if $ENV{AUTHOR_TESTING}, 'Test::Warnings'; use B (); sub is_method { my ($ns, $sub) = @_; no strict 'refs'; my $cv = B::svref_2object(\&{"${ns}::${sub}"}); return if !$cv->isa('B::CV'); my $gv = $cv->GV; return if $gv->isa('B::SPECIAL'); my $pack = $gv->STASH->NAME or return; return ( $pack eq $ns || ($pack eq 'constant' && $gv->name eq '__ANON__') ); } # see also Test::CleanNamespaces::_remaining_imports sub imports { my $ns = shift; no strict 'refs'; my @symbols = grep !/::\z/ && defined &{"${ns}::$_"}, keys %{"${ns}::"}; return grep !is_method($ns, $_), @symbols; } { package Foo; sub foo { print "normal Foo::foo sub\n"; } sub bar { print "normal Foo::bar sub\n"; } sub baz { print "normal Foo::baz sub\n"; } } ok( !(grep $_ eq 'foo' || $_ eq 'bar' || $_ eq 'baz', imports('Foo')), "original subs are not in Foo's list of imports", ) or note('Foo has imports: ' . join(', ', imports('Foo'))); # this should also pass: # namespaces_clean('Foo'); eval { package Foo; use Class::Method::Modifiers; Test::More::note 'redefining Foo::foo'; around foo => sub { my $orig = shift; my $ret = $orig->(@_); print "wrapped foo sub\n" }; around bar => sub { print "wrapped bar sub\n" }; around baz => sub { print "wrapped baz sub\n" }; }; ok( !(grep $_ eq 'foo' || $_ eq 'bar' || $_ eq 'baz', imports('Foo')), "modified subs are not in Foo's list of imports", ) or note('Foo has imports: ' . join(', ', imports('Foo'))); # this should also still pass, except for the 'before', 'around' and 'after' # subs that CMM itself imported which should be cleaned: # namespaces_clean('Foo'); done_testing; portability.t100644000766000024 13014401224375 21760 0ustar00etherstaff000000000000Class-Method-Modifiers-2.15/xt/authoruse strict; use warnings; use Test::More; use Test::Portability::Files; run_tests(); 081-sub-and-modifier.t100600000766000024 612114401224375 21375 0ustar00etherstaff000000000000Class-Method-Modifiers-2.15/tuse strict; use warnings; use Test::More 0.88; use if $ENV{AUTHOR_TESTING}, 'Test::Warnings'; my @seen; my $class = MyParent->new(); $class->orig("hi"); is(@seen, 5); is($seen[0], "before-orig:hi"); is($seen[1], "around-before-orig:hi"); is($seen[2], "orig:hi"); is($seen[3], "around-after-orig:hi"); is($seen[4], "after-orig:hi"); @seen = (); $class = Child->new(); $class->orig("yo"); is(@seen, 9); is($seen[0], "Cbefore-orig:yo"); is($seen[1], "Caround-before-orig:yo"); is($seen[2], "before-orig:yo"); is($seen[3], "around-before-orig:yo"); is($seen[4], "orig:yo"); is($seen[5], "around-after-orig:yo"); is($seen[6], "after-orig:yo"); is($seen[7], "Caround-after-orig:yo"); is($seen[8], "Cafter-orig:yo"); @seen = (); $class = Childer->new(); $class->orig("oy"); is(@seen, 5); is($seen[0], "CCbefore-orig:oy"); is($seen[1], "CCaround-before-orig:oy"); is($seen[2], "CCorig:oy"); is($seen[3], "CCaround-after-orig:oy"); is($seen[4], "CCafter-orig:oy"); @seen = (); $class = MyParent2->new(); $class->orig("bye"); is(@seen, 5); is($seen[0], "before-orig:bye"); is($seen[1], "around-before-orig:bye"); is($seen[2], "orig:bye"); is($seen[3], "around-after-orig:bye"); is($seen[4], "after-orig:bye"); BEGIN { package MyParent; use Class::Method::Modifiers; sub new { bless {}, shift } sub orig { push @seen, "orig:$_[1]"; } before 'orig' => sub { push @seen, "before-orig:$_[1]"; }; around 'orig' => sub { my $orig = shift; push @seen, "around-before-orig:$_[1]"; $orig->(@_); push @seen, "around-after-orig:$_[1]"; }; after 'orig' => sub { push @seen, "after-orig:$_[1]"; }; } BEGIN { package Child; our @ISA = 'MyParent'; use Class::Method::Modifiers; before 'orig' => sub { push @seen, "Cbefore-orig:$_[1]"; }; around 'orig' => sub { my $orig = shift; push @seen, "Caround-before-orig:$_[1]"; $orig->(@_); push @seen, "Caround-after-orig:$_[1]"; }; after 'orig' => sub { push @seen, "Cafter-orig:$_[1]"; }; } BEGIN { package Childer; our @ISA = 'Child'; use Class::Method::Modifiers; sub orig { push @seen, "CCorig:$_[1]"; } before 'orig' => sub { push @seen, "CCbefore-orig:$_[1]"; }; around 'orig' => sub { my $orig = shift; push @seen, "CCaround-before-orig:$_[1]"; $orig->(@_); push @seen, "CCaround-after-orig:$_[1]"; }; after 'orig' => sub { push @seen, "CCafter-orig:$_[1]"; }; } BEGIN { package MyParent2; use Class::Method::Modifiers; sub new { bless {}, shift } around 'orig' => sub { my $orig = shift; push @seen, "around-before-orig:$_[1]"; $orig->(@_); push @seen, "around-after-orig:$_[1]"; }; before 'orig' => sub { push @seen, "before-orig:$_[1]"; }; after 'orig' => sub { push @seen, "after-orig:$_[1]"; }; sub orig { push @seen, "orig:$_[1]"; } } done_testing; 130-clean-underscore.t100600000766000024 341014401224375 21472 0ustar00etherstaff000000000000Class-Method-Modifiers-2.15/tuse strict; use warnings; use Test::More 0.88; use if $ENV{AUTHOR_TESTING}, 'Test::Warnings'; my @calls; do { package MyParent; sub original { $_ = "danger"; push @calls, 'MyParent::original'; } }; do { package Child::Before; use Class::Method::Modifiers; BEGIN { our @ISA = 'MyParent' } before original => sub { $_ = "danger"; push @calls, 'Child::Before::original'; }; }; Child::Before->original; is_deeply([splice @calls], [ 'Child::Before::original', 'MyParent::original', ]); Child::Before->original; is_deeply([splice @calls], [ 'Child::Before::original', 'MyParent::original', ]); do { package Child::After; use Class::Method::Modifiers; BEGIN { our @ISA = 'MyParent' } after original => sub { $_ = "danger"; push @calls, 'Child::After::original'; }; }; Child::After->original; is_deeply([splice @calls], [ 'MyParent::original', 'Child::After::original', ]); Child::After->original; is_deeply([splice @calls], [ 'MyParent::original', 'Child::After::original', ]); do { package Child::Around; use Class::Method::Modifiers; BEGIN { our @ISA = 'MyParent' } around original => sub { my $orig = shift; $_ = "danger"; push @calls, 'Child::Around::original(before)'; $orig->(@_); $_ = "danger"; push @calls, 'Child::Around::original(after)'; }; }; Child::Around->original; is_deeply([splice @calls], [ 'Child::Around::original(before)', 'MyParent::original', 'Child::Around::original(after)', ]); Child::Around->original; is_deeply([splice @calls], [ 'Child::Around::original(before)', 'MyParent::original', 'Child::Around::original(after)', ]); done_testing; pod-coverage.t100644000766000024 36514401224375 22003 0ustar00etherstaff000000000000Class-Method-Modifiers-2.15/xt/author#!perl # This file was automatically generated by Dist::Zilla::Plugin::PodCoverageTests. use strict; use warnings; use Test::Pod::Coverage 1.08; use Pod::Coverage::TrustPod; all_pod_coverage_ok({ coverage_class => 'Pod::Coverage::TrustPod' }); release000755000766000024 014401224375 17235 5ustar00etherstaff000000000000Class-Method-Modifiers-2.15/xtcpan-changes.t100644000766000024 34414401224375 22072 0ustar00etherstaff000000000000Class-Method-Modifiers-2.15/xt/releaseuse strict; use warnings; # this test was generated with Dist::Zilla::Plugin::Test::CPAN::Changes 0.012 use Test::More 0.96 tests => 1; use Test::CPAN::Changes; subtest 'changes_ok' => sub { changes_file_ok('Changes'); }; 080-multiple-modifiers.t100600000766000024 310114401224375 22054 0ustar00etherstaff000000000000Class-Method-Modifiers-2.15/tuse strict; use warnings; use Test::More 0.88; use if $ENV{AUTHOR_TESTING}, 'Test::Warnings'; my @seen; my @expected = qw/ before around-before orig around-after after /; my $child = Child->new(); $child->orig(); is_deeply(\@seen, \@expected, "multiple modifiers in one class"); @seen = (); @expected = qw/ beforer around-beforer before around-before orig around-after after around-afterer afterer /; my $childer = Childer->new(); $childer->orig(); is_deeply(\@seen, \@expected, "multiple modifiers subclassed with multiple modifiers"); BEGIN { package MyParent; sub new { bless {}, shift } sub orig { push @seen, 'orig'; } } BEGIN { package Child; our @ISA = 'MyParent'; use Class::Method::Modifiers; after 'orig' => sub { push @seen, 'after'; }; around 'orig' => sub { my $orig = shift; push @seen, 'around-before'; $orig->(); push @seen, 'around-after'; }; before 'orig' => sub { push @seen, 'before'; }; } BEGIN { package Childer; our @ISA = 'Child'; use Class::Method::Modifiers; after 'orig' => sub { push @seen, 'afterer'; }; around 'orig' => sub { my $orig = shift; push @seen, 'around-beforer'; $orig->(); push @seen, 'around-afterer'; }; before 'orig' => sub { push @seen, 'beforer'; }; } done_testing; 034-multiple-everything.t100600000766000024 252214401224375 22264 0ustar00etherstaff000000000000Class-Method-Modifiers-2.15/tuse strict; use warnings; use Test::More 0.88; use if $ENV{AUTHOR_TESTING}, 'Test::Warnings'; my @seen; my @expected = ("before 2", "before 1", "around 2 before", "around 1 before", "orig", "around 1 after", "around 2 after", "after 1", "after 2", ); my $child = Child->new; $child->orig; is_deeply(\@seen, \@expected, "multiple afters called in the right order"); BEGIN { package MyParent; sub new { bless {}, shift } sub orig { push @seen, "orig"; } } BEGIN { package Child; our @ISA = 'MyParent'; use Class::Method::Modifiers; before orig => sub { push @seen, "before 1"; }; before orig => sub { push @seen, "before 2"; }; around orig => sub { my $orig = shift; push @seen, "around 1 before"; $orig->(); push @seen, "around 1 after"; }; around orig => sub { my $orig = shift; push @seen, "around 2 before"; $orig->(); push @seen, "around 2 after"; }; after orig => sub { push @seen, "after 1"; }; after orig => sub { push @seen, "after 2"; }; } done_testing; minimum-version.t100644000766000024 15514401224375 22563 0ustar00etherstaff000000000000Class-Method-Modifiers-2.15/xt/authoruse strict; use warnings; use Test::More; use Test::MinimumVersion; all_minimum_version_ok( qq{5.006000} ); 020-multiple-inheritance.t100644000766000024 704714401224375 22403 0ustar00etherstaff000000000000Class-Method-Modifiers-2.15/tuse strict; use warnings; use Test::More 0.88; use if $ENV{AUTHOR_TESTING}, 'Test::Warnings'; # inheritance tree looks like: # # SuperL SuperR # \ / # MiddleL MiddleR # \ / # -Child- # the Child and MiddleR modules use modifiers # Child will modify a method in SuperL (sl_c) # Child will modify a method in SuperR (sr_c) # Child will modify a method in SuperR already modified by MiddleR (sr_m_c) # SuperL and MiddleR will both have a method of the same name, doing different # things (called 'conflict' and 'cnf_mod') # every method and modifier will just return my $SuperL = SuperL->new(); my $SuperR = SuperR->new(); my $MiddleL = MiddleL->new(); my $MiddleR = MiddleR->new(); my $Child = Child->new(); is($SuperL->superl, "", "SuperL loaded correctly"); is($SuperR->superr, "", "SuperR loaded correctly"); is($MiddleL->middlel, "", "MiddleL loaded correctly"); is($MiddleR->middler, "", "MiddleR loaded correctly"); is($Child->child, "", "Child loaded correctly"); is($SuperL->sl_c, "", "SuperL->sl_c on SuperL"); is($Child->sl_c, ">", "SuperL->sl_c wrapped by Child's around"); is($SuperR->sr_c, "", "SuperR->sr_c on SuperR"); is($Child->sr_c, ">", "SuperR->sr_c wrapped by Child's around"); is($SuperR->sr_m_c, "", "SuperR->sr_m_c on SuperR"); is($MiddleR->sr_m_c, ">", "SuperR->sr_m_c wrapped by MiddleR's around"); is($Child->sr_m_c, ">>", "MiddleR->sr_m_c's wrapping wrapped by Child's around"); is($SuperL->conflict, "", "SuperL->conflict on SuperL"); is($MiddleR->conflict, "", "MiddleR->conflict on MiddleR"); is($Child->conflict, "", "SuperL->conflict on Child"); is($SuperL->cnf_mod, "", "SuperL->cnf_mod on SuperL"); is($MiddleR->cnf_mod, "", "MiddleR->cnf_mod on MiddleR"); is($Child->cnf_mod, ">", "SuperL->cnf_mod wrapped by Child's around"); BEGIN { { package SuperL; sub new { bless {}, shift } sub superl { "" } sub conflict { "" } sub cnf_mod { "" } sub sl_c { "" } } { package SuperR; sub new { bless {}, shift } sub superr { "" } sub sr_c { "" } sub sr_m_c { "" } } { package MiddleL; our @ISA = 'SuperL'; sub middlel { "" } } { package MiddleR; our @ISA = 'SuperR'; use Class::Method::Modifiers; sub middler { "" } sub conflict { "" } sub cnf_mod { "" } around sr_m_c => sub { my $orig = shift; return "(@_).">" }; } { package Child; our @ISA = ('MiddleL', 'MiddleR'); use Class::Method::Modifiers; sub child { "" } around cnf_mod => sub { "(@_).">" }; around sl_c => sub { "(@_).">" }; around sr_c => sub { "(@_).">" }; around sr_m_c => sub { my $orig = shift; return "(@_).">" }; } } done_testing; clean-namespaces.t100644000766000024 36114401224375 22623 0ustar00etherstaff000000000000Class-Method-Modifiers-2.15/xt/authoruse strict; use warnings; # this test was generated with Dist::Zilla::Plugin::Test::CleanNamespaces 0.006 use Test::More 0.94; use Test::CleanNamespaces 0.15; subtest all_namespaces_clean => sub { all_namespaces_clean() }; done_testing; Method000755000766000024 014401224375 20215 5ustar00etherstaff000000000000Class-Method-Modifiers-2.15/lib/ClassModifiers.pm100640000766000024 4122514401224375 22654 0ustar00etherstaff000000000000Class-Method-Modifiers-2.15/lib/Class/Methoduse strict; use warnings; package Class::Method::Modifiers; # git description: v2.14-6-gede37cf # ABSTRACT: Provides Moose-like method modifiers # KEYWORDS: method wrap modification patch # vim: set ts=8 sts=4 sw=4 tw=115 et : our $VERSION = '2.15'; use base 'Exporter'; our @EXPORT = qw(before after around); our @EXPORT_OK = (@EXPORT, qw(fresh install_modifier)); our %EXPORT_TAGS = ( moose => [qw(before after around)], all => \@EXPORT_OK, ); BEGIN { *_HAS_READONLY = $] >= 5.008 ? sub(){1} : sub(){0}; } our %MODIFIER_CACHE; # for backward compatibility sub _install_modifier; # -w *_install_modifier = \&install_modifier; sub install_modifier { my $into = shift; my $type = shift; my $code = pop; my @names = @_; @names = @{ $names[0] } if ref($names[0]) eq 'ARRAY'; return _fresh($into, $code, @names) if $type eq 'fresh'; for my $name (@names) { my $hit = $into->can($name) or do { require Carp; Carp::confess("The method '$name' is not found in the inheritance hierarchy for class $into"); }; my $qualified = $into.'::'.$name; my $cache = $MODIFIER_CACHE{$into}{$name} ||= { before => [], after => [], around => [], }; # this must be the first modifier we're installing if (!exists($cache->{"orig"})) { no strict 'refs'; # grab the original method (or undef if the method is inherited) $cache->{"orig"} = *{$qualified}{CODE}; # the "innermost" method, the one that "around" will ultimately wrap $cache->{"wrapped"} = $cache->{"orig"} || $hit; #sub { # # we can't cache this, because new methods or modifiers may be # # added between now and when this method is called # for my $package (@{ mro::get_linear_isa($into) }) { # next if $package eq $into; # my $code = *{$package.'::'.$name}{CODE}; # goto $code if $code; # } # require Carp; # Carp::confess("$qualified\::$name disappeared?"); #}; } # keep these lists in the order the modifiers are called if ($type eq 'after') { push @{ $cache->{$type} }, $code; } else { unshift @{ $cache->{$type} }, $code; } # wrap the method with another layer of around. much simpler than # the Moose equivalent. :) if ($type eq 'around') { my $method = $cache->{wrapped}; my $attrs = _sub_attrs($code); # a bare "sub :lvalue {...}" will be parsed as a label and an # indirect method call. force it to be treated as an expression # using + $cache->{wrapped} = eval "package $into; +sub $attrs { \$code->(\$method, \@_); };"; } # install our new method which dispatches the modifiers, but only # if a new type was added if (@{ $cache->{$type} } == 1) { # avoid these hash lookups every method invocation my $before = $cache->{"before"}; my $after = $cache->{"after"}; # this is a coderef that changes every new "around". so we need # to take a reference to it. better a deref than a hash lookup my $wrapped = \$cache->{"wrapped"}; my $attrs = _sub_attrs($cache->{wrapped}); my $generated = "package $into;\n"; $generated .= "sub $name $attrs {"; # before is easy, it doesn't affect the return value(s) if (@$before) { $generated .= ' for my $method (@$before) { $method->(@_); } '; } if (@$after) { $generated .= ' my $ret; if (wantarray) { $ret = [$$wrapped->(@_)]; '.(_HAS_READONLY ? 'Internals::SvREADONLY(@$ret, 1);' : '').' } elsif (defined wantarray) { $ret = \($$wrapped->(@_)); } else { $$wrapped->(@_); } for my $method (@$after) { $method->(@_); } wantarray ? @$ret : $ret ? $$ret : (); ' } else { $generated .= '$$wrapped->(@_);'; } $generated .= '}'; no strict 'refs'; no warnings 'redefine'; no warnings 'closure'; eval $generated; }; } } sub before { _install_modifier(scalar(caller), 'before', @_); } sub after { _install_modifier(scalar(caller), 'after', @_); } sub around { _install_modifier(scalar(caller), 'around', @_); } sub fresh { my $code = pop; my @names = @_; @names = @{ $names[0] } if ref($names[0]) eq 'ARRAY'; _fresh(scalar(caller), $code, @names); } sub _fresh { my ($into, $code, @names) = @_; for my $name (@names) { if ($name !~ /\A [a-zA-Z_] [a-zA-Z0-9_]* \z/xms) { require Carp; Carp::confess("Invalid method name '$name'"); } if ($into->can($name)) { require Carp; Carp::confess("Class $into already has a method named '$name'"); } # We need to make sure that the installed method has its CvNAME in # the appropriate package; otherwise, it would be subject to # deletion if callers use namespace::autoclean. If $code was # compiled in the target package, we can just install it directly; # otherwise, we'll need a different approach. Using Sub::Name would # be fine in all cases, at the cost of introducing a dependency on # an XS-using, non-core module. So instead we'll use string-eval to # create a new subroutine that wraps $code. if (_is_in_package($code, $into)) { no strict 'refs'; *{"$into\::$name"} = $code; } else { no warnings 'closure'; # for 5.8.x my $attrs = _sub_attrs($code); eval "package $into; sub $name $attrs { \$code->(\@_) }"; } } } sub _sub_attrs { my ($coderef) = @_; local *_sub = $coderef; local $@; local $SIG{__DIE__}; # this assignment will fail to compile if it isn't an lvalue sub. we # never want to actually call the sub though, so we return early. (eval 'return 1; &_sub = 1') ? ':lvalue' : ''; } sub _is_in_package { my ($coderef, $package) = @_; require B; my $cv = B::svref_2object($coderef); return $cv->GV->STASH->NAME eq $package; } 1; __END__ =pod =encoding UTF-8 =head1 NAME Class::Method::Modifiers - Provides Moose-like method modifiers =head1 VERSION version 2.15 =head1 SYNOPSIS package Child; use parent 'MyParent'; use Class::Method::Modifiers; sub new_method { } before 'old_method' => sub { carp "old_method is deprecated, use new_method"; }; around 'other_method' => sub { my $orig = shift; my $ret = $orig->(@_); return $ret =~ /\d/ ? $ret : lc $ret; }; after 'private', 'protected' => sub { debug "finished calling a dangerous method"; }; use Class::Method::Modifiers qw(fresh); fresh 'not_in_hierarchy' => sub { warn "freshly added method\n"; }; =head1 DESCRIPTION =for stopwords CLOS Method modifiers are a convenient feature from the CLOS (Common Lisp Object System) world. In its most basic form, a method modifier is just a method that calls C<< $self->SUPER::foo(@_) >>. I for one have trouble remembering that exact invocation, so my classes seldom re-dispatch to their base classes. Very bad! C provides three modifiers: C, C, and C. C and C are run just before and after the method they modify, but can not really affect that original method. C is run in place of the original method, with a hook to easily call that original method. See the L section for more details on how the particular modifiers work. One clear benefit of using C is that you can define multiple modifiers in a single namespace. These separate modifiers don't need to know about each other. This makes top-down design easy. Have a base class that provides the skeleton methods of each operation, and have plugins modify those methods to flesh out the specifics. Parent classes need not know about C. This means you should be able to modify methods in I subclass. See L for an example of subclassing with C. In short, C solves the problem of making sure you call C<< $self->SUPER::foo(@_) >>, and provides a cleaner interface for it. As of version 1.00, C is faster in some cases than L. See F in the L distribution. C also provides an additional "modifier" type, C; see below. =head1 MODIFIERS All modifiers let you modify one or multiple methods at a time. The names of multiple methods can be provided as a list or as an array-reference. Examples: before 'method' => sub { ... }; before 'method1', 'method2' => sub { ... }; before [ 'method1', 'method2' ] => sub { ... }; =head2 before method(s) => sub { ... }; C is called before the method it is modifying. Its return value is totally ignored. It receives the same C<@_> as the method it is modifying would have received. You can modify the C<@_> the original method will receive by changing C<$_[0]> and friends (or by changing anything inside a reference). This is a feature! =head2 after method(s) => sub { ... }; C is called after the method it is modifying. Its return value is totally ignored. It receives the same C<@_> as the method it is modifying received, mostly. The original method can modify C<@_> (such as by changing C<$_[0]> or references) and C will see the modified version. If you don't like this behavior, specify both a C and C, and copy the C<@_> during C for C to use. =head2 around method(s) => sub { ... }; C is called instead of the method it is modifying. The method you're overriding is passed in as the first argument (called C<$orig> by convention). Watch out for contextual return values of C<$orig>. You can use C to: =over 4 =item Pass C<$orig> a different C<@_> around 'method' => sub { my $orig = shift; my $self = shift; $orig->($self, reverse @_); }; =item Munge the return value of C<$orig> around 'method' => sub { my $orig = shift; ucfirst $orig->(@_); }; =item Avoid calling C<$orig> -- conditionally around 'method' => sub { my $orig = shift; return $orig->(@_) if time() % 2; return "no dice, captain"; }; =back =head2 fresh method(s) => sub { ... }; (Available since version 2.00) Unlike the other modifiers, this does not modify an existing method. Ordinarily, C merely installs the coderef as a method in the appropriate class; but if the class hierarchy already contains a method of the same name, an exception is thrown. The idea of this "modifier" is to increase safety when subclassing. Suppose you're writing a subclass of a class Some::Base, and adding a new method: package My::Subclass; use base 'Some::Base'; sub foo { ... } If a later version of Some::Base also adds a new method named C, your method will shadow that method. Alternatively, you can use C to install the additional method into your subclass: package My::Subclass; use base 'Some::Base'; use Class::Method::Modifiers 'fresh'; fresh 'foo' => sub { ... }; Now upgrading Some::Base to a version with a conflicting C method will cause an exception to be thrown; seeing that error will give you the opportunity to fix the problem (perhaps by picking a different method name in your subclass, or similar). Creating fresh methods with C (see below) provides a way to get similar safety benefits when adding local monkeypatches to existing classes; see L. For API compatibility reasons, this function is exported only when you ask for it specifically, or for C<:all>. =head2 install_modifier $package, $type, @names, sub { ... } C is like C, C, C, and C but it also lets you dynamically select the modifier type ('before', 'after', 'around', 'fresh') and package that the method modifiers are installed into. This expert-level function is exported only when you ask for it specifically, or for C<:all>. =head1 NOTES All three normal modifiers; C, C, and C; are exported into your namespace by default. You may C to avoid modifying your namespace. I may steal more features from L, namely C, C, C, C, and whatever the L folks come up with next. Note that the syntax and semantics for these modifiers is directly borrowed from L (the implementations, however, are not). L shares a few similarities with C, and they even have some overlap in purpose -- both can be used to implement highly pluggable applications. The difference is that L provides a mechanism for easily letting parent classes to invoke hooks defined by other code. C provides a way of overriding/augmenting methods safely, and the parent class need not know about it. =head2 :lvalue METHODS When adding C or C modifiers, the wrapper method will be an lvalue method if the wrapped sub is, and assigning to the method will propagate to the wrapped method as expected. For C modifiers, it is the modifier sub that determines if the wrapper method is an lvalue method. =head1 CAVEATS It is erroneous to modify a method that doesn't exist in your class's inheritance hierarchy. If this occurs, an exception will be thrown when the modifier is defined. It doesn't yet play well with C. There are some C tests for this. Don't get your hopes up though! Applying modifiers to array lvalue methods is not fully supported. Attempting to assign to an array lvalue method that has an C modifier applied will result in an error. Array lvalue methods are not well supported by perl in general, and should be avoided. =head1 MAJOR VERSION CHANGES =for stopwords reimplementation This module was bumped to 1.00 following a complete reimplementation, to indicate breaking backwards compatibility. The "guard" modifier was removed, and the internals are completely different. The new version is a few times faster with half the code. It's now even faster than Moose. Any code that just used modifiers should not change in behavior, except to become more correct. And, of course, faster. :) =head1 SEE ALSO =over 4 =item * L =item * L =item * L =item * L =item * L =item * L =back =head1 ACKNOWLEDGMENTS =for stopwords Stevan Thanks to Stevan Little for L, I would never have known about method modifiers otherwise. Thanks to Matt Trout and Stevan Little for their advice. =head1 SUPPORT Bugs may be submitted through L (or L). =head1 AUTHOR Shawn M Moore =head1 CONTRIBUTORS =for stopwords Karen Etheridge Shawn M Moore Graham Knop Aaron Crane Peter Rabbitson David Steinbrunner gfx Justin Hunter mannih Yves Orton =over 4 =item * Karen Etheridge =item * Shawn M Moore =item * Graham Knop =item * Aaron Crane =item * Peter Rabbitson =item * David Steinbrunner =item * gfx =item * Justin Hunter =item * mannih =item * Yves Orton =back =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2007 by Shawn M Moore. 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 070-modify-multiple-at-once.t100600000766000024 171314401224375 22714 0ustar00etherstaff000000000000Class-Method-Modifiers-2.15/tuse strict; use warnings; use Test::More 0.88; use if $ENV{AUTHOR_TESTING}, 'Test::Warnings'; my @seen; package MyParent; sub new { bless {}, shift } sub left { push @seen, "orig-left" } sub right { push @seen, "orig-right" } package Child; our @ISA = 'MyParent'; use Class::Method::Modifiers; before 'left', 'right' => sub { push @seen, 'before' }; package Grandchild; our @ISA = 'Child'; use Class::Method::Modifiers; before ['left', 'right'] => sub { push @seen, 'grandbefore' }; package main; my $child = Child->new(); $child->left; is_deeply([splice @seen], [qw/before orig-left/], "correct 'left' results"); $child->right; is_deeply([splice @seen], [qw/before orig-right/], "correct 'right' results"); my $grand = Grandchild->new(); $grand->left; is_deeply([splice @seen], [qw/grandbefore before orig-left/], "correct 'left' results"); $grand->right; is_deeply([splice @seen], [qw/grandbefore before orig-right/], "correct 'right' results"); done_testing; changes_has_content.t100644000766000024 210014401224375 23550 0ustar00etherstaff000000000000Class-Method-Modifiers-2.15/xt/releaseuse Test::More tests => 2; note 'Checking Changes'; my $changes_file = 'Changes'; my $newver = '2.15'; my $trial_token = '-TRIAL'; my $encoding = 'UTF-8'; 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; 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>); if ($encoding) { require Encode; $changelog = Encode::decode($encoding, $changelog, Encode::FB_CROAK()); } 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; } 035-multiple-everything-twice.t100600000766000024 452514401224375 23403 0ustar00etherstaff000000000000Class-Method-Modifiers-2.15/tuse strict; use warnings; use Test::More 0.88; use if $ENV{AUTHOR_TESTING}, 'Test::Warnings'; my @seen; my @expected = ("before 4", "before 3", "around 4 before", "around 3 before", "before 2", "before 1", "around 2 before", "around 1 before", "orig", "around 1 after", "around 2 after", "after 1", "after 2", "around 3 after", "around 4 after", "after 3", "after 4", ); my $child = Grandchild->new; $child->orig; is_deeply(\@seen, \@expected, "multiple afters called in the right order"); BEGIN { package MyParent; sub new { bless {}, shift } sub orig { push @seen, "orig"; } } BEGIN { package Child; our @ISA = 'MyParent'; use Class::Method::Modifiers; before orig => sub { push @seen, "before 1"; }; before orig => sub { push @seen, "before 2"; }; around orig => sub { my $orig = shift; push @seen, "around 1 before"; $orig->(); push @seen, "around 1 after"; }; around orig => sub { my $orig = shift; push @seen, "around 2 before"; $orig->(); push @seen, "around 2 after"; }; after orig => sub { push @seen, "after 1"; }; after orig => sub { push @seen, "after 2"; }; } BEGIN { package Grandchild; our @ISA = 'Child'; use Class::Method::Modifiers; before orig => sub { push @seen, "before 3"; }; before orig => sub { push @seen, "before 4"; }; around orig => sub { my $orig = shift; push @seen, "around 3 before"; $orig->(); push @seen, "around 3 after"; }; around orig => sub { my $orig = shift; push @seen, "around 4 before"; $orig->(); push @seen, "around 4 after"; }; after orig => sub { push @seen, "after 3"; }; after orig => sub { push @seen, "after 4"; }; } done_testing; 100-class-mop-method-modifiers.t100600000766000024 373114401224375 23377 0ustar00etherstaff000000000000Class-Method-Modifiers-2.15/t # taken from Class::MOP's test suite, cut down to the interesting bits I haven't # necessarily tested yet use strict; use warnings; use Test::More 0.88; use if $ENV{AUTHOR_TESTING}, 'Test::Warnings'; my @tracelog; package GreatGrandMyParent; sub new { bless {}, shift } sub method { 4 } sub wrapped { push @tracelog => 'primary' } package GrandMyParent; use Class::Method::Modifiers; our @ISA = 'GreatGrandMyParent'; around method => sub { (3, $_[0]->()) }; package MyParent; use Class::Method::Modifiers; our @ISA = 'GrandMyParent'; around method => sub { (2, $_[0]->()) }; package Child; use Class::Method::Modifiers; our @ISA = 'MyParent'; around method => sub { (1, $_[0]->()) }; package GrandChild; use Class::Method::Modifiers; our @ISA = 'Child'; around method => sub { (0, $_[0]->()) }; before wrapped => sub { push @tracelog => 'before 1' }; before wrapped => sub { push @tracelog => 'before 2' }; before wrapped => sub { push @tracelog => 'before 3' }; around wrapped => sub { push @tracelog => 'around 1'; $_[0]->() }; around wrapped => sub { push @tracelog => 'around 2'; $_[0]->() }; around wrapped => sub { push @tracelog => 'around 3'; $_[0]->() }; after wrapped => sub { push @tracelog => 'after 1' }; after wrapped => sub { push @tracelog => 'after 2' }; after wrapped => sub { push @tracelog => 'after 3' }; package main; my $gc = GrandChild->new(); is_deeply( [ $gc->method() ], [ 0, 1, 2, 3, 4 ], '... got the right results back from the around methods (in list context)'); is(scalar $gc->method(), 4, '... got the right results back from the around methods (in scalar context)'); $gc->wrapped(); is_deeply( \@tracelog, [ 'before 3', 'before 2', 'before 1', # last-in-first-out order 'around 3', 'around 2', 'around 1', # last-in-first-out order 'primary', 'after 1', 'after 2', 'after 3', # first-in-first-out order ], '... got the right tracelog from all our before/around/after methods'); done_testing;