Class-Method-Modifiers-2.11/000755 000767 000024 00000000000 12373565151 016123 5ustar00etherstaff000000 000000 Class-Method-Modifiers-2.11/Changes000644 000767 000024 00000010072 12373565151 017416 0ustar00etherstaff000000 000000 Revision history for Class-Method-Modifiers 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. Class-Method-Modifiers-2.11/CONTRIBUTING000644 000767 000024 00000007040 12373565151 017756 0ustar00etherstaff000000 000000 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 me through the bug queue described later in this document, or by emailing me directly. You are not required to follow any of the steps in this document to submit a patch or bug report; these are just guidelines, intended to help you. 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 sufficent 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. Detailed instructions for doing that is available here: https://help.github.com/ https://help.github.com/articles/creating-a-pull-request 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 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, unless you specifically request for it not to be (using the attribution on the commit or patch). If you wish to be listed under a different name, you should submit a pull request to the .mailmap file to contain the correct mapping. This file was generated via Dist::Zilla::Plugin::GenerateFile::ShareDir 0.005 from a template file originating in Dist-Zilla-PluginBundle-Author-ETHER-0.069. Class-Method-Modifiers-2.11/dist.ini000644 000767 000024 00000001535 12373565151 017573 0ustar00etherstaff000000 000000 name = Class-Method-Modifiers author = Shawn M Moore copyright_holder = Shawn M Moore copyright_year = 2007 license = Perl_5 [PodVersion] [@Author::ETHER] :version = 0.025 ; MakeMaker::Fallback and ModuleBuildTiny -remove = PodWeaver ; can add later, if desired installer = MakeMaker ; MBT is not yet 5.6-friendly Authority.authority = cpan:SARTAK Test::MinimumVersion.max_target_perl = 5.006000 Test::ReportPrereqs.include[0] = Moose ; authordep Pod::Weaver::Section::Contributors ; TODO - when weaving pod [Git::Contributors] [Prereqs / RuntimeRequires] Exporter = 0 [Prereqs / DevelopRequires] Test::Warnings = 0 Moose = 0 Perl::MinimumVersion = 1.35 [OnlyCorePrereqs] phase = configure phase = build phase = runtime check_dual_life_versions = 0 [Test::CleanNamespaces] Class-Method-Modifiers-2.11/INSTALL000644 000767 000024 00000002004 12373565151 017150 0ustar00etherstaff000000 000000 This 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 you are installing into a system-wide directory, you may need to pass the "-S" flag to cpanm, which uses sudo to install the module: % cpanm -S Class::Method::Modifiers ## 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. Download the tarball, untar it, then build it: % perl Makefile.PL % make && make test Then install it: % make install If you are installing into a system-wide directory, you may need to run: % sudo make install ## Documentation Class-Method-Modifiers documentation is available as POD. You can run perldoc from a shell to read the documentation: % perldoc Class::Method::Modifiers Class-Method-Modifiers-2.11/lib/000755 000767 000024 00000000000 12373565151 016671 5ustar00etherstaff000000 000000 Class-Method-Modifiers-2.11/LICENSE000644 000767 000024 00000043660 12373565151 017141 0ustar00etherstaff000000 000000 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. 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 MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. The End Class-Method-Modifiers-2.11/Makefile.PL000644 000767 000024 00000002647 12373565151 020106 0ustar00etherstaff000000 000000 # This file was automatically generated by Dist::Zilla::Plugin::MakeMaker v5.020. 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", "EXE_FILES" => [], "LICENSE" => "perl", "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::Fatal" => 0, "Test::More" => 0, "Test::Requires" => 0, "if" => 0 }, "VERSION" => "2.11", "test" => { "TESTS" => "t/*.t" } ); my %FallbackPrereqs = ( "B" => 0, "Carp" => 0, "Exporter" => 0, "ExtUtils::MakeMaker" => 0, "File::Spec" => 0, "Test::Fatal" => 0, "Test::More" => 0, "Test::Requires" => 0, "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); Class-Method-Modifiers-2.11/MANIFEST000644 000767 000024 00000002276 12373565151 017263 0ustar00etherstaff000000 000000 # This file was automatically generated by Dist::Zilla::Plugin::Manifest v5.020. 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/pod-spell.t xt/release/changes_has_content.t xt/release/clean-namespaces.t xt/release/cpan-changes.t xt/release/distmeta.t xt/release/eol.t xt/release/kwalitee.t xt/release/minimum-version.t xt/release/mojibake.t xt/release/no-tabs.t xt/release/pod-coverage.t xt/release/pod-no404s.t xt/release/pod-syntax.t xt/release/portability.t Class-Method-Modifiers-2.11/META.json000644 000767 000024 00000067635 12373565151 017565 0ustar00etherstaff000000 000000 { "abstract" : "Provides Moose-like method modifiers", "author" : [ "Shawn M Moore " ], "dynamic_config" : 0, "generated_by" : "Dist::Zilla version 5.020, CPAN::Meta::Converter version 2.142060", "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" } }, "develop" : { "recommends" : { "Dist::Zilla::PluginBundle::Author::ETHER" : "0.069" }, "requires" : { "Dist::Zilla" : "5", "Dist::Zilla::Plugin::Git::CheckFor::CorrectBranch" : "0.004", "Dist::Zilla::Plugin::Git::Commit" : "2.020", "Dist::Zilla::Plugin::Git::Contributors" : "0.004", "Dist::Zilla::Plugin::Git::GatherDir" : "2.016", "Dist::Zilla::Plugin::GitHub::Update" : "0", "Dist::Zilla::Plugin::GithubMeta" : "0", "Dist::Zilla::Plugin::Keywords" : "0.004", "Dist::Zilla::Plugin::MakeMaker" : "0", "Dist::Zilla::Plugin::MetaProvides::Package" : "1.15000002", "Dist::Zilla::Plugin::NextRelease" : "4.300018", "Dist::Zilla::Plugin::OnlyCorePrereqs" : "0", "Dist::Zilla::Plugin::PkgVersion" : "5.010", "Dist::Zilla::Plugin::PodVersion" : "0", "Dist::Zilla::Plugin::Prereqs" : "0", "Dist::Zilla::Plugin::ReadmeAnyFromPod" : "0.142180", "Dist::Zilla::Plugin::RunExtraTests" : "0.019", "Dist::Zilla::Plugin::Test::CPAN::Changes" : "0.008", "Dist::Zilla::Plugin::Test::CleanNamespaces" : "0", "Dist::Zilla::Plugin::Test::Compile" : "2.039", "Dist::Zilla::Plugin::Test::MinimumVersion" : "2.000003", "Dist::Zilla::PluginBundle::Author::ETHER" : "0.025", "File::Spec" : "0", "IO::Handle" : "0", "IPC::Open3" : "0", "Moose" : "0", "Perl::MinimumVersion" : "1.35", "Pod::Coverage::TrustPod" : "0", "Test::CPAN::Changes" : "0.19", "Test::CPAN::Meta" : "0", "Test::CleanNamespaces" : "0.15", "Test::Kwalitee" : "1.21", "Test::More" : "0.94", "Test::NoTabs" : "0", "Test::Pod" : "1.41", "Test::Pod::Coverage" : "1.08", "Test::Spelling" : "0.12", "Test::Warnings" : "0" } }, "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::Fatal" : "0", "Test::More" : "0", "Test::Requires" : "0", "if" : "0" } } }, "provides" : { "Class::Method::Modifiers" : { "file" : "lib/Class/Method/Modifiers.pm", "version" : "2.11" } }, "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.11", "x_Dist_Zilla" : { "perl" : { "version" : "5.021002" }, "plugins" : [ { "class" : "Dist::Zilla::Plugin::PodVersion", "name" : "PodVersion", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::Git::NextVersion", "config" : { "Dist::Zilla::Plugin::Git::NextVersion" : { "first_version" : "0.001", "version_by_branch" : "0", "version_regexp" : "(?^:^v([\\d._]+)(-TRIAL)?$)" }, "Dist::Zilla::Role::Git::Repo" : { "repo_root" : "." } }, "name" : "@Author::ETHER/Git::NextVersion", "version" : "2.023" }, { "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", "skip" : [] } }, "name" : "@Author::ETHER/stale modules, build", "version" : "0.024" }, { "class" : "Dist::Zilla::Plugin::PromptIfStale", "config" : { "Dist::Zilla::Plugin::PromptIfStale" : { "check_all_plugins" : "1", "check_all_prereqs" : "1", "modules" : [], "phase" : "release", "skip" : [] } }, "name" : "@Author::ETHER/stale modules, release", "version" : "0.024" }, { "class" : "Dist::Zilla::Plugin::ExecDir", "name" : "@Author::ETHER/ExecDir", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::ShareDir", "name" : "@Author::ETHER/ShareDir", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::FileFinder::ByName", "name" : "@Author::ETHER/Examples", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::FileFinder::ByName", "name" : "@Author::ETHER/ExtraTestFiles", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::Git::GatherDir", "config" : { "Dist::Zilla::Plugin::Git::GatherDir" : { "include_untracked" : "0" }, "Dist::Zilla::Role::Git::Repo" : { "repo_root" : "." } }, "name" : "@Author::ETHER/Git::GatherDir", "version" : "2.023" }, { "class" : "Dist::Zilla::Plugin::MetaYAML", "name" : "@Author::ETHER/MetaYAML", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::MetaJSON", "name" : "@Author::ETHER/MetaJSON", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::License", "name" : "@Author::ETHER/License", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::Readme", "name" : "@Author::ETHER/Readme", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::Manifest", "name" : "@Author::ETHER/Manifest", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::GenerateFile::ShareDir", "config" : { "Dist::Zilla::Plugin::GenerateFile::ShareDir" : { "destination_filename" : "CONTRIBUTING", "dist" : "Dist-Zilla-PluginBundle-Author-ETHER", "encoding" : "UTF-8", "has_xs" : 0, "source_filename" : "CONTRIBUTING" } }, "name" : "@Author::ETHER/generate CONTRIBUTING", "version" : "0.005" }, { "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" : [ ":ExecFiles", "@Author::ETHER/Examples" ], "skips" : [] } }, "name" : "@Author::ETHER/Test::Compile", "version" : "2.045" }, { "class" : "Dist::Zilla::Plugin::Test::NoTabs", "config" : { "Dist::Zilla::Plugin::Test::NoTabs" : { "finder" : [ ":InstallModules", ":ExecFiles", "@Author::ETHER/Examples", ":TestFiles", "@Author::ETHER/ExtraTestFiles" ] } }, "name" : "@Author::ETHER/Test::NoTabs", "version" : "0.08" }, { "class" : "Dist::Zilla::Plugin::EOLTests", "name" : "@Author::ETHER/EOLTests", "version" : "0.02" }, { "class" : "Dist::Zilla::Plugin::MetaTests", "name" : "@Author::ETHER/MetaTests", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::Test::CPAN::Changes", "name" : "@Author::ETHER/Test::CPAN::Changes", "version" : "0.008" }, { "class" : "Dist::Zilla::Plugin::Test::ChangesHasContent", "name" : "@Author::ETHER/Test::ChangesHasContent", "version" : "0.006" }, { "class" : "Dist::Zilla::Plugin::Test::MinimumVersion", "name" : "@Author::ETHER/Test::MinimumVersion", "version" : "2.000005" }, { "class" : "Dist::Zilla::Plugin::PodSyntaxTests", "name" : "@Author::ETHER/PodSyntaxTests", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::PodCoverageTests", "name" : "@Author::ETHER/PodCoverageTests", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::Test::PodSpelling", "name" : "@Author::ETHER/Test::PodSpelling", "version" : "2.006008" }, { "class" : "Dist::Zilla::Plugin::Test::Pod::No404s", "name" : "@Author::ETHER/Test::Pod::No404s", "version" : "1.001" }, { "class" : "Dist::Zilla::Plugin::Test::Kwalitee", "config" : { "Dist::Zilla::Plugin::Test::Kwalitee" : { "skiptest" : [] } }, "name" : "@Author::ETHER/Test::Kwalitee", "version" : "2.08" }, { "class" : "Dist::Zilla::Plugin::MojibakeTests", "name" : "@Author::ETHER/MojibakeTests", "version" : "0.7" }, { "class" : "Dist::Zilla::Plugin::Test::ReportPrereqs", "name" : "@Author::ETHER/Test::ReportPrereqs", "version" : "0.019" }, { "class" : "Dist::Zilla::Plugin::Test::Portability", "name" : "@Author::ETHER/Test::Portability", "version" : "2.000005" }, { "class" : "Dist::Zilla::Plugin::Git::Describe", "name" : "@Author::ETHER/Git::Describe", "version" : "0.003" }, { "class" : "Dist::Zilla::Plugin::PkgVersion", "name" : "@Author::ETHER/PkgVersion", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::Authority", "name" : "@Author::ETHER/Authority", "version" : "1.006" }, { "class" : "Dist::Zilla::Plugin::NextRelease", "name" : "@Author::ETHER/NextRelease", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::ReadmeAnyFromPod", "name" : "@Author::ETHER/ReadmeAnyFromPod", "version" : "0.142250" }, { "class" : "Dist::Zilla::Plugin::GithubMeta", "name" : "@Author::ETHER/GithubMeta", "version" : "0.46" }, { "class" : "Dist::Zilla::Plugin::AutoMetaResources", "name" : "@Author::ETHER/AutoMetaResources", "version" : "1.20" }, { "class" : "Dist::Zilla::Plugin::MetaNoIndex", "name" : "@Author::ETHER/MetaNoIndex", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::MetaProvides::Package", "config" : { "Dist::Zilla::Plugin::MetaProvides::Package" : { "finder" : [ ":InstallModules" ], "finder_objects" : [ { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":InstallModules", "version" : "5.020" } ] }, "Dist::Zilla::Role::MetaProvider::Provider" : { "inherit_missing" : "1", "inherit_version" : "1", "meta_noindex" : "1" } }, "name" : "@Author::ETHER/MetaProvides::Package", "version" : "2.000004" }, { "class" : "Dist::Zilla::Plugin::MetaConfig", "name" : "@Author::ETHER/MetaConfig", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::Keywords", "config" : { "Dist::Zilla::Plugin::Keywords" : { "keywords" : [ "method", "wrap", "modification", "patch" ] } }, "name" : "@Author::ETHER/Keywords", "version" : "0.006" }, { "class" : "Dist::Zilla::Plugin::Git::Contributors", "config" : { "Dist::Zilla::Plugin::Git::Contributors" : { "include_authors" : "0", "include_releaser" : "1", "order_by" : "commits" } }, "name" : "@Author::ETHER/Git::Contributors", "version" : "0.006" }, { "class" : "Dist::Zilla::Plugin::AutoPrereqs", "name" : "@Author::ETHER/AutoPrereqs", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::Prereqs::AuthorDeps", "name" : "@Author::ETHER/Prereqs::AuthorDeps", "version" : "0.003" }, { "class" : "Dist::Zilla::Plugin::MinimumPerl", "name" : "@Author::ETHER/MinimumPerl", "version" : "1.003" }, { "class" : "Dist::Zilla::Plugin::Prereqs", "config" : { "Dist::Zilla::Plugin::Prereqs" : { "phase" : "develop", "type" : "recommends" } }, "name" : "@Author::ETHER/pluginbundle_version", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::MakeMaker", "config" : { "Dist::Zilla::Role::TestRunner" : { "default_jobs" : 9 } }, "name" : "@Author::ETHER/MakeMaker", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::InstallGuide", "name" : "@Author::ETHER/InstallGuide", "version" : "1.200003" }, { "class" : "Dist::Zilla::Plugin::RunExtraTests", "config" : { "Dist::Zilla::Role::TestRunner" : { "default_jobs" : 9 } }, "name" : "@Author::ETHER/RunExtraTests", "version" : "0.022" }, { "class" : "Dist::Zilla::Plugin::CheckSelfDependency", "config" : { "Dist::Zilla::Plugin::CheckSelfDependency" : { "finder" : [ ":InstallModules" ] } }, "name" : "@Author::ETHER/CheckSelfDependency", "version" : "0.007" }, { "class" : "Dist::Zilla::Plugin::Run::AfterBuild", "config" : { "Dist::Zilla::Plugin::Run::Role::Runner" : { "run" : [ "bash -c \"if [[ `dirname %d` != .build ]]; then test -e .ackrc && grep -q -- '--ignore-dir=%d' .ackrc || echo '--ignore-dir=%d' >> .ackrc; fi; if [[ %d =~ ^%n-[.[:xdigit:]]+$ ]]; then rm -f .latest; ln -s %d .latest; fi\"" ] } }, "name" : "@Author::ETHER/Run::AfterBuild", "version" : "0.024" }, { "class" : "Dist::Zilla::Plugin::CheckStrictVersion", "name" : "@Author::ETHER/CheckStrictVersion", "version" : "0.001" }, { "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" : { "repo_root" : "." } }, "name" : "@Author::ETHER/initial check", "version" : "2.023" }, { "class" : "Dist::Zilla::Plugin::Git::CheckFor::MergeConflicts", "config" : { "Dist::Zilla::Role::Git::Repo" : { "repo_root" : "." } }, "name" : "@Author::ETHER/Git::CheckFor::MergeConflicts", "version" : "0.011" }, { "class" : "Dist::Zilla::Plugin::Git::CheckFor::CorrectBranch", "config" : { "Dist::Zilla::Role::Git::Repo" : { "repo_root" : "." } }, "name" : "@Author::ETHER/Git::CheckFor::CorrectBranch", "version" : "0.011" }, { "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.012" }, { "class" : "Dist::Zilla::Plugin::TestRelease", "name" : "@Author::ETHER/TestRelease", "version" : "5.020" }, { "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" : { "repo_root" : "." } }, "name" : "@Author::ETHER/after tests", "version" : "2.023" }, { "class" : "Dist::Zilla::Plugin::CheckIssues", "name" : "@Author::ETHER/CheckIssues", "version" : "0.002" }, { "class" : "Dist::Zilla::Plugin::UploadToCPAN", "name" : "@Author::ETHER/UploadToCPAN", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::CopyFilesFromRelease", "name" : "@Author::ETHER/CopyFilesFromRelease", "version" : "0.002" }, { "class" : "Dist::Zilla::Plugin::Run::AfterRelease", "config" : { "Dist::Zilla::Plugin::Run::Role::Runner" : { "run" : [ "rm -f README.md" ] } }, "name" : "@Author::ETHER/remove old READMEs", "version" : "0.024" }, { "class" : "Dist::Zilla::Plugin::Git::Commit", "config" : { "Dist::Zilla::Plugin::Git::Commit" : { "add_files_in" : [ "." ], "commit_msg" : "%N-%v%t%n%n%c", "time_zone" : "local" }, "Dist::Zilla::Role::Git::DirtyFiles" : { "allow_dirty" : [ "Changes", "README.md", "README.pod", "LICENSE", "CONTRIBUTING" ], "allow_dirty_match" : [], "changelog" : "Changes" }, "Dist::Zilla::Role::Git::Repo" : { "repo_root" : "." } }, "name" : "@Author::ETHER/Git::Commit", "version" : "2.023" }, { "class" : "Dist::Zilla::Plugin::Git::Tag", "config" : { "Dist::Zilla::Plugin::Git::Tag" : { "branch" : null, "signed" : 0, "tag" : "v2.11", "tag_format" : "v%v%t", "tag_message" : "v%v%t", "time_zone" : "local" }, "Dist::Zilla::Role::Git::Repo" : { "repo_root" : "." } }, "name" : "@Author::ETHER/Git::Tag", "version" : "2.023" }, { "class" : "Dist::Zilla::Plugin::GitHub::Update", "name" : "@Author::ETHER/GitHub::Update", "version" : "0.38" }, { "class" : "Dist::Zilla::Plugin::Git::Push", "config" : { "Dist::Zilla::Plugin::Git::Push" : { "push_to" : [ "origin" ], "remotes_must_exist" : 1 }, "Dist::Zilla::Role::Git::Repo" : { "repo_root" : "." } }, "name" : "@Author::ETHER/Git::Push", "version" : "2.023" }, { "class" : "Dist::Zilla::Plugin::Run::AfterRelease", "config" : { "Dist::Zilla::Plugin::Run::Role::Runner" : { "run" : "REDACTED" } }, "name" : "@Author::ETHER/install release", "version" : "0.024" }, { "class" : "Dist::Zilla::Plugin::ConfirmRelease", "name" : "@Author::ETHER/ConfirmRelease", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::Prereqs", "config" : { "Dist::Zilla::Plugin::Prereqs" : { "phase" : "develop", "type" : "requires" } }, "name" : "@Author::ETHER/bundle_options", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::Git::Contributors", "config" : { "Dist::Zilla::Plugin::Git::Contributors" : { "include_authors" : "0", "include_releaser" : "1", "order_by" : "name" } }, "name" : "Git::Contributors", "version" : "0.006" }, { "class" : "Dist::Zilla::Plugin::Prereqs", "config" : { "Dist::Zilla::Plugin::Prereqs" : { "phase" : "runtime", "type" : "requires" } }, "name" : "RuntimeRequires", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::Prereqs", "config" : { "Dist::Zilla::Plugin::Prereqs" : { "phase" : "develop", "type" : "requires" } }, "name" : "DevelopRequires", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::OnlyCorePrereqs", "config" : { "Dist::Zilla::Plugin::OnlyCorePrereqs" : { "check_dual_life_versions" : "0", "deprecated_ok" : "0", "phases" : [ "configure", "build", "runtime" ], "skips" : [], "starting_version" : "to be determined from perl prereq" } }, "name" : "OnlyCorePrereqs", "version" : "0.017" }, { "class" : "Dist::Zilla::Plugin::Test::CleanNamespaces", "config" : { "Dist::Zilla::Plugin::Test::CleanNamespaces" : { "filename" : "xt/release/clean-namespaces.t", "skips" : [] } }, "name" : "Test::CleanNamespaces", "version" : "0.005" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":InstallModules", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":IncModules", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":TestFiles", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":ExecFiles", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":ShareFiles", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":MainModule", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":AllFiles", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":NoFiles", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::VerifyPhases", "name" : "@Author::ETHER/PHASE VERIFICATION", "version" : "0.003" } ], "zilla" : { "class" : "Dist::Zilla::Dist::Builder", "config" : { "is_trial" : "0" }, "version" : "5.020" } }, "x_authority" : "cpan:SARTAK", "x_contributors" : [ "Aaron Crane ", "David Steinbrunner ", "gfx ", "Graham Knop ", "Justin Hunter ", "Karen Etheridge ", "mannih ", "Peter Rabbitson ", "Shawn M Moore " ] } Class-Method-Modifiers-2.11/META.yml000644 000767 000024 00000042144 12373565151 017401 0ustar00etherstaff000000 000000 --- abstract: 'Provides Moose-like method modifiers' author: - 'Shawn M Moore ' build_requires: ExtUtils::MakeMaker: '0' File::Spec: '0' Test::Fatal: '0' Test::More: '0' Test::Requires: '0' if: '0' configure_requires: ExtUtils::MakeMaker: '0' dynamic_config: 0 generated_by: 'Dist::Zilla version 5.020, CPAN::Meta::Converter version 2.142060' 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.11' 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.11' x_Dist_Zilla: perl: version: '5.021002' plugins: - class: Dist::Zilla::Plugin::PodVersion name: PodVersion version: '5.020' - class: Dist::Zilla::Plugin::Git::NextVersion config: Dist::Zilla::Plugin::Git::NextVersion: first_version: '0.001' version_by_branch: '0' version_regexp: (?^:^v([\d._]+)(-TRIAL)?$) Dist::Zilla::Role::Git::Repo: repo_root: . name: '@Author::ETHER/Git::NextVersion' version: '2.023' - 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 skip: [] name: '@Author::ETHER/stale modules, build' version: '0.024' - class: Dist::Zilla::Plugin::PromptIfStale config: Dist::Zilla::Plugin::PromptIfStale: check_all_plugins: '1' check_all_prereqs: '1' modules: [] phase: release skip: [] name: '@Author::ETHER/stale modules, release' version: '0.024' - class: Dist::Zilla::Plugin::ExecDir name: '@Author::ETHER/ExecDir' version: '5.020' - class: Dist::Zilla::Plugin::ShareDir name: '@Author::ETHER/ShareDir' version: '5.020' - class: Dist::Zilla::Plugin::FileFinder::ByName name: '@Author::ETHER/Examples' version: '5.020' - class: Dist::Zilla::Plugin::FileFinder::ByName name: '@Author::ETHER/ExtraTestFiles' version: '5.020' - class: Dist::Zilla::Plugin::Git::GatherDir config: Dist::Zilla::Plugin::Git::GatherDir: include_untracked: '0' Dist::Zilla::Role::Git::Repo: repo_root: . name: '@Author::ETHER/Git::GatherDir' version: '2.023' - class: Dist::Zilla::Plugin::MetaYAML name: '@Author::ETHER/MetaYAML' version: '5.020' - class: Dist::Zilla::Plugin::MetaJSON name: '@Author::ETHER/MetaJSON' version: '5.020' - class: Dist::Zilla::Plugin::License name: '@Author::ETHER/License' version: '5.020' - class: Dist::Zilla::Plugin::Readme name: '@Author::ETHER/Readme' version: '5.020' - class: Dist::Zilla::Plugin::Manifest name: '@Author::ETHER/Manifest' version: '5.020' - class: Dist::Zilla::Plugin::GenerateFile::ShareDir config: Dist::Zilla::Plugin::GenerateFile::ShareDir: destination_filename: CONTRIBUTING dist: Dist-Zilla-PluginBundle-Author-ETHER encoding: UTF-8 has_xs: 0 source_filename: CONTRIBUTING name: '@Author::ETHER/generate CONTRIBUTING' version: '0.005' - 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: - ':ExecFiles' - '@Author::ETHER/Examples' skips: [] name: '@Author::ETHER/Test::Compile' version: '2.045' - class: Dist::Zilla::Plugin::Test::NoTabs config: Dist::Zilla::Plugin::Test::NoTabs: finder: - ':InstallModules' - ':ExecFiles' - '@Author::ETHER/Examples' - ':TestFiles' - '@Author::ETHER/ExtraTestFiles' name: '@Author::ETHER/Test::NoTabs' version: '0.08' - class: Dist::Zilla::Plugin::EOLTests name: '@Author::ETHER/EOLTests' version: '0.02' - class: Dist::Zilla::Plugin::MetaTests name: '@Author::ETHER/MetaTests' version: '5.020' - class: Dist::Zilla::Plugin::Test::CPAN::Changes name: '@Author::ETHER/Test::CPAN::Changes' version: '0.008' - class: Dist::Zilla::Plugin::Test::ChangesHasContent name: '@Author::ETHER/Test::ChangesHasContent' version: '0.006' - class: Dist::Zilla::Plugin::Test::MinimumVersion name: '@Author::ETHER/Test::MinimumVersion' version: '2.000005' - class: Dist::Zilla::Plugin::PodSyntaxTests name: '@Author::ETHER/PodSyntaxTests' version: '5.020' - class: Dist::Zilla::Plugin::PodCoverageTests name: '@Author::ETHER/PodCoverageTests' version: '5.020' - class: Dist::Zilla::Plugin::Test::PodSpelling name: '@Author::ETHER/Test::PodSpelling' version: '2.006008' - class: Dist::Zilla::Plugin::Test::Pod::No404s name: '@Author::ETHER/Test::Pod::No404s' version: '1.001' - class: Dist::Zilla::Plugin::Test::Kwalitee config: Dist::Zilla::Plugin::Test::Kwalitee: skiptest: [] name: '@Author::ETHER/Test::Kwalitee' version: '2.08' - class: Dist::Zilla::Plugin::MojibakeTests name: '@Author::ETHER/MojibakeTests' version: '0.7' - class: Dist::Zilla::Plugin::Test::ReportPrereqs name: '@Author::ETHER/Test::ReportPrereqs' version: '0.019' - class: Dist::Zilla::Plugin::Test::Portability name: '@Author::ETHER/Test::Portability' version: '2.000005' - class: Dist::Zilla::Plugin::Git::Describe name: '@Author::ETHER/Git::Describe' version: '0.003' - class: Dist::Zilla::Plugin::PkgVersion name: '@Author::ETHER/PkgVersion' version: '5.020' - class: Dist::Zilla::Plugin::Authority name: '@Author::ETHER/Authority' version: '1.006' - class: Dist::Zilla::Plugin::NextRelease name: '@Author::ETHER/NextRelease' version: '5.020' - class: Dist::Zilla::Plugin::ReadmeAnyFromPod name: '@Author::ETHER/ReadmeAnyFromPod' version: '0.142250' - class: Dist::Zilla::Plugin::GithubMeta name: '@Author::ETHER/GithubMeta' version: '0.46' - class: Dist::Zilla::Plugin::AutoMetaResources name: '@Author::ETHER/AutoMetaResources' version: '1.20' - class: Dist::Zilla::Plugin::MetaNoIndex name: '@Author::ETHER/MetaNoIndex' version: '5.020' - class: Dist::Zilla::Plugin::MetaProvides::Package config: Dist::Zilla::Plugin::MetaProvides::Package: finder: - ':InstallModules' finder_objects: - class: Dist::Zilla::Plugin::FinderCode name: ':InstallModules' version: '5.020' Dist::Zilla::Role::MetaProvider::Provider: inherit_missing: '1' inherit_version: '1' meta_noindex: '1' name: '@Author::ETHER/MetaProvides::Package' version: '2.000004' - class: Dist::Zilla::Plugin::MetaConfig name: '@Author::ETHER/MetaConfig' version: '5.020' - class: Dist::Zilla::Plugin::Keywords config: Dist::Zilla::Plugin::Keywords: keywords: - method - wrap - modification - patch name: '@Author::ETHER/Keywords' version: '0.006' - class: Dist::Zilla::Plugin::Git::Contributors config: Dist::Zilla::Plugin::Git::Contributors: include_authors: '0' include_releaser: '1' order_by: commits name: '@Author::ETHER/Git::Contributors' version: '0.006' - class: Dist::Zilla::Plugin::AutoPrereqs name: '@Author::ETHER/AutoPrereqs' version: '5.020' - class: Dist::Zilla::Plugin::Prereqs::AuthorDeps name: '@Author::ETHER/Prereqs::AuthorDeps' version: '0.003' - class: Dist::Zilla::Plugin::MinimumPerl name: '@Author::ETHER/MinimumPerl' version: '1.003' - class: Dist::Zilla::Plugin::Prereqs config: Dist::Zilla::Plugin::Prereqs: phase: develop type: recommends name: '@Author::ETHER/pluginbundle_version' version: '5.020' - class: Dist::Zilla::Plugin::MakeMaker config: Dist::Zilla::Role::TestRunner: default_jobs: 9 name: '@Author::ETHER/MakeMaker' version: '5.020' - class: Dist::Zilla::Plugin::InstallGuide name: '@Author::ETHER/InstallGuide' version: '1.200003' - class: Dist::Zilla::Plugin::RunExtraTests config: Dist::Zilla::Role::TestRunner: default_jobs: 9 name: '@Author::ETHER/RunExtraTests' version: '0.022' - class: Dist::Zilla::Plugin::CheckSelfDependency config: Dist::Zilla::Plugin::CheckSelfDependency: finder: - ':InstallModules' name: '@Author::ETHER/CheckSelfDependency' version: '0.007' - class: Dist::Zilla::Plugin::Run::AfterBuild config: Dist::Zilla::Plugin::Run::Role::Runner: run: - "bash -c \"if [[ `dirname %d` != .build ]]; then test -e .ackrc && grep -q -- '--ignore-dir=%d' .ackrc || echo '--ignore-dir=%d' >> .ackrc; fi; if [[ %d =~ ^%n-[.[:xdigit:]]+$ ]]; then rm -f .latest; ln -s %d .latest; fi\"" name: '@Author::ETHER/Run::AfterBuild' version: '0.024' - class: Dist::Zilla::Plugin::CheckStrictVersion name: '@Author::ETHER/CheckStrictVersion' version: '0.001' - 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: repo_root: . name: '@Author::ETHER/initial check' version: '2.023' - class: Dist::Zilla::Plugin::Git::CheckFor::MergeConflicts config: Dist::Zilla::Role::Git::Repo: repo_root: . name: '@Author::ETHER/Git::CheckFor::MergeConflicts' version: '0.011' - class: Dist::Zilla::Plugin::Git::CheckFor::CorrectBranch config: Dist::Zilla::Role::Git::Repo: repo_root: . name: '@Author::ETHER/Git::CheckFor::CorrectBranch' version: '0.011' - 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.012' - class: Dist::Zilla::Plugin::TestRelease name: '@Author::ETHER/TestRelease' version: '5.020' - 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: repo_root: . name: '@Author::ETHER/after tests' version: '2.023' - class: Dist::Zilla::Plugin::CheckIssues name: '@Author::ETHER/CheckIssues' version: '0.002' - class: Dist::Zilla::Plugin::UploadToCPAN name: '@Author::ETHER/UploadToCPAN' version: '5.020' - class: Dist::Zilla::Plugin::CopyFilesFromRelease name: '@Author::ETHER/CopyFilesFromRelease' version: '0.002' - class: Dist::Zilla::Plugin::Run::AfterRelease config: Dist::Zilla::Plugin::Run::Role::Runner: run: - 'rm -f README.md' name: '@Author::ETHER/remove old READMEs' version: '0.024' - class: Dist::Zilla::Plugin::Git::Commit config: Dist::Zilla::Plugin::Git::Commit: add_files_in: - . commit_msg: '%N-%v%t%n%n%c' time_zone: local Dist::Zilla::Role::Git::DirtyFiles: allow_dirty: - Changes - README.md - README.pod - LICENSE - CONTRIBUTING allow_dirty_match: [] changelog: Changes Dist::Zilla::Role::Git::Repo: repo_root: . name: '@Author::ETHER/Git::Commit' version: '2.023' - class: Dist::Zilla::Plugin::Git::Tag config: Dist::Zilla::Plugin::Git::Tag: branch: ~ signed: 0 tag: v2.11 tag_format: v%v%t tag_message: v%v%t time_zone: local Dist::Zilla::Role::Git::Repo: repo_root: . name: '@Author::ETHER/Git::Tag' version: '2.023' - class: Dist::Zilla::Plugin::GitHub::Update name: '@Author::ETHER/GitHub::Update' version: '0.38' - class: Dist::Zilla::Plugin::Git::Push config: Dist::Zilla::Plugin::Git::Push: push_to: - origin remotes_must_exist: 1 Dist::Zilla::Role::Git::Repo: repo_root: . name: '@Author::ETHER/Git::Push' version: '2.023' - class: Dist::Zilla::Plugin::Run::AfterRelease config: Dist::Zilla::Plugin::Run::Role::Runner: run: REDACTED name: '@Author::ETHER/install release' version: '0.024' - class: Dist::Zilla::Plugin::ConfirmRelease name: '@Author::ETHER/ConfirmRelease' version: '5.020' - class: Dist::Zilla::Plugin::Prereqs config: Dist::Zilla::Plugin::Prereqs: phase: develop type: requires name: '@Author::ETHER/bundle_options' version: '5.020' - class: Dist::Zilla::Plugin::Git::Contributors config: Dist::Zilla::Plugin::Git::Contributors: include_authors: '0' include_releaser: '1' order_by: name name: Git::Contributors version: '0.006' - class: Dist::Zilla::Plugin::Prereqs config: Dist::Zilla::Plugin::Prereqs: phase: runtime type: requires name: RuntimeRequires version: '5.020' - class: Dist::Zilla::Plugin::Prereqs config: Dist::Zilla::Plugin::Prereqs: phase: develop type: requires name: DevelopRequires version: '5.020' - class: Dist::Zilla::Plugin::OnlyCorePrereqs config: Dist::Zilla::Plugin::OnlyCorePrereqs: check_dual_life_versions: '0' deprecated_ok: '0' phases: - configure - build - runtime skips: [] starting_version: 'to be determined from perl prereq' name: OnlyCorePrereqs version: '0.017' - class: Dist::Zilla::Plugin::Test::CleanNamespaces config: Dist::Zilla::Plugin::Test::CleanNamespaces: filename: xt/release/clean-namespaces.t skips: [] name: Test::CleanNamespaces version: '0.005' - class: Dist::Zilla::Plugin::FinderCode name: ':InstallModules' version: '5.020' - class: Dist::Zilla::Plugin::FinderCode name: ':IncModules' version: '5.020' - class: Dist::Zilla::Plugin::FinderCode name: ':TestFiles' version: '5.020' - class: Dist::Zilla::Plugin::FinderCode name: ':ExecFiles' version: '5.020' - class: Dist::Zilla::Plugin::FinderCode name: ':ShareFiles' version: '5.020' - class: Dist::Zilla::Plugin::FinderCode name: ':MainModule' version: '5.020' - class: Dist::Zilla::Plugin::FinderCode name: ':AllFiles' version: '5.020' - class: Dist::Zilla::Plugin::FinderCode name: ':NoFiles' version: '5.020' - class: Dist::Zilla::Plugin::VerifyPhases name: '@Author::ETHER/PHASE VERIFICATION' version: '0.003' zilla: class: Dist::Zilla::Dist::Builder config: is_trial: '0' version: '5.020' x_authority: cpan:SARTAK x_contributors: - 'Aaron Crane ' - 'David Steinbrunner ' - 'gfx ' - 'Graham Knop ' - 'Justin Hunter ' - 'Karen Etheridge ' - 'mannih ' - 'Peter Rabbitson ' - 'Shawn M Moore ' Class-Method-Modifiers-2.11/README000644 000767 000024 00000000577 12373565151 017014 0ustar00etherstaff000000 000000 This archive contains the distribution Class-Method-Modifiers, version 2.11: 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 v5.020. Class-Method-Modifiers-2.11/t/000755 000767 000024 00000000000 12373565151 016366 5ustar00etherstaff000000 000000 Class-Method-Modifiers-2.11/xt/000755 000767 000024 00000000000 12373565151 016556 5ustar00etherstaff000000 000000 Class-Method-Modifiers-2.11/xt/author/000755 000767 000024 00000000000 12373565151 020060 5ustar00etherstaff000000 000000 Class-Method-Modifiers-2.11/xt/release/000755 000767 000024 00000000000 12373565151 020176 5ustar00etherstaff000000 000000 Class-Method-Modifiers-2.11/xt/release/changes_has_content.t000644 000767 000024 00000002010 12373565151 024351 0ustar00etherstaff000000 000000 #!perl use Test::More tests => 2; note 'Checking Changes'; my $changes_file = 'Changes'; my $newver = '2.11'; my $trial_token = '-TRIAL'; SKIP: { ok(-e $changes_file, "$changes_file file exists") or skip 'Changes is missing', 1; ok(_get_changes($newver), "$changes_file has content for $newver"); } done_testing; # _get_changes copied and adapted from Dist::Zilla::Plugin::Git::Commit # by Jerome Quelin sub _get_changes { my $newver = shift; # parse changelog to find commit message open(my $fh, '<', $changes_file) or die "cannot open $changes_file: $!"; my $changelog = join('', <$fh>); close $fh; my @content = grep { /^$newver(?:$trial_token)?(?:\s+|$)/ ... /^\S/ } # from newver to un-indented split /\n/, $changelog; shift @content; # drop the version line # drop unindented last line and trailing blank lines pop @content while ( @content && $content[-1] =~ /^(?:\S|\s*$)/ ); # return number of non-blank lines return scalar @content; } Class-Method-Modifiers-2.11/xt/release/clean-namespaces.t000644 000767 000024 00000000361 12373565151 023562 0ustar00etherstaff000000 000000 use strict; use warnings; # this test was generated with Dist::Zilla::Plugin::Test::CleanNamespaces 0.005 use Test::More 0.94; use Test::CleanNamespaces 0.15; subtest all_namespaces_clean => sub { all_namespaces_clean() }; done_testing; Class-Method-Modifiers-2.11/xt/release/cpan-changes.t000644 000767 000024 00000000263 12373565151 022713 0ustar00etherstaff000000 000000 #!perl use strict; use warnings; use Test::More 0.96 tests => 2; use_ok('Test::CPAN::Changes'); subtest 'changes_ok' => sub { changes_file_ok('Changes'); }; done_testing(); Class-Method-Modifiers-2.11/xt/release/distmeta.t000644 000767 000024 00000000172 12373565151 022175 0ustar00etherstaff000000 000000 #!perl # This file was automatically generated by Dist::Zilla::Plugin::MetaTests. use Test::CPAN::Meta; meta_yaml_ok(); Class-Method-Modifiers-2.11/xt/release/eol.t000644 000767 000024 00000000240 12373565151 021136 0ustar00etherstaff000000 000000 use strict; use warnings; use Test::More; eval 'use Test::EOL'; plan skip_all => 'Test::EOL required' if $@; all_perl_files_ok({ trailing_whitespace => 1 }); Class-Method-Modifiers-2.11/xt/release/kwalitee.t000644 000767 000024 00000000275 12373565151 022174 0ustar00etherstaff000000 000000 # this test was generated with Dist::Zilla::Plugin::Test::Kwalitee 2.08 use strict; use warnings; use Test::More 0.88; use Test::Kwalitee 1.21 'kwalitee_ok'; kwalitee_ok(); done_testing; Class-Method-Modifiers-2.11/xt/release/minimum-version.t000644 000767 000024 00000000271 12373565151 023521 0ustar00etherstaff000000 000000 #!perl use Test::More; eval "use Test::MinimumVersion"; plan skip_all => "Test::MinimumVersion required for testing minimum versions" if $@; all_minimum_version_ok( qq{5.006000} ); Class-Method-Modifiers-2.11/xt/release/mojibake.t000644 000767 000024 00000000406 12373565151 022144 0ustar00etherstaff000000 000000 #!perl use strict; use warnings qw(all); use Test::More; ## no critic (ProhibitStringyEval, RequireCheckingReturnValueOfEval) eval q(use Test::Mojibake); plan skip_all => q(Test::Mojibake required for source encoding testing) if $@; all_files_encoding_ok(); Class-Method-Modifiers-2.11/xt/release/no-tabs.t000644 000767 000024 00000003031 12373565151 021723 0ustar00etherstaff000000 000000 use strict; use warnings; # this test was generated with Dist::Zilla::Plugin::Test::NoTabs 0.08 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/pod-spell.t', 'xt/release/changes_has_content.t', 'xt/release/clean-namespaces.t', 'xt/release/cpan-changes.t', 'xt/release/distmeta.t', 'xt/release/eol.t', 'xt/release/kwalitee.t', 'xt/release/minimum-version.t', 'xt/release/mojibake.t', 'xt/release/no-tabs.t', 'xt/release/pod-coverage.t', 'xt/release/pod-no404s.t', 'xt/release/pod-syntax.t', 'xt/release/portability.t' ); notabs_ok($_) foreach @files; done_testing; Class-Method-Modifiers-2.11/xt/release/pod-coverage.t000644 000767 000024 00000000334 12373565151 022736 0ustar00etherstaff000000 000000 #!perl # This file was automatically generated by Dist::Zilla::Plugin::PodCoverageTests. use Test::Pod::Coverage 1.08; use Pod::Coverage::TrustPod; all_pod_coverage_ok({ coverage_class => 'Pod::Coverage::TrustPod' }); Class-Method-Modifiers-2.11/xt/release/pod-no404s.t000644 000767 000024 00000000527 12373565151 022176 0ustar00etherstaff000000 000000 #!perl use strict; use warnings; use Test::More; foreach my $env_skip ( qw( SKIP_POD_NO404S AUTOMATED_TESTING ) ){ plan skip_all => "\$ENV{$env_skip} is set, skipping" if $ENV{$env_skip}; } eval "use Test::Pod::No404s"; if ( $@ ) { plan skip_all => 'Test::Pod::No404s required for testing POD'; } else { all_pod_files_ok(); } Class-Method-Modifiers-2.11/xt/release/pod-syntax.t000644 000767 000024 00000000220 12373565151 022463 0ustar00etherstaff000000 000000 #!perl # This file was automatically generated by Dist::Zilla::Plugin::PodSyntaxTests. use Test::More; use Test::Pod 1.41; all_pod_files_ok(); Class-Method-Modifiers-2.11/xt/release/portability.t000644 000767 000024 00000000276 12373565151 022732 0ustar00etherstaff000000 000000 #!perl use strict; use warnings; use Test::More; eval 'use Test::Portability::Files'; plan skip_all => 'Test::Portability::Files required for testing portability' if $@; run_tests(); Class-Method-Modifiers-2.11/xt/author/00-compile.t000644 000767 000024 00000002044 12373565151 022112 0ustar00etherstaff000000 000000 use 5.006; use strict; use warnings; # this test was generated with Dist::Zilla::Plugin::Test::Compile 2.045 use Test::More 0.94 tests => 1 + ($ENV{AUTHOR_TESTING} ? 1 : 0); my @module_files = ( 'Class/Method/Modifiers.pm' ); # no fake home requested my $inc_switch = -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; my $pid = open3($stdin, '>&STDERR', $stderr, $^X, $inc_switch, '-e', "require q[$lib]"); binmode $stderr, ':crlf' if $^O eq 'MSWin32'; my @_warnings = <$stderr>; waitpid($pid, 0); is($?, 0, "$lib loaded ok"); if (@_warnings) { warn @_warnings; push @warnings, @_warnings; } } is(scalar(@warnings), 0, 'no warnings found') if $ENV{AUTHOR_TESTING}; BAIL_OUT("Compilation problems") if !Test::More->builder->is_passing; Class-Method-Modifiers-2.11/xt/author/pod-spell.t000644 000767 000024 00000000670 12373565151 022147 0ustar00etherstaff000000 000000 use strict; use warnings; use Test::More; # generated by Dist::Zilla::Plugin::Test::PodSpelling 2.006008 use Test::Spelling 0.12; use Pod::Wordlist; add_stopwords(); all_pod_files_spelling_ok( qw( bin lib ) ); __DATA__ Shawn Moore sartak Aaron Crane arc David Steinbrunner dsteinbrunner gfx gfuji Graham Knop haarg Justin Hunter justin Karen Etheridge ether mannih github Peter Rabbitson ribasushi code lib Class Method Modifiers Class-Method-Modifiers-2.11/t/00-report-prereqs.dd000644 000767 000024 00000010712 12373565151 022107 0ustar00etherstaff000000 000000 do { my $x = { 'configure' => { 'requires' => { 'ExtUtils::MakeMaker' => '0' } }, 'develop' => { 'recommends' => { 'Dist::Zilla::PluginBundle::Author::ETHER' => '0.069' }, 'requires' => { 'Dist::Zilla' => '5', 'Dist::Zilla::Plugin::Git::CheckFor::CorrectBranch' => '0.004', 'Dist::Zilla::Plugin::Git::Commit' => '2.020', 'Dist::Zilla::Plugin::Git::Contributors' => '0.004', 'Dist::Zilla::Plugin::Git::GatherDir' => '2.016', 'Dist::Zilla::Plugin::GitHub::Update' => '0', 'Dist::Zilla::Plugin::GithubMeta' => '0', 'Dist::Zilla::Plugin::Keywords' => '0.004', 'Dist::Zilla::Plugin::MakeMaker' => '0', 'Dist::Zilla::Plugin::MetaProvides::Package' => '1.15000002', 'Dist::Zilla::Plugin::NextRelease' => '4.300018', 'Dist::Zilla::Plugin::OnlyCorePrereqs' => '0', 'Dist::Zilla::Plugin::PkgVersion' => '5.010', 'Dist::Zilla::Plugin::PodVersion' => '0', 'Dist::Zilla::Plugin::Prereqs' => '0', 'Dist::Zilla::Plugin::ReadmeAnyFromPod' => '0.142180', 'Dist::Zilla::Plugin::RunExtraTests' => '0.019', 'Dist::Zilla::Plugin::Test::CPAN::Changes' => '0.008', 'Dist::Zilla::Plugin::Test::CleanNamespaces' => '0', 'Dist::Zilla::Plugin::Test::Compile' => '2.039', 'Dist::Zilla::Plugin::Test::MinimumVersion' => '2.000003', 'Dist::Zilla::PluginBundle::Author::ETHER' => '0.025', 'File::Spec' => '0', 'IO::Handle' => '0', 'IPC::Open3' => '0', 'Moose' => '0', 'Perl::MinimumVersion' => '1.35', 'Pod::Coverage::TrustPod' => '0', 'Test::CPAN::Changes' => '0.19', 'Test::CPAN::Meta' => '0', 'Test::CleanNamespaces' => '0.15', 'Test::Kwalitee' => '1.21', 'Test::More' => '0.94', 'Test::NoTabs' => '0', 'Test::Pod' => '1.41', 'Test::Pod::Coverage' => '1.08', 'Test::Spelling' => '0.12', 'Test::Warnings' => '0' } }, '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::Fatal' => '0', 'Test::More' => '0', 'Test::Requires' => '0', 'if' => '0' } } }; $x; }Class-Method-Modifiers-2.11/t/00-report-prereqs.t000644 000767 000024 00000012323 12373565151 021763 0ustar00etherstaff000000 000000 #!perl use strict; use warnings; # This test was generated by Dist::Zilla::Plugin::Test::ReportPrereqs 0.019 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( Moose ); 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'; if ( $source && $HAS_CPAN_META ) { if ( my $meta = eval { CPAN::Meta->load_file($source) } ) { $full_prereqs = _merge_prereqs($full_prereqs, $meta->prereqs); } } else { $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 $mod eq 'perl'; next if grep { $_ eq $mod } @exclude; my $file = $mod; $file =~ s{::}{/}g; $file .= ".pm"; my ($prefix) = grep { -e File::Spec->catfile($_, $file) } @INC; my $want = $req_hash->{$phase}{$type}{$mod}; $want = "undef" unless defined $want; $want = "any" if !$want && $want == 0; my $req_string = $want eq 'any' ? 'any version required' : "version '$want' required"; 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 ); 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 ( @dep_errors ) { diag join("\n", "\n*** WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING ***\n", "The following REQUIRED prerequisites were not satisfied:\n", @dep_errors, "\n" ); } pass; # vim: ts=4 sts=4 sw=4 et: Class-Method-Modifiers-2.11/t/000-load.t000644 000767 000024 00000000461 12373565151 017770 0ustar00etherstaff000000 000000 use strict; use warnings; use Test::More; 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; Class-Method-Modifiers-2.11/t/001-error.t000644 000767 000024 00000001755 12373565151 020212 0ustar00etherstaff000000 000000 use strict; use warnings; use Test::More; use if $ENV{AUTHOR_TESTING}, 'Test::Warnings'; use Test::Fatal; do { package Class1; use Class::Method::Modifiers; ::like( ::exception { before foo => sub {}; }, qr/The method 'foo' is not found in the inheritance hierarchy for class Class1/, ); }; do { package Class2; use Class::Method::Modifiers; ::like( ::exception { after foo => sub {}; }, qr/The method 'foo' is not found in the inheritance hierarchy for class Class2/, ); }; do { package Class3; use Class::Method::Modifiers; ::like( ::exception { around foo => sub {}; }, qr/The method 'foo' is not found in the inheritance hierarchy for class Class3/, ); }; do { package Class4; use Class::Method::Modifiers; sub foo {} ::like( ::exception { around 'foo', 'bar' => sub {}; }, qr/The method 'bar' is not found in the inheritance hierarchy for class Class4/, ); }; done_testing; Class-Method-Modifiers-2.11/t/002-cache.t000644 000767 000024 00000004014 12373565151 020114 0ustar00etherstaff000000 000000 use strict; use warnings; use Test::More; 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; Class-Method-Modifiers-2.11/t/003-basic.t000755 000767 000024 00000004071 12373565151 020141 0ustar00etherstaff000000 000000 use strict; use warnings; use Test::More; use if $ENV{AUTHOR_TESTING}, 'Test::Warnings'; my @calls; do { package Parent; use Class::Method::Modifiers; sub original { push @calls, 'Parent::original' } before original => sub { push @calls, 'before Parent::original' }; after original => sub { push @calls, 'after Parent::original' }; }; Parent->original; is_deeply([splice @calls], [ 'before Parent::original', 'Parent::original', 'after Parent::original', ]); do { package Parent; use Class::Method::Modifiers; before original => sub { push @calls, 'before before Parent::original' }; after original => sub { push @calls, 'after after Parent::original' }; }; Parent->original; is_deeply([splice @calls], [ 'before before Parent::original', 'before Parent::original', 'Parent::original', 'after Parent::original', 'after after Parent::original', ]); do { package Child; BEGIN { our @ISA = 'Parent' } }; Parent->original; is_deeply([splice @calls], [ 'before before Parent::original', 'before Parent::original', 'Parent::original', 'after Parent::original', 'after after Parent::original', ]); Child->original; is_deeply([splice @calls], [ 'before before Parent::original', 'before Parent::original', 'Parent::original', 'after Parent::original', 'after after Parent::original', ]); do { package Child; use Class::Method::Modifiers; before original => sub { push @calls, 'before Child::original' }; after original => sub { push @calls, 'after Child::original' }; }; Parent->original; is_deeply([splice @calls], [ 'before before Parent::original', 'before Parent::original', 'Parent::original', 'after Parent::original', 'after after Parent::original', ]); Child->original; is_deeply([splice @calls], [ 'before Child::original', 'before before Parent::original', 'before Parent::original', 'Parent::original', 'after Parent::original', 'after after Parent::original', 'after Child::original', ]); done_testing; Class-Method-Modifiers-2.11/t/004-around.t000644 000767 000024 00000002464 12373565151 020352 0ustar00etherstaff000000 000000 use strict; use warnings; use Test::More; 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 Parent; use Class::Method::Modifiers; sub original { push @calls, 'Parent::original' } around original => sub { my $orig = shift; push @calls, 'around/before Parent::original'; $orig->(@_); push @calls, 'around/after Parent::original'; }; }; Parent->original; is_deeply([splice @calls], [ 'around/before Parent::original', 'Parent::original', 'around/after Parent::original', ]); do { package Parent; use Class::Method::Modifiers; around original => sub { my $orig = shift; push @calls, '2 around/before Parent::original'; $orig->(@_); push @calls, '2 around/after Parent::original'; }; }; Parent->original; is_deeply([splice @calls], [ '2 around/before Parent::original', 'around/before Parent::original', 'Parent::original', 'around/after Parent::original', '2 around/after Parent::original', ]); done_testing; Class-Method-Modifiers-2.11/t/005-return.t000644 000767 000024 00000000704 12373565151 020375 0ustar00etherstaff000000 000000 use strict; use warnings; use Test::More; 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; Class-Method-Modifiers-2.11/t/010-before-args.t000644 000767 000024 00000001252 12373565151 021245 0ustar00etherstaff000000 000000 use strict; use warnings; use Test::More; 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 Parent; sub new { bless {}, shift } sub orig { my $self = shift; return lc shift; } } BEGIN { package Child; our @ISA = 'Parent'; 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; Class-Method-Modifiers-2.11/t/011-after-args.t000644 000767 000024 00000001374 12373565151 021112 0ustar00etherstaff000000 000000 use strict; use warnings; use Test::More; 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 Parent; sub new { bless {}, shift } sub orig { my $self = shift; $_[0] =~ s/Foo/bAR/; return "orig"; } } BEGIN { package Child; our @ISA = 'Parent'; 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; Class-Method-Modifiers-2.11/t/012-around-args.t000644 000767 000024 00000001326 12373565151 021277 0ustar00etherstaff000000 000000 use strict; use warnings; use Test::More; 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 Parent; sub new { bless {}, shift } sub orig { my $self = shift; my $arg = shift; return "$arg-orig"; } } BEGIN { package Child; our @ISA = 'Parent'; 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; Class-Method-Modifiers-2.11/t/020-multiple-inheritance.t000644 000767 000024 00000007042 12373565151 023177 0ustar00etherstaff000000 000000 use strict; use warnings; use Test::More; 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; Class-Method-Modifiers-2.11/t/030-multiple-before.t000644 000767 000024 00000001160 12373565151 022144 0ustar00etherstaff000000 000000 use strict; use warnings; use Test::More; 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 Parent; sub new { bless {}, shift } sub orig { push @seen, "orig"; } } BEGIN { package Child; our @ISA = 'Parent'; use Class::Method::Modifiers; before orig => sub { push @seen, "before 1"; }; before orig => sub { push @seen, "before 2"; }; } done_testing; Class-Method-Modifiers-2.11/t/031-multiple-after.t000644 000767 000024 00000001151 12373565151 022004 0ustar00etherstaff000000 000000 use strict; use warnings; use Test::More; 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 Parent; sub new { bless {}, shift } sub orig { push @seen, "orig"; } } BEGIN { package Child; our @ISA = 'Parent'; use Class::Method::Modifiers; after orig => sub { push @seen, "after 1"; }; after orig => sub { push @seen, "after 2"; }; } done_testing; Class-Method-Modifiers-2.11/t/032-multiple-around.t000644 000767 000024 00000001526 12373565151 022202 0ustar00etherstaff000000 000000 use strict; use warnings; use Test::More; 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 Parent; sub new { bless {}, shift } sub orig { push @seen, "orig"; } } BEGIN { package Child; our @ISA = 'Parent'; 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; Class-Method-Modifiers-2.11/t/034-multiple-everything.t000644 000767 000024 00000002511 12373565151 023073 0ustar00etherstaff000000 000000 use strict; use warnings; use Test::More; 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 Parent; sub new { bless {}, shift } sub orig { push @seen, "orig"; } } BEGIN { package Child; our @ISA = 'Parent'; 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; Class-Method-Modifiers-2.11/t/035-multiple-everything-twice.t000644 000767 000024 00000004514 12373565151 024212 0ustar00etherstaff000000 000000 use strict; use warnings; use Test::More; 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 Parent; sub new { bless {}, shift } sub orig { push @seen, "orig"; } } BEGIN { package Child; our @ISA = 'Parent'; 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; Class-Method-Modifiers-2.11/t/040-twice-orig.t000644 000767 000024 00000000742 12373565151 021130 0ustar00etherstaff000000 000000 use strict; use warnings; use Test::More; 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 Parent; sub new { bless {}, shift } sub orig { push @seen, "orig" } package ChildCMM; our @ISA = 'Parent'; use Class::Method::Modifiers; around 'orig' => sub { my $orig = shift; $orig->(); $orig->(); }; } done_testing; Class-Method-Modifiers-2.11/t/041-modify-parent.t000644 000767 000024 00000001715 12373565151 021637 0ustar00etherstaff000000 000000 use strict; use warnings; use Test::More; use if $ENV{AUTHOR_TESTING}, 'Test::Warnings'; my @calls; do { package Parent; sub foo { push @calls, 'Parent::foo' } package Child; use Class::Method::Modifiers; our @ISA = 'Parent'; around foo => sub { push @calls, 'before Child::foo'; shift->(@_); push @calls, 'after Child::foo'; }; }; Child->foo; is_deeply([splice @calls], [ 'before Child::foo', 'Parent::foo', 'after Child::foo', ]); do { package Parent; use Class::Method::Modifiers; around foo => sub { push @calls, 'before Parent::foo'; shift->(@_); push @calls, 'after Parent::foo'; }; }; Child->foo; TODO: { local $TODO = "pending discussion with stevan"; is_deeply([splice @calls], [ 'before Child::foo', 'before Parent::foo', 'Parent::foo', 'after Parent::foo', 'after Child::foo', ]); } done_testing; Class-Method-Modifiers-2.11/t/051-undef-list-ctxt.t000644 000767 000024 00000001613 12373565151 022111 0ustar00etherstaff000000 000000 use strict; use warnings; use Test::More; 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 Parent; sub new { bless {}, shift } sub orig { my $self = shift; $orig_called = 1; return; } } BEGIN { package Child; our @ISA = 'Parent'; use Class::Method::Modifiers; after 'orig' => sub { $after_called = 1; }; } done_testing; Class-Method-Modifiers-2.11/t/060-caller.t000644 000767 000024 00000002230 12373565151 020315 0ustar00etherstaff000000 000000 use strict; use warnings; use Test::More; use if $ENV{AUTHOR_TESTING}, 'Test::Warnings'; my ($parent_caller, $before_caller, $around_caller, $after_caller); my $parent = Parent->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 Parent; sub new { bless {}, shift } sub orig { $parent_caller = caller; } } BEGIN { package Child; our @ISA = 'Parent'; 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; Class-Method-Modifiers-2.11/t/070-modify-multiple-at-once.t000644 000767 000024 00000001702 12373565151 023523 0ustar00etherstaff000000 000000 use strict; use warnings; use Test::More; use if $ENV{AUTHOR_TESTING}, 'Test::Warnings'; my @seen; package Parent; sub new { bless {}, shift } sub left { push @seen, "orig-left" } sub right { push @seen, "orig-right" } package Child; our @ISA = 'Parent'; 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; Class-Method-Modifiers-2.11/t/080-multiple-modifiers.t000644 000767 000024 00000003070 12373565151 022672 0ustar00etherstaff000000 000000 use strict; use warnings; use Test::More; 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 Parent; sub new { bless {}, shift } sub orig { push @seen, 'orig'; } } BEGIN { package Child; our @ISA = 'Parent'; 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; Class-Method-Modifiers-2.11/t/081-sub-and-modifier.t000644 000767 000024 00000006102 12373565151 022205 0ustar00etherstaff000000 000000 use strict; use warnings; use Test::More; use if $ENV{AUTHOR_TESTING}, 'Test::Warnings'; my @seen; my $class = Parent->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 = Parent2->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 Parent; 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 = 'Parent'; 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 Parent2; 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; Class-Method-Modifiers-2.11/t/090-diamond.t000644 000767 000024 00000001120 12373565151 020466 0ustar00etherstaff000000 000000 use strict; use warnings; use Test::More; use if $ENV{AUTHOR_TESTING}, 'Test::Warnings'; my $D = D->new(); is($D->orig, "DBA", "C not called"); BEGIN { package A; sub new { bless {}, shift } sub orig { "A" } package B; use Class::Method::Modifiers; our @ISA = ('A'); around orig => sub { "B" . shift->() }; package C; use Class::Method::Modifiers; our @ISA = ('A'); around orig => sub { "C" . shift->() }; package D; use Class::Method::Modifiers; our @ISA = ('B', 'C'); around orig => sub { "D" . shift->() }; } done_testing; Class-Method-Modifiers-2.11/t/100-class-mop-method-modifiers.t000644 000767 000024 00000003710 12373565151 024205 0ustar00etherstaff000000 000000 # 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; use if $ENV{AUTHOR_TESTING}, 'Test::Warnings'; my @tracelog; package GreatGrandParent; sub new { bless {}, shift } sub method { 4 } sub wrapped { push @tracelog => 'primary' } package GrandParent; use Class::Method::Modifiers; our @ISA = 'GreatGrandParent'; around method => sub { (3, $_[0]->()) }; package Parent; use Class::Method::Modifiers; our @ISA = 'GrandParent'; around method => sub { (2, $_[0]->()) }; package Child; use Class::Method::Modifiers; our @ISA = 'Parent'; 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; Class-Method-Modifiers-2.11/t/110-namespace-clean.t000644 000767 000024 00000003147 12373565151 022073 0ustar00etherstaff000000 000000 use strict; use warnings; use Test::More; use if $ENV{AUTHOR_TESTING}, 'Test::Warnings'; use Test::Requires 'Moose'; # code for this sub is taken directly from # Test::CleanNamespaces::build_namespaces_clean sub imports { my $ns = shift; my $meta = Moose::Util::find_meta($ns) || Moose::Meta::Class->initialize($ns); my %methods = map { ($_ => 1) } $meta->get_method_list; my @symbols = keys %{ $meta->get_all_package_symbols('CODE') || {} }; my @imports = grep { !$methods{$_} } @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; Class-Method-Modifiers-2.11/t/120-fresh.t000755 000767 000024 00000004660 12373565151 020173 0ustar00etherstaff000000 000000 use strict; use warnings; use Test::More; use if $ENV{AUTHOR_TESTING}, 'Test::Warnings'; use Test::Fatal; 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; ::like(::exception { fresh m1 => sub {} }, qr/^Class P2 already has a method named 'm1'/, 'fresh: exception when inherited method exists'); ::like(::exception { fresh m6 => sub {} }, qr/^Class P2 already has a method named 'm6'/, 'fresh: exception when local method exists'); ::like(::exception { fresh '=:=' => sub {} }, qr/^Invalid method name '=:='/, 'fresh: exception when name invalid'); } like(exception { install_modifier P3 => fresh => m1 => sub {} }, qr/^Class P3 already has a method named 'm1'/, 'install_modifier: exception when inherited method exists'); like(exception { install_modifier P3 => fresh => m6 => sub {} }, qr/^Class P3 already has a method named 'm6'/, 'install_modifier: exception when local method exists'); like(exception { install_modifier P3 => fresh => '=:=' => sub {} }, qr/^Invalid method name '=:='/, 'install_modifier: exception when name invalid'); done_testing; Class-Method-Modifiers-2.11/t/130-clean-underscore.t000644 000767 000024 00000003355 12373565151 022313 0ustar00etherstaff000000 000000 use strict; use warnings; use Test::More; use if $ENV{AUTHOR_TESTING}, 'Test::Warnings'; my @calls; do { package Parent; sub original { $_ = "danger"; push @calls, 'Parent::original'; } }; do { package Child::Before; use Class::Method::Modifiers; BEGIN { our @ISA = 'Parent' } before original => sub { $_ = "danger"; push @calls, 'Child::Before::original'; }; }; Child::Before->original; is_deeply([splice @calls], [ 'Child::Before::original', 'Parent::original', ]); Child::Before->original; is_deeply([splice @calls], [ 'Child::Before::original', 'Parent::original', ]); do { package Child::After; use Class::Method::Modifiers; BEGIN { our @ISA = 'Parent' } after original => sub { $_ = "danger"; push @calls, 'Child::After::original'; }; }; Child::After->original; is_deeply([splice @calls], [ 'Parent::original', 'Child::After::original', ]); Child::After->original; is_deeply([splice @calls], [ 'Parent::original', 'Child::After::original', ]); do { package Child::Around; use Class::Method::Modifiers; BEGIN { our @ISA = 'Parent' } 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)', 'Parent::original', 'Child::Around::original(after)', ]); Child::Around->original; is_deeply([splice @calls], [ 'Child::Around::original(before)', 'Parent::original', 'Child::Around::original(after)', ]); done_testing; Class-Method-Modifiers-2.11/t/140-lvalue.t000644 000767 000024 00000003131 12373565151 020343 0ustar00etherstaff000000 000000 use strict; use warnings; use Test::More; use if $ENV{AUTHOR_TESTING}, 'Test::Warnings'; use Test::Fatal; { 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"; is exception { (After->array_lvalue) = (3,4) }, undef, 'assigning to array lvalue attribute causes no errors'; is_deeply([After->array_lvalue], [3,4], 'after array lvalue attribute sets values'); } done_testing; Class-Method-Modifiers-2.11/lib/Class/000755 000767 000024 00000000000 12373565151 017736 5ustar00etherstaff000000 000000 Class-Method-Modifiers-2.11/lib/Class/Method/000755 000767 000024 00000000000 12373565151 021156 5ustar00etherstaff000000 000000 Class-Method-Modifiers-2.11/lib/Class/Method/Modifiers.pm000644 000767 000024 00000037170 12373565151 023445 0ustar00etherstaff000000 000000 use strict; use warnings; package Class::Method::Modifiers; BEGIN { $Class::Method::Modifiers::AUTHORITY = 'cpan:SARTAK'; } # git description: v2.10-10-gcae27a4 $Class::Method::Modifiers::VERSION = '2.11'; # ABSTRACT: Provides Moose-like method modifiers # KEYWORDS: method wrap modification patch # vim: set ts=8 sw=4 tw=78 et : # work around https://rt.cpan.org/Ticket/Display.html?id=89173 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 $@; (eval 'sub { _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__ =head1 NAME Class::Method::Modifiers - provides Moose-like method modifiers =head1 VERSION version 2.11 =head1 SYNOPSIS package Child; use parent 'Parent'; 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 C 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 C 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::SubclassOf::C; 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::SubclassOf::C; 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 thrashing 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 L L, L, L, L, CLOS =head1 AUTHOR Shawn M Moore, C =head1 ACKNOWLEDGEMENTS =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 COPYRIGHT AND LICENSE Copyright 2007-2009 Shawn M Moore. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =cut