Hello community,
here is the log from the commit of package perl-Class-Method-Modifiers for openSUSE:Factory checked in at 2013-06-05 17:48:48
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/perl-Class-Method-Modifiers (Old)
and /work/SRC/openSUSE:Factory/.perl-Class-Method-Modifiers.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "perl-Class-Method-Modifiers"
Changes:
--------
--- /work/SRC/openSUSE:Factory/perl-Class-Method-Modifiers/perl-Class-Method-Modifiers.changes 2012-05-03 10:59:36.000000000 +0200
+++ /work/SRC/openSUSE:Factory/.perl-Class-Method-Modifiers.new/perl-Class-Method-Modifiers.changes 2013-06-05 17:48:50.000000000 +0200
@@ -1,0 +2,9 @@
+Mon Jun 3 15:36:16 UTC 2013 - coolo@suse.com
+
+- updated to 2.04
+ Test for and fix $_ corruption (Vladimir Timofeev)
+ New 'fresh' modifier (Aaron Crane)
+ Avoid "Variable "$..." will not stay shared" warnings under 5.8.x
+ (from changes in 1.09) [#80194] (Karen Etheridge)
+
+-------------------------------------------------------------------
Old:
----
Class-Method-Modifiers-1.09.tar.gz
New:
----
Class-Method-Modifiers-2.04.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ perl-Class-Method-Modifiers.spec ++++++
--- /var/tmp/diff_new_pack.AwQXty/_old 2013-06-05 17:48:50.000000000 +0200
+++ /var/tmp/diff_new_pack.AwQXty/_new 2013-06-05 17:48:50.000000000 +0200
@@ -1,7 +1,7 @@
#
# spec file for package perl-Class-Method-Modifiers
#
-# Copyright (c) 2012 SUSE LINUX Products GmbH, Nuernberg, Germany.
+# Copyright (c) 2013 SUSE LINUX Products GmbH, Nuernberg, Germany.
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@@ -17,27 +17,30 @@
Name: perl-Class-Method-Modifiers
-Version: 1.09
+Version: 2.04
Release: 0
%define cpan_name Class-Method-Modifiers
Summary: Provides Moose-like method modifiers
-License: GPL-1.0+ or Artistic-1.0
+License: Artistic-1.0 or GPL-1.0+
Group: Development/Libraries/Perl
Url: http://search.cpan.org/dist/Class-Method-Modifiers/
-Source: http://www.cpan.org/authors/id/S/SA/SARTAK/%{cpan_name}-%{version}.tar.gz
+Source: http://www.cpan.org/authors/id/E/ET/ETHER/%{cpan_name}-%{version}.tar.gz
BuildArch: noarch
BuildRoot: %{_tmppath}/%{name}-%{version}-build
BuildRequires: perl
BuildRequires: perl-macros
-BuildRequires: perl(ExtUtils::MakeMaker) >= 6.36
BuildRequires: perl(Test::Fatal)
-BuildRequires: perl(Test::More)
+#BuildRequires: perl(App::pod2pdf)
#BuildRequires: perl(Class::Method::Modifiers)
#BuildRequires: perl(inc::Module::Install)
#BuildRequires: perl(JSON)
#BuildRequires: perl(LWP::Simple)
#BuildRequires: perl(Module::Build)
+#BuildRequires: perl(Module::Install::AuthorRequires)
+#BuildRequires: perl(Module::Install::AutoLicense)
#BuildRequires: perl(Module::Install::Base)
+#BuildRequires: perl(Module::Install::GithubMeta)
+#BuildRequires: perl(Module::Install::ReadmeFromPod)
#BuildRequires: perl(Parse::CPAN::Meta)
#BuildRequires: perl(YAML::Tiny)
%{perl_requires}
@@ -75,6 +78,9 @@
the Moose manpage. See 'benchmark/method_modifiers.pl' in the the Moose
manpage distribution.
+'Class::Method::Modifiers' also provides an additional "modifier" type,
+'fresh'; see below.
+
%prep
%setup -q -n %{cpan_name}-%{version}
find . -type f -print0 | xargs -0 chmod 644
@@ -93,6 +99,6 @@
%files -f %{name}.files
%defattr(-,root,root,755)
-%doc Changes
+%doc Changes LICENSE README
%changelog
++++++ Class-Method-Modifiers-1.09.tar.gz -> Class-Method-Modifiers-2.04.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Class-Method-Modifiers-1.09/Changes new/Class-Method-Modifiers-2.04/Changes
--- old/Class-Method-Modifiers-1.09/Changes 2012-04-03 02:09:22.000000000 +0200
+++ new/Class-Method-Modifiers-2.04/Changes 2013-03-31 05:16:35.000000000 +0200
@@ -1,5 +1,30 @@
Revision history for Class-Method-Modifiers
+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)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Class-Method-Modifiers-1.09/LICENSE new/Class-Method-Modifiers-2.04/LICENSE
--- old/Class-Method-Modifiers-1.09/LICENSE 1970-01-01 01:00:00.000000000 +0100
+++ new/Class-Method-Modifiers-2.04/LICENSE 2013-03-31 05:19:17.000000000 +0200
@@ -0,0 +1,379 @@
+This software is copyright (c) 2013 by Shawn M Moore, C.
+
+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) 2013 by Shawn M Moore, C.
+
+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, Suite 500, Boston, MA 02110-1335 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 <name of author>
+
+ 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.
+
+ <signature of Ty Coon>, 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) 2013 by Shawn M Moore, C.
+
+This is free software, licensed under:
+
+ The Artistic License 1.0
+
+The Artistic License
+
+Preamble
+
+The intent of this document is to state the conditions under which a Package
+may be copied, such that the Copyright Holder maintains some semblance of
+artistic control over the development of the package, while giving the users of
+the package the right to use and distribute the Package in a more-or-less
+customary fashion, plus the right to make reasonable modifications.
+
+Definitions:
+
+ - "Package" refers to the collection of files distributed by the Copyright
+ Holder, and derivatives of that collection of files created through
+ textual modification.
+ - "Standard Version" refers to such a Package if it has not been modified,
+ or has been modified in accordance with the wishes of the Copyright
+ Holder.
+ - "Copyright Holder" is whoever is named in the copyright or copyrights for
+ the package.
+ - "You" is you, if you're thinking about copying or distributing this Package.
+ - "Reasonable copying fee" is whatever you can justify on the basis of media
+ cost, duplication charges, time of people involved, and so on. (You will
+ not be required to justify it to the Copyright Holder, but only to the
+ computing community at large as a market that must bear the fee.)
+ - "Freely Available" means that no fee is charged for the item itself, though
+ there may be fees involved in handling the item. It also means that
+ recipients of the item may redistribute it under the same conditions they
+ received it.
+
+1. You may make and give away verbatim copies of the source form of the
+Standard Version of this Package without restriction, provided that you
+duplicate all of the original copyright notices and associated disclaimers.
+
+2. You may apply bug fixes, portability fixes and other modifications derived
+from the Public Domain or from the Copyright Holder. A Package modified in such
+a way shall still be considered the Standard Version.
+
+3. You may otherwise modify your copy of this Package in any way, provided that
+you insert a prominent notice in each changed file stating how and when you
+changed that file, and provided that you do at least ONE of the following:
+
+ a) place your modifications in the Public Domain or otherwise make them
+ Freely Available, such as by posting said modifications to Usenet or an
+ equivalent medium, or placing the modifications on a major archive site
+ such as ftp.uu.net, or by allowing the Copyright Holder to include your
+ modifications in the Standard Version of the Package.
+
+ b) use the modified Package only within your corporation or organization.
+
+ c) rename any non-standard executables so the names do not conflict with
+ standard executables, which must also be provided, and provide a separate
+ manual page for each non-standard executable that clearly documents how it
+ differs from the Standard Version.
+
+ d) make other distribution arrangements with the Copyright Holder.
+
+4. You may distribute the programs of this Package in object code or executable
+form, provided that you do at least ONE of the following:
+
+ a) distribute a Standard Version of the executables and library files,
+ together with instructions (in the manual page or equivalent) on where to
+ get the Standard Version.
+
+ b) accompany the distribution with the machine-readable source of the Package
+ with your modifications.
+
+ c) accompany any non-standard executables with their corresponding Standard
+ Version executables, giving the non-standard executables non-standard
+ names, and clearly documenting the differences in manual pages (or
+ equivalent), together with instructions on where to get the Standard
+ Version.
+
+ d) make other distribution arrangements with the Copyright Holder.
+
+5. You may charge a reasonable copying fee for any distribution of this
+Package. You may charge any fee you choose for support of this Package. You
+may not charge a fee for this Package itself. However, you may distribute this
+Package in aggregate with other (possibly commercial) programs as part of a
+larger (possibly commercial) software distribution provided that you do not
+advertise this Package as a product of your own.
+
+6. The scripts and library files supplied as input to or produced as output
+from the programs of this Package do not automatically fall under the copyright
+of this Package, but belong to whomever generated them, and may be sold
+commercially, and may be aggregated with this Package.
+
+7. C or perl subroutines supplied by you and linked into this Package shall not
+be considered part of this Package.
+
+8. The name of the Copyright Holder may not be used to endorse or promote
+products derived from this software without specific prior written permission.
+
+9. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
+MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+
+The End
+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Class-Method-Modifiers-1.09/MANIFEST new/Class-Method-Modifiers-2.04/MANIFEST
--- old/Class-Method-Modifiers-1.09/MANIFEST 2012-04-03 02:11:41.000000000 +0200
+++ new/Class-Method-Modifiers-2.04/MANIFEST 2013-03-31 05:19:20.000000000 +0200
@@ -1,18 +1,23 @@
Changes
inc/Module/Install.pm
inc/Module/Install/AuthorRequires.pm
+inc/Module/Install/AutoLicense.pm
inc/Module/Install/Base.pm
inc/Module/Install/Can.pm
inc/Module/Install/Fetch.pm
inc/Module/Install/GithubMeta.pm
inc/Module/Install/Makefile.pm
inc/Module/Install/Metadata.pm
+inc/Module/Install/ReadmeFromPod.pm
inc/Module/Install/Win32.pm
inc/Module/Install/WriteAll.pm
lib/Class/Method/Modifiers.pm
+LICENSE
Makefile.PL
MANIFEST This list of files
+MANIFEST.SKIP
META.yml
+README
t/000-load.t
t/001-error.t
t/002-cache.t
@@ -38,3 +43,7 @@
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/release-pod-coverage.t
+t/release-pod-syntax.t
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Class-Method-Modifiers-1.09/MANIFEST.SKIP new/Class-Method-Modifiers-2.04/MANIFEST.SKIP
--- old/Class-Method-Modifiers-1.09/MANIFEST.SKIP 1970-01-01 01:00:00.000000000 +0100
+++ new/Class-Method-Modifiers-2.04/MANIFEST.SKIP 2012-10-28 02:27:01.000000000 +0200
@@ -0,0 +1,59 @@
+### from: !perldoc -m ExtUtils::MANIFEST.SKIP (6.62)
+# Avoid version control files.
+\bRCS\b
+\bCVS\b
+\bSCCS\b
+,v$
+\B\.svn\b
+\B\.git\b
+\B\.gitignore\b
+\b_darcs\b
+\B\.cvsignore$
+
+# Avoid VMS specific MakeMaker generated files
+\bDescrip.MMS$
+\bDESCRIP.MMS$
+\bdescrip.mms$
+
+# Avoid Makemaker generated and utility files.
+\bMANIFEST\.bak
+\bMakefile$
+\bblib/
+\bMakeMaker-\d
+\bpm_to_blib\.ts$
+\bpm_to_blib$
+\bblibdirs\.ts$ # 6.18 through 6.25 generated this
+
+# Avoid Module::Build generated and utility files.
+\bBuild$
+\b_build/
+\bBuild.bat$
+\bBuild.COM$
+\bBUILD.COM$
+\bbuild.com$
+
+# Avoid temp and backup files.
+~$
+\.old$
+\#$
+\b\.#
+\.bak$
+\.tmp$
+\.#
+\.rej$
+\..*\.sw.?$
+
+# Avoid OS-specific files/dirs
+# Mac OSX metadata
+\B\.DS_Store
+# Mac OSX SMB mount metadata files
+\B\._
+
+# Avoid Devel::Cover and Devel::CoverX::Covered files.
+\bcover_db\b
+\bcovered\b
+
+# Avoid MYMETA files
+^MYMETA\.
+
+/Class-Method-Modifiers-*
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Class-Method-Modifiers-1.09/META.yml new/Class-Method-Modifiers-2.04/META.yml
--- old/Class-Method-Modifiers-1.09/META.yml 2012-04-03 02:09:58.000000000 +0200
+++ new/Class-Method-Modifiers-2.04/META.yml 2013-03-31 05:19:18.000000000 +0200
@@ -3,11 +3,11 @@
author:
- 'Shawn M Moore, C'
build_requires:
- ExtUtils::MakeMaker: 6.36
+ ExtUtils::MakeMaker: 6.59
Test::Fatal: 0
Test::More: 0
configure_requires:
- ExtUtils::MakeMaker: 6.36
+ ExtUtils::MakeMaker: 6.59
distribution_type: module
dynamic_config: 1
generated_by: 'Module::Install version 1.06'
@@ -20,11 +20,10 @@
directory:
- inc
- t
+requires:
+ perl: 5.6.0
resources:
- homepage: https://github.com/sartak/Class-Method-Modifiers/tree
+ homepage: https://github.com/karenetheridge/Class-Method-Modifiers/tree
license: http://dev.perl.org/licenses/
- repository:
- type: git
- url: git://github.com/sartak/Class-Method-Modifiers.git
- web: https://github.com/sartak/Class-Method-Modifiers/tree
-version: 1.09
+ repository: git://github.com/karenetheridge/Class-Method-Modifiers.git
+version: 2.04
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Class-Method-Modifiers-1.09/Makefile.PL new/Class-Method-Modifiers-2.04/Makefile.PL
--- old/Class-Method-Modifiers-1.09/Makefile.PL 2012-04-03 02:08:40.000000000 +0200
+++ new/Class-Method-Modifiers-2.04/Makefile.PL 2013-03-31 05:15:02.000000000 +0200
@@ -1,11 +1,19 @@
# Load the Module::Install bundled in ./inc/
use inc::Module::Install;
+use Module::Install::AuthorRequires;
+use Module::Install::ReadmeFromPod;
+use Module::Install::GithubMeta;
+use Module::Install::AutoLicense;
# Define metadata
name 'Class-Method-Modifiers';
+perl_version '5.006';
+readme_from 'lib/Class/Method/Modifiers.pm';
all_from 'lib/Class/Method/Modifiers.pm';
+auto_license;
githubmeta;
+
test_requires 'Test::Fatal';
test_requires 'Test::More';
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Class-Method-Modifiers-1.09/README new/Class-Method-Modifiers-2.04/README
--- old/Class-Method-Modifiers-1.09/README 1970-01-01 01:00:00.000000000 +0100
+++ new/Class-Method-Modifiers-2.04/README 2013-03-31 05:19:17.000000000 +0200
@@ -0,0 +1,211 @@
+NAME
+ Class::Method::Modifiers - provides Moose-like method modifiers
+
+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";
+ };
+
+DESCRIPTION
+ 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
+ "$self->SUPER::foo(@_)". I for one have trouble remembering that exact
+ invocation, so my classes seldom re-dispatch to their base classes. Very
+ bad!
+
+ "Class::Method::Modifiers" provides three modifiers: "before", "around",
+ and "after". "before" and "after" are run just before and after the
+ method they modify, but can not really affect that original method.
+ "around" is run in place of the original method, with a hook to easily
+ call that original method. See the "MODIFIERS" section for more details
+ on how the particular modifiers work.
+
+ One clear benefit of using "Class::Method::Modifiers" 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 "Class::Method::Modifiers". This
+ means you should be able to modify methods in *any* subclass. See
+ Term::VT102::ZeroBased for an example of subclassing with CMM.
+
+ In short, "Class::Method::Modifiers" solves the problem of making sure
+ you call "$self->SUPER::foo(@_)", and provides a cleaner interface for
+ it.
+
+ As of version 1.00, "Class::Method::Modifiers" is faster in some cases
+ than Moose. See "benchmark/method_modifiers.pl" in the Moose
+ distribution.
+
+ "Class::Method::Modifiers" also provides an additional "modifier" type,
+ "fresh"; see below.
+
+MODIFIERS
+ before method(s) => sub { ... }
+ "before" is called before the method it is modifying. Its return value
+ is totally ignored. It receives the same @_ as the the method it is
+ modifying would have received. You can modify the @_ the original method
+ will receive by changing $_[0] and friends (or by changing anything
+ inside a reference). This is a feature!
+
+ after method(s) => sub { ... }
+ "after" is called after the method it is modifying. Its return value is
+ totally ignored. It receives the same @_ as the the method it is
+ modifying received, mostly. The original method can modify @_ (such as
+ by changing $_[0] or references) and "after" will see the modified
+ version. If you don't like this behavior, specify both a "before" and
+ "after", and copy the @_ during "before" for "after" to use.
+
+ around method(s) => sub { ... }
+ "around" is called instead of the method it is modifying. The method
+ you're overriding is passed in as the first argument (called $orig by
+ convention). Watch out for contextual return values of $orig.
+
+ You can use "around" to:
+
+ Pass $orig a different @_
+ around 'method' => sub {
+ my $orig = shift;
+ my $self = shift;
+ $orig->($self, reverse @_);
+ };
+
+ Munge the return value of $orig
+ around 'method' => sub {
+ my $orig = shift;
+ ucfirst $orig->(@_);
+ };
+
+ Avoid calling $orig -- conditionally
+ around 'method' => sub {
+ my $orig = shift;
+ return $orig->(@_) if time() % 2;
+ return "no dice, captain";
+ };
+
+ fresh method(s) => sub { ... };
+ Unlike the other modifiers, this does not modify an existing method.
+ Ordinarily, "fresh" 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 "foo",
+ your method will shadow that method. Alternatively, you can use "fresh"
+ 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 "foo" 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 "install_modifier" (see below) provides a
+ way to get similar safety benefits when adding local monkeypatches to
+ existing classes; see
+ http://aaroncrane.co.uk/talks/monkey_patching_subclassing/.
+
+ For API compatibility reasons, this function is exported only when you
+ ask for it specifically, or for ":all".
+
+ install_modifier $package, $type, @names, sub { ... }
+ "install_modifier" is like "before", "after", "around", and "fresh" 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 ":all".
+
+NOTES
+ All three normal modifiers; "before", "after", and "around"; are
+ exported into your namespace by default. You may "use
+ Class::Method::Modifiers ()" to avoid thrashing your namespace. I may
+ steal more features from Moose, namely "super", "override", "inner",
+ "augment", and whatever the Moose folks come up with next.
+
+ Note that the syntax and semantics for these modifiers is directly
+ borrowed from Moose (the implementations, however, are not).
+
+ Class::Trigger shares a few similarities with
+ "Class::Method::Modifiers", and they even have some overlap in purpose
+ -- both can be used to implement highly pluggable applications. The
+ difference is that Class::Trigger provides a mechanism for easily
+ letting parent classes to invoke hooks defined by other code.
+ "Class::Method::Modifiers" provides a way of overriding/augmenting
+ methods safely, and the parent class need not know about it.
+
+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 "caller". There are some todo tests for
+ this. Don't get your hopes up though!
+
+VERSION
+ 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. :)
+
+SEE ALSO
+ Class::Method::Modifiers::Fast Moose, Class::Trigger,
+ Class::MOP::Method::Wrapped, MRO::Compat, CLOS
+
+AUTHOR
+ Shawn M Moore, "sartak@gmail.com"
+
+ACKNOWLEDGEMENTS
+ Thanks to Stevan Little for Moose, I would never have known about method
+ modifiers otherwise.
+
+ Thanks to Matt Trout and Stevan Little for their advice.
+
+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.
+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Class-Method-Modifiers-1.09/inc/Module/Install/AutoLicense.pm new/Class-Method-Modifiers-2.04/inc/Module/Install/AutoLicense.pm
--- old/Class-Method-Modifiers-1.09/inc/Module/Install/AutoLicense.pm 1970-01-01 01:00:00.000000000 +0100
+++ new/Class-Method-Modifiers-2.04/inc/Module/Install/AutoLicense.pm 2013-03-31 05:19:17.000000000 +0200
@@ -0,0 +1,63 @@
+#line 1
+package Module::Install::AutoLicense;
+
+use strict;
+use warnings;
+use base qw(Module::Install::Base);
+use vars qw($VERSION);
+
+$VERSION = '0.08';
+
+my %licenses = (
+ perl => 'Software::License::Perl_5',
+ apache => 'Software::License::Apache_2_0',
+ artistic => 'Software::License::Artistic_1_0',
+ artistic_2 => 'Software::License::Artistic_2_0',
+ lgpl2 => 'Software::License::LGPL_2_1',
+ lgpl3 => 'Software::License::LGPL_3_0',
+ bsd => 'Software::License::BSD',
+ gpl => 'Software::License::GPL_1',
+ gpl2 => 'Software::License::GPL_2',
+ gpl3 => 'Software::License::GPL_3',
+ mit => 'Software::License::MIT',
+ mozilla => 'Software::License::Mozilla_1_1',
+);
+
+sub auto_license {
+ my $self = shift;
+ return unless $Module::Install::AUTHOR;
+ my %opts = @_;
+ $opts{lc $_} = delete $opts{$_} for keys %opts;
+ my $holder = $opts{holder} || _get_authors( $self );
+ #my $holder = $opts{holder} || $self->author;
+ my $license = $self->license();
+ unless ( defined $licenses{ $license } ) {
+ warn "No license definition for '$license', aborting\n";
+ return 1;
+ }
+ my $class = $licenses{ $license };
+ eval "require $class";
+ my $sl = $class->new( { holder => $holder } );
+ open LICENSE, '>LICENSE' or die "$!\n";
+ print LICENSE $sl->fulltext;
+ close LICENSE;
+ $self->postamble(<<"END");
+distclean :: license_clean
+
+license_clean:
+\t\$(RM_F) LICENSE
+END
+
+ return 1;
+}
+
+sub _get_authors {
+ my $self = shift;
+ my $joined = join ', ', @{ $self->author() || [] };
+ return $joined;
+}
+
+'Licensed to auto';
+__END__
+
+#line 125
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Class-Method-Modifiers-1.09/inc/Module/Install/GithubMeta.pm new/Class-Method-Modifiers-2.04/inc/Module/Install/GithubMeta.pm
--- old/Class-Method-Modifiers-1.09/inc/Module/Install/GithubMeta.pm 2012-04-03 02:09:57.000000000 +0200
+++ new/Class-Method-Modifiers-2.04/inc/Module/Install/GithubMeta.pm 2013-03-31 05:19:17.000000000 +0200
@@ -7,7 +7,7 @@
use base qw(Module::Install::Base);
use vars qw($VERSION);
-$VERSION = '0.16';
+$VERSION = '0.22';
sub githubmeta {
my $self = shift;
@@ -21,13 +21,7 @@
$git_url =~ s![\w\-]+\@([^:]+):!git://$1/!;
$http_url =~ s![\w\-]+\@([^:]+):!https://$1/!;
$http_url =~ s!\.git$!/tree!;
- $self->repository(
- {
- type => 'git',
- url => $git_url,
- web => $http_url,
- },
- );
+ $self->repository( $git_url );
$self->homepage( $http_url ) unless $self->homepage();
return 1;
}
@@ -54,4 +48,4 @@
'Github';
__END__
-#line 117
+#line 111
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Class-Method-Modifiers-1.09/inc/Module/Install/ReadmeFromPod.pm new/Class-Method-Modifiers-2.04/inc/Module/Install/ReadmeFromPod.pm
--- old/Class-Method-Modifiers-1.09/inc/Module/Install/ReadmeFromPod.pm 1970-01-01 01:00:00.000000000 +0100
+++ new/Class-Method-Modifiers-2.04/inc/Module/Install/ReadmeFromPod.pm 2013-03-31 05:19:17.000000000 +0200
@@ -0,0 +1,138 @@
+#line 1
+package Module::Install::ReadmeFromPod;
+
+use 5.006;
+use strict;
+use warnings;
+use base qw(Module::Install::Base);
+use vars qw($VERSION);
+
+$VERSION = '0.20';
+
+sub readme_from {
+ my $self = shift;
+ return unless $self->is_admin;
+
+ # Input file
+ my $in_file = shift || $self->_all_from
+ or die "Can't determine file to make readme_from";
+
+ # Get optional arguments
+ my ($clean, $format, $out_file, $options);
+ my $args = shift;
+ if ( ref $args ) {
+ # Arguments are in a hashref
+ if ( ref($args) ne 'HASH' ) {
+ die "Expected a hashref but got a ".ref($args)."\n";
+ } else {
+ $clean = $args->{'clean'};
+ $format = $args->{'format'};
+ $out_file = $args->{'output_file'};
+ $options = $args->{'options'};
+ }
+ } else {
+ # Arguments are in a list
+ $clean = $args;
+ $format = shift;
+ $out_file = shift;
+ $options = \@_;
+ }
+
+ # Default values;
+ $clean ||= 0;
+ $format ||= 'txt';
+
+ # Generate README
+ print "readme_from $in_file to $format\n";
+ if ($format =~ m/te?xt/) {
+ $out_file = $self->_readme_txt($in_file, $out_file, $options);
+ } elsif ($format =~ m/html?/) {
+ $out_file = $self->_readme_htm($in_file, $out_file, $options);
+ } elsif ($format eq 'man') {
+ $out_file = $self->_readme_man($in_file, $out_file, $options);
+ } elsif ($format eq 'pdf') {
+ $out_file = $self->_readme_pdf($in_file, $out_file, $options);
+ }
+
+ if ($clean) {
+ $self->clean_files($out_file);
+ }
+
+ return 1;
+}
+
+
+sub _readme_txt {
+ my ($self, $in_file, $out_file, $options) = @_;
+ $out_file ||= 'README';
+ require Pod::Text;
+ my $parser = Pod::Text->new( @$options );
+ open my $out_fh, '>', $out_file or die "Could not write file $out_file:\n$!\n";
+ $parser->output_fh( *$out_fh );
+ $parser->parse_file( $in_file );
+ close $out_fh;
+ return $out_file;
+}
+
+
+sub _readme_htm {
+ my ($self, $in_file, $out_file, $options) = @_;
+ $out_file ||= 'README.htm';
+ require Pod::Html;
+ Pod::Html::pod2html(
+ "--infile=$in_file",
+ "--outfile=$out_file",
+ @$options,
+ );
+ # Remove temporary files if needed
+ for my $file ('pod2htmd.tmp', 'pod2htmi.tmp') {
+ if (-e $file) {
+ unlink $file or warn "Warning: Could not remove file '$file'.\n$!\n";
+ }
+ }
+ return $out_file;
+}
+
+
+sub _readme_man {
+ my ($self, $in_file, $out_file, $options) = @_;
+ $out_file ||= 'README.1';
+ require Pod::Man;
+ my $parser = Pod::Man->new( @$options );
+ $parser->parse_from_file($in_file, $out_file);
+ return $out_file;
+}
+
+
+sub _readme_pdf {
+ my ($self, $in_file, $out_file, $options) = @_;
+ $out_file ||= 'README.pdf';
+ eval { require App::pod2pdf; }
+ or die "Could not generate $out_file because pod2pdf could not be found\n";
+ my $parser = App::pod2pdf->new( @$options );
+ $parser->parse_from_file($in_file);
+ open my $out_fh, '>', $out_file or die "Could not write file $out_file:\n$!\n";
+ select $out_fh;
+ $parser->output;
+ select STDOUT;
+ close $out_fh;
+ return $out_file;
+}
+
+
+sub _all_from {
+ my $self = shift;
+ return unless $self->admin->{extensions};
+ my ($metadata) = grep {
+ ref($_) eq 'Module::Install::Metadata';
+ } @{$self->admin->{extensions}};
+ return unless $metadata;
+ return $metadata->{values}{all_from} || '';
+}
+
+'Readme!';
+
+__END__
+
+#line 254
+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Class-Method-Modifiers-1.09/lib/Class/Method/Modifiers.pm new/Class-Method-Modifiers-2.04/lib/Class/Method/Modifiers.pm
--- old/Class-Method-Modifiers-1.09/lib/Class/Method/Modifiers.pm 2012-04-03 02:09:05.000000000 +0200
+++ new/Class-Method-Modifiers-2.04/lib/Class/Method/Modifiers.pm 2013-03-31 05:16:07.000000000 +0200
@@ -2,11 +2,11 @@
use strict;
use warnings;
-our $VERSION = '1.09';
+our $VERSION = '2.04';
use base 'Exporter';
our @EXPORT = qw(before after around);
-our @EXPORT_OK = (@EXPORT, 'install_modifier');
+our @EXPORT_OK = (@EXPORT, qw(fresh install_modifier));
our %EXPORT_TAGS = (
moose => [qw(before after around)],
all => \@EXPORT_OK,
@@ -26,6 +26,8 @@
@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;
@@ -91,7 +93,13 @@
$generated .= "sub $name {";
# before is easy, it doesn't affect the return value(s)
- $generated .= '$_->(@_) for @$before;' if @$before;
+ if (@$before) {
+ $generated .= '
+ for my $method (@$before) {
+ $method->(@_);
+ }
+ ';
+ }
if (@$after) {
$generated .= '
@@ -106,7 +114,9 @@
$$wrapped->(@_);
}
- $_->(@_) for @$after;
+ for my $method (@$after) {
+ $method->(@_);
+ }
return wantarray ? @ret : $ret[0];
';
@@ -119,6 +129,7 @@
no strict 'refs';
no warnings 'redefine';
+ no warnings 'closure';
eval $generated;
};
}
@@ -136,6 +147,55 @@
_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 {
+ my $body = 'my $self = shift; $self->$code(@_)';
+ no warnings 'closure'; # for 5.8.x
+ eval "package $into; sub $name { $body }";
+ }
+ }
+}
+
+sub _is_in_package {
+ my ($coderef, $package) = @_;
+ require B;
+ my $cv = B::svref_2object($coderef);
+ return $cv->GV->STASH->NAME eq $package;
+}
+
1;
__END__
@@ -166,6 +226,12 @@
debug "finished calling a dangerous method";
};
+ use Class::Method::Modifiers qw(fresh);
+
+ fresh 'not_in_hierarchy' => sub {
+ warn "freshly added method\n";
+ };
+
=head1 DESCRIPTION
@@ -199,6 +265,9 @@
As of version 1.00, CClass::Method::Modifiers is faster in some cases than
L<Moose>. See C in the L<Moose> distribution.
+CClass::Method::Modifiers also provides an additional "modifier" type,
+C<fresh>; see below.
+
=head1 MODIFIERS
=head2 before method(s) => sub { ... }
@@ -253,10 +322,48 @@
=back
+=head2 fresh method(s) => sub { ... };
+
+Unlike the other modifiers, this does not modify an existing method.
+Ordinarily, C<fresh> 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<foo>, your
+method will shadow that method. Alternatively, you can use C<fresh>
+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<foo> 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 Lhttp://aaroncrane.co.uk/talks/monkey_patching_subclassing/.
+
+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<before>, C<after>, and C<around> but it also
-lets you dynamically select the modifier type ('before', 'after', 'around')
+C is like C<before>, C<after>, C<around>, and C<fresh> 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>.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Class-Method-Modifiers-1.09/t/110-namespace-clean.t new/Class-Method-Modifiers-2.04/t/110-namespace-clean.t
--- old/Class-Method-Modifiers-1.09/t/110-namespace-clean.t 2012-04-03 02:07:47.000000000 +0200
+++ new/Class-Method-Modifiers-2.04/t/110-namespace-clean.t 2013-03-31 05:15:02.000000000 +0200
@@ -5,7 +5,7 @@
BEGIN {
eval "require Class::MOP"
- or plan skip_all => $!;
+ or plan skip_all => 'Test requires Class::MOP';
}
# code for this sub is taken directly from
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Class-Method-Modifiers-1.09/t/120-fresh.t new/Class-Method-Modifiers-2.04/t/120-fresh.t
--- old/Class-Method-Modifiers-1.09/t/120-fresh.t 1970-01-01 01:00:00.000000000 +0100
+++ new/Class-Method-Modifiers-2.04/t/120-fresh.t 2012-12-29 19:59:01.000000000 +0100
@@ -0,0 +1,89 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use Test::More tests => 12;
+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');
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Class-Method-Modifiers-1.09/t/130-clean-underscore.t new/Class-Method-Modifiers-2.04/t/130-clean-underscore.t
--- old/Class-Method-Modifiers-1.09/t/130-clean-underscore.t 1970-01-01 01:00:00.000000000 +0100
+++ new/Class-Method-Modifiers-2.04/t/130-clean-underscore.t 2013-01-27 21:18:53.000000000 +0100
@@ -0,0 +1,90 @@
+#!/usr/bin/env perl
+use strict;
+use warnings;
+use Test::More tests => 6;
+
+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)',
+]);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Class-Method-Modifiers-1.09/t/release-pod-coverage.t new/Class-Method-Modifiers-2.04/t/release-pod-coverage.t
--- old/Class-Method-Modifiers-1.09/t/release-pod-coverage.t 1970-01-01 01:00:00.000000000 +0100
+++ new/Class-Method-Modifiers-2.04/t/release-pod-coverage.t 2013-01-27 21:18:54.000000000 +0100
@@ -0,0 +1,19 @@
+use strict;
+use warnings;
+use Test::More;
+
+BEGIN {
+ unless ($ENV{RELEASE_TESTING}) {
+ plan skip_all => 'these tests are for release candidate testing';
+ }
+}
+
+eval "use Test::Pod::Coverage 1.08";
+plan skip_all => "Test::Pod::Coverage 1.08 required for testing POD coverage"
+ if $@;
+
+eval "use Pod::Coverage::TrustPod";
+plan skip_all => "Pod::Coverage::TrustPod required for testing POD coverage"
+ if $@;
+
+all_pod_coverage_ok({ coverage_class => 'Pod::Coverage::TrustPod' });
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Class-Method-Modifiers-1.09/t/release-pod-syntax.t new/Class-Method-Modifiers-2.04/t/release-pod-syntax.t
--- old/Class-Method-Modifiers-1.09/t/release-pod-syntax.t 1970-01-01 01:00:00.000000000 +0100
+++ new/Class-Method-Modifiers-2.04/t/release-pod-syntax.t 2013-01-27 21:18:54.000000000 +0100
@@ -0,0 +1,14 @@
+use strict;
+use warnings;
+use Test::More;
+
+BEGIN {
+ unless ($ENV{RELEASE_TESTING}) {
+ plan skip_all => 'these tests are for release candidate testing';
+ }
+}
+
+eval "use Test::Pod 1.41";
+plan skip_all => "Test::Pod 1.41 required for testing POD" if $@;
+
+all_pod_files_ok();
--
To unsubscribe, e-mail: opensuse-commit+unsubscribe@opensuse.org
For additional commands, e-mail: opensuse-commit+help@opensuse.org