Moose-2.2200/000770 000766 000024 00000000000 14137574636 013151 5ustar00etherstaff000000 000000 Moose-2.2200/perltidyrc000644 000766 000024 00000000455 14137574636 015264 0ustar00etherstaff000000 000000 -l=78 -i=4 -ci=4 -se -b -bar -boc -vt=0 -vtc=0 -cti=0 -pt=1 -bt=1 -sbt=1 -bbt=1 -nolq -npro -nsfs --blank-lines-before-packages=0 --opening-hash-brace-right --no-outdent-long-comments --iterations=2 -wbb="% + - * / x != == >= <= =~ !~ < > | & >= < = **= += *= &= <<= &&= -= /= |= >>= ||= .= %= ^= x=" Moose-2.2200/inc/000770 000766 000024 00000000000 14137574636 013722 5ustar00etherstaff000000 000000 Moose-2.2200/LICENSE000644 000766 000024 00000043717 14137574636 014175 0ustar00etherstaff000000 000000 This software is copyright (c) 2006 by Infinity Interactive, Inc. 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) 2006 by Infinity Interactive, Inc. 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) 2006 by Infinity Interactive, Inc. This is free software, licensed under: The Artistic License 1.0 The Artistic License Preamble The intent of this document is to state the conditions under which a Package may be copied, such that the Copyright Holder maintains some semblance of artistic control over the development of the package, while giving the users of the package the right to use and distribute the Package in a more-or-less customary fashion, plus the right to make reasonable modifications. Definitions: - "Package" refers to the collection of files distributed by the Copyright Holder, and derivatives of that collection of files created through textual modification. - "Standard Version" refers to such a Package if it has not been modified, or has been modified in accordance with the wishes of the Copyright Holder. - "Copyright Holder" is whoever is named in the copyright or copyrights for the package. - "You" is you, if you're thinking about copying or distributing this Package. - "Reasonable copying fee" is whatever you can justify on the basis of media cost, duplication charges, time of people involved, and so on. (You will not be required to justify it to the Copyright Holder, but only to the computing community at large as a market that must bear the fee.) - "Freely Available" means that no fee is charged for the item itself, though there may be fees involved in handling the item. It also means that recipients of the item may redistribute it under the same conditions they received it. 1. You may make and give away verbatim copies of the source form of the Standard Version of this Package without restriction, provided that you duplicate all of the original copyright notices and associated disclaimers. 2. You may apply bug fixes, portability fixes and other modifications derived from the Public Domain or from the Copyright Holder. A Package modified in such a way shall still be considered the Standard Version. 3. You may otherwise modify your copy of this Package in any way, provided that you insert a prominent notice in each changed file stating how and when you changed that file, and provided that you do at least ONE of the following: a) place your modifications in the Public Domain or otherwise make them Freely Available, such as by posting said modifications to Usenet or an equivalent medium, or placing the modifications on a major archive site such as ftp.uu.net, or by allowing the Copyright Holder to include your modifications in the Standard Version of the Package. b) use the modified Package only within your corporation or organization. c) rename any non-standard executables so the names do not conflict with standard executables, which must also be provided, and provide a separate manual page for each non-standard executable that clearly documents how it differs from the Standard Version. d) make other distribution arrangements with the Copyright Holder. 4. You may distribute the programs of this Package in object code or executable form, provided that you do at least ONE of the following: a) distribute a Standard Version of the executables and library files, together with instructions (in the manual page or equivalent) on where to get the Standard Version. b) accompany the distribution with the machine-readable source of the Package with your modifications. c) accompany any non-standard executables with their corresponding Standard Version executables, giving the non-standard executables non-standard names, and clearly documenting the differences in manual pages (or equivalent), together with instructions on where to get the Standard Version. d) make other distribution arrangements with the Copyright Holder. 5. You may charge a reasonable copying fee for any distribution of this Package. You may charge any fee you choose for support of this Package. You may not charge a fee for this Package itself. However, you may distribute this Package in aggregate with other (possibly commercial) programs as part of a larger (possibly commercial) software distribution provided that you do not advertise this Package as a product of your own. 6. The scripts and library files supplied as input to or produced as output from the programs of this Package do not automatically fall under the copyright of this Package, but belong to whomever generated them, and may be sold commercially, and may be aggregated with this Package. 7. C or perl subroutines supplied by you and linked into this Package shall not be considered part of this Package. 8. The name of the Copyright Holder may not be used to endorse or promote products derived from this software without specific prior written permission. 9. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. The End Moose-2.2200/bin/000770 000766 000024 00000000000 14137574636 013721 5ustar00etherstaff000000 000000 Moose-2.2200/Changes000640 000766 000024 00000516624 14137574636 014461 0ustar00etherstaff000000 000000 Also see Moose::Manual::Delta for more details of, and workarounds for, noteworthy changes. 2.2200 2021-10-31 - no changes since 2.2100 2.2100 2021-04-13 (TRIAL RELEASE) [OTHER] - Replaced all uses of Sub::Name with Sub::Util, since the latter is part of core as of Perl 5.22. 2.2015 2021-03-31 [TESTS] - a test has been rewritten so as to remove IO::String from the prerequisite list (#179, thanks Ricardo Signes!) [OTHER] - optional prereq on List::SomeUtils has been replaced with List::Util 1.56. 2.2014 2020-12-19 [ENHANCEMENTS] - Include details about expected values when Enum type checks fail (#174; thanks sherrardb) [DOCUMENTATION] - fix misleading missing semicolon in exceptions example (#170; thanks Perlover) [OTHER] - allow internal packages to be indexed by PAUSE. This avoids their permissions being captured (possibly unintentionally) by others. - Sub::Identify prerequisite removed, in favour of already-existing local code. 2.2013 2020-07-21 [DOCUMENTATION] - improved some documentation wording in Moose and Class::MOP::Class (PR#162; thanks Tom Hukins!) [OTHER] - updated bundled ExtUtils::HasCompiler, for msys2 support (RT#133022) 2.2012 2019-11-22 [TESTS] - adjust test of missing package to accomodate new diagnostic message in perl 5.31.6 (RT#130929) 2.2011 2018-05-16 [BUG FIXES] - Various native trait methods would refuse "0" where they expected a string. They have been fixed to allow all defined, non-reference values, and all objects with string, number, or boolean overloads. [DOCUMENTATION] - Moose::Manual::Construction now notes that roles can modify the BUILD sub. (thanks, E. Choroba!) [OTHER] - adjustments have been made to the Makefile for 'bmake', so it now works when not run in compatibility mode (Leon Timmermans). 2.2010 2018-02-16 [OTHER] - A performance improvement with operator overloads has been made by making use of a new Devel::OverloadInfo interface (thanks, ilmari!) 2.2009 2017-11-29 [BUG FIXES] - Some hash native trait methods (notably clear and delete) were broken in various ways when the associated attribute's type allowed for coercion of the hash values and coercion was enabled for the hash. Reported by Ralf Bartel in RT #123737. [TESTS] - fixed tests (new in 2.2008) that sometimes fail under Windows. 2.2008 2017-11-21 [BUG FIXES] - fixed empty exception messages under -d (new issue in 2.2007) 2.2007 2017-11-12 [DOCUMENTATION] - The Moose::Manual::Attributes pod has been amended to clarify that 'required' attributes can be satisfied with a 'default' or 'builder' sub, and that 'ro' attributes can be set through the constructor. - The Moose::Manual::Types pod has been amended to recommend Params::ValidationCompiler and Moops instead of older modules (which are slow and/or deprecated). - other small documentation fixes (thanks to Chris Weyl and Anirvan Chatterjee!) [OTHER] - some dead code has been removed (thanks, Jens Berthold!) - all Moose exception classes have been made immutable. 2.2006 2017-07-12 [BUG FIXES] - Passing roles as a mix of role names and role objects to Moose::Meta::class->create_anon_class could throw a bogus exception about 'Roles with parameters cannot be cached ...'. Fixed by Olivier Mengué. Based on PR #117. 2.2005 2017-05-03 [OTHER] - increased minimum required version of Test::More, to ensure a reliable subtest. 2.2004 2017-01-31 [BUG FIXES] - When an attribute was specified as 'rw' and you also provided an accessor name matching the attribute and there was an explicit writer, Moose would try to make an additional reader access with the same name as the attribute. Then Moose would warn about overwriting an accessor with a reader. This is related to the bugs reported in RT #120040. 2.2003 2017-01-30 [BUG FIXES] - Moose could die when attempting to warn about overwriting an attribute's access method in some cases (since version 2.1902) (RT #120040) 2.2002 2017-01-30 [BUG FIXES] - Creating a Moose subclass of a Moo class with an attribute with a delegation would cause a warning (since version 2.1902). 2.2001 2017-01-29 [TESTS] - fixed variable interpolation in filename in test (RT#120033) 2.2000 2017-01-29 [OTHER] - increased minimum required version of Sub::Name. 2.1905 2017-01-07 (TRIAL RELEASE) [ENHANCEMENTS] - Added support for __no_BUILD__ as a constructor argument to skip calling any BUILD subs (used internally by modules like Moo that have their own implementation of calling BUILD) (PR#142, Graham Knop) 2.1904 2016-12-22 (TRIAL RELEASE) [BUG FIXES] - Slight tweaks to the syntax used for hashes in a few tests, that were broken by a recent Test::More release that started using a new namespace that clashes with a (bareword) type name in these tests. (PR#141, D.Maestro) 2.1903 2016-11-22 (TRIAL RELEASE) [ENHANCEMENTS] - When an attribute defines two methods (say a reader and writer) with the same name, this now generates a warning. - The warning when attribute methods overwrite one another is now much more informative. It includes the type of accessors involved (reader, writer, predicate, etc.) as well as the file and line where each accessor was defined. Fixes RT #118325. [BUG FIXES] - Brought back the Moose::Meta::Method::Delegation->_get_delegate_accessor method for the benefit of MooseX::CurriedDelegation. - The definition context (package, file, & line) for attributes on Class::MOP and Moose metaclasses was wrong in all cases. 2.1902 2016-10-23 (TRIAL RELEASE) [ENHANCEMENTS] - The stack trace for an inlined delegation now tells you where the delegating attribute was declared (file and line number). 2.1901 2016-10-20 (TRIAL RELEASE) [TESTS] - warnings are only checked for in tests under AUTHOR_TESTING, so as to not prevent installation when warnings occur in prerequisites. 2.1900 2016-10-09 (TRIAL RELEASE) [ENHANCEMENTS] - Most delegations are inlined now. This is not done for speed but rather to improve stack traces when the delegated-to method throws an exception or when the delegated-to method simply does not exist in the delegatee. Previously, this stack trace and associated error were less helpful than they could have been. Requested by Tim Bunce, Olaf Alders, and Van de Bugger. (RT#46614, RT#98402, and RT#109631). 2.1807 2016-12-22 [BUG FIXES] - The definition context (package, file, & line) for attributes on Class::MOP and Moose metaclasses was wrong in all cases. - Slight tweaks to the syntax used for hashes in a few tests, that were broken by a recent Test::More release that started using a new namespace that clashes with a (bareword) type name in these tests. (PR#141, D.Maestro) 2.1806 2016-09-25 [BUG FIXES] - A role generated on the fly (as opposed to one in a file on disk) could not be used as a trait. Fixed by Aaron Cohen. (RT#92089, PR#47). [ENHANCEMENTS] - When a required attribute's init_arg differs from the attribute's name, we now include both the attribute name and init_arg in the exception thrown when that attribute is not provided. (RT#116814, Gordon Fisher) - The unimport sub generated by Moose::Exporter can now be called with parameters like { into => 'Package' } or { into_level => 1 }, just like the import sub it generates. Requested by Dmytro Zagashev. (RT #93666). - Moose::Meta::Attribute objects created from role attributes keep a reference to the Moose::Meta::Role::Attribute which created them. Moose::Meta::Attribute now has ->role_attribute and ->has_role_attribute methods. RT #84563 and #117586. (Dave Rolsky) [DOCUMENTATION] - Updated Moose::Manual::Roles with more detail on role consumption and how to deal with various corner cases involving required methods, multiple roles, etc. 2.1805 2016-08-19 [BUG FIXES] - remove inc/Config.pm that should not have appeared in the distribution (an issue since 2.1800; RT#117071) 2.1804 2016-06-02 [OTHER] - restrict Type::Tiny test to versions new enough to support native traits. - restrict recipe test to perls where Regexp::Common is installable 2.1803 2016-05-31 [BUG FIXES] - fixed type compatibility with Type::Tiny that was partially lost in 2.1802. 2.1802 2016-05-25 [BUG FIXES] - Fixed test failures if Specio 0.14+ was installed. [OTHER] - updated metadata, used by moose-outdated and t/zzz-check-breaks.t, to reflect downstream modules affected by the recent removal of List::MoreUtils. 2.1801 2016-05-02 [OTHER] - bundled an updated ExtUtils::HasCompiler, to support building with a noexec $TMPDIR. 2.1800 2016-04-30 [OTHER] - an increased Data::OptList version has been added to recommended prereqs, for greater speed. (Olivier Mengué, PR#123) 2.1705 2016-04-21 (TRIAL RELEASE) [OTHER] - build-time compiler sanity checking is now done with ExtUtils::HasCompiler instead of ExtUtils::CBuilder. 2.1704 2016-04-13 (TRIAL RELEASE) [BUG FIXES] - Fixed method cache regeneration when a class contains a blessed sub (RT#113704, Graham Knop, PR#122) [TESTS] - restore test on perl 5.8.x when Class::C3::XS is not installed (RT#113704) 2.1703 2016-04-12 (TRIAL RELEASE) [TESTS] - skip dysfunctional test on perl 5.8.x when Class::C3::XS is not installed (RT#113704) 2.1702 2016-04-08 (TRIAL RELEASE) [DOCUMENTATION] - Moose::Meta::Attribute::Native::Trait::Array now documents the return value for 'first_index' when there is no match (-1). [OTHER] - Moose::Exception's message attribute can now be any defined value, so as to allow for objects with a stringification overload in place of a string. 2.1701 2016-04-07 (TRIAL RELEASE) [OTHER] - Fixed the last remaining use of List::MoreUtils (RT#113587) 2.1700 2016-04-06 (TRIAL RELEASE) [OTHER] - Moose::Exception now has a boolean overload. (Graham Knop, PR#119) - All uses of List::MoreUtils have been removed, replaced by inlined forms or equivalents in List::Util. (Graham Knop, PR#120) 2.1605 2016-02-16 [DOCUMENTATION] - Fixed references to test files that were renamed when their associated documentation files were renamed in 2.0500 (RT#111898) - Moose::Manual::Roles now contains a section on handling required attributes in role application (thanks, Kent Fredric!) - a few other, very minor, documentation fixes 2.1604 2015-11-07 [OTHER] - The minimum perl requirement is now set in configure-requires, as well as runtime-requires, to ensure that smokers bail out early enough to declare the installation as a N/A rather than a FAIL. 2.1603 2015-08-28 - No changes from 2.1602-TRIAL (other than a minor documentation tweak). 2.1602 2015-08-14 (TRIAL RELEASE) [BUG FIXES] - Replaced uses of overload::Overloaded with the new Devel::OverloadInfo::is_overloaded (thanks, ilmari!) to work around more issues with overload handling in older versions of perl. 2.1601 2015-08-10 (TRIAL RELEASE) [BUG FIXES] - Explicit boolean overload handling has been added to Class::MOP::Method and Moose::Meta::Role::Method::Required, to work around a bug with the handling of overload fallbacks on perl 5.8.x. In particular this fixes issues observed in MooseX::MethodAttributes. 2.1600 2015-07-31 [DOCUMENTATION] - Made all docs use =head2 and =head3 for methods/functions so that they appear as part of the table of contents on MetaCPAN. 2.1501 2015-07-20 (TRIAL RELEASE) [DOCUMENTATION] - Added a new slideshow by Shawn M. Moore (sartak) to Moose::Manual::Resources - Documentation for exception classes has been rewritten, with Moose::Manual::Exceptions::Manifest changing how it describes each class's attributes and methods. (Dave Rolsky, PR#95) [REVERSIONS] - The change in 2.1500 to allow DOES to check delegated options has been reverted. This turned out to have a variety of issues both in concept and implementation; it will be refined further in MooseX::Does::Delegated. [CHANGED] - The name for an anonymous sub that is used in method modifiers (that shows up in stack traces etc) now identifies the package and method being modified. (Philipp Gortan, PR#94) 2.1500 2015-07-01 (TRIAL RELEASE) [ENHANCEMENTS] - An object's DOES method now also checks roles composed by delegated objects (Chris Prather, PR#104) 2.1405 2015-06-06 [BUG FIXES] - The native 'Array' trait 'sort' accessor now returns the number of elements in scalar context, instead of the undefined value (or a different, seemingly-random, value under 5.23.x). 2.1404 2015-04-17 [BUG FIXES] - Add Sub::Identify to prereqs. (RT #101661) - bump List::Util prereq to avoid a memory leak (RT#101124) [DOCUMENTATION] - Added section to Moose::Manual::Resources to list external links related to Moose (RT #101993, Michael LaGrasta) 2.1403 2014-12-07 [DOCUMENTATION] - Added a section to Moose::Manual::MethodModifiers illustrating how method modifiers work with inheritance. (Andreas Koenig, RT #98940) - Added docs to Moose.pm on the -meta_name import option. This addresses RT #98488. [BUG FIXES] - Fix a test that fails on MSWin32 systems using nmake - fix dev build compilation error when using MSVC (A. Sinan Unur) [OTHER] - the modules in the git repository now have a defined $VERSION, to make it easier to test MooseX::* and other code under development. 2.1402 2014-11-05 [BUG FIXES] - Fix a test that was trying to load Test::Exception instead of Test::Fatal. (Michael Schout) 2.1401 2014-11-03 [BUG FIXES] - The core overloading support interacted badly with MooseX::MarkAsMethods. If you used MooseX::MarkAsMethods in a role that provided overloading, then that overloading would not be properly applied to consuming classes, leading to very weird errors of the form: Can't resolve method "???" overloading """" in package "Class2" ... Note that the problems that MooseX::MarkAsMethods fixes are no longer present if you are using Moose 2.1400+ and namespace::autoclean 0.16+. We encourage you to upgrade both of these modules and remove MooseX::MarkAsMethods from your code base. 2.1400 2014-11-01 [BUG FIXES] - Moose exception classes now stringify all stack frames, to avoid issues in global destruction (see RT#99811) 2.1307 2014-10-26 (TRIAL RELEASE) [ENHANCEMENTS] - Support added to Moose::Exporter for exporting subs by their fully qualified name, as well as coderefs. This avoids internal breakage if some other module has monkey-patched a sub to be exported and left it anonymous (e.g. RT#88669). (Graham Knop, PR#84) [BUG FIXES] - Further refined the overloading fixes from 2.1306, fixing fallback handling on older perl versions (Dave Rolsky, PR#85) 2.1306 2014-10-25 (TRIAL RELEASE) [ENHANCEMENTS] - Rewrote overloading implementation to use a new Class::MOP::Overload object. This object properly captures all overloading information. The Class::MOP::Method::Overload class has been removed. (Dave Rolsky, PR#83) [BUG FIXES] - If a role had method-based overloading but did not actually implement the specified method, its overloading was simply ignored when applying overloading to other roles or classes. Reported by rjbs. RT #98531. 2.1305 2014-10-23 (TRIAL RELEASE) [ENHANCEMENTS] - By default, exceptions thrown from inside Moose now remove most of the Moose internals from their stack trace when stringifying. This makes for much more readable error messages in most cases. Set the MOOSE_FULL_EXCEPTION env var to true to get the complete stack trace. 2.1304 2014-09-25 (TRIAL RELEASE) [BUG FIXES] - closed a memory leak in Moose exception objects where captured stack trace frames would contain circular references to the exception objects themselves (Graham Knop, PR#81) 2.1303 2014-09-20 (TRIAL RELEASE) [TEST FIXES] - fix tests that fail on altered warning messages in perl 5.21.4 (RT#98987) 2.1302 2014-08-20 (TRIAL RELEASE) [BUG FIXES] - When a role consumes another role and they differ in their overloading fallback settings, the consuming role now silently wins instead of throwing an exception. This is consistent with how other role-consumes-role conflicts are handled. - Fixed the docs for overloading conflicts to match reality. 2.1301 2014-08-19 (TRIAL RELEASE) [BUG FIXES] - Conflict detection for overloading operators is now more correct. If a class consumed two roles that both had identical overloading methods (because they got them from some other role, for example), this caused an error, but it shouldn't. GH #4. (rjbs) - Similarly, when a role consumes another role, conflicts in overloading operators are now silently resolved in favor of the consuming role, just as they are with methods. Note that conflicts between the fallback setting for roles are still an error. 2.1300 2014-08-11 (TRIAL RELEASE) [ENHANCEMENTS] - Moose now has core support for overloading in roles. When a role with overloading is applied to classes or other roles, the overloading settings are transferred to the consumer. Conflicts between roles are treated much like method conflicts. This obviates the need for MooseX::Role::WithOverloading. If you are using MooseX::Role::WithOverloading, upgrade to version 0.15+ and it will simply become a no-op when used with this version of Moose. [OTHER] - The overloading info methods for roles and classes no longer treat "fallback" as an overloaded op. Instead, there are new get_overload_fallback_value() and set_overload_fallback_value() methods to deal with this explicitly. This is arguably a bug fix. 2.1213 2014-09-25 [BUG FIXES] - closed a memory leak in Moose exception objects where captured stack trace frames would contain circular references to the exception objects themselves (Graham Knop, PR#81) 2.1212 2014-09-19 [TEST FIXES] - fix tests that fail on altered warning messages in perl 5.21.4 (RT#98987) 2.1211 2014-08-12 [DOCUMENTATION] - Updated Changes and Moose::Manual::Delta to note when we started removing lazy_build from docs. Also added a note in the Moose::Meta::Attribute docs stating that use of this feature is discouraged. - Added a pointer from the auto_deref feature to Moose::Meta::Attribute::Native. This is often a better choice. [OTHER] - The subs installed by Moose::Exporter->setup_import_methods are now named using Sub::Name (Dave Rolsky, RT#97572) 2.1210 2014-07-03 [DOCUMENTATION] - Clarify that Moose::Exception exists for internal usage and that user code is better off using the Throwable role or Throwable::Error superclass. - Moose::Manual::Support policy clarified regarding legacy Perl versions [OTHER] - logic has been removed for an alpha branch of Test::Builder that will never see the light of day, and will break with upcoming Test::Builder changes (Exodist) 2.1209 2014-06-05 [OTHER] - The is_anon method now always returns false when called on Moose::Meta::Role::Composite objects. This isn't strictly right, but for the purposes of Moose internals, where "is_anon" really means "needs to be cleaned up", it's correct. This fixes warnings that were seen when using recent Moose (2.1100+) and MooseX::Role::Parameterized roles as part of a composite role. These warnings only appear with Perl 5.16 and earlier. 2.1208 2014-06-01 [BUG FIXES] - fix implementation of throw_exception in internal Class::MOP traits, caused by changes in 2.1207 (ether, RT#96112) 2.1207 2014-05-26 [OTHER] - Fixed Specio support to work with the latest Specio (0.10). This version of Specio no longer uses Moose internally. - exceptions in Class::MOP no longer use Moose::Util, instead using their own private implementation of throw_exception, to avoid needless premature loading of Moose logic. 2.1206 2014-05-14 [BUG FIXES] - exceptions should not throw other exceptions; fixes cases where exceptions were reporting the wrong error (Upasana, RT#92818 and RT#94795) [OTHER] - prereqs needed strictly for building with Dist::Zilla have been moved from develop requires to develop recommends, to simplify automated testing on older perls that cannot install all Dist::Zilla components - removed instances of metaobjects in exception classes where they're not really required 2.1205 2014-04-16 [ENHANCEMENTS] - new utility interface: Moose::Util::is_role [BUG FIXES] - better error message provided when trying to load a trait class that does not exist in @INC (Upasana, RT#94731) [OTHER] - new test added, to run last, which runs `moose-outdated` as a possibly more visible mechanism to provide important information to the user (re RT#92780) 2.1204 2014-02-07 [BUG FIXES] - bump minimum prereq needed for optional test using MooseX::NonMoose (which broke with new Module::Runtime, see 2.1203), so users can install Moose and pass tests before updating MooseX::NonMoose. 2.1203 2014-02-07 [BUG FIXES] - bump prereq on Module::Runtime to properly detect when a module fails to load, and fix how we call these subs (Zefram, RT#92770, RT#86394, RT#92791) [ENHANCEMENTS] - line numbers in shipped code are now almost the same (within 3) as the repository source, for easier debugging 2.1202 2014-01-20 [BUG FIXES] - string comparisons are now possible with Moose exceptions (RT#92232) 2.1201 2014-01-11 [OTHER] - re-release to index pod files (Moose::Cookbook::*, Moose::Manual::* etc). 2.1200 2014-01-06 [OTHER] - Releasing 2.1108 as stable (last stable release was 2.1005). 2.1108 2014-01-05 (TRIAL RELEASE) [OTHER] - fixed distribution manifest - minor documentation and metadata updates 2.1107 2013-11-29 (TRIAL RELEASE) [OTHER] - many additions to the list of conflicting modules (those that require updates after installing Moose), reflecting recent API changes - now failing early at build time, with a useful error message, if a compiler is not available 2.1106 2013-11-05 (TRIAL RELEASE) [BUG FIXES] - throw_error import cleaned from Moose::Object after use (doy) - resolved new circular load issue between Moose::Util and Class::MOP (Kent Fredric, RT#89713 and PR#42) 2.1105 2013-10-31 (TRIAL RELEASE) [BUG FIXES] - legacy throw_error now takes multiple arguments, like confess does (Karen Etheridge) 2.1104 2013-10-30 (TRIAL RELEASE) [BUG FIXES] - Class::MOP::Object::_inline_throw_error is back, used by some MooseX modules (Upasana) 2.1103 2013-10-26 (TRIAL RELEASE) [BUG FIXES] - fix errors in last trial release relating to Moose::Error::Default, Moose::Util::throw_error (Upasana) 2.1102 2013-10-20 (TRIAL RELEASE) [BUG FIXES] - die if a role to consume can't be found -- this restores behaviour as in 2.1005 (doy) - fix test to accomodate Devel::PartialDump possibly not being installed (Upasana) 2.1101 2013-10-20 (TRIAL RELEASE) [ENHANCEMENTS] - Moose string exceptions have been replaced by Moose::Exception objects. See Moose::Manual::Delta for details. 2.1100 2013-09-07 (TRIAL RELEASE) [DEPRECATIONS] - Class::MOP::load_class, Class::MOP::is_class_loaded, and Class::MOP::load_first_existing_class are now deprecated. See Moose::Manual::Delta for details. - The non-arrayref forms of enum and duck_type have been deprecated. See Moose::Manual::Delta for details. - Many deprecated features have now been removed: - optimize_as for type constraints - the "default is" and "default default" features for native delegations - setting coerce => 1 on an attribute whose type constraint has no coercion - the public version of Moose::Meta::Method::Destructor::initialize_body [ENHANCEMENTS] - Creating classes with Moose now always sets the appropriate entry in %INC, even if it wasn't loaded from a file. This should make writing classes inline easier, and will allow us to be more intelligent about figuring out when classes are loaded in the future. See Moose::Manual::Delta for more details. Note that this is slightly backwards-incompatible in some edge cases. - Moose now uses Module::Runtime instead of Class::Load to load classes. This means that there are no more issues with the weird heuristics that Class::Load does to determine if a class was previously loaded (inheriting from an empty package is now possible, for instance). See Moose::Manual::Delta for more details. This is also slightly backwards-incompatible in some edge cases. 2.1005 2013-08-07 [ENHANCEMENTS] - add_method now accepts blessed subs (Graham Knop, PR#28) [BUG FIXES] - If a role consumed another role, we resolve method conflicts just like a class consuming a role, but when metaclass compat tried to fix up metaclass roles, we were putting all methods into one composite role and allowing methods in the metaclass roles to conflict. Now we resolve them as we should. (Jesse Luehrs, PR#27) - Some edge cases in tests with base.pm and non-existent module files are handled more strictly (see also perl RT#118561) (Graham Knop, PR#25) 2.1004 2013-07-26 [BUG FIXES] - 2.1003 was released with some bad metadata, which caused the prereq test to fail. 2.1003 2013-07-26 [OTHER] - Releasing 2.0901 as stable. 2.0901 2013-06-21 (TRIAL RELEASE) [ENHANCEMENTS] - The with_immutable() sub from Test::Moose now passes a boolean value to the code block containing tests indicating whether or not the classes have been made immutable. This can make for nicer test descriptions. (Dave Rolsky) - You can now use Specio types instead of Moose builtins or MooseX::Types. However, this support is still experimental (as is Specio), so use it with care. (Dave Rolsky) 2.0900 2013-05-27 (TRIAL RELEASE) [API CHANGES] - Fixed the Num builtin type to reject NaN, Inf, numbers with whitespace, and other questionable strings. The MooseX::Types::LaxNum distribution implements the old behavior. RT#70539 (Upasana) 2.0802 2013-05-07 [ENHANCEMENTS] - fix incompatibilities with Test::Builder 1.005+ (Karen Etheridge) - Moose::Manual::Contributing updated to reflect the change of primary repository from git.moose.perl.org to github.com 2.0801 2013-03-28 [BUG FIXES] - properly apply traits at compile time (error introduced in 2.0800, RT#77974). (doy) 2.0800 2013-03-28 [ENHANCEMENTS] - The super() subroutine now carps if you pass it arguments. These arguments are always ignored, but we used to ignore them silently. RT #77383. - Roles can now override methods from other roles they consume directly, without needing to manually exclude them (just like classes can). (mst) [BUG FIXES] - Fix false positive when checking for circular references for modules that use the "also" parameter with Moose::Exporter. Reported by Jon Swartz. Fixed by Matthew Wickline. RT #63818. - Fix memory leak in type unions. (Karen Etheridge) RT#83929. - Fix application of traits at compile time. (doy) RT#77974. 2.0604 2012-09-19 [BUG FIXES] - Fix nonsensical error message for inlined accessors of required attributes. (doy) - Stop trying to localize a lexical (blead now throws an error for this). RT #79257, perl #114628. (sprout) [OTHER] - Depend on a version of Carp new enough to have caller_info. RT #79367. (pshangov) 2.0603 2012-06-28 [BUG FIXES] - Fix test failure in blead. RT #78085. 2.0602 2012-05-07 [BUG FIXES] - Ensure that the Moose::Exporter-generated init_meta returns the same value that it did previously. This isn't really a bug, since the return value has never been tested or documented, but since the generated init_meta is nothing more than a compatibility shim at this point, there's no reason to not make it as compatible as possible. Reported by Moritz Onken. (doy) [DOCUMENTATION] - The lazy_build attribute feature was removed from Moose::Manual::BestPractices. 2.0601 2012-05-01 [BUG FIXES] - Fix init_meta order when multiple also packages are specified (this matters when one of them is being used to actually initalize the metaclass, typically with also => 'Moose'). Reported by Randy Stauner. (doy) 2.0600 2012-04-29 [OTHER] - Releasing 2.0502 as stable. 2.0502 2012-04-25 (TRIAL RELEASE) [OTHER] - The Test::DependentModules test now covers a much wider range of downstream dependents (all of them in fact, for some definition of "all"). This should allow us to track inadvertent backwards compatibility breakages much more effectively. (doy) - A few test tweaks to avoid spurious failures. (doy) 2.0501 2012-04-03 (TRIAL RELEASE) [BUG FIXES] - Avoid syntax errors on pre-5.14. (doy) 2.0500 2012-04-03 (TRIAL RELEASE) [NEW FEATURES] - Class::MOP::Class now has methods for introspecting and modifying the overloaded operators for a class. (doy) [ENHANCEMENTS] - The cookbook recipes have all been renamed. Instead of numbered recipes (Basics::Recipe1), we now have descriptive names (Basics::Point_AttributesAndSubclassing). This makes it easier for us to add and remove recipes in the future, and makes it a little easier to converse about them, since the name gives us some clue of what they contain. [BUG FIXES] - Re-declaring a class_type or role_type constraint that has already been declared now just returns the original type constraint, rather than replacing the original constraint and ergo losing any coercions that were on the original constraint. Fixes RT #73289. (t0m) - Moose::Exporter now calls init_meta methods in the correct order, when multiple levels of 'also' parameters are specified. Reported by Rocco Caputo. (doy, perigrin) - Moose::Exporter no longer generates init_meta methods in order to apply metaroles, since the metaclass itself isn't guaranteed to exist yet at that point. Metaroles are now applied at the end of import, after all user-defined init_meta methods have been called. Fixes RT #51561. (doy) - Fixed a memory leak. This occurred when creating an anonymous class. Immutabilizing an anonymous class still leaks memory due to a bug in Eval::Closure (which should hopefully be fixed soon). Based on code and bug report from Carlos Lima. RT #74650. - Fix a segfault when adding a method to a class which was defined in a package which was deleted. (doy) 2.0403 2012-04-03 [OTHER] - No changes, reupload to fix indexing. 2.0402 2012-02-04 [OTHER] - Minor documentation fixes. - Fix test failure on blead (test was unnecessarily strict). Reported by Nicholas Clark. (doy) 2.0401 2011-11-17 [BUG FIXES] - Attributes with weak_ref now weaken their associated slot when they are initialized through a lazy default or builder. Reported by tome. (doy) 2.0400 2011-11-15 [OTHER] - No changes from 2.0302 (other than a few minor documentation tweaks). 2.0302 2011-11-02 (TRIAL RELEASE) [BUG FIXES] - Fix test failure on 5.8. (Dave Rolsky) - Make make_immutable return value consistent and document it to be true. (mst) 2.0301 2011-10-21 (TRIAL RELEASE) [BUG FIXES] - Fix compilation on 5.8. Reported by ether. (doy) - A custom error class caused a warning when the class that used it was made immutable. Reported by Maroš Kollár. RT #71514. (Dave Rolsky) [ENHANCEMENTS] - The enum type will now allow single value enumerations. Previously, two or more values were required. (rjbs) 2.0300 2011-09-23 (TRIAL RELEASE) [DEPRECATIONS] - The optimize_as option for type constraints has been deprecated. Use the inline_as option to provide inlining code instead. (Dave Rolsky) [API CHANGES] - Methods to introspect a class's methods will now return methods defined in UNIVERSAL (isa, can, etc.). This also means that you can wrap these methods with method modifiers. RT #69839. Reported by Vyacheslav Matyukhin. (Dave Rolsky) - The ->parent and ->parents method for a union now return the nearest common ancestor of that union's component types. See Moose::Manual::Delta for more details. (Dave Rolsky) - The ->parents method used to return an arrayref for union types, and a list of one or more types for all other types. Now they all return lists. (Dave Rolsky) - The ->is_subtype_of and ->is_a_type_of methods have changed their behavior for union types. Previously, they returned true if any of their member types returned true for a given type. Now, all of the member types must return true. RT #67731. (Dave Rolsky) [ENHANCEMENTS] - The Moose::Exporter module now has a "meta_lookup" option when creating an importer. This allows you to specify an alternate method for determining the metaclass of a caller. This is useful for modules like MooseX::Role::Parameterized which generate new metaclasses on the fly. (sartak) - Added a Moose::Meta::Method->is_stub method. (Dave Rolsky) [BUG FIXES] - A subtype of a union type did not return the right results when you called ->is_subtype_of or ->is_a_type_of on it. This has been fixed. RT #70322. (Dave Rolsky) - An attribute accessor or delegation method can overwrite a stub method and this will no longer throw an error. Reported by Mark-Jason Dominus. RT #69988. (Dave Rolsky) - The error generated by unfulfilled method requirements during role composition now mentions how to work around imported methods not being recognized. Reported by Michael Schwern. RT #60583. (doy) - class_type and role_type will now throw errors if you attempt to use them to override existing types, just like type and subtype have always done. (doy) - Implicitly creating class or role types by using them as the 'isa' or 'does' parameter to attribute construction will now register the type. This means that it cannot later be redefined as something else. (doy) - $class_type->is_subtype_of no longer returns true if passed the name of the class that the class type represents when the class type wasn't registered. (doy) - Removing anonymous metaclasses prematurely no longer prevents reaping of the associated stash. (doy) [OTHER] - The Class::MOP::load_class and Class::MOP::is_class_loaded subroutines are no longer documented, and will cause a deprecation warning in the future. Moose now uses Class::Load to provide this functionality, and you should as well. (Dave Rolsky) 2.0205 2011-09-06 [NEW FEATURES] - The Array and Hash native traits now provide a "shallow_clone" method, which will return a reference to a new container with the same contents as the attribute's reference. [ENHANCEMENTS] - Specifying an invalid value in a hashref 'handles' value now throws a sensible error. Reported by Mark-Jason Dominus. RT #69990. (Dave Rolsky) [BUG FIXES] - When specifying an attribute trait, passing options for the trait besides -alias or -excludes caused a warning. However, passing other options is totally valid when using MooseX::Role::Parameterized. Fixes RT #70419. (sartak) - Allow regexp objects in duck_type constraints (to bring this in line with the Object constraint). 2.0204 2011-08-25 [BUG FIXES] - Validating duck_type type constraint turned out to work only by accident, and only when not running under the debugger. This has been fixed. (Florian Ragwitz) [OTHER] - Loosen the dependency on ExtUtils::ParseXS. 2.0203 2011-08-23 [BUG FIXES] - is_class_loaded now properly detects packages which have a version object in their $VERSION. - Fix XS compilation under blead. 2.0202 2011-07-26 [BUG FIXES] - Be more consistent about how type constraint messages are handled. 2.0201 2011-07-22 [BUG FIXES] - Moose::Util::does_role shouldn't call ->does on things that don't inherit from Moose::Object. - Make ->does initialize the metaclass, so that calling it as a class method on a class which sets up inheritance via some method other than extends works properly (this fixes an issue with MooseX::Types). - Make Dist::CheckConflicts a runtime requirement, so moose-outdated always works. 2.0200 2011-07-18 [OTHER] - No changes from 2.0105 (other than a few minor documentation tweaks). 2.0105 2011-06-27 (TRIAL RELEASE) [ENHANCEMENTS] - Moose::Util::does_role now respects overridden ->does methods. (doy) 2.0104 2011-06-20 (TRIAL RELEASE) [OTHER] - Include changes from 2.0010. 2.0103 2011-06-20 (TRIAL RELEASE) [DEPRECATIONS] - Several things that have been deprecated for a while have been removed. See the 2.0000 section in Moose::Manual::Delta for details. [NEW FEATURES] - New Moose::Util::TypeConstraints::union function for creating union type constraints without having to rely on the string type constraint parsing. This also allows for creating unions of anonymous type constraints. (kentnl) [OTHER] - Include changes from Moose 2.0009. 2.0102 2011-06-18 (TRIAL RELEASE) [ENHANCEMENTS] - The native Array trait now has a 'first_index' method, which works just like the version in List::MoreUtils. (Karen Etheridge) - Clean up some internal code to help out extensions. [OTHER] - Include changes from Moose 2.0008. 2.0101 2011-06-06 (TRIAL RELEASE) [OTHER] - Various packaging issues. 2.0100 2011-06-06 (TRIAL RELEASE) [DEPRECATIONS] - Using a hand-optimized type constraint is now deprecated. In keeping with our release policy, this won't actually start warning until the 2.0200 release. [NEW FEATURES] - Type constraints can now provide inlined versions, which should make inlined code which uses type constraints (such as accessors) faster. This replaces the existing hand-optimized constraint feature. (Dave Rolsky) [ENHANCEMENTS] - Remove a lot of cases where generated methods closed over meta objects. Most simple cases should now only close over simple data types and coderefs. This should make deparsing simpler. 2.0010 2011-06-20 [BUG FIXES] - Fix regression in 2.0009 and 2.0103 when applying roles during init_meta in an exporter that also re-exports Moose or Moose::Role. (t0m, ilmari) 2.0009 2011-06-19 [BUG FIXES] - duck_type type constraints now report reasonable errors when given something which isn't an instance of an object. (t0m) - Moose::Util::apply_all_roles now works even if the applicant is a non-Moose class. (perigrin) - When an object is reblessed, triggers are called on attributes that are set during the reblessing. (Karen Etheridge). [OTHER] - Better error message if Moose->init_meta is called with a 'metaclass' option when that metaclass hasn't been loaded. (jasonmay) 2.0008 2011-06-16 [BUG FIXES] - The 'accessor' native delegation for hashrefs now allows setting the value to undef. (sugoik, doy) [ENHANCEMENTS] - Various generated methods have more useful context information. (doy) 2.0007 2011-05-15 [BUG FIXES] - Make sure weak attributes remain weak when cloning. (doy, rafl) 2.0006 2011-05-09 [BUG FIXES] - Revert the List::MoreUtils version bump, as it breaks backwards compatibility. The dependency will be bumped with Moose 2.0200. 2.0005 2011-05-09 [BUG FIXES] - Only sort the alias keys when determining caching. 2.0004 2011-05-09 [BUG FIXES] - Bump the List::MoreUtils dep to avoid buggy behavior in old versions. - Sort the list of roles and the alias and excludes parameters when determining caching, since their order doesn't matter. 2.0003 2011-05-09 [BUG FIXES] - Applying multiple role objects (rather than role names) at once no longer skips every other role. (rjbs) - Caching of anon classes now works more sanely in the presence of role application parameters - alias and excludes options are taken into account, and caching is disabled entirely if other parameters exist. Asking for caching (instead of just not weakening) when parameters are given will begin warning in Moose 2.0200. (doy, autarch) 2.0002 2011-04-28 [ENHANCEMENTS] - Provide definition context information for constructors and destructors, so that they will show up as something other than "generated method (unknown origin)". Also, add the package that accessors are defined in to their definition context. - Use Devel::PartialDump in type constraint error messages, if it is installed. [BUG FIXES] - Stop hiding warnings produced by throwing errors in DEMOLISH methods. - The 'reset' native delegation for Counter attributes will now also respect builders (previously, it only respected defaults). 2.0001 2011-04-22 [ENHANCEMENTS] - Anonymous classes and roles now have a unified implementation in Class::MOP::Package. This means that anonymous packages are now also possible. (Shawn M Moore, doy) [BUG FIXES] - No longer call XSLoader from multiple places, as this causes issues on older perls. (doy, ribasushi) - Moose::Meta::Role->create now accepts the 'roles' parameter, as it was documented to. (Chris Weyl) - Depend on Eval::Closure 0.04, which fixes some issues in mod_perl environments. (doy, mateu) 2.0000 2011-04-11 [API CHANGES] - The RegexpRef type constraint now accepts regular expressions blessed into other classes, such as those found in pluggable regexp engines. Additionally the 'Object' constraint no longer rejects objects implemented as a blessed regular expression. (David Leadbeater) [DOCUMENTATION] - The lazy_build attribute feature was mostly removed from the docs and is no longer encouraged. [OTHER] - Moose::Manual::Support now explicitly states when major releases are allowed to happen (January, April, July, or October). 1.9906 2011-04-04 (TRIAL RELEASE) [OTHER] - Update conflicts list. - Minor pod updates. 1.9905 2011-03-28 (TRIAL RELEASE) [NEW FEATURES] - The Moose::Meta::Role::Attribute class now has an original_role method which returns the role which first defined an attribute. See the docs for details. (Dave Rolsky) - Moose::Util::MetaRole will make sure that the class to which you're applying metaroles or base class roles can actually have them applied. If not (it's not a Moose class, it has a non-Moose metaclass, etc.), then it gives a useful error message. Previously, this would just end up dying in the MetaRole code without a useful message. (Dave Rolsky) [BUG FIXES] - When a role had its own applied_attribute metaclass (usually from MetaRole application), that metaclass would get lost when that role participated in role composition. It was also lost if that role was consumed by some other role. Both of these cases have been fixed. Attributes are always applied with the applied_attribute metaclass of the role which originally defined them. (Dave Rolsky) 1.9904 2011-03-04 (TRIAL RELEASE) [BUG FIXES] - Reinitializing anonymous roles used to accidentally clear out the role's stash in some circumstances. This is now fixed. (doy) - The Int type constraint now rejects integers with trailing newlines. (Matthew Horsfall) 1.9903 2011-02-28 (TRIAL RELEASE) [BUG FIXES] - Reverse the order that Moose::Exporter 'also' exports are dispatched. When trying to re-export from a package that itself exported a modified set of Moose sugar, you'd get the original Moose sugar instead of the overrides. There are also now tests for this. (perigrin) - Don't initialize lazy attributes with defaults in the constructor (for immutable classes). (mo) - When reinitializing meta objects for classes and roles, we failed to preserve roles and role applications. This led to weird bugs. Many MooseX modules end up reinitializing your class or role. (Dave Rolsky) 1.9902 2011-01-03 (TRIAL RELEASE) [OTHER] - Fix generation of CCFLAGS. - Add a bit more Dist::Zilla functionality. 1.9901 2011-01-03 (TRIAL RELEASE) [OTHER] - Fix some indexing issues. - Fix a few issues with the conflict checking stuff. 1.9900 2011-01-01 (TRIAL RELEASE) [OTHER] - The entire Class::MOP distribution has been merged with Moose. In the future, the Class::MOP code itself will be merged into Moose, and eventually the Class::MOP namespace will disappear entirely. For the current release, we have simply changed how Class::MOP is distributed. (Dave Rolsky). - Switched to Dist::Zilla for development. However, we still have a minimal Makefile.PL in the repository that can be used for development. (Dave Rolsky) [API CHANGES] - Roles now have their own default attribute metaclass to use during application to a class, rather than just using the class's attribute_metaclass. This is also overridable via ::MetaRole, with the applied_attribute key in the role_metaroles hashref (doy). - The internal code used to generate inlined methods (accessor, constructor, etc.) has been massively rewritten. MooseX modules that do inlining will almost certainly need to be updated as well. [ENHANCEMENTS] - We now load the roles needed for native delegations only as needed. This speeds up the compilation time for Moose itself. (doy) 1.25 2011-04-01 [BUG FIXES] - Reinitializing anonymous roles used to accidentally clear out the role's stash in some circumstances. This is now fixed. (doy) (backported from 1.9904) 1.24 2011-02-22 [BUG FIXES] - Reverse the order that Moose::Exporter 'also' exports are dispatched. When trying to re-export from a package that itself exported a modified set of Moose sugar, you'd get the original Moose sugar instead of the overrides. There are also now tests for this. (perigrin) (backported from 1.9903) 1.23 2011-02-13 [PACKAGING FIX] - The 1.22 release had a bad MANIFEST. This has been fixed. 1.22 2011-02-13 [BUG FIXES] - When reinitializing meta objects for classes and roles, we failed to preserve roles and role applications. This led to weird bugs. Many MooseX modules end up reinitializing your class or role. (Dave Rolsky) (backported from 1.9903) 1.21 2010-11-24 [ENHANCEMENTS] - The Support manual has been updated to reflect our new major/minor version policy. (Chris Prather) - The Contributing manual has been updated to reflect workflow changes based on this new support policy. (doy) [BUG FIXES] - The role attribute metaclass did not inherit from Class::MOP::Object, which could cause errors when trying to resolve metaclass compatibility issues. Reported by Daniel Ruoso. (doy) - The lazy_build feature was accidentally removed from all the docs. Now it's listed in Moose.pm again. (Chris Prather) 1.20 2010-11-19 [BUG FIXES] - When using native delegations, if an array or hash ref member failed a type constraint check, Moose ended up erroring out with "Can't call method "get_message" on unblessed reference" instead of generating a useful error based on the failed type constraint. Reported by t0m. RT #63113. (Dave Rolsky) 1.19 2010-11-02 [BUG FIXES] - There was still one place in the code trying to load Test::Exception instead of Test::Fatal. (Karen Etheridge) 1.18 2010-10-31 [ENHANCEMENTS] - Type constraint objects now have an assert_coerce method which will either return a valid value or throw an error. (rjbs) - We now warn when an accessor for one attribute overwrites an accessor for another attribute. RT #57510. (Dave Rolsky) [BUG FIXES] - The native Array and Hash delegation methods now coerce individual new members if the _member type_ has a coercion. In other words, if the array reference is defined as an ArrayRef[DateTime], and you've defined a coercion from Int to DateTime, then pushing an integer via a delegation method will coerce the integer to a DateTime object. Reported by Karen Etheridge. RT #62351. (Dave Rolsky) - An attribute using native delegations did not always properly coerce and type check a lazily set default value. (doy and Dave Rolsky) - Using a regexp to define delegations for a class which was not yet loaded did not actually work, but did not explicitly fail. However, it caused an error when the class was loaded later. Reported by Max Kanat-Alexander. RT #60596. (Dave Rolsky) - Attempting to delegate to a class or role which is not yet loaded will now throw an explicit error. (Dave Rolsky) - Attempting to set lazy_build in an inherited attribute was ignored. RT #62057. (perigrin) [OTHER] - The Moose test suite now uses Test::Fatal instead of Test::Exception. (rjbs) 1.17 2010-10-19 [BUG FIXES] - Make native delegation inlining work with instance metaclasses where slot access is an do {} block, like Kioku. This fixes the use of native delegations together with Kioku. (Scott, doy) 1.16 2010-10-18 [ENHANCEMENTS] - Almost every native delegation method which changes the attribute value now has an explicitly documented return value. In general, this return value matches what Perl would return for the same operation. (Dave Rolsky) - Lots of work on native delegation documentation, including documenting what arguments each native delegation method allows or requires. (Dave Rolsky) - Passing an odd number of args to ->new() now gives a more useful warning than Perl's builtin warning. Suggested by Sir Robert Burbridge. (Dave Rolsky) - Allow disabling stack traces by setting an environment variable. See Moose::Error::Default for details. This feature is considered experimental, and may change in a future release. (Marcus Ramberg) - The deprecation warning for using alias and excludes without a leading dash now tells you the role being applied and what it was being applied to. (mst). [BUG FIXES] - A number of native trait methods which expected strings as arguments did not allow the empty string. This included Array->join, String->match, String->replace, and String->substr. Reported by Whitney Jackson. RT #61962. (Dave Rolsky) - 'no Moose' no longer inadvertently removes imports it didn't create itself. RT #60013. (Florian Ragwitz, doy) - Roles now support passing an array reference of method names to method modifier sugar functions. (doy) - Native traits no longer use optimized inlining routines if the instance requests it (in particular, if inline_get_slot_value doesn't return something that can be assigned to). This should fix issues with KiokuDB::Class. (doy) - We now ignore all Class::MOP and Moose classes when determining what package called a deprecated feature. This should make the deprecation warnings saner, and make it possible to turn them off more easily. (Dave Rolsky) - The deprecated "default is" warning no longer happens if the attribute has any accessor method defined (accessor, reader, writer). Also, this warning only happens when a method that was generated because of the "default is" gets called, rather than when the attribute is defined. (Dave Rolsky) - The "default default" code for some native delegations no longer issues a deprecation warning when the attribute is required or has a builder. (Dave Rolsky) - Setting a "default default" caused a fatal error if you used the builder or lazy_build options for the attribute. Reported by Kent Fredric. RT #59613. (Dave Rolsky) 1.15 2010-10-05 [API CHANGES] - Major changes to Native Traits, most of which make them act more like "normal" attributes. This should be mostly compatible with existing code, but see Moose::Manual::Delta for details. - A few native traits (String, Counter, Bool) provide default values of "is" and "default" when you created an attribute. Allowing them to provide these values is now deprecated. Supply the value yourself when creating the attribute. - New option 'trait_aliases' for Moose::Exporter, which will allow you to generate non-global aliases for your traits (and allow your users to rename the aliases, etc). (doy) - 'use Moose' and 'use Moose::Role' now accept a '-meta_name' option, to determine which name to install the 'meta' name under. Passing 'undef' to this option will suppress generation of the meta method entirely. (doy) - Moose now warns if it overwrites an existing method named "meta" in your class when you "use Moose". (doy) [ENHANCEMENTS] - Native Trait delegations are now all generated as inline code. This should be much faster than the previous method of delegation. In the best case, native trait methods will be very highly optimized. - Reinitializing a metaclass no longer removes the existing method and attribute objects (it instead fixes them so they are correct for the reinitialized metaclass). This should make the order of loading many MooseX modules less of an issue. (doy) - The Moose::Manual docs have been revised and updated. (Dave Rolsky) [BUG FIXES] - If an attribute was weak, setting it to a non-ref value after the object was constructed caused an error. Now we only call weaken when the new value is a reference. - t/040_type_constraints/036_match_type_operator.t failed on 5.13.5+. Fixed based on a patch from Andreas Koenig. 1.14 2010-09-21 [BUG FIXES] - Work around what looks like a bug in List::MoreUtils::any. This bug caused a weird error when defining the same union type twice, but only when using MooseX::Types. Reported by Curtis Jewell. RT #61001. (Dave Rolsky) 1.13 2010-09-13 [API CHANGES] - The deprecation warnings for alias and excludes are back, use -alias and -excludes instead. (Dave Rolsky) [ENHANCEMENTS] - When composing one role into another and there is an attribute conflict, the error message now includes the attribute name. Reported by Sam Graham. RT #59985. (Dave Rolsky) - When a class is made immutable, the does_role method is overridden with a much faster version that simply looks role names up in a hash. Code which uses lots of role-based type constraints should be faster. (Dave Rolsky) 1.12 2010-08-28 [BUG FIXES] - Fix the MANIFEST. Fixes RT #60831, reported by Alberto Simões. 1.11 2010-08-27 [API CHANGES] - An attribute in a subclass can now override the value of "is". (doy) - The deprecation warnings for alias and excludes have been turned back off for this release, to give other module authors a chance to tweak their code. (Dave Rolsky) [BUG FIXES] - mro::get_linear_isa was being called as a function rather than a method, which caused problems with Perl 5.8.x. (t0m) - Union types always created a type constraint, even if their constituent constraints did not have any coercions. This bogus coercion always returned undef, which meant that a union which included Undef as a member always coerced bad values to undef. Reported by Eric Brine. RT #58411. (Dave Rolsky) - Union types with coercions would always fall back to coercing the value to undef (unintentionally). Now if all the coercions for a union type fail, the value returned by the coercion is the original value that we attempted to coerce. (Dave Rolsky). 1.10 2010-08-22 [API CHANGES] - The long-deprecated alias and excludes options for role applications now issue a deprecation warning. Use -alias and -excludes instead. (Dave Rolsky) [BUG FIXES] - Inlined code no longer stringifies numeric attribute defaults. (vg, doy) - default => undef now works properly. (doy) - Enum type constraints now throw errors if their values are nonsensical. (Sartak) [ENHANCEMENTS] - Optimizations that should help speed up compilation time (Dave Rolsky). 1.09 2010-07-25 [API CHANGES] - You can no longer pass "coerce => 1" for an attribute unless its type constraint has a coercion defined. Doing so will issue a deprecation warning. (Dave Rolsky) - Previously, '+foo' only allowed a specific set of options to be overridden, which made it impossible to change attribute options related to extensions. Now we blacklist some options, and anything else is allowed. (doy, Tuomas Jormola) - Most features which have been declared deprecated now issue a warning using Moose::Deprecated. Warnings are issued once per calling package, not repeatedly. See Moose::Deprecated for information on how you can shut these warnings up entirely. Note that deprecated features will eventually be removed, so shutting up the warnings may not be the best idea. (Dave Rolsky) - Removed the long-deprecated Moose::Meta::Role->alias_method method. (Dave Rolsky). [NEW FEATURES] - We no longer unimport strict and warnings when Moose, Moose::Role, or Moose::Exporter are unimported. Doing this was broken if the user explicitly loaded strict and warnings themself, and the results could be generally surprising. We decided that it was best to err on the side of safety and leave these on. Reported by David Wheeler. RT #58310. (Dave Rolsky) - New with_traits helper function in Moose::Util. (doy) [BUG FIXES] - Accessors will no longer be inlined if the instance metaclass isn't inlinable. (doy) - Use Perl 5.10's new recursive regex features, if possible, for the type constraint parser. (doy, nothingmuch) [ENHANCEMENTS] - Attributes now warn if their accessors overwrite a locally defined function (not just method). (doy) [OTHER] - Bump our required perl version to 5.8.3, since earlier versions fail tests and aren't easily installable/testable. 1.08 2010-06-15 [ENHANCEMENTS] - Refactored a small amount of Moose::Meta::Method::Constructor to allow it to be overridden more easily (doy). 1.07 2010-06-05 [BUG FIXES] - Fixed a minor metaclass compatibility fixing bug dealing with immutable classes and non-class metaclass traits (doy, dougdude). 1.06 2010-06-01 [NEW FEATURES] - Added '0+' overloading in Moose::Meta::TypeConstraint so that we can more uniformly compare type constraints between 'classic' Moose type constraints and MooseX::Types based type constraints. 1.05 2010-05-20 [API CHANGES] - Packages and modules no longer have methods - this functionality was moved back up into Moose::Meta::Class and Moose::Meta::Role individually (through the Class::MOP::Mixin::HasMethods mixin) (doy). - BUILDALL is now called by Moose::Meta::Class::new_object, rather than by Moose::Object::new. (doy) [NEW FEATURES] - strict and warnings are now unimported when Moose, Moose::Role, or Moose::Exporter are unimported. (doy, Adam Kennedy) - Added a 'consumers' method to Moose::Meta::Role for finding all classes/roles which consume the given role. (doy) [BUG FIXES] - Fix has '+attr' in Roles to explode immediately, rather than when the role is applied to a class (t0m). - Fix type constraint validation messages to not include the string 'failed' twice in the same sentence (Florian Ragwitz). - New type constraints will default to being unequal, rather than equal (rjbs). - The tests no longer check for perl's behavior of clobbering $@, which has been fixed in perl-5.13.1 (Florian Ragwitz). - Metaclass compatibility fixing has been completely rewritten, and should be much more robust. (doy) 1.04 2010-05-20 - This release was broken and has been deleted from CPAN shortly after its upload. 1.03 2010-05-06 [NEW FEATURES] - Allow specifying required versions when setting superclasses or applying roles (Florian Ragwitz). 1.02 2010-05-01 [BUG FIXES] - Stop the natatime method provided by the native Array trait from returning an exhausted iterator when being called with a callback. (Florian Ragwitz) - Make Moose::Meta::TypeConstraint::Class correctly reject RegexpRefs. (Florian Ragwitz) - Calling is_subtype_of on a Moose::Meta::TypeConstraint::Class with itself or the class the TC represents as an argument incorrectly returned true. This behavior is correct for is_type_of, not is_subtype_of. (Guillermo Roditi) - Use File::Temp for temp files created during tests. Previously, files were written to the t/ dir, which could cause problems of the user running the tests did not have write access to that directory.. (Chris Weyl, Ævar Arnfjörð Bjarmason) - Pass role arguments along when applying roles to instances. (doy, lsm) 1.01 2010-03-26 [NEW FEATURES] - The handles option now also accepts a role type constraint in addition to a plain role name. (Florian Ragwitz) [OTHER] - Record the Sartak/doy debt properly in Changes (perigrin) 1.00 2010-03-25 [BUG FIXES] - Moose::Meta::Attribute::Native::Trait::Code no longer creates reader methods by default. (Florian Ragwitz) [DOCUMENTATION] - Improve various parts of the documentation and fix many typos. (Dave Rolsky, Mateu Hunter, Graham Knop, Robin V, Jay Hannah, Jesse Luehrs) [OTHER] - Paid the $10 debt to doy from 0.80 2009-06-06 (Sartak) 0.99 2010-03-08 [NEW FEATURES] - New method find_type_for in Moose::Meta::TypeConstraint::Union, for finding which member of the union a given value validates for. (Cory Watson) [BUG FIXES] - DEMOLISH methods in mutable subclasses of immutable classes are now called properly (Chia-liang Kao, Jesse Luehrs) [NEW DOCUMENTATION] - Added Moose::Manual::Support that defines the support, compatiblity, and release policies for Moose. (Chris Prather) 0.98 2010-02-10 [BUG FIXES] - An internals change in 0.97 broke role application to an instance in some cases. The bug occurred when two different roles were applied to different instances of the same class. (Rafael Kitover) 0.97 2010-02-09 [BUG FIXES] - Calling ->reinitialize on a cached anonymous class effectively uncached the metaclass object, causing the metaclass to go out of scope unexpectedly. This could easily happen at a distance by applying a metarole to an anonymous class. (Dave Rolsky). 0.96 2010-02-06 [NEW FEATURES] - ScalarRef is now a parameterized type. You can now specify a type constraint for whatever the reference points to. (Closes RT#50857) (Michael G. Schwern, Florian Ragwitz) [BUG FIXES] - ScalarRef now accepts references to other references. (Closes RT#50934) (Michael G. Schwern) 0.95 2010-02-04 [NEW FEATURES] - Moose::Meta::Attribute::Native::Trait::Code now provides execute_method as a delegation option. This allows the code reference to be called as a method on the object. (Florian Ragwitz) [ENHANCEMENTS] - Moose::Object::does no longer checks the entire inheritance tree, since Moose::Meta::Class::does_role already does this. (doy) - Moose::Util::add_method_modifier (and subsequently the sugar functions Moose::before, Moose::after, and Moose::around) can now accept arrayrefs, with the same behavior as lists. Types other than arrayref and regexp result in an error. (Dylan Hardison) 0.94 2010-01-18 [API CHANGES] - Please see the changes listed for 0.93_01 and Moose::Manual::Delta. [ENHANCEMENTS] - Improved support for anonymous roles by changing various APIs to take Moose::Meta::Role objects as well as role names. This included - Moose::Meta::Class->does_role - Moose::Meta::Role->does_role - Moose::Util::does_role - Moose::Util::apply_all_roles - Moose::Util::ensure_all_roles - Moose::Util::search_class_by_role Requested by Shawn Moore. Addresses RT #51143 (and then some). (Dave Rolsky) [BUG FIXES] - Fix handling of non-alphanumeric attributes names like '@foo'. This should work as long as the accessor method names are explicitly set to valid Perl method names. Reported by Doug Treder. RT #53731. (Dave Rolsky) 0.93_03 2010-01-05 [BUG FIXES] - Portability fixes to our XS code so we compile with 5.8.8 and Visual C++. Fixes RT #53391. Reported by Taro Nishino. (rafl) 0.93_02 2010-01-05 [BUG FIXES] - Depend on Class::MOP 0.97_01 so we can get useful results from CPAN testers. (Dave Rolsky) 0.93_01 2010-01-04 [API CHANGES] See Moose::Manual::Delta for more details on backwards compatiblity issues. - Role attributes are now objects of the Moose::Meta::Role::Attribute class. (Dave Rolsky). - There were major changes to how metaroles are applied. We now distinguish between metaroles for classes vs those for roles. See the Moose::Util::MetaRole docs for details. (Dave Rolsky) - The old MetaRole API has been deprecated, but will continue to work. However, if you are applying an attribute metaclass role, this may break because of the fact that roles now have an attribute metaclass too. (Dave Rolsky) - Moose::Util::MetaRole::apply_metaclass_roles is now called apply_metaroles. The old name is deprecated. (Dave Rolsky) - The unimport subs created by Moose::Exporter now clean up re-exported functions like blessed and confess, unless the caller imported them from somewhere else too. See Moose::Manua::Delta for backcompat details. (rafl) [ENHANCEMENTS AND BUG FIXES] - Changed the Str constraint to accept magic lvalue strings like one gets from substr et al, again. (sorear) - Sped up the type constraint parsing regex. (Sam Vilain) - The Moose::Cookbook::Extending::Recipe2 recipe was broken. Fix suggested by jrey. - Added Moose::Util::TypeConstraints exports when using oose.pm to allow easier testing of TypeConstraints from the command line. (perigrin) - Added a with_immutable test function to Test::Moose, to run a block of tests with and without certain classes being immutable. (doy) - We now use Module::Install extensions explicitly to avoid confusing errors if they're not installed. We use Module::Install::AuthorRequires to stop test extraction and general failures if you don't have the author side dependencies installed. - Fixed a grammar error in Moose::Cookbook::Basics::Recipe4. rt.cpan.org #51791. (Amir E. Aharoni) 0.93 2009-11-19 - Moose::Object - Calling $object->new() is no longer deprecated, and no longer warns. (doy) - Moose::Meta::Role - The get_attribute_map method is now deprecated. (Dave Rolsky) - Moose::Meta::Method::Delegation - Preserve variable aliasing in @_ for delegated methods, so that altering @_ affects the passed value. (doy) - Moose::Util::TypeConstraints - Allow array refs for non-anonymous form of enum and duck_type, not just anonymous. The non-arrayref forms may be removed in the future. (doy) - Changed Str constraint to not accept globs (*STDIN or *FOO). (chansen) - Properly document Int being a subtype of Str. (doy) - Moose::Exporter - Moose::Exporter using modules can now export their functions to the main package. This applied to Moose and Moose::Role, among others. (nothingmuch) - Moose::Meta::Attribute - Don't remove attribute accessors we never installed, during remove_accessors. (doy) - Moose::Meta::Attribute::Native::Trait::Array - Don't bypass prototype checking when calling List::Util::first, to avoid a segfault when it is called with a non-code argument. (doy) - Moose::Meta::Attribute::Native::Trait::Code - Fix passing arguments to code execute helpers. (doy) 0.92 2009-09-22 - Moose::Util::TypeConstraints - added the match_on_type operator (Stevan) - added tests and docs for this (Stevan) - Moose::Meta::Class - Metaclass compat fixing should already happen recursively, there's no need to explicitly walk up the inheritance tree. (doy) - Moose::Meta::Attribute - Add tests for set_raw_value and get_raw_value. (nothingmuch) 0.91 2009-09-17 - Moose::Object - Don't import any functions, in order to avoid polluting our namespace with things that can look like methods (blessed, try, etc) (nothingmuch) - Moose::Meta::Method::Constructor - The generated code needs to called Scalar::Util::blessed by its fully-qualified name or else Perl can interpret the call to blessed as an indirect method call. This broke Search::GIN, which in turn broke KiokuDB. (nothingmuch) 0.90 2009-09-15 - Moose::Meta::Attribute::Native::Trait::Counter - Moose::Meta::Attribute::Native::Trait::String - For these two traits, an attribute which did not explicitly provide methods to handles magically ended up delegating *all* the helper methods. This has been removed. You must be explicit in your handles declaration for all Native Traits. (Dave Rolsky) - Moose::Object - DEMOLISHALL behavior has changed. If any DEMOLISH method dies, we make sure to rethrow its error message. However, we also localize $@ before this so that if all the DEMOLISH methods success, the value of $@ will be preserved. (nothingmuch and Dave Rolsky) - We now also localize $? during object destruction. (nothingmuch and Dave Rolsky) - The handling of DEMOLISH methods was broken for immutablized classes, which were not receiving the value of Devel::GlobalDestruction::in_global_destruction. - These two fixes address some of RT #48271, reported by Zefram. - This is all now documented in Moose::Manual::Construction. - Calling $object->new() is now deprecated. A warning will be issued. (perigrin) - Moose::Meta::Role - Added more hooks to customize how roles are applied. The role summation class, used to create composite roles, can now be changed and/or have meta-roles applied to it. (rafl) - The get_method_list method no longer explicitly excludes the "meta" method. This was a hack that has been replaced by better hacks. (Dave Rolsky) - Moose::Meta::Method::Delegation - fixed delegated methods to make sure that any modifiers attached to the accessor being delegated on will be called (Stevan) - added tests for this (Stevan) - Moose::Meta::Class - Moose no longer warns when a class that is being made immutable has mutable ancestors. While in theory this is a good thing to warn about, we found so many exceptions to this that doing this properly became quite problematic. 0.89_02 2009-09-10 - Moose::Meta::Attribute::Native - Fix Hash, which still had 'empty' instead of 'is_empty'. (hdp) - Moose::Meta::Attribute::Native::Trait::Array - Added a number of functions from List::Util and List::MoreUtils, including reduce, shuffle, uniq, and natatime. (doy) - Moose::Exporter - This module will now generate an init_meta method for your exporting class if you pass it options for Moose::Util::MetaRole::apply_metaclass_roles or apply_base_class_roles. This eliminates a lot of repetitive boilerplate for typical MooseX modules. (doy). - Documented the with_meta feature, which is a replacement for with_caller. This feature was added by josh a while ago. - The with_caller feature is now deprecated, but will not issue a warning yet. (Dave Rolsky) - If you try to wrap/export a subroutine which doesn't actually exist, Moose::Exporter will warn you about this. (doy) - Moose::Meta::Role::Application::ToRole - When a role aliased a method from another role, it was only getting the new (aliased) name, not the original name. This differed from what happens when a class aliases a role's methods. If you _only_ want the aliased name, make sure to also exclue the original name. (Dave Rolsky) 0.89_01 2009-09-02 - Moose::Meta::Attribute - Added the currying syntax for delegation from AttributeHelpers to the existing delegation API. (hdp) - Moose::Meta::Attribute::Native - We have merged the functionality of MooseX::AttributeHelpers into the Moose core with some API tweaks. You can continue to use MooseX::AttributeHelpers, but it will not be maintained except (perhaps) for critical bug fixes in the future. See Moose::Manual::Delta for details. (hdp, jhannah, rbuels, Sartak, perigrin, doy) - Moose::Error::Croak - Moose::Error::Confess - Clarify documentation on how to use different error-throwing modules. (Curtis Jewell) - Moose - Correct POD for builder to point to Recipe8, not 9. (gphat) - Moose::Exporter - When a nonexistent sub name is passed to as_is, with_caller, or with_meta, throw a warning and skip the exporting, rather than installing a broken sub. (doy) - Moose::Meta::Class - Moose now warns if you call C for a class with mutable ancestors. (doy) 0.89 2009-08-13 - Moose::Manual::Attributes - Clarify "is", include discussion of "bare". (Sartak) - Moose::Meta::Role::Method::Conflicting - Moose::Meta::Role::Application::ToClass - For the first set of roles involved in a conflict, report all unresolved method conflicts, not just the first method. Fixes #47210 reported by Ovid. (Sartak) - Moose::Meta::TypeConstraint - Add assert_valid method to use a TypeConstraint for assertion (rjbs) - Moose::Exporter - Make "use Moose -metaclass => 'Foo'" do alias resolution, like -traits does. (doy) - Allow specifying role options (alias, excludes, MXRP stuff) in the arrayref passed to "use Moose -traits" (doy) - Moose::Util - Add functions meta_class_alias and meta_attribute_alias for creating aliases for class and attribute metaclasses and metatraits. (doy) - Moose::Meta::Attribute - Moose::Meta::Method::Accessor - A trigger now receives the old value as a second argument, if the attribute had one. (Dave Rolsky) - Moose::Meta::Method::Constructor - Fix a bug with $obj->new when $obj has stringify overloading. Reported by Andrew Suffield [rt.cpan.org #47882] (Sartak) - However, we will probably deprecate $obj->new, so please don't start using it for new code! - Moose::Meta::Role::Application - Moose::Meta::Role::Application::RoleSummation - Rename alias and excludes to -alias and -excludes (but keep the old names for now, for backcompat) (doy) 0.88 2009-07-24 - Moose::Manual::Contributing - Re-write the Moose::Manual::Contributing document to reflect the new layout and methods of work for the Git repository. All work now should be done in topic branches and reviewed by a core committer before being applied to master. All releases are done by a cabal member and merged from master to stable. This plan was devised by Yuval, blame him. (perigrin) - Moose::Meta::Role - Create metaclass attributes for the different role application classes. (rafl) - Moose::Util::MetaRole - Allow applying roles to a meta role's role application classes. (rafl) - Moose::Meta::Attribute - Add weak_ref to allowed options for "has '+foo'" (mst) - Moose::Meta::Method::Accessor - No longer uses inline_slot_access in accessors, to support non-lvalue-based meta instances. (sorear) 0.87 2009-07-07 - Moose::Meta::Method::Delegation - Once again allow class names as well as objects for delegation. This was changed in 0.86. 0.86 2009-07-03 - Moose::Meta::Class::Immutable::Trait - Fixes to work with the latest Class::MOP. - Moose::Meta::Method::Delegation - Delegation now dies with a more useful error message if the attribute's accessor returns something defined but unblessed. (hdp) 0.85 2009-06-26 - Moose::Meta::Attribute - The warning for 'no associated methods' is now split out into the _check_associated_methods method, so that extensions can safely call 'after install_accessors => ...'. This fixes a warning from MooseX::AttributeHelpers. (hdp) 0.84 2009-06-26 - Moose::Role - has now sets definition_context for attributes defined in roles. (doy) - Moose::Meta::Attribute - When adding an attribute to a metaclass, if the attribute has no associated methods, it will give a deprecation warning. (hdp) - Methods generated by delegation were not being added to associated_methods. (hdp) - Attribute accessors (reader, writer, accessor, predicate, clearer) now warn if they overwrite an existing method. (doy) - Attribute constructors now warn very noisily about unknown (or misspelled) arguments - Moose::Util::TypeConstraints - Deprecated the totally useless Role type name, which just checked if $object->can('does'). Note that this is _not_ the same as a type created by calling role_type('RoleName'). - Moose::Util::TypeConstraints - Moose::Meta::TypeConstraint::DuckType - Reify duck type from a regular subtype into an actual class (Sartak) - Document this because Sartak did all my work for me (perigrin) - Moose::Meta::Attribute - Allow Moose::Meta::TypeConstraint::DuckType in handles, since it is just a list of methods (Sartak) - Moose::Meta::Role - The get_*_method_modifiers methods would die if the role had no modifiers of the given type (Robert Buels). 0.83 2009-06-23 - Moose::Meta::Class - Fix _construct_instance not setting the special __MOP__ object key in instances of anon classes. (doy) 0.82 2009-06-21 - Moose::Manual::Types - Mention MooseX::Types early to avoid users falling down the string parsing rathole (mst) - Moose::Manual::MooseX - Add warnings about class-level extensions and mention considering using plain objects instead 0.81 2009-06-07 - Bumped our Class::MOP prereq to the latest version (0.85), since that's what we need. 0.80 2009-06-06 - Moose::Manual::FAQ - Add FAQ about the coercion change from 0.76 because it came up three times today (perigrin) - Win doy $10 dollars because Sartak didn't think anybody would document this fast enough (perigrin) - Moose::Meta::Method::Destructor - Inline a DESTROY method even if there are no DEMOLISH methods to prevent unnecessary introspection in Moose::Object::DEMOLISHALL - Moose::* - A role's required methods are now represented by Moose::Meta::Role::Method::Required objects. Conflicts are now represented by Moose::Meta::Role::Method::Conflicting objects. The benefit for end-users in that unresolved conflicts generate different, more instructive, errors, resolving Ovid's #44895. (Sartak) - Moose::Role - Improve the error message of "extends" as suggested by Adam Kennedy and confound (Sartak) - Link to Moose::Manual::Roles from Moose::Role as we now have excellent documentation (Adam Kennedy) - Tests - Update test suite for subname change in Class::MOP (nothingmuch) - Add TODO test for infinite recursion in Moose::Meta::Class (groditi) 0.79 2009-05-13 - Tests - More fixes for Win32 problems. Reported by Robert Krimen. - Moose::Object - The DEMOLISHALL method could still blow up in some cases during global destruction. This method has been made more resilient in the face of global destruction's random garbage collection order. - Moose::Exporter - If you "also" a module that isn't loaded, the error message now acknowledges that (Sartak) - Moose - When your ->meta method does not return a Moose::Meta::Class, the error message gave the wrong output (Sartak) 0.78 2009-05-12 - Moose::Cookbook::FAQ and Moose::Cookbook::WTF - Merged these documents into what is now Moose::Manual::FAQ - Moose::Unsweetened - Moved to Moose::Manual::Unsweetened - Moose::Cookbook::Basics::Recipes 9-12 - Renamed to be 8-11, since recipe 8 did not exist - Moose::Exporter - Make Moose::Exporter import strict and warnings into packages that use it (doy) - Moose::Object - Fix DEMOLISHALL sometimes not being able to find DEMOLISH methods during global destruction (doy) - Moose::Meta::Class - Moose::Meta::Role::Application::ToClass - Track the Role::Application objects created during class-role consumption (Sartak) - Moose::Meta::Class - Fix metaclass incompatibility errors when extending a vanilla perl class which isa Moose class with a metaclass role applied (t0m) - Moose::Meta::Role - Add a role-combination hook, _role_for_combination, for the benefit of MooseX::Role::Parameterized (Sartak) - Tests - Some tests were failing on Win32 because they explicit checked warning output for newlines. Reported by Nickolay Platonov. 0.77 2009-05-02 - Moose::Meta::Role - Add explicit use of Devel::GlobalDestruction and Sub::Name (perigrin) - Moose::Object - Pass a boolean to DEMOLISHALL and DEMOLISH indicating whether or not we are currently in global destruction (doy) - Add explicit use of Devel::GlobalDestruction and Sub::Name (perigrin) - Moose::Cookbook::FAQ - Reworked much of the existing content to be more useful to modern Moose hackers (Sartak) - Makefile.PL - Depend on Class::MOP 0.83 instead of 0.82_01. 0.76 2009-04-27 - Moose::Meta::TypeConstraint - Do not run coercions in coerce() if the value already passes the type constraint (hdp) - Moose::Meta::TypeConstraint::Class - In validation error messages, specifically say that the value is not an instance of the class. This should alleviate some frustrating forgot-to-load-my-type bugs. rt.cpan.org #44639 (Sartak) - Moose::Meta::Role::Application::ToClass - Revert the class-overrides-role warning in favor of a solution outside of the Moose core (Sartak) - Tests - Make Test::Output optional again, since it's only used in a few files (Sartak) 0.75_01 2009-04-23 - Moose::Meta::Role::Application::ToClass - Moose now warns about each class overriding methods from roles it consumes (Sartak) - Tests - Warnings tests have standardized on Test::Output which is now an unconditionally dependency (Sartak) - Moose::Meta::Class - Changes to immutabilization to work with Class::MOP 0.82_01+. 0.75 2009-04-20 - Moose - Moose::Meta::Class - Move validation of not inheriting from roles from Moose::extends to Moose::Meta::Class::superclasses (doy) - Moose::Util - add ensure_all_roles() function to encapsulate the common "apply this role unless the object already does it" pattern (hdp) - Moose::Exporter - Users can now select a different metaclass with the "-metaclass" option to import, for classes and roles (Sartak) - Moose::Meta::Role - Make method_metaclass an attr so that it can accept a metarole application. (jdv) 0.74 2009-04-07 - Moose::Meta::Role - Moose::Meta::Method::Destructor - Include stack traces in the deprecation warnings. (Florian Ragwitz) - Moose::Meta::Class - Removed the long-deprecated _apply_all_roles method. - Moose::Meta::TypeConstraint - Removed the long-deprecated union method. 0.73_02 2009-04-06 - More deprecations and renamings - Moose::Meta::Method::Constructor - initialize_body => _initialize_body (this is always called when an object is constructed) - Moose::Object - The DEMOLISHALL method could throw an exception during global destruction, meaning that your class's DEMOLISH methods would not be properly called. Reported by t0m. - Moose::Meta::Method::Destructor - Destructor inlining was totally broken by the change to the is_needed method in 0.72_01. Now there is a test for this feature, and it works again. - Moose::Util - Bold the word 'not' in the POD for find_meta (t0m) 0.73_01 2009-04-05 - Moose::* - Call user_class->meta in fewer places, with the eventual goal of allowing the user to rename or exclude ->meta altogether. Instead uses Class::MOP::class_of. (Sartak) - Moose::Meta::Method::Accessor - If an attribute had a lazy default, and that value did not pass the attribute's type constraint, it did not get the message from the type constraint, instead using a generic message. Test provided by perigrin. - Moose::Util::TypeConstraints - Add duck_type keyword. It's sugar over making sure an object can() a list of methods. This is easier than jrockway's suggestion to fork all of CPAN. (perigrin) - add tests and documentation (perigrin) - Moose - Document the fact that init_meta() returns the target class's metaclass object. (hdp) - Moose::Cookbook::Extending::Recipe1 - Moose::Cookbook::Extending::Recipe2 - Moose::Cookbook::Extending::Recipe3 - Moose::Cookbook::Extending::Recipe4 - Make init_meta() examples explicitly return the metaclass and point out this fact. (hdp) - Moose::Cookbook::Basics::Recipe12 - A new recipe, creating a custom meta-method class. - Moose::Cookbook::Meta::Recipe6 - A new recipe, creating a custom meta-method class. - Moose::Meta::Class - Moose::Meta::Method::Constructor - Attribute triggers no longer receive the meta-attribute object as an argument in any circumstance. Previously, triggers called during instance construction were passed the meta-attribute, but triggers called by normal accessors were not. Fixes RT#44429, reported by Mark Swayne. (hdp) - Moose::Manual::Attributes - Remove references to triggers receving the meta-attribute object as an argument. (hdp) - Moose::Cookbook::FAQ - Remove recommendation for deprecated Moose::Policy and Moose::Policy::FollowPBP; recommend MooseX::FollowPBP instead. (hdp) - Many methods have been renamed with a leading underscore, and a few have been deprecated entirely. The methods with a leading underscore are consider "internals only". People writing subclasses or extensions to Moose should feel free to override them, but they are not for "public" use. - Moose::Meta::Class - check_metaclass_compatibility => _check_metaclass_compatibility - Moose::Meta::Method::Accessor - initialize_body => _initialize_body (this is always called when an object is constructed) - /(generate_.*_method(?:_inline)?)/ => '_' . $1 - Moose::Meta::Method::Constructor - initialize_body => _initialize_body (this is always called when an object is constructed) - /(generate_constructor_method(?:_inline)?)/ => '_' . $1 - attributes => _attributes (now inherited from parent) - meta_instance => _meta_instance (now inherited from parent) - Moose::Meta::Role - alias_method is deprecated. Use add_method 0.73 2009-03-27 - No changes from 0.72_01. 0.72_01 2009-03-26 - Everything - Almost every module has complete API documentation. A few methods (and even whole classes) have been intentionally excluded pending some rethinking of their APIs. - Moose::Util::TypeConstraints - Calling subtype with a name as the only argument is now an exception. If you want an anonymous subtype do: my $subtype = subtype as 'Foo'; - Moose::Cookbook::Meta::Recipe7 - A new recipe, creating a custom meta-instance class. - Moose::Cookbook::Basics::Recipe5 - Fix various typos and mistakes. Includes a patch from Radu Greab. - Moose::Cookbook::Basics::Recipe9 - Link to this recipe from Moose.pm's builder blurb - Moose::Exporter - When wrapping a function with a prototype, Moose::Exporter now makes sure the wrapped function still has the same prototype. (Daisuke Maki) - Moose::Meta::Attribute - Allow a subclass to set lazy_build for an inherited attribute. (hdp) - Makefile.PL - Explicitly depend on Data::OptList. We already had this dependency via Sub::Exporter, but since we're using it directly we're better off with it listed. (Sartak) - Moose::Meta::Method::Constructor - Make it easier to subclass the inlining behaviour. (Ash Berlin) - Moose::Manual::Delta - Details significant changes in the history of Moose, along with recommended workarounds. - Moose::Manual::Contributing - Contributor's guide to Moose. - Moose::Meta::Method::Constructor - The long-deprecated intialize_body method has been removed (yes, spelled like that). - Moose::Meta::Method::Destructor - This is_needed method is now always a class method. - Moose::Meta::Class - Changes to the internals of how make_immutable works to match changes in latest Class::MOP. 0.72 2009-02-23 - Moose::Object - Moose::Meta::Method::Constructor - A mutable class accepted Foo->new(undef) without complaint, while an immutable class would blow up with an unhelpful error. Now, in both cases we throw a helpful error instead. Reported by doy. 0.71_01 2009-02-22 - Moose::Cookbook - Hopefully fixed some POD errors in a few recipes that caused them to display weird on search.cpan.org. - Moose::Util::TypeConstraints - Calling type or subtype without the sugar helpers (as, where, message) is now deprecated. - The subtype function tried hard to guess what you meant, but often got it wrong. For example: my $subtype = subtype as 'ArrayRef[Object]'; This caused an error in the past, but now works as you'd expect. - Everywhere - Make sure Moose.pm is loaded before calling Moose->throw_error. This wasn't normally an issue, but could bite you in weird cases. 0.71 2009-02-19 - Moose::Cookbook::Basics::Recipe11 - A new recipe which demonstrates the use of BUILDARGS and BUILD. (Dave Rolsky) - Moose::Cookbook::Roles::Recipe3 - A new recipe, applying a role to an object instance. (Dave Rolsky) - Moose::Exporter - Allow overriding specific keywords from "also" packages. (doy) - Tests - Replace hardcoded cookbook tests with Test::Inline to ensure the tests match the actual code in the recipes. (Dave Rolsky) - Moose::Cookbook - Working on the above turned up a number of little bugs in the recipe code. (Dave Rolsky) - Moose::Util::TypeConstraints::Optimized - Just use Class::MOP for the optimized ClassName check. (Dave Rolsky) 0.70 2009-02-14 - Moose::Util::TypeConstraints - Added the RoleName type (stevan) - added tests for this (stevan) - Moose::Cookbook::Basics::Recipe3 - Updated the before qw[left right] sub to be a little more defensive about what it accepts (stevan) - added more tests to t/000_recipies/basics/003_binary_tree.t (stevan) - Moose::Object - We now always call DEMOLISHALL, even if a class does not define DEMOLISH. This makes sure that method modifiers on DEMOLISHALL work as expected. (doy) - added tests for this (EvanCarroll) - Moose::Util::MetaRole - Accept roles for the wrapped_method_metaclass (rafl) - added tests for this (rafl) - Moose::Meta::Attribute - We no longer pass the meta-attribute object as a final argument to triggers. This actually changed for inlined code a while back, but the non-inlined version and the docs were still out of date. - Tests - Some tests tried to use Test::Warn 0.10, which had bugs. Now they require 0.11. (Dave Rolsky) - Documentation - Lots of small changes to the manual, cookbook, and elsewhere. These were based on feedback from various users, too many to list here. (Dave Rolsky) 0.69 2009-02-12 - Moose - Make some keyword errors use throw_error instead of croak since Moose::Exporter wraps keywords now (Sartak) - Moose::Cookbook::* - Revised every recipe for style and clarity. Also moved some documentation out of cookbook recipes and into Moose::Manual pages. This work was funded as part of the Moose docs grant from TPF. (Dave Rolsky) - Moose::Meta::Method::Delegation - If the attribute doing the delegation was not populated, the error message did not specify the attribute name properly. (doy) 0.68 2009-02-04 - POD - Many spelling, typo, and formatting fixes by daxim. - Moose::Manual::Attributes - The NAME section in the POD used "Attribute" so search.cpan didn't resolve links from other documents properly. - Moose::Meta::Method::Overriden - Now properly spelled as Overridden. Thanks to daxim for noticing this. 0.67 2009-02-03 - Moose::Manual::* - Lots of little typo fixes and a few clarifications. Several pages didn't have proper titles, and so weren't actually visible on search.cpan.org. Thanks to hanekomu for a variety of fixes and formatting improvements. 0.66 2009-02-03 - Moose::Manual - This is a brand new, extensive manual for Moose. This aims to provide a complete introduction to all of Moose's features. This work was funded as part of the Moose docs grant from TPF. (Dave Rolsky) - Moose::Meta::Attribute - Added a delegation_metaclass method to replace a hard-coded use of Moose::Meta::Method::Delegation. (Dave Rolsky) - Moose::Util::TypeConstraints - If you created a subtype and passed a parent that Moose didn't know about, it simply ignored the parent. Now it automatically creates the parent as a class type. This may not be what you want, but is less broken than before. (Dave Rolsky) - Moose::Util::TypeConstraints - This module tried throw errors by calling Moose->throw_error, but it did not ensure that Moose was loaded first. This could cause very unhelpful errors when it tried to throw an error before Moose was loaded. (Dave Rolsky) - Moose::Util::TypeConstraints - You could declare a name with subtype such as "Foo!Bar" that would be allowed, but if you used it in a parameterized type such as "ArrayRef[Foo!Bar]" it wouldn't work. We now do some vetting on names created via the sugar functions, so that they can only contain alphanumerics, ":", and ".". (Dave Rolsky) 0.65 2009-01-22 - Moose and Moose::Meta::Method::Overridden - If an overridden method called super(), and then the superclass's method (not overridden) _also_ called super(), Moose went into an endless recursion loop. Test provided by Chris Prather. (Dave Rolsky) - Moose::Meta::TypeConstraint - All methods are now documented. (gphat) - t/100_bugs/011_DEMOLISH_eats_exceptions.t - Fixed some bogus failures that occurred because we tried to validate filesystem paths in a very ad-hoc and not-quite-correct way. (Dave Rolsky) - Moose::Util::TypeConstraints - Added maybe_type to exports. See docs for details. (rjbs) - Moose - Added Moose::Util::TypeConstraints to the SEE ALSO section. (pjf) - Moose::Role - Methods created via an attribute can now fulfill a "requires" declaration for a role. (nothingmuch) - Moose::Meta::Method::* - Stack traces from inlined code will now report its line and file as being in your class, as opposed to in Moose guts. (nothingmuch). 0.64 2008-12-31 - Moose::Meta::Method::Accessor - Always inline predicate and clearer methods (Sartak) - Moose::Meta::Attribute - Support for parameterized traits (Sartak) - verify_against_type_constraint method to avoid duplication and enhance extensibility (Sartak) - Moose::Meta::Class - Tests (but no support yet) for parameterized traits (Sartak) - Moose - Require Class::MOP 0.75+, which has the side effect of making sure we work on Win32. (Dave Rolsky) 0.63 2008-12-08 - Moose::Unsweetened - Some small grammar tweaks and bug fixes in non-Moose example code. (Dave Rolsky) 0.62_02 2008-12-05 - Moose::Meta::Role::Application::ToClass - When a class does not provide all of a role's required methods, the error thrown now mentions all of the missing methods, as opposed to just the first one found. Requested by Curtis Poe (RT #41119). (Dave Rolsky) - Moose::Meta::Method::Constructor - Moose will no longer inline a constructor for your class unless it inherits its constructor from Moose::Object, and will warn when it doesn't inline. If you want to force inlining anyway, pass "replace_constructor => 1" to make_immutable. Addresses RT #40968, reported by Jon Swartz. (Dave Rolsky) - The quoting of default values could be broken if the default contained a single quote ('). Now we use quotemeta to escape anything potentially dangerous in the defaults. (Dave Rolsky) 0.62_01 2008-12-03 - Moose::Object - use the method->execute API for BUILDALL and DEMOLISHALL (Sartak) - Moose::Util::TypeConstraints - We now make all the type constraint meta classes immutable before creating the default types provided by Moose. This should make loading Moose a little faster. (Dave Rolsky) 0.62 2008-11-26 - Moose::Meta::Role::Application::ToClass Moose::Meta::Role::Application::ToRole - fixed issues where excluding and aliasing the same methods for a single role did not work right (worked just fine with multiple roles) (stevan) - added test for this (stevan) - Moose::Meta::Role::Application::RoleSummation - fixed the error message when trying to compose a role with a role it excludes (Sartak) - Moose::Exporter - Catch another case where recursion caused the value of $CALLER to be stamped on (t0m) - added test for this (t0m) - Moose - Remove the make_immutable keyword, which has been deprecated since April. It breaks metaclasses that use Moose without no Moose (Sartak) - Moose::Meta::Attribute - Removing an attribute from a class now also removes delegation (handles) methods installed for that attribute (t0m) - added test for this (t0m) - Moose::Meta::Method::Constructor - An attribute with a default that looked like a number (but was really a string) would accidentally be treated as a number when the constructor was made immutable (perigrin) - added test for this (perigrin) - Moose::Meta::Role - create method for constructing a role dynamically (Sartak) - added test for this (Sartak) - anonymous roles! (Sartak) - added test for this (Sartak) - Moose::Role - more consistent error messages (Sartak) - Moose::Cookbook::Roles::Recipe1 - attempt to explain why a role that just requires methods is useful (Sartak) 0.61 2008-11-07 - Moose::Meta::Attribute - When passing a role to handles, it will be loaded if necessary (perigrin) - Moose::Meta::Class - Method objects returned by get_method (and other methods) Could end up being returned without an associated_metaclass attribute. Removing get_method_map, which is provided by Class::MOP::Class, fixed this. The Moose version did nothing different from its parent except introduce a bug. (Dave Rolsky) - added tests for this (jdv79) - Various - Added a $VERSION to all .pm files which didn't have one. Fixes RT #40049, reported by Adam Kennedy. (Dave Rolsky) - Moose::Cookbook::Basics::Recipe4 - Moose::Cookbook::Basics::Recipe6 - These files had spaces on the first line of the SYNOPSIS, as opposed to a totally empty line. According to RT #40432, this confuses POD parsers. (Dave Rolsky) 0.60 2008-10-24 - Moose::Exporter - Passing "-traits" when loading Moose caused the Moose.pm exports to be broken. Reported by t0m. (Dave Rolsky) - Tests for this bug. (t0m) - Moose::Util - Change resolve_metaclass alias to use the new load_first_existing_class function. This makes it a lot simpler, and also around 5 times faster. (t0m) - Add caching to resolve_metaclass_alias, which gives an order of magnitude speedup to things which repeatedly call the Moose::Meta::Attribute->does method, notably MooseX::Storage (t0m) - Moose::Util::TypeConstraint - Put back the changes for parameterized constraints that shouldn't have been removed in 0.59. We still cannot parse them, but MooseX modules can create them in some other way. See the 0.58 changes for more details. (jnapiorkowski) - Changed the way subtypes are created so that the job is delegated to a type constraint parent. This clears up some hardcoded checking and should allow correct subtypes of Moose::Meta::Type::Constraint. Don't rely on this new API too much (create_child_type) because it may go away in the future. (jnapiorkowski) - Moose::Meta::TypeConstraint::Union - Type constraint names are sorted as strings, not numbers. (jnapiorkowski) - Moose::Meta::TypeConstraint::Parameterizable - New parameterize method. This can be used as a factory method to make a new type constraint with a given parameterized type. (jnapiorkowski) - added tests (jnapiorkowski) 0.59 2008-10-14 - Moose - Add abridged documentation for builder/default/initializer/ predicate, and link to more details sections in Class::MOP::Attribute. (t0m) - Moose::Util::TypeConstraints - removed prototypes from all but the &-based stuff (mst) - Moose::Util::TypeConstraints - Creating a anonymous subtype with both a constraint and a message failed with a very unhelpful error, but should just work. Reported by t0m. (Dave Rolsky) - Tests - Some tests that used Test::Warn if it was available failed with older versions of Test::Warn. Reported by Fayland. (Dave Rolsky) - Test firing behavior of triggers in relation to builder/default/ lazy_build. (t0m) - Test behavior of equals/is_a_type_of/is_subtype_of for all kinds of supported type. (t0m) - Moose::Meta::Class - In create(), do not pass "roles" option to the superclass - added related test that creates an anon metaclass with a required attribute - Moose::Meta::TypeConstraint::Class - Moose::Meta::TypeConstraint::Role - Unify behavior of equals/is_a_type_of/is_subtype_of with other types (as per change in 0.55_02). (t0m) - Moose::Meta::TypeConstraint::Registry - Fix warning when dealing with unknown type names (t0m) - Moose::Util::TypeConstraints - Reverted changes from 0.58 related to handle parameterized types. This caused random failures on BSD and Win32 systems, apparently related to the regex engine. This means that Moose can no longer parse structured type constraints like ArrayRef[Int,Int] or HashRef[name=>Str]. This will be supported in a slightly different way via MooseX::Types some time in the future. (Dave Rolsky) 0.58 2008-09-20 !! This release has an incompatible change regarding !! !! how roles add methods to a class !! - Roles and role application ! Roles now add methods by calling add_method, not alias_method. They make sure to always provide a method object, which will be cloned internally. This means that it is now possible to track the source of a method provided by a role, and even follow its history through intermediate roles. This means that methods added by a role now show up when looking at a class's method list/map. (Dave Rolsky) - Makefile.PL - From this release on, we'll try to maintain a list of conflicting modules, and warn you if you have one installed. For example, this release conflicts with ... - MooseX::Singleton <= 0.11 - MooseX::Params::Validate <= 0.05 - Fey::ORM <= 0.10 In general, we try to not break backwards compatibility for most Moose users, but MooseX modules and other code which extends Moose's metaclasses is often affected by very small changes in the Moose internals. - Moose::Meta::Method::Delegation - Moose::Meta::Attribute - Delegation methods now have their own method class. (Dave Rolsky) - Moose::Meta::TypeConstraint::Parameterizable - Added a new method 'parameterize' which is basically a factory for the containing constraint. This makes it easier to create new types of parameterized constraints. (jnapiorkowski) - Moose::Meta::TypeConstraint::Union - Changed the way Union types canonicalize their names to follow the normalized TC naming rules, which means we strip all whitespace. (jnapiorkowski) - Moose::Util::TypeConstraints - Parameter and Union args are now sorted, this makes Int|Str the same constraint as Str|Int. (jnapiorkowski) - Changes to the way Union types are parsed to more correctly stringify their names. (jnapiorkowski) - When creating a parameterized type, we now use the new parameterize method. (jnapiorkowski) - Incoming type constraint strings are now normalized to remove all whitespace differences. (jnapiorkowski) - Changed the way we parse type constraint strings so that we now match TC[Int,Int,...] and TC[name=>Str] as parameterized type constraints. This lays the foundation for more flexible type constraint implementations. - Tests and docs for all the above. (jnapiorkowski) - Moose::Exporter - Moose - Moose::Exporter will no longer remove a subroutine that the exporting package re-exports. Moose re-exports the Carp::confess function, among others. The reasoning is that we cannot know whether you have also explicitly imported those functions for your own use, so we err on the safe side and always keep them. (Dave Rolsky) - added tests for this (rafl) - Moose::Meta::Class - Changes to how we fix metaclass compatibility that are much too complicated to go into. The summary is that Moose is much less likely to complain about metaclass incompatibility now. In particular, if two metaclasses differ because Moose::Util::MetaRole was used on the two corresponding classes, then the difference in roles is reconciled for the subclass's metaclass. (Dave Rolsky) - Squashed an warning in _process_attribute (thepler) - Moose::Meta::Role - throw exceptions (sooner) for invalid attribute names (thepler) - added tests for this (thepler) - Moose::Util::MetaRole - If you explicitly set a constructor or destructor class for a metaclass object, and then applied roles to the metaclass, that explicitly set class would be lost and replaced with the default. - Moose::Meta::Class - Moose::Meta::Attribute - Moose::Meta::Method - Moose - Moose::Object - Moose::Error::Default - Moose::Error::Croak - Moose::Error::Confess - All instances of confess() changed to use overridable C method. This method ultimately calls a class constructor, and you can change the class being called. In addition, errors now pass more information than just a string. The default C behaves like C, so the behavior is not visibly different for end users. 0.57 2008-09-03 - Moose::Intro - A new bit of doc intended to introduce folks familiar with "standard" Perl 5 OO to Moose concepts. (Dave Rolsky) - Moose::Unsweetened - Shows examples of two classes, each done first with and then without Moose. This makes a nice parallel to Moose::Intro. (Dave Rolsky) - Moose::Util::TypeConstraints - Fixed a bug in find_or_parse_type_constraint so that it accepts a Moose::Meta::TypeConstraint object as the parent type, not just a name (jnapiorkowski) - added tests (jnapiorkowski) - Moose::Exporter - If Sub::Name was not present, unimporting failed to actually remove some sugar subs, causing test failures (Dave Rolsky) 0.56 2008-09-01 For those not following the series of dev releases, there are several major changes in this release of Moose. ! Moose::init_meta should now be called as a method. See the docs for details. - Major performance improvements by nothingmuch. - New modules for extension writers, Moose::Exporter and Moose::Util::MetaRole by Dave Rolsky. - Lots of doc improvements and additions, especially in the cookbook sections. - Various bug fixes. - Removed all references to the experimental-but-no-longer-needed Moose::Meta::Role::Application::ToMetaclassInstance. - Require Class::MOP 0.65. 0.55_04 2008-08-30 - Moose::Util::MetaRole - Moose::Cookbook::Extending::Recipe2 - This simplifies the application of roles to any meta class, as well as the base object class. Reimplemented metaclass traits using this module. (Dave Rolsky) - Moose::Cookbook::Extending::Recipe1 - This a new recipe, an overview of various ways to write Moose extensions (Dave Rolsky) - Moose::Cookbook::Extending::Recipe3 - Moose::Cookbook::Extending::Recipe4 - These used to be Extending::Recipe1 and Extending::Recipe2, respectively. 0.55_03 2008-08-29 - No changes from 0.55_02 except increasing the Class::MOP dependency to 0.64_07. 0.55_02 2008-08-29 - Makefile.PL and Moose.pm - explicitly require Perl 5.8.0+ (Dave Rolsky) - Moose::Util::TypeConstraints - Fix warnings from find_type_constraint if the type is not found (t0m). - Moose::Meta::TypeConstraint - Predicate methods (equals/is_a_type_of/is_subtype_of) now return false if the type you specify cannot be found in the type registry, rather than throwing an unhelpful and coincidental exception. (t0m). - added docs & test for this (t0m) - Moose::Meta::TypeConstraint::Registry - add_type_constraint now throws an exception if a parameter is not supplied (t0m). - added docs & test for this (t0m) - Moose::Cookbook::FAQ - Added a faq entry on the difference between "role" and "trait" (t0m) - Moose::Meta::Role - Fixed a bug that caused role composition to not see a required method when that method was provided by another role being composed at the same time. (Dave Rolsky) - test and bug finding (tokuhirom) 0.55_01 2008-08-20 !! Calling Moose::init_meta as a function is now !! !! deprecated. Please see the Moose.pm docs for details. !! - Moose::Meta::Method::Constructor - Fix inlined constructor so that values produced by default or builder methods are coerced as required. (t0m) - added test for this (t0m) - Moose::Meta::Attribute - A lazy attribute with a default or builder did not attempt to coerce the default value. The immutable code _did_ coerce. (t0m) - added test for this (t0m) - Moose::Exporter - This is a new helper module for writing "Moose-alike" modules. This should make the lives of MooseX module authors much easier. (Dave Rolsky) - Moose - Moose::Cookbook::Meta::Recipe5 - Implemented metaclass traits (and wrote a recipe for it): use Moose -traits => 'Foo' This should make writing small Moose extensions a little easier (Dave Rolsky) - Moose::Cookbook::Basics::Recipe1 - Removed any examples of direct hashref access, and applied an editorial axe to reduce verbosity. (Dave Rolsky) - Moose::Cookbook::Basics::Recipe1 - Also applied an editorial axe here. (Dave Rolsky) - Moose - Moose::Cookbook::Extending::Recipe1 - Moose::Cookbook::Extending::Recipe2 - Rewrote extending and embedding moose documentation and recipes to use Moose::Exporter (Dave Rolsky) - Moose - Moose::Role - These two modules now warn when you load them from the main package "main" package, because we will not export sugar to main. Previously it just did nothing. (Dave Rolsky) - Moose::Role - Now provide an init_meta method just like Moose.pm, and you can call this to provide an alternate role metaclass. (Dave Rolsky and nothingmuch) - get_method_map now respects the package cache flag (nothingmuch) - Moose::Meta::Role - Two new methods - add_method and wrap_method_body (nothingmuch) - many modules - Optimizations including allowing constructors to accept hash refs, making many more classes immutable, and making constructors immutable. (nothingmuch) 0.55 2008-08-03 - Moose::Meta::Attribute - breaking down the way 'handles' methods are created so that the process can be more easily overridden by subclasses (stevan) - Moose::Meta::TypeConstraint - fixing what is passed into a ->message with the type constraints (RT #37569) - added tests for this (Charles Alderman) - Moose::Util::TypeConstraints - fix coerce to accept anon types like subtype can (mst) - Moose::Cookbook - reorganized the recipes into sections - Basics, Roles, Meta, Extending - and wrote abstracts for each section (Dave Rolsky) - Moose::Cookbook::Basics::Recipe10 - A new recipe that demonstrates operator overloading in combination with Moose. (bluefeet) - Moose::Cookbook::Meta::Recipe1 - an introduction to what meta is and why you'd want to make your own metaclass extensions (Dave Rolsky) - Moose::Cookbook::Meta::Recipe4 - a very simple metaclass example (Dave Rolsky) - Moose::Cookbook::Extending::Recipe1 - how to write a Moose-alike module to use your own object base class (Dave Rolsky) - Moose::Cookbook::Extending::Recipe2 - how to write modules with an API just like C (Dave Rolsky) - all documentation - Tons of fixes, both syntactical and grammatical (Dave Rolsky, Paul Fenwick) 0.54 2008-07-03 ... this is not my day today ... - Moose::Meta::Attribute - fixed legal_options_for_inheritance such that clone_and_inherit options still works for Class::MOP::Attribute objects and therefore does not break MooseX::AttributeHelpers (stevan) 0.53 2008-07-03 - Whoops, I guess I should run 'make manifest' before actually releasing the module. No actual changes in this release, except the fact that it includes the changes that I didn't include in the last release. (stevan--) 0.52 2008-07-03 - Moose - added "FEATURE REQUESTS" section to the Moose docs to properly direct people (stevan) (RT #34333) - making 'extends' croak if it is passed a Role since this is not ever something you want to do (fixed by stevan, found by obra) - added tests for this (stevan) - Moose::Object - adding support for DOES (as in UNIVERSAL::DOES) (nothingmuch) - added test for this - Moose::Meta::Attribute - added legal_options_for_inheritance (wreis) - added tests for this (wreis) - Moose::Cookbook::Snacks::* - removed some of the unfinished snacks that should not have been released yet. Added some more examples to the 'Keywords' snack. (stevan) - Moose::Cookbook::Style - added general Moose "style guide" of sorts to the cookbook (nothingmuch) (RT #34335) - t/ - added more BUILDARGS tests (stevan) 0.51 2008-06-26 - Moose::Role - add unimport so "no Moose::Role" actually does something (sartak) - Moose::Meta::Role::Application::ToRole - when RoleA did RoleB, and RoleA aliased a method from RoleB in order to provide its own implementation, that method still got added to the list of required methods for consumers of RoleB. Now an aliased method is only added to the list of required methods if the role doing the aliasing does not provide its own implementation. See Recipe 11 for an example of all this. (Dave Rolsky) - added tests for this - Moose::Meta::Method::Constructor - when a single argument that wasn't a hashref was provided to an immutabilized constructor, the error message was very unhelpful, as opposed to the non-immutable error. Reported by dew. (Dave Rolsky) - added test for this (Dave Rolsky) - Moose::Meta::Attribute - added support for meta_attr->does("ShortAlias") (sartak) - added tests for this (sartak) - moved the bulk of the `handles` handling to the new install_delegation method (Stevan) - Moose::Object - Added BUILDARGS, a new step in new() - Moose::Meta::Role::Application::RoleSummation - fix typos no one ever sees (sartak) - Moose::Util::TypeConstraints - Moose::Meta::TypeConstraint - Moose::Meta::TypeCoercion - Attempt to work around the ??{ } vs. threads issue (not yet fixed) - Some null_constraint optimizations 0.50 2008-06-12 - Fixed a version number issue by bumping all modules to 0.50. 0.49 2008-06-12 !! This version now approx. 20-25% !! !! faster with new Class::MOP 0.59 !! - Moose::Meta::Attribute - fixed how the is => (ro|rw) works with custom defined reader, writer and accessor options. - added docs for this (TODO). - added tests for this (Thanks to Penfold) - added the custom attribute alias for regular Moose attributes which is "Moose" - fix builder and default both being used (groditi) - Moose Moose::Meta::Class Moose::Meta::Attribute Moose::Meta::Role Moose::Meta::Role::Composite Moose::Util::TypeConstraints - switched usage of reftype to ref because it is much faster - Moose::Meta::Role - changing add_package_symbol to use the new HASH ref form - Moose::Object - fixed how DEMOLISHALL is called so that it can be overrided in subclasses (thanks to Sartak) - added test for this (thanks to Sartak) - Moose::Util::TypeConstraints - move the ClassName type check code to Class::MOP::is_class_loaded (thanks to Sartak) - Moose::Cookbook::Recipe11 - add tests for this (thanks to tokuhirom) 0.48 2008-05-29 (early morning release engineering)-- - fixing the version in Moose::Meta::Method::Destructor which was causing the indexer to choke 0.47 2008-05-29 (late night release engineering)-- - fixing the version is META.yml, no functional changes in this release 0.46 2008-05-28 !! This version now approx. 20-25% !! !! faster with new Class::MOP 0.57 !! - Moose::Meta::Class - some optimizations of the &initialize method since it is called so often by &meta - Moose::Meta::Class Moose::Meta::Role - now use the get_all_package_symbols from the updated Class::MOP, test suite is now 10 seconds faster - Moose::Meta::Method::Destructor - is_needed can now also be called as a class method for immutablization to check if the destructor object even needs to be created at all - Moose::Meta::Method::Destructor Moose::Meta::Method::Constructor - added more descriptive error message to help keep people from wasting time tracking an error that is easily fixed by upgrading. 0.45 2008-05-24 - Moose - Because of work in Class::MOP 0.57, all XS based functionality is now optional and a Pure Perl version is supplied - the CLASS_MOP_NO_XS environment variable can now be used to force non-XS versions to always be used - several of the packages have been tweaked to take care of this, mostly we added support for the package_name and name variables in all the Method metaclasses - before/around/after method modifiers now support regexp matching of names (thanks to Takatoshi Kitano) - tests added for this - NOTE: this only works for classes, it is currently not supported in roles, but, ... patches welcome - All usage of Carp::confess have been replaced by Carp::croak in the "keyword" functions since the stack trace is usually not helpful - Moose::Role - All usage of Carp::confess have been replaced by Carp::croak in the "keyword" functions since the stack trace is usually not helpful - The 'has' keyword for roles now accepts the same array ref form that Moose.pm does (has [qw/foo bar/] => (is => 'rw', ...)) - added test for this - Moose::Meta::Attribute - trigger on a ro-attribute is no longer an error, as it's useful to trigger off of the constructor - Moose::Meta::Class - added same 'add_package_symbol' fix as in Class::MOP 0.57 - Moose::Util - does_role now handles non-Moose classes more gracefully - added tests for this - added the 'add_method_modifier' function (thanks to Takatoshi Kitano) - Moose::Util::TypeConstraints - subtypes of parameterizable types now are themselves parameterizable types - Moose::Meta::Method::Constructor - fixed bug where trigger was not being called by the inlined immutable constructors - added test for this (thanks to Caelum) - Moose::Meta::Role::Application::ToInstance - now uses the metaclass of the instance (if possible) to create the anon-class (thanks Jonathan Rockway) - Moose::Cookbook::Recipe22 - added the meta-attribute trait recipe (thanks to Sartak) - t/ - fixed hash-ordering test bug that was causing occasional cpantester failures - renamed the t/000_recipe/*.t tests to be more descriptive (thanks to Sartak) 0.44 2008-05-10 - Moose - made make_immutable warning cluck to show where the error is (thanks mst) - Moose::Object - BUILDALL and DEMOLISHALL now call ->body when looping through the methods, to avoid the overloaded method call. - fixed issue where DEMOLISHALL was eating the $@ values, and so not working correctly, it still kind of eats them, but so does vanilla perl - added tests for this - Moose::Cookbook::Recipe7 - added new recipe for immutable functionality (thanks Dave Rolsky) - Moose::Cookbook::Recipe9 - added new recipe for builder and lazy_build (thanks Dave Rolsky) - Moose::Cookbook::Recipe11 - added new recipe for method aliasing and exclusion with Roles (thanks Dave Rolsky) - t/ - fixed Win32 test failure (thanks spicyjack) ~ removed Build.PL and Module::Build compat since Module::Install has done that. 0.43 2008-04-30 - NOTE TO SELF: drink more coffee before doing release engineering - whoops, forgot to do the smolder tests, and we broke some of the custom meta-attr modules. This fixes that. 0.42 2008-04-28 - some bad tests slipped by, nothing else changed in this release (cpantesters++) - upped the Class::MOP dependency to 0.55 since we have tests which need the C3 support 0.41 2008-04-28 ~~ numerous documentation updates ~~ - Changed all usage of die to Carp::croak for better error reporting (initial patch by Tod Hagan) ** IMPORTANT NOTE ** - the make_immutable keyword is now deprecated, don't use it in any new code and please fix your old code as well. There will be 2 releases, and then it will be removed. - Moose Moose::Role Moose::Meta::Class - refactored the way inner and super work to avoid any method/@ISA cache penalty (nothingmuch) - Moose::Meta::Class - fixing &new_object to make sure trigger gets the coerced value (spotted by Charles Alderman on the mailing list) - added test for this - Moose::Meta::Method::Constructor - immutable classes which had non-lazy attributes were calling the default generating sub twice in the constructor. (bug found by Jesse Luehrs, fixed by Dave Rolsky) - added tests for this (Dave Rolsky) - fix typo in initialize_body method (nothingmuch) - Moose::Meta::Method::Destructor - fix typo in initialize_body method (nothingmuch) - Moose::Meta::Method::Overriden Moose::Meta::Method::Augmented - moved the logic for these into their own classes (nothingmuch) - Moose::Meta::Attribute - inherited attributes may now be extended without restriction on the type ('isa', 'does') (Sartak) - added tests for this (Sartak) - when an attribute property is malformed (such as lazy without a default), give the name of the attribute in the error message (Sartak) - added the &applied_traits and &has_applied_traits methods to allow introspection of traits - added tests for this - moved 'trait' and 'metaclass' argument handling to here from Moose::Meta::Class - clone_and_inherit_options now handles 'trait' and 'metaclass' (has '+foo' syntax) (nothingmuch) - added tests for this (t0m) - Moose::Object - localize $@ inside DEMOLISHALL to avoid it eating $@ (found by Ernesto) - added test for this (thanks to Ernesto) - Moose::Util::TypeConstraints - &find_type_constraint now DWIMs when given an type constraint object or name (nothingmuch) - &find_or_create_type_constraint superseded with a number of more specific functions: - find_or_create_{isa,does}_type_constraint - find_or_parse_type_constraint - Moose::Meta::TypeConstraint Moose::Meta::TypeConstraint::Class Moose::Meta::TypeConstraint::Role Moose::Meta::TypeConstraint::Enum Moose::Meta::TypeConstraint::Union Moose::Meta::TypeConstraint::Parameterized - added the &equals method for comparing two type constraints (nothingmuch) - added tests for this (nothingmuch) - Moose::Meta::TypeConstraint - add the &parents method, which is just an alias to &parent. Useful for polymorphism with TC::{Class,Role,Union} (nothingmuch) - Moose::Meta::TypeConstraint::Class - added the class attribute for introspection purposes (nothingmuch) - added tests for this - Moose::Meta::TypeConstraint::Enum Moose::Meta::TypeConstraint::Role - broke these out into their own classes (nothingmuch) - Moose::Cookbook::Recipe* - fixed references to test file locations in the POD and updated up some text for new Moose features (Sartak) - Moose::Util - Added &resolve_metaclass_alias, a helper function for finding an actual class for a short name (e.g. in the traits list) 0.40 2008-03-14 - I hate Pod::Coverage 0.39 2008-03-14 - Moose - documenting the use of '+name' with attributes that come from recently composed roles. It makes sense, people are using it, and so why not just officially support it. - fixing the 'extends' keyword so that it will not trigger Ovid's bug (http://use.perl.org/~Ovid/journal/35763) - oose - added the perl -Moose=+Class::Name feature to allow monkeypatching of classes in one liners - Moose::Util - fixing the 'apply_all_roles' keyword so that it will not trigger Ovid's bug (http://use.perl.org/~Ovid/journal/35763) - Moose::Meta::Class - added ->create method which now supports roles (thanks to jrockway) - added tests for this - added ->create_anon_class which now supports roles and caching of the results (thanks to jrockway) - added tests for this - made ->does_role a little more forgiving when it is checking a Class::MOP era metaclasses. - Moose::Meta::Role::Application::ToInstance - it is now possible to pass extra params to be used when a role is applied to an the instance (rebless_params) - added tests for this - Moose::Util::TypeConstraints - class_type now accepts an optional second argument for a custom message. POD anotated accordingly (groditi) - added tests for this - it is now possible to make anon-enums by passing 'enum' an ARRAY ref instead of the $name => @values. Everything else works as before. - added tests for this - t/ - making test for using '+name' on attributes consumed from a role, it works and makes sense too. - Moose::Meta::Attribute - fix handles so that it doesn't return nothing when the method cannot be found, not sure why it ever did this originally, this means we now have slightly better support for AUTOLOADed objects - added more delegation tests - adding ->does method to this so as to better support traits and their introspection. - added tests for this - Moose::Object - localizing the Data::Dumper configurations so that it does not pollute others (RT #33509) - made ->does a little more forgiving when it is passed Class::MOP era metaclasses. 0.38 2008-02-15 - Moose::Meta::Attribute - fixed initializer to correctly do type checking and coercion in the callback - added tests for this - t/ - fixed some finicky tests (thanks to konobi) 0.37 2008-02-14 - Moose - fixed some details in Moose::init_meta and its superclass handling (thanks thepler) - added tests for this (thanks thepler) - 'has' now dies if you don't pass in name value pairs - added the 'make_immutable' keyword as a shortcut to make_immutable - Moose::Meta::Class Moose::Meta::Method::Constructor Moose::Meta::Attribute - making (init_arg => undef) work here too (thanks to nothingmuch) - Moose::Meta::Attribute Moose::Meta::Method::Constructor Moose::Meta::Method::Accessor - make lazy attributes respect attr initializers (rjbs) - added tests for this - Moose::Util::TypeConstraints Moose::Util::TypeConstraints::OptimizedConstraints Moose::Meta::TypeConstraints Moose::Meta::Attribute Moose::Meta::Method::Constructor Moose::Meta::Method::Accessor - making type errors use the assigned message (thanks to Sartak) - added tests for this - Moose::Meta::Method::Destructor - making sure DESTROY gets inlined properly with successive DEMOLISH calls (thanks to manito) - Moose::Meta::Attribute Moose::Meta::Method::Accessor - fixed handling of undef with type constraints (thanks to Ernesto) - added tests for this - Moose::Util - added &get_all_init_args and &get_all_attribute_values (thanks to Sartak and nothingmuch) 0.36 2008-01-26 - Moose::Role Moose::Meta::Attribute - role type tests now support when roles are applied to non-Moose classes (found by ash) - added tests for this (thanks to ash) - couple extra tests to boost code coverage - Moose::Meta::Method::Constructor - improved fix for handling Class::MOP attributes - added test for this - Moose::Meta::Class - handled the add_attribute($attribute_meta_object) case correctly - added test for this 0.35 2008-01-22 - Moose::Meta::Method::Constructor - fix to make sure even Class::MOP attributes are handled correctly (Thanks to Dave Rolsky) - added test for this (also Dave Rolsky) - Moose::Meta::Class - improved error message on _apply_all_roles, you should now use Moose::Util::apply_all_roles and you shouldnt have been using a _ prefixed method in the first place ;) 0.34 2008-01-21 ~~~ more misc. doc. fixes ~~~ ~~ updated copyright dates ~~ Moose is now a postmodern object system :) - (see the POD for details) - <> - this release contains a major reworking and cleanup of the role system - 100% backwards compat. - Role application now restructured into seperate classes based on type of applicants - Role summation (combining of more than one role) is much cleaner and anon-classes are no longer used in this process - new Composite role metaclass - runtime application of roles to instances is now more efficient and re-uses generated classes when applicable - <> - methods can now be excluded from a given role during composition - methods can now be aliased to another name (and still retain the original as well) - Moose::Util::TypeConstraints::OptimizedConstraints - added this module (see above) - Moose::Meta::Class - fixed the &_process_attribute method to be called by &add_attribute, so that the API is now correct - Moose::Meta::Method::Accessor - fixed bug when passing a list of values to an accessor would get (incorrectly) ignored. Thanks to Sartak for finding this ;) - added tests for this (Sartak again) - Moose::Meta::Method::Accessor Moose::Meta::Method::Constructor Moose::Meta::Attribute Moose::Meta::TypeConstraint Moose::Meta::TypeCoercion - lots of cleanup of such things as: - generated methods - type constraint handling - error handling/messages (thanks to nothingmuch) - Moose::Meta::TypeConstraint::Parameterizable - added this module to support the refactor in Moose::Meta::TypeConstraint::Parameterized - Moose::Meta::TypeConstraint::Parameterized - refactored how these types are handled so they are more generic and not confined to ArrayRef and HashRef only - t/ - shortened some file names for better VMS support (RT #32381) 0.33 2007-12-14 !! Moose now loads 2 x faster !! !! with new Class::MOP 0.49 !! ++ new oose.pm module to make command line Moose-ness easier (see POD docs for more) - Moose::Meta::Class - Moose::Meta::Role - several tweaks to take advantage of the new method map caching in Class::MOP - Moose::Meta::TypeConstraint::Parameterized - allow subtypes of ArrayRef and HashRef to be used as a container (sartak) - added tests for this - basic support for coercion to ArrayRef and HashRef for containers (sartak) - added tests for this - Moose::Meta::TypeCoercion - coercions will now create subtypes as needed so you can now add coercions to parameterized types without having to explictly define them - added tests for this - Moose::Meta::Method::Accessor - allow subclasses to decide whether we need to copy the value into a new variable (sartak) 0.32 2007-12-04 - Moose::Util::TypeConstraints - fixing how subtype aliases of unions work they should inherit the parent's coercion - added tests for this - you can now define multiple coercions on a single type at different times instead of having to do it all in one place - added tests for this - Moose::Meta::TypeConstraint - there is now a default constraint of sub { 1 } instead of Moose::Util::TypeConstraints setting this for us - Moose::Meta::TypeCoercion - Moose::Meta::TypeCoercion::Union - added the &has_coercion_for_type and &add_type_coercions methods to support the new features above (although you cannot add more type coercions for Union types) 0.31 2007-11-26 - Moose::Meta::Attribute - made the +attr syntax handle extending types with parameters. So "has '+foo' => (isa => 'ArrayRef[Int]')" now works if the original foo is an ArrayRef. - added tests for this. - delegation now works even if the attribute does not have a reader method using the get_read_method_ref method from Class::MOP::Attribute. - added tests for this - added docs for this - Moose::Util::TypeConstraints - passing no "additional attribute info" to &find_or_create_type_constraint will no longer attempt to create an __ANON__ type for you, instead it will just return undef. - added docs for this 0.30 2007-11-23 - Moose::Meta::Method::Constructor -builder related bug in inlined constructor. (groditi) - Moose::Meta::Method::Accessor - genereate unnecessary calls to predicates and refactor code generation for runtime speed (groditi) - Moose::Util::TypeConstraints - fix ClassName constraint to introspect symbol table (mst) - added more tests for this (mst) - fixed it so that subtype 'Foo' => as 'HashRef[Int]' ... with work correctly. - added tests for this - Moose::Cookbook - adding the link to Recipie 11 (written by Sartak) - adding test for SYNOPSIS code - t/ - New tests for builder bug. Upon instantiation, if an attribute had a builder, no value and was not lazy the builder default was not getting run, oops. (groditi) 0.29 2007-11-13 - Moose::Meta::Attribute - Fix error message on missing builder method (groditi) - Moose::Meta::Method::Accessor - Fix error message on missing builder method (groditi) - t/ - Add test to check for the correct error message when builder method is missing (groditi) 0.28 2007-11-13 - 0.27 packaged incorrectly (groditi) 0.27 2007-11-13 - Moose::Meta::Attribute - Added support for the new builder option (groditi) - Added support for lazy_build option (groditi) - Changed slot initialization for predicate changes (groditi) - Moose::Meta::Method::Accessor - Added support for lazy_build option (groditi) - Fix inline methods to work with corrected predicate behavior (groditi) - Moose::Meta::Method::Constructor - Added support for lazy_build option (groditi) - t/ - tests for builder and lazy_build (groditi) - fixing some misc. bits in the docs that got mentioned on CPAN Forum & perlmonks - Moose::Meta::Role - fixed how required methods are handled when they encounter overriden or modified methods from a class (thanks to confound). - added tests for this - Moose::Util::TypeConstraint - fixed the type notation parser so that the | always creates a union and so is no longer a valid type char (thanks to konobi, mugwump and #moose for working this one out.) - added more tests for this 0.26 2007-09-27 == New Features == - Parameterized Types We now support parameterized collection types, such as: ArrayRef[Int] # array or integers HashRef[Object] # a hash with object values They can also be nested: ArrayRef[HashRef[RegexpRef]] # an array of hashes with regex values And work with the type unions as well: ArrayRef[Int | Str] # array of integers of strings - Better Framework Extendability Moose.pm is now "extendable" such that it is now much easier to extend the framework and add your own keywords and customizations. See the "EXTENDING AND EMBEDDING MOOSE" section of the Moose.pm docs. - Moose Snacks! In an effort to begin documenting some of the various details of Moose as well as some common idioms, we have created Moose::Cookbook::Snacks as a place to find small (easily digestable) nuggets of Moose code. ==== ~ Several doc updates/cleanup thanks to castaway ~ - converted build system to use Module::Install instead of Module::Build (thanks to jrockway) - Moose - added all the meta classes to the immutable list and set it to inline the accessors - fix import to allow Sub::Exporter like { into => } and { into_level => } (perigrin) - exposed and documented init_meta() to allow better embedding and extending of Moose (perigrin) - t/ - complete re-organization of the test suite - added some new tests as well - finally re-enabled the Moose::POOP test since the new version of DBM::Deep now works again (thanks rob) - Moose::Meta::Class - fixed very odd and very nasty recursion bug with inner/augment (mst) - added tests for this (eilara) - Moose::Meta::Attribute Moose::Meta::Method::Constructor Moose::Meta::Method::Accessor - fixed issue with overload::Overloaded getting called on non-blessed items. (RT #29269) - added tests for this - Moose::Meta::Method::Accessor - fixed issue with generated accessor code making assumptions about hash based classes (thanks to dexter) - Moose::Coookbook::Snacks - these are bits of documentation, not quite as big as Recipes but which have no clear place in the module docs. So they are Snacks! (horray for castaway++) - Moose::Cookbook::Recipe4 - updated it to use the new ArrayRef[MyType] construct - updated the accompanying test as well +++ Major Refactor of the Type Constraint system +++ +++ with new features added as well +++ - Moose::Util::TypeConstraint - no longer uses package variable to keep track of the type constraints, now uses the an instance of Moose::Meta::TypeConstraint::Registry to do it - added more sophisticated type notation parsing (thanks to mugwump) - added tests for this - Moose::Meta::TypeConstraint - some minor adjustments to make subclassing easier - added the package_defined_in attribute so that we can track where the type constraints are created - Moose::Meta::TypeConstraint::Union - this is now been refactored to be a subclass of Moose::Meta::TypeConstraint - Moose::Meta::TypeCoercion::Union - this has been added to service the newly refactored Moose::Meta::TypeConstraint::Union and is itself a subclass of Moose::Meta::TypeCoercion - Moose::Meta::TypeConstraint::Parameterized - added this module (taken from MooseX::AttributeHelpers) to help construct nested collection types - added tests for this - Moose::Meta::TypeConstraint::Registry - added this class to keep track of type constraints 0.25 2007-08-13 - Moose - Documentation update to reference Moose::Util::TypeConstraints under 'isa' in 'has' for how to define a new type (thanks to shlomif). - Moose::Meta::Attribute - required attributes now will no longer accept undef from the constructor, even if there is a default and lazy - added tests for this - default subroutines must return a value which passes the type constraint - added tests for this - Moose::Meta::Attribute - Moose::Meta::Method::Constructor - Moose::Meta::Method::Accessor - type-constraint tests now handle overloaded objects correctly in the error message - added tests for this (thanks to EvanCarroll) - Moose::Meta::TypeConstraint::Union - added (has_)hand_optimized_constraint to this class so that it behaves as the regular Moose::Meta::TypeConstraint does. - Moose::Meta::Role - large refactoring of this code - added several more tests - tests for subtle conflict resolition issues added, but not currently running (thanks to kolibre) - Moose::Cookbook::Recipe7 - added new recipe for augment/inner functionality (still in progress) - added test for this - Moose::Spec::Role - a formal definition of roles (still in progress) - Moose::Util - utilities for easier working with Moose classes - added tests for these - Test::Moose - This contains Moose specific test functions - added tests for these 0.24 2007-07-03 ~ Some doc updates/cleanup ~ - Moose::Meta::Attribute - added support for roles to be given as parameters to the 'handles' option. - added tests and docs for this - the has '+foo' attribute form now accepts changes to the lazy option, and the addition of a handles option (but not changing the handles option) - added tests and docs for this - Moose::Meta::Role - required methods are now fetched using find_method_by_name so that required methods can come from superclasses - adjusted tests for this 0.23 2007-06-18 - Moose::Meta::Method::Constructor - fix inlined constructor for hierarchy with multiple BUILD methods (mst) - Moose::Meta::Class - Modify make_immutable to work with the new Class::MOP immutable mechanism + POD + very basic test (groditi) - Moose::Meta::Attribute - Fix handles to use goto() so that caller() comes out properly on the other side (perigrin) 0.22 2007-05-31 - Moose::Util::TypeConstraints - fix for prototype undeclared issue when Moose::Util::TypeConstraints loaded before consumers (e.g. Moose::Meta::Attribute) by predeclaring prototypes for functions - added the ClassName type constraint, this checks for strings which will respond true to ->isa(UNIVERSAL). - added tests and docs for this - subtyping just in name now works correctly by making the default for where be { 1 } - added test for this - Moose::Meta::Method::Accessor - coerce and lazy now work together correctly, thanks to merlyn for finding this bug - tests added for this - fix reader presedence bug in Moose::Meta::Attribute + tests - Moose::Object - Foo->new(undef) now gets ignored, it is assumed you meant to pass a HASH-ref and missed. This produces better error messages then having it die cause undef is not a HASH. - added tests for this 0.21 2007-05-03 - Moose - added SUPER_SLOT and INNER_SLOT class hashes to support unimport - modified unimport to remove super and inner along with the rest - altered unimport tests to handle this - Moose::Role - altered super export to populate SUPER_SLOT - Moose::Meta::Class - altered augment and override modifier application to use *_SLOT - modified tests for these to unimport one test class each to test - Moose::Meta::Role - fixed issue where custom attribute metaclasses where not handled correctly in roles - added tests for this - Moose::Meta::Class - fixed issue where extending metaclasses with roles would blow up. Thanks to Aankhen`` for finding this insidious error, and its solution. ~~ lots of spelling and grammer fixes in the docs, many many thanks to rlb3 and Aankhen for these :) 0.20 2007-04-06 >> I messed up the SKIP logic in one test so this release is just to fix that. - Moose - 'has' now also accepts an ARRAY ref to create multiple attrs (see docs) (thanks to konobi for this) - added tests and docs 0.19 2007-04-05 ~~ More documentation updates ~~ - Moose::Util::TypeConstraints - 'type' now supports messages as well thanks to phaylon for finding this - added tests for this - added &list_all_type_constraints and &list_all_builtin_type_constraints functions to facilitate introspection. - Moose::Meta::Attribute - fixed regexp 'handles' declarations to build the list of delegated methods correctly (and not override important things like &new) thanks to ashleyb for finding this - added tests and docs for this - added the 'documentation' attributes so that you can actually document your attributes and inspect them through the meta-object. - added tests and docs for this - Moose::Meta::Class - when loading custom attribute metaclasses it will first look in for the class in the Moose::Meta::Attribute::Custom::$name, and then default to just loading $name. - added tests and docs for this - Moose::Meta::TypeConstraint - type constraints now stringify to their names. - added test for this - misc. - added tests to assure we work with Module::Refresh - added stricter test skip logic in the Moose POOP test, ask Rob Kinyon why. - *cough* DBM::Deep 1.0 backwards compatibility sucks *cough* ;) 0.18 2007-03-10 ~~ Many, many documentation updates ~~ - misc. - We now use Class::MOP::load_class to load all classes. - added tests to show types and subtypes working with Declare::Constraints::Simple and Test::Deep as constraint engines. 0.18_001 2006-11-26 !! You must have Class::MOP 0.37_001 !! !! for this developer release to work !! This release was primarily adding the immutable feature to Moose. An immutable class is one which you promise not to alter. When you set the class as immutable it will perform various bits of memoization and inline certain part of the code (constructors, destructors and accessors). This minimizes (and in some cases totally eliminates) one of Moose's biggest performance hits. This feature is not on by default, and is 100% optional. It has several configurable bits as well, so you can pick and choose to your specific needs. The changes involved in this were fairly wide and highly specific, but 100% backwards compatible, so I am not going to enumerate them here. If you are truely interested in what was changed, please do a diff :) 0.17 2006-11-14 - Moose::Meta::Method::Accessor - bugfix for read-only accessors which are have a type constraint and lazy. Thanks to chansen for finding it. 0.16 2006-11-14 ++ NOTE ++ There are some speed improvements in this release, but they are only the begining, so stay tuned. - Moose::Object - BUILDALL and DEMOLISHALL no longer get called unless they actually need to be. This gave us a signifigant speed boost for the cases when there is no BUILD or DEMOLISH method present. - Moose::Util::TypeConstraints - Moose::Meta::TypeConstraint - added an 'optimize_as' option to the type constraint, which allows for a hand optimized version of the type constraint to be used when possible. - Any internally created type constraints now provide an optimized version as well. 0.15 2006-11-05 ++ NOTE ++ This version of Moose *must* have Class::MOP 0.36 in order to work correctly. A number of small internal tweaks have been made in order to be compatible with that release. - Moose::Util::TypeConstraints - added &unimport so that you can clean out your class namespace of these exported keywords - Moose::Meta::Class - fixed minor issue which occasionally comes up during global destruction (thanks omega) - moved Moose::Meta::Method::Overriden into its own file. - Moose::Meta::Role - moved Moose::Meta::Role::Method into its own file. - Moose::Meta::Attribute - changed how we do type checks so that we reduce the overall cost, but still retain correctness. *** API CHANGE *** - moved accessor generation methods to Moose::Meta::Method::Accessor to conform to the API changes from Class::MOP 0.36 - Moose::Meta::TypeConstraint - changed how constraints are compiled so that we do less recursion and more iteration. This makes the type check faster :) - moved Moose::Meta::TypeConstraint::Union into its own file - Moose::Meta::Method::Accessor - created this from methods formerly found in Moose::Meta::Attribute - Moose::Meta::Role::Method - moved this from Moose::Meta::Role - Moose::Meta::Method::Overriden - moved this from Moose::Meta::Class - Moose::Meta::TypeConstraint::Union - moved this from Moose::Meta::TypeConstraint 0.14 2006-10-09 - Moose::Meta::Attribute - fixed lazy attributes which were not getting checked with the type constraint (thanks ashley) - added tests for this - removed the over-enthusiastic DWIMery of the automatic ArrayRef and HashRef defaults, it broke predicates in an ugly way. - removed tests for this 0.13 2006-09-30 ++ NOTE ++ This version of Moose *must* have Class::MOP 0.35 in order to work correctly. A number of small internal tweaks have been made in order to be compatible with that release. - Moose - Removed the use of UNIVERSAL::require to be a better symbol table citizen and remove a dependency (thanks Adam Kennedy) **~~ removed experimental & undocumented feature ~~** - commented out the 'method' and 'self' keywords, see the comments for more info. - Moose::Cookbook - added a FAQ and WTF files to document frequently asked questions and common problems - Moose::Util::TypeConstraints - added GlobRef and FileHandle type constraint - added tests for this - Moose::Meta::Attribute - if your attribute 'isa' ArrayRef of HashRef, and you have not explicitly set a default, then make the default DWIM. This will also work for subtypes of ArrayRef and HashRef as well. - you can now auto-deref subtypes of ArrayRef or HashRef too. - new test added for this (thanks to ashley) - Moose::Meta::Role - added basic support for runtime role composition but this is still *highly experimental*, so feedback is much appreciated :) - added tests for this - Moose::Meta::TypeConstraint - the type constraint now handles the coercion process through delegation, this is to support the coercion of unions - Moose::Meta::TypeConstraint::Union - it is now possible for coercions to be performed on a type union - added tests for this (thanks to konobi) - Moose::Meta::TypeCoercion - properly capturing error when type constraint is not found - Build.PL - Scalar::Util 1.18 is bad on Win32, so temporarily only require version 1.17 for Win32 and cygwin. (thanks Adam Kennedy) 0.12 2006-09-01 - Moose::Cookbook - Recipe5 (subtypes & coercion) has been written - Moose - fixed "bad meta" error message to be more descriptive - fixed &unimport to not remove the &inner and &super keywords because we need to localize them. - fixed number of spelling/grammer issues, thanks Theory :) **~~ experimental & undocumented feature ~~** - added the method and self keywords, they are basically just sugar, and they may not stay around. - Moose::Object - added &dump method to easily Data::Dumper an object - Moose::Meta::TypeConstraint - added the &is_a_type_of method to check both the current and the subtype of a method (similar to &isa with classes) - Moose::Meta::Role - this is now a subclass of Class::MOP::Module, and no longer creates the _role_meta ugliness of before. - fixed tests to reflect this change 0.11 2006-07-12 - Moose - added an &unimport method to remove all the keywords that Moose will import, simply add 'no Moose' to the bottom of your class file. - t/ - fixed some test failures caused by a forgotten test dependency. 0.10 2006-07-06 - Moose - improved error message when loading modules so it is less confusing when you load a role. - added &calculate_all_roles method to Moose::Meta::Class and Moose::Meta::Role NOTE: This module has been tested against Class::MOP 0.30 but it does not yet utilize the optimizations it makes available. Stay tuned for that ;) 0.09_03 2006-06-23 ++ DEVELOPER RELEASE ++ - Moose - 'use strict' and 'use warnings' are no longer needed in Moose classes, Moose itself will turn them on for you. - added tests for this - moved code from exported subs to private methods in Moose::Meta::Class - Moose::Role - as with Moose, strict and warnings are automatically turned on for you. - added tests for this - Moose::Meta::Role - now handles an edge case for override errors - added tests for this - added some more edge case tests 0.09_02 2006-05-16 ++ DEVELOPER RELEASE ++ - Moose - added prototypes to the exported subs - updated docs - Moose::Role - added prototypes to the exported subs - updated docs - Moose::Util::TypeConstraints - cleaned up prototypes for the subs - updated docs 0.09_01 2006-05-12 ++ DEVELOPER RELEASE ++ - This release works in combination with Class::MOP 0.29_01, it is a developer release because it uses the a new instance sub-protocol and a fairly complete Role implementation. It has not yet been optimized, so it is slower than the previous CPAN version. This release also lacks good updated docs, the official release will have updated docs. - Moose - refactored the keyword exports - 'with' now checks Role validaity and accepts more than one Role at a time - 'extends' makes metaclass adjustments as needed to ensure metaclass compatibility - Moose::Role - refactored the keyword exports - 'with' now checks Role validaity and accepts more than one Role at a time - Moose::Util::TypeConstraints - added the 'enum' keyword for simple string enumerations which can be used as type constraints - see example of usage in t/202_example.t - Moose::Object - more careful checking of params to new() - Moose::Meta::Role - much work done on the role composition - many new tests for conflict detection and composition edge cases - not enough documentation, I suggest looking at the tests - Moose::Meta::Instance - added new Instance metaclass to support the new Class::MOP instance protocol - Moose::Meta::Class - some small changes to support the new instance protocol - some small additions to support Roles - Moose::Meta::Attribute - some improvements to the accessor generation code by nothingmuch - some small changes to support the new instance protocol - (still somewhat) experimental delegation support with the 'handles' option - added several tests for this - no docs for this yet 0.05 2006-04-27 - Moose - keywords are now exported with Sub::Exporter thanks to chansen for this commit - has keyword now takes a 'metaclass' option to support custom attribute meta-classes on a per-attribute basis - added tests for this - the 'has' keyword not accepts inherited slot specifications (has '+foo'). This is still an experimental feature and probably not finished see t/038_attribute_inherited_slot_specs.t for more details, or ask about it on #moose - added tests for this - Moose::Role - keywords are now exported with Sub::Exporter - Moose::Utils::TypeConstraints - reorganized the type constraint hierarchy, thanks to nothingmuch and chansen for his help and advice on this - added some tests for this - keywords are now exported with Sub::Exporter thanks to chansen for this commit - Moose::Meta::Class - due to changes in Class::MOP, we had to change construct_instance (for the better) - Moose::Meta::Attribute - due to changes in Class::MOP, we had to add the initialize_instance_slot method (it's a good thing) - Moose::Meta::TypeConstraint - added type constraint unions - added tests for this - added the is_subtype_of predicate method - added tests for this 0.04 2006-04-16 - Moose::Role - Roles can now consume other roles - added tests for this - Roles can specify required methods now with the requires() keyword - added tests for this - Moose::Meta::Role - ripped out much of its guts... much cleaner now - added required methods and correct handling of them in apply() for both classes and roles - added tests for this - no longer adds a does() method to consuming classes it relys on the one in Moose::Object - added roles attribute and some methods to support roles consuming roles - Moose::Meta::Attribute - added support for triggers on attributes - added tests for this - added support for does option on an attribute - added tests for this - Moose::Meta::Class - added support for attribute triggers in the object construction - added tests for this - Moose - Moose no longer creates a subtype for your class if a subtype of the same name already exists, this should DWIM in 99.9999% of all cases - Moose::Util::TypeConstraints - fixed bug where incorrect subtype conflicts were being reported - added test for this - Moose::Object - this class can now be extended with 'use base' if you need it, it properly loads the metaclass class now - added test for this 0.03_02 2006-04-12 - Moose - you must now explictly use Moose::Util::TypeConstraints it no longer gets exported for you automatically - Moose::Object - new() now accepts hash-refs as well as key/value lists - added does() method to check for Roles - added tests for this - Moose::Meta::Class - added roles attribute along with the add_role() and does_role() methods - added tests for this - Moose::Meta::Role - now adds a does() method to consuming classes which tests the class's hierarchy for roles - added tests for this 0.03_01 2006-04-10 - Moose::Cookbook - added new Role recipe (no content yet, only code) - Moose - added 'with' keyword for Role support - added test and docs for this - fixed subtype quoting bug - added test for this - Moose::Role - Roles for Moose - added test and docs - Moose::Util::TypeConstraints - added the message keyword to add custom error messages to type constraints - Moose::Meta::Role - the meta role to support Moose::Role - added tests and docs - Moose::Meta::Class - moved a number of things from Moose.pm to here, they should have been here in the first place - Moose::Meta::Attribute - moved the attribute option macros here instead of putting them in Moose.pm - Moose::Meta::TypeConstraint - added the message attributes and the validate method - added tests and docs for this 0.03 2006-03-30 - Moose::Cookbook - added the Moose::Cookbook with 5 recipes, describing all the stuff Moose can do. - Moose - fixed an issue with &extends super class loading it now captures errors and deals with inline packages correctly (bug found by mst, solution stolen from alias) - added super/override & inner/augment features - added tests and docs for these - Moose::Object - BUILDALL now takes a reference of the %params that are passed to &new, and passes that to each BUILD as well. - Moose::Util::TypeConstraints - Type constraints now survive runtime reloading - added test for this - Moose::Meta::Class - fixed the way attribute defaults are handled during instance construction (bug found by chansen) - Moose::Meta::Attribute - read-only attributes now actually enforce their read-only-ness (this corrected in Class::MOP as well) 0.02 2006-03-21 - Moose - many more tests, fixing some bugs and edge cases - &extends now loads the base module with UNIVERSAL::require - added UNIVERSAL::require to the dependencies list ** API CHANGES ** - each new Moose class will also create and register a subtype of Object which correspond to the new Moose class. - the 'isa' option in &has now only accepts strings, and will DWIM in almost all cases - Moose::Util::TypeConstraints - added type coercion features - added tests for this - added support for this in attributes and instance construction ** API CHANGES ** - type construction no longer creates a function, it registers the type instead. - added several functions to get the registered types - Moose::Object - BUILDALL and DEMOLISHALL were broken because of a mis-named hash key, Whoops :) - Moose::Meta::Attribute - adding support for coercion in the autogenerated accessors - Moose::Meta::Class - adding support for coercion in the instance construction - Moose::Meta::TypeConstraint - Moose::Meta::TypeCoercion - type constraints and coercions are now full fledges meta-objects 0.01 2006-03-15 - Moooooooooooooooooose!!! Moose-2.2200/author/000770 000766 000024 00000000000 14137574636 014453 5ustar00etherstaff000000 000000 Moose-2.2200/MANIFEST000644 000766 000024 00000120176 14137574636 014314 0ustar00etherstaff000000 000000 # This file was automatically generated by Dist::Zilla::Plugin::Manifest v6.024. Changes Changes.Class-MOP LICENSE MANIFEST META.json META.yml Makefile.PL README.md TODO author/doc-generator author/extract-inline-tests author/find-dupe-test-numbers benchmarks/caf_vs_moose.pl benchmarks/cmop/all.yml benchmarks/cmop/foo.pl benchmarks/cmop/lib/Bench/Accessor.pm benchmarks/cmop/lib/Bench/Construct.pm benchmarks/cmop/lib/Bench/Run.pm benchmarks/cmop/lib/MOP/Immutable/Point.pm benchmarks/cmop/lib/MOP/Immutable/Point3D.pm benchmarks/cmop/lib/MOP/Installed/Point.pm benchmarks/cmop/lib/MOP/Installed/Point3D.pm benchmarks/cmop/lib/MOP/Point.pm benchmarks/cmop/lib/MOP/Point3D.pm benchmarks/cmop/lib/Plain/Point.pm benchmarks/cmop/lib/Plain/Point3D.pm benchmarks/cmop/loading-benchmark.pl benchmarks/cmop/profile.pl benchmarks/cmop/run_yml.pl benchmarks/immutable.pl benchmarks/lotsa-classes.pl benchmarks/method_modifiers.pl benchmarks/moose_bench.pl benchmarks/simple_class.pl benchmarks/simple_compile.pl benchmarks/simple_constructor.pl benchmarks/type_constraints.pl benchmarks/type_constraints2.pl bin/moose-outdated dist.ini doc/moosex-compile inc/CheckAuthorDeps.pm inc/CheckDelta.pm inc/CheckReleaseType.pm inc/Clean.pm inc/Documentation.pm inc/ExtUtils/HasCompiler.pm inc/ExtractInlineTests.pm inc/GenerateDocs.pm inc/GitUpToDate.pm inc/MMHelper.pm inc/MakeMaker.pm inc/MyInline.pm inc/SimpleAuthority.pm inc/SimpleProvides.pm inc/TestRelease.pm lib/Class/MOP.pm lib/Class/MOP/Attribute.pm lib/Class/MOP/Class.pm lib/Class/MOP/Class/Immutable/Trait.pm lib/Class/MOP/Deprecated.pm lib/Class/MOP/Instance.pm lib/Class/MOP/Method.pm lib/Class/MOP/Method/Accessor.pm lib/Class/MOP/Method/Constructor.pm lib/Class/MOP/Method/Generated.pm lib/Class/MOP/Method/Inlined.pm lib/Class/MOP/Method/Meta.pm lib/Class/MOP/Method/Wrapped.pm lib/Class/MOP/MiniTrait.pm lib/Class/MOP/Mixin.pm lib/Class/MOP/Mixin/AttributeCore.pm lib/Class/MOP/Mixin/HasAttributes.pm lib/Class/MOP/Mixin/HasMethods.pm lib/Class/MOP/Mixin/HasOverloads.pm lib/Class/MOP/Module.pm lib/Class/MOP/Object.pm lib/Class/MOP/Overload.pm lib/Class/MOP/Package.pm lib/Moose.pm lib/Moose/Conflicts.pm lib/Moose/Cookbook.pod lib/Moose/Cookbook/Basics/BankAccount_MethodModifiersAndSubclassing.pod lib/Moose/Cookbook/Basics/BinaryTree_AttributeFeatures.pod lib/Moose/Cookbook/Basics/BinaryTree_BuilderAndLazyBuild.pod lib/Moose/Cookbook/Basics/Company_Subtypes.pod lib/Moose/Cookbook/Basics/DateTime_ExtendingNonMooseParent.pod lib/Moose/Cookbook/Basics/Document_AugmentAndInner.pod lib/Moose/Cookbook/Basics/Genome_OverloadingSubtypesAndCoercion.pod lib/Moose/Cookbook/Basics/HTTP_SubtypesAndCoercion.pod lib/Moose/Cookbook/Basics/Immutable.pod lib/Moose/Cookbook/Basics/Person_BUILDARGSAndBUILD.pod lib/Moose/Cookbook/Basics/Point_AttributesAndSubclassing.pod lib/Moose/Cookbook/Extending/Debugging_BaseClassRole.pod lib/Moose/Cookbook/Extending/ExtensionOverview.pod lib/Moose/Cookbook/Extending/Mooseish_MooseSugar.pod lib/Moose/Cookbook/Legacy/Debugging_BaseClassReplacement.pod lib/Moose/Cookbook/Legacy/Labeled_AttributeMetaclass.pod lib/Moose/Cookbook/Legacy/Table_ClassMetaclass.pod lib/Moose/Cookbook/Meta/GlobRef_InstanceMetaclass.pod lib/Moose/Cookbook/Meta/Labeled_AttributeTrait.pod lib/Moose/Cookbook/Meta/PrivateOrPublic_MethodMetaclass.pod lib/Moose/Cookbook/Meta/Table_MetaclassTrait.pod lib/Moose/Cookbook/Meta/WhyMeta.pod lib/Moose/Cookbook/Roles/ApplicationToInstance.pod lib/Moose/Cookbook/Roles/Comparable_CodeReuse.pod lib/Moose/Cookbook/Roles/Restartable_AdvancedComposition.pod lib/Moose/Cookbook/Snack/Keywords.pod lib/Moose/Cookbook/Snack/Types.pod lib/Moose/Cookbook/Style.pod lib/Moose/Deprecated.pm lib/Moose/Exception.pm lib/Moose/Exception/AccessorMustReadWrite.pm lib/Moose/Exception/AddParameterizableTypeTakesParameterizableType.pm lib/Moose/Exception/AddRoleTakesAMooseMetaRoleInstance.pm lib/Moose/Exception/AddRoleToARoleTakesAMooseMetaRole.pm lib/Moose/Exception/ApplyTakesABlessedInstance.pm lib/Moose/Exception/AttachToClassNeedsAClassMOPClassInstanceOrASubclass.pm lib/Moose/Exception/AttributeConflictInRoles.pm lib/Moose/Exception/AttributeConflictInSummation.pm lib/Moose/Exception/AttributeExtensionIsNotSupportedInRoles.pm lib/Moose/Exception/AttributeIsRequired.pm lib/Moose/Exception/AttributeMustBeAnClassMOPMixinAttributeCoreOrSubclass.pm lib/Moose/Exception/AttributeNamesDoNotMatch.pm lib/Moose/Exception/AttributeValueIsNotAnObject.pm lib/Moose/Exception/AttributeValueIsNotDefined.pm lib/Moose/Exception/AutoDeRefNeedsArrayRefOrHashRef.pm lib/Moose/Exception/BadOptionFormat.pm lib/Moose/Exception/BothBuilderAndDefaultAreNotAllowed.pm lib/Moose/Exception/BuilderDoesNotExist.pm lib/Moose/Exception/BuilderMethodNotSupportedForAttribute.pm lib/Moose/Exception/BuilderMethodNotSupportedForInlineAttribute.pm lib/Moose/Exception/BuilderMustBeAMethodName.pm lib/Moose/Exception/CallingMethodOnAnImmutableInstance.pm lib/Moose/Exception/CallingReadOnlyMethodOnAnImmutableInstance.pm lib/Moose/Exception/CanExtendOnlyClasses.pm lib/Moose/Exception/CanOnlyConsumeRole.pm lib/Moose/Exception/CanOnlyWrapBlessedCode.pm lib/Moose/Exception/CanReblessOnlyIntoASubclass.pm lib/Moose/Exception/CanReblessOnlyIntoASuperclass.pm lib/Moose/Exception/CannotAddAdditionalTypeCoercionsToUnion.pm lib/Moose/Exception/CannotAddAsAnAttributeToARole.pm lib/Moose/Exception/CannotApplyBaseClassRolesToRole.pm lib/Moose/Exception/CannotAssignValueToReadOnlyAccessor.pm lib/Moose/Exception/CannotAugmentIfLocalMethodPresent.pm lib/Moose/Exception/CannotAugmentNoSuperMethod.pm lib/Moose/Exception/CannotAutoDerefWithoutIsa.pm lib/Moose/Exception/CannotAutoDereferenceTypeConstraint.pm lib/Moose/Exception/CannotCalculateNativeType.pm lib/Moose/Exception/CannotCallAnAbstractBaseMethod.pm lib/Moose/Exception/CannotCallAnAbstractMethod.pm lib/Moose/Exception/CannotCoerceAWeakRef.pm lib/Moose/Exception/CannotCoerceAttributeWhichHasNoCoercion.pm lib/Moose/Exception/CannotCreateHigherOrderTypeWithoutATypeParameter.pm lib/Moose/Exception/CannotCreateMethodAliasLocalMethodIsPresent.pm lib/Moose/Exception/CannotCreateMethodAliasLocalMethodIsPresentInClass.pm lib/Moose/Exception/CannotDelegateLocalMethodIsPresent.pm lib/Moose/Exception/CannotDelegateWithoutIsa.pm lib/Moose/Exception/CannotFindDelegateMetaclass.pm lib/Moose/Exception/CannotFindType.pm lib/Moose/Exception/CannotFindTypeGivenToMatchOnType.pm lib/Moose/Exception/CannotFixMetaclassCompatibility.pm lib/Moose/Exception/CannotGenerateInlineConstraint.pm lib/Moose/Exception/CannotInitializeMooseMetaRoleComposite.pm lib/Moose/Exception/CannotInlineTypeConstraintCheck.pm lib/Moose/Exception/CannotLocatePackageInINC.pm lib/Moose/Exception/CannotMakeMetaclassCompatible.pm lib/Moose/Exception/CannotOverrideALocalMethod.pm lib/Moose/Exception/CannotOverrideBodyOfMetaMethods.pm lib/Moose/Exception/CannotOverrideLocalMethodIsPresent.pm lib/Moose/Exception/CannotOverrideNoSuperMethod.pm lib/Moose/Exception/CannotRegisterUnnamedTypeConstraint.pm lib/Moose/Exception/CannotUseLazyBuildAndDefaultSimultaneously.pm lib/Moose/Exception/CircularReferenceInAlso.pm lib/Moose/Exception/ClassDoesNotHaveInitMeta.pm lib/Moose/Exception/ClassDoesTheExcludedRole.pm lib/Moose/Exception/ClassNamesDoNotMatch.pm lib/Moose/Exception/CloneObjectExpectsAnInstanceOfMetaclass.pm lib/Moose/Exception/CodeBlockMustBeACodeRef.pm lib/Moose/Exception/CoercingWithoutCoercions.pm lib/Moose/Exception/CoercionAlreadyExists.pm lib/Moose/Exception/CoercionNeedsTypeConstraint.pm lib/Moose/Exception/ConflictDetectedInCheckRoleExclusions.pm lib/Moose/Exception/ConflictDetectedInCheckRoleExclusionsInToClass.pm lib/Moose/Exception/ConstructClassInstanceTakesPackageName.pm lib/Moose/Exception/CouldNotCreateMethod.pm lib/Moose/Exception/CouldNotCreateWriter.pm lib/Moose/Exception/CouldNotEvalConstructor.pm lib/Moose/Exception/CouldNotEvalDestructor.pm lib/Moose/Exception/CouldNotFindTypeConstraintToCoerceFrom.pm lib/Moose/Exception/CouldNotGenerateInlineAttributeMethod.pm lib/Moose/Exception/CouldNotLocateTypeConstraintForUnion.pm lib/Moose/Exception/CouldNotParseType.pm lib/Moose/Exception/CreateMOPClassTakesArrayRefOfAttributes.pm lib/Moose/Exception/CreateMOPClassTakesArrayRefOfSuperclasses.pm lib/Moose/Exception/CreateMOPClassTakesHashRefOfMethods.pm lib/Moose/Exception/CreateTakesArrayRefOfRoles.pm lib/Moose/Exception/CreateTakesHashRefOfAttributes.pm lib/Moose/Exception/CreateTakesHashRefOfMethods.pm lib/Moose/Exception/DefaultToMatchOnTypeMustBeCodeRef.pm lib/Moose/Exception/DelegationToAClassWhichIsNotLoaded.pm lib/Moose/Exception/DelegationToARoleWhichIsNotLoaded.pm lib/Moose/Exception/DelegationToATypeWhichIsNotAClass.pm lib/Moose/Exception/DoesRequiresRoleName.pm lib/Moose/Exception/EnumCalledWithAnArrayRefAndAdditionalArgs.pm lib/Moose/Exception/EnumValuesMustBeString.pm lib/Moose/Exception/ExtendsMissingArgs.pm lib/Moose/Exception/HandlesMustBeAHashRef.pm lib/Moose/Exception/IllegalInheritedOptions.pm lib/Moose/Exception/IllegalMethodTypeToAddMethodModifier.pm lib/Moose/Exception/IncompatibleMetaclassOfSuperclass.pm lib/Moose/Exception/InitMetaRequiresClass.pm lib/Moose/Exception/InitializeTakesUnBlessedPackageName.pm lib/Moose/Exception/InstanceBlessedIntoWrongClass.pm lib/Moose/Exception/InstanceMustBeABlessedReference.pm lib/Moose/Exception/InvalidArgPassedToMooseUtilMetaRole.pm lib/Moose/Exception/InvalidArgumentToMethod.pm lib/Moose/Exception/InvalidArgumentsToTraitAliases.pm lib/Moose/Exception/InvalidBaseTypeGivenToCreateParameterizedTypeConstraint.pm lib/Moose/Exception/InvalidHandleValue.pm lib/Moose/Exception/InvalidHasProvidedInARole.pm lib/Moose/Exception/InvalidNameForType.pm lib/Moose/Exception/InvalidOverloadOperator.pm lib/Moose/Exception/InvalidRoleApplication.pm lib/Moose/Exception/InvalidTypeConstraint.pm lib/Moose/Exception/InvalidTypeGivenToCreateParameterizedTypeConstraint.pm lib/Moose/Exception/InvalidValueForIs.pm lib/Moose/Exception/IsaDoesNotDoTheRole.pm lib/Moose/Exception/IsaLacksDoesMethod.pm lib/Moose/Exception/LazyAttributeNeedsADefault.pm lib/Moose/Exception/Legacy.pm lib/Moose/Exception/MOPAttributeNewNeedsAttributeName.pm lib/Moose/Exception/MatchActionMustBeACodeRef.pm lib/Moose/Exception/MessageParameterMustBeCodeRef.pm lib/Moose/Exception/MetaclassIsAClassNotASubclassOfGivenMetaclass.pm lib/Moose/Exception/MetaclassIsARoleNotASubclassOfGivenMetaclass.pm lib/Moose/Exception/MetaclassIsNotASubclassOfGivenMetaclass.pm lib/Moose/Exception/MetaclassMustBeASubclassOfMooseMetaClass.pm lib/Moose/Exception/MetaclassMustBeASubclassOfMooseMetaRole.pm lib/Moose/Exception/MetaclassMustBeDerivedFromClassMOPClass.pm lib/Moose/Exception/MetaclassNotLoaded.pm lib/Moose/Exception/MetaclassTypeIncompatible.pm lib/Moose/Exception/MethodExpectedAMetaclassObject.pm lib/Moose/Exception/MethodExpectsFewerArgs.pm lib/Moose/Exception/MethodExpectsMoreArgs.pm lib/Moose/Exception/MethodModifierNeedsMethodName.pm lib/Moose/Exception/MethodNameConflictInRoles.pm lib/Moose/Exception/MethodNameNotFoundInInheritanceHierarchy.pm lib/Moose/Exception/MethodNameNotGiven.pm lib/Moose/Exception/MustDefineAMethodName.pm lib/Moose/Exception/MustDefineAnAttributeName.pm lib/Moose/Exception/MustDefineAnOverloadOperator.pm lib/Moose/Exception/MustHaveAtLeastOneValueToEnumerate.pm lib/Moose/Exception/MustPassAHashOfOptions.pm lib/Moose/Exception/MustPassAMooseMetaRoleInstanceOrSubclass.pm lib/Moose/Exception/MustPassAPackageNameOrAnExistingClassMOPPackageInstance.pm lib/Moose/Exception/MustPassEvenNumberOfArguments.pm lib/Moose/Exception/MustPassEvenNumberOfAttributeOptions.pm lib/Moose/Exception/MustProvideANameForTheAttribute.pm lib/Moose/Exception/MustSpecifyAtleastOneMethod.pm lib/Moose/Exception/MustSpecifyAtleastOneRole.pm lib/Moose/Exception/MustSpecifyAtleastOneRoleToApplicant.pm lib/Moose/Exception/MustSupplyAClassMOPAttributeInstance.pm lib/Moose/Exception/MustSupplyADelegateToMethod.pm lib/Moose/Exception/MustSupplyAMetaclass.pm lib/Moose/Exception/MustSupplyAMooseMetaAttributeInstance.pm lib/Moose/Exception/MustSupplyAnAccessorTypeToConstructWith.pm lib/Moose/Exception/MustSupplyAnAttributeToConstructWith.pm lib/Moose/Exception/MustSupplyArrayRefAsCurriedArguments.pm lib/Moose/Exception/MustSupplyPackageNameAndName.pm lib/Moose/Exception/NeedsTypeConstraintUnionForTypeCoercionUnion.pm lib/Moose/Exception/NeitherAttributeNorAttributeNameIsGiven.pm lib/Moose/Exception/NeitherClassNorClassNameIsGiven.pm lib/Moose/Exception/NeitherRoleNorRoleNameIsGiven.pm lib/Moose/Exception/NeitherTypeNorTypeNameIsGiven.pm lib/Moose/Exception/NoAttributeFoundInSuperClass.pm lib/Moose/Exception/NoBodyToInitializeInAnAbstractBaseClass.pm lib/Moose/Exception/NoCasesMatched.pm lib/Moose/Exception/NoConstraintCheckForTypeConstraint.pm lib/Moose/Exception/NoDestructorClassSpecified.pm lib/Moose/Exception/NoImmutableTraitSpecifiedForClass.pm lib/Moose/Exception/NoParentGivenToSubtype.pm lib/Moose/Exception/OnlyInstancesCanBeCloned.pm lib/Moose/Exception/OperatorIsRequired.pm lib/Moose/Exception/OverloadConflictInSummation.pm lib/Moose/Exception/OverloadRequiresAMetaClass.pm lib/Moose/Exception/OverloadRequiresAMetaMethod.pm lib/Moose/Exception/OverloadRequiresAMetaOverload.pm lib/Moose/Exception/OverloadRequiresAMethodNameOrCoderef.pm lib/Moose/Exception/OverloadRequiresAnOperator.pm lib/Moose/Exception/OverloadRequiresNamesForCoderef.pm lib/Moose/Exception/OverrideConflictInComposition.pm lib/Moose/Exception/OverrideConflictInSummation.pm lib/Moose/Exception/PackageDoesNotUseMooseExporter.pm lib/Moose/Exception/PackageNameAndNameParamsNotGivenToWrap.pm lib/Moose/Exception/PackagesAndModulesAreNotCachable.pm lib/Moose/Exception/ParameterIsNotSubtypeOfParent.pm lib/Moose/Exception/ReferencesAreNotAllowedAsDefault.pm lib/Moose/Exception/RequiredAttributeLacksInitialization.pm lib/Moose/Exception/RequiredAttributeNeedsADefault.pm lib/Moose/Exception/RequiredMethodsImportedByClass.pm lib/Moose/Exception/RequiredMethodsNotImplementedByClass.pm lib/Moose/Exception/Role/Attribute.pm lib/Moose/Exception/Role/AttributeName.pm lib/Moose/Exception/Role/Class.pm lib/Moose/Exception/Role/EitherAttributeOrAttributeName.pm lib/Moose/Exception/Role/Instance.pm lib/Moose/Exception/Role/InstanceClass.pm lib/Moose/Exception/Role/InvalidAttributeOptions.pm lib/Moose/Exception/Role/Method.pm lib/Moose/Exception/Role/ParamsHash.pm lib/Moose/Exception/Role/Role.pm lib/Moose/Exception/Role/RoleForCreate.pm lib/Moose/Exception/Role/RoleForCreateMOPClass.pm lib/Moose/Exception/Role/TypeConstraint.pm lib/Moose/Exception/RoleDoesTheExcludedRole.pm lib/Moose/Exception/RoleExclusionConflict.pm lib/Moose/Exception/RoleNameRequired.pm lib/Moose/Exception/RoleNameRequiredForMooseMetaRole.pm lib/Moose/Exception/RolesDoNotSupportAugment.pm lib/Moose/Exception/RolesDoNotSupportExtends.pm lib/Moose/Exception/RolesDoNotSupportInner.pm lib/Moose/Exception/RolesDoNotSupportRegexReferencesForMethodModifiers.pm lib/Moose/Exception/RolesInCreateTakesAnArrayRef.pm lib/Moose/Exception/RolesListMustBeInstancesOfMooseMetaRole.pm lib/Moose/Exception/SingleParamsToNewMustBeHashRef.pm lib/Moose/Exception/TriggerMustBeACodeRef.pm lib/Moose/Exception/TypeConstraintCannotBeUsedForAParameterizableType.pm lib/Moose/Exception/TypeConstraintIsAlreadyCreated.pm lib/Moose/Exception/TypeParameterMustBeMooseMetaType.pm lib/Moose/Exception/UnableToCanonicalizeHandles.pm lib/Moose/Exception/UnableToCanonicalizeNonRolePackage.pm lib/Moose/Exception/UnableToRecognizeDelegateMetaclass.pm lib/Moose/Exception/UndefinedHashKeysPassedToMethod.pm lib/Moose/Exception/UnionCalledWithAnArrayRefAndAdditionalArgs.pm lib/Moose/Exception/UnionTakesAtleastTwoTypeNames.pm lib/Moose/Exception/ValidationFailedForInlineTypeConstraint.pm lib/Moose/Exception/ValidationFailedForTypeConstraint.pm lib/Moose/Exception/WrapTakesACodeRefToBless.pm lib/Moose/Exception/WrongTypeConstraintGiven.pm lib/Moose/Exporter.pm lib/Moose/Intro.pod lib/Moose/Manual.pod lib/Moose/Manual/Attributes.pod lib/Moose/Manual/BestPractices.pod lib/Moose/Manual/Classes.pod lib/Moose/Manual/Concepts.pod lib/Moose/Manual/Construction.pod lib/Moose/Manual/Contributing.pod lib/Moose/Manual/Delegation.pod lib/Moose/Manual/Delta.pod lib/Moose/Manual/Exceptions.pod lib/Moose/Manual/Exceptions/Manifest.pod lib/Moose/Manual/FAQ.pod lib/Moose/Manual/MOP.pod lib/Moose/Manual/MethodModifiers.pod lib/Moose/Manual/MooseX.pod lib/Moose/Manual/Resources.pod lib/Moose/Manual/Roles.pod lib/Moose/Manual/Support.pod lib/Moose/Manual/Types.pod lib/Moose/Manual/Unsweetened.pod lib/Moose/Meta/Attribute.pm lib/Moose/Meta/Attribute/Native.pm lib/Moose/Meta/Attribute/Native/Trait.pm lib/Moose/Meta/Attribute/Native/Trait/Array.pm lib/Moose/Meta/Attribute/Native/Trait/Bool.pm lib/Moose/Meta/Attribute/Native/Trait/Code.pm lib/Moose/Meta/Attribute/Native/Trait/Counter.pm lib/Moose/Meta/Attribute/Native/Trait/Hash.pm lib/Moose/Meta/Attribute/Native/Trait/Number.pm lib/Moose/Meta/Attribute/Native/Trait/String.pm lib/Moose/Meta/Class.pm lib/Moose/Meta/Class/Immutable/Trait.pm lib/Moose/Meta/Instance.pm lib/Moose/Meta/Method.pm lib/Moose/Meta/Method/Accessor.pm lib/Moose/Meta/Method/Accessor/Native.pm lib/Moose/Meta/Method/Accessor/Native/Array.pm lib/Moose/Meta/Method/Accessor/Native/Array/Writer.pm lib/Moose/Meta/Method/Accessor/Native/Array/accessor.pm lib/Moose/Meta/Method/Accessor/Native/Array/clear.pm lib/Moose/Meta/Method/Accessor/Native/Array/count.pm lib/Moose/Meta/Method/Accessor/Native/Array/delete.pm lib/Moose/Meta/Method/Accessor/Native/Array/elements.pm lib/Moose/Meta/Method/Accessor/Native/Array/first.pm lib/Moose/Meta/Method/Accessor/Native/Array/first_index.pm lib/Moose/Meta/Method/Accessor/Native/Array/get.pm lib/Moose/Meta/Method/Accessor/Native/Array/grep.pm lib/Moose/Meta/Method/Accessor/Native/Array/insert.pm lib/Moose/Meta/Method/Accessor/Native/Array/is_empty.pm lib/Moose/Meta/Method/Accessor/Native/Array/join.pm lib/Moose/Meta/Method/Accessor/Native/Array/map.pm lib/Moose/Meta/Method/Accessor/Native/Array/natatime.pm lib/Moose/Meta/Method/Accessor/Native/Array/pop.pm lib/Moose/Meta/Method/Accessor/Native/Array/push.pm lib/Moose/Meta/Method/Accessor/Native/Array/reduce.pm lib/Moose/Meta/Method/Accessor/Native/Array/set.pm lib/Moose/Meta/Method/Accessor/Native/Array/shallow_clone.pm lib/Moose/Meta/Method/Accessor/Native/Array/shift.pm lib/Moose/Meta/Method/Accessor/Native/Array/shuffle.pm lib/Moose/Meta/Method/Accessor/Native/Array/sort.pm lib/Moose/Meta/Method/Accessor/Native/Array/sort_in_place.pm lib/Moose/Meta/Method/Accessor/Native/Array/splice.pm lib/Moose/Meta/Method/Accessor/Native/Array/uniq.pm lib/Moose/Meta/Method/Accessor/Native/Array/unshift.pm lib/Moose/Meta/Method/Accessor/Native/Bool/not.pm lib/Moose/Meta/Method/Accessor/Native/Bool/set.pm lib/Moose/Meta/Method/Accessor/Native/Bool/toggle.pm lib/Moose/Meta/Method/Accessor/Native/Bool/unset.pm lib/Moose/Meta/Method/Accessor/Native/Code/execute.pm lib/Moose/Meta/Method/Accessor/Native/Code/execute_method.pm lib/Moose/Meta/Method/Accessor/Native/Collection.pm lib/Moose/Meta/Method/Accessor/Native/Counter/Writer.pm lib/Moose/Meta/Method/Accessor/Native/Counter/dec.pm lib/Moose/Meta/Method/Accessor/Native/Counter/inc.pm lib/Moose/Meta/Method/Accessor/Native/Counter/reset.pm lib/Moose/Meta/Method/Accessor/Native/Counter/set.pm lib/Moose/Meta/Method/Accessor/Native/Hash.pm lib/Moose/Meta/Method/Accessor/Native/Hash/Writer.pm lib/Moose/Meta/Method/Accessor/Native/Hash/accessor.pm lib/Moose/Meta/Method/Accessor/Native/Hash/clear.pm lib/Moose/Meta/Method/Accessor/Native/Hash/count.pm lib/Moose/Meta/Method/Accessor/Native/Hash/defined.pm lib/Moose/Meta/Method/Accessor/Native/Hash/delete.pm lib/Moose/Meta/Method/Accessor/Native/Hash/elements.pm lib/Moose/Meta/Method/Accessor/Native/Hash/exists.pm lib/Moose/Meta/Method/Accessor/Native/Hash/get.pm lib/Moose/Meta/Method/Accessor/Native/Hash/is_empty.pm lib/Moose/Meta/Method/Accessor/Native/Hash/keys.pm lib/Moose/Meta/Method/Accessor/Native/Hash/kv.pm lib/Moose/Meta/Method/Accessor/Native/Hash/set.pm lib/Moose/Meta/Method/Accessor/Native/Hash/shallow_clone.pm lib/Moose/Meta/Method/Accessor/Native/Hash/values.pm lib/Moose/Meta/Method/Accessor/Native/Number/abs.pm lib/Moose/Meta/Method/Accessor/Native/Number/add.pm lib/Moose/Meta/Method/Accessor/Native/Number/div.pm lib/Moose/Meta/Method/Accessor/Native/Number/mod.pm lib/Moose/Meta/Method/Accessor/Native/Number/mul.pm lib/Moose/Meta/Method/Accessor/Native/Number/set.pm lib/Moose/Meta/Method/Accessor/Native/Number/sub.pm lib/Moose/Meta/Method/Accessor/Native/Reader.pm lib/Moose/Meta/Method/Accessor/Native/String/append.pm lib/Moose/Meta/Method/Accessor/Native/String/chomp.pm lib/Moose/Meta/Method/Accessor/Native/String/chop.pm lib/Moose/Meta/Method/Accessor/Native/String/clear.pm lib/Moose/Meta/Method/Accessor/Native/String/inc.pm lib/Moose/Meta/Method/Accessor/Native/String/length.pm lib/Moose/Meta/Method/Accessor/Native/String/match.pm lib/Moose/Meta/Method/Accessor/Native/String/prepend.pm lib/Moose/Meta/Method/Accessor/Native/String/replace.pm lib/Moose/Meta/Method/Accessor/Native/String/substr.pm lib/Moose/Meta/Method/Accessor/Native/Writer.pm lib/Moose/Meta/Method/Augmented.pm lib/Moose/Meta/Method/Constructor.pm lib/Moose/Meta/Method/Delegation.pm lib/Moose/Meta/Method/Destructor.pm lib/Moose/Meta/Method/Meta.pm lib/Moose/Meta/Method/Overridden.pm lib/Moose/Meta/Mixin/AttributeCore.pm lib/Moose/Meta/Object/Trait.pm lib/Moose/Meta/Role.pm lib/Moose/Meta/Role/Application.pm lib/Moose/Meta/Role/Application/RoleSummation.pm lib/Moose/Meta/Role/Application/ToClass.pm lib/Moose/Meta/Role/Application/ToInstance.pm lib/Moose/Meta/Role/Application/ToRole.pm lib/Moose/Meta/Role/Attribute.pm lib/Moose/Meta/Role/Composite.pm lib/Moose/Meta/Role/Method.pm lib/Moose/Meta/Role/Method/Conflicting.pm lib/Moose/Meta/Role/Method/Required.pm lib/Moose/Meta/TypeCoercion.pm lib/Moose/Meta/TypeCoercion/Union.pm lib/Moose/Meta/TypeConstraint.pm lib/Moose/Meta/TypeConstraint/Class.pm lib/Moose/Meta/TypeConstraint/DuckType.pm lib/Moose/Meta/TypeConstraint/Enum.pm lib/Moose/Meta/TypeConstraint/Parameterizable.pm lib/Moose/Meta/TypeConstraint/Parameterized.pm lib/Moose/Meta/TypeConstraint/Registry.pm lib/Moose/Meta/TypeConstraint/Role.pm lib/Moose/Meta/TypeConstraint/Union.pm lib/Moose/Object.pm lib/Moose/Role.pm lib/Moose/Spec/Role.pod lib/Moose/Unsweetened.pod lib/Moose/Util.pm lib/Moose/Util/MetaRole.pm lib/Moose/Util/TypeConstraints.pm lib/Moose/Util/TypeConstraints/Builtins.pm lib/Test/Moose.pm lib/metaclass.pm lib/oose.pm mop.c mop.h perltidyrc ppport.h t/00-report-prereqs.dd t/00-report-prereqs.t t/000_load.t t/attributes/accessor_context.t t/attributes/accessor_inlining.t t/attributes/accessor_override_method.t t/attributes/accessor_overwrite_warning.t t/attributes/attr_dereference_test.t t/attributes/attribute_accessor_generation.t t/attributes/attribute_custom_metaclass.t t/attributes/attribute_delegation.t t/attributes/attribute_does.t t/attributes/attribute_inherited_slot_specs.t t/attributes/attribute_lazy_initializer.t t/attributes/attribute_names.t t/attributes/attribute_reader_generation.t t/attributes/attribute_required.t t/attributes/attribute_traits.t t/attributes/attribute_traits_n_meta.t t/attributes/attribute_traits_parameterized.t t/attributes/attribute_traits_registered.t t/attributes/attribute_triggers.t t/attributes/attribute_type_unions.t t/attributes/attribute_without_any_methods.t t/attributes/attribute_writer_generation.t t/attributes/bad_coerce.t t/attributes/chained_coercion.t t/attributes/clone_weak.t t/attributes/default_class_role_types.t t/attributes/default_undef.t t/attributes/delegation_and_modifiers.t t/attributes/delegation_arg_aliasing.t t/attributes/delegation_target_not_loaded.t t/attributes/illegal_options_for_inheritance.t t/attributes/inherit_lazy_build.t t/attributes/lazy_no_default.t t/attributes/method_generation_rules.t t/attributes/misc_attribute_coerce_lazy.t t/attributes/misc_attribute_tests.t t/attributes/more_attr_delegation.t t/attributes/no_init_arg.t t/attributes/no_slot_access.t t/attributes/non_alpha_attr_names.t t/attributes/numeric_defaults.t t/attributes/trigger_and_coerce.t t/attributes/type_constraint.t t/basics/always_strict_warnings.t t/basics/basic_class_setup.t t/basics/buildargs.t t/basics/buildargs_warning.t t/basics/create.t t/basics/create_anon.t t/basics/definition_context.t t/basics/deprecations.t t/basics/destruction.t t/basics/error_handling.t t/basics/global-destruction-helper.pl t/basics/global_destruction.t t/basics/import_unimport.t t/basics/inner_and_augment.t t/basics/load_into_main.t t/basics/method_modifier_with_regexp.t t/basics/methods.t t/basics/moose_object_does.t t/basics/moose_respects_type_constraints.t t/basics/override_and_foreign_classes.t t/basics/override_augment_inner_super.t t/basics/rebless.t t/basics/require_superclasses.t t/basics/super_and_override.t t/basics/super_warns_on_args.t t/basics/universal_methods_wrappable.t t/basics/wrapped_method_cxt_propagation.t t/bugs/DEMOLISHALL.t t/bugs/DEMOLISHALL_shortcutted.t t/bugs/DEMOLISH_eats_exceptions.t t/bugs/DEMOLISH_eats_mini.t t/bugs/DEMOLISH_fails_without_metaclass.t t/bugs/Moose_Object_error.t t/bugs/anon_method_metaclass.t t/bugs/application_metarole_compat.t t/bugs/apply_role_to_one_instance_only.t t/bugs/attribute_trait_parameters.t t/bugs/augment_recursion_bug.t t/bugs/coerce_without_coercion.t t/bugs/constructor_object_overload.t t/bugs/create_anon_mkopt.t t/bugs/create_anon_recursion.t t/bugs/create_anon_role_pass.t t/bugs/delete_sub_stash.t t/bugs/find_custom_trait_rt_92089.t t/bugs/handles_foreign_class_bug.t t/bugs/immutable_metaclass_does_role.t t/bugs/immutable_n_default_x2.t t/bugs/inheriting_from_roles.t t/bugs/inline_reader_bug.t t/bugs/instance_application_role_args.t t/bugs/lazybuild_required_undef.t t/bugs/mark_as_methods_overloading_breakage.t t/bugs/moo_delegation.t t/bugs/moose_exporter_false_circular_reference_rt_63818.t t/bugs/moose_octal_defaults.t t/bugs/native_trait_handles_bad_value.t t/bugs/overloading_edge_cases.t t/bugs/reader_precedence_bug.t t/bugs/role_caller.t t/bugs/subclass_use_base_bug.t t/bugs/subtype_conflict_bug.t t/bugs/subtype_quote_bug.t t/bugs/super_recursion.t t/bugs/traits_with_exporter.t t/bugs/type_constraint_messages.t t/cmop/ArrayBasedStorage_test.t t/cmop/AttributesWithHistory_test.t t/cmop/BinaryTree_test.t t/cmop/C3MethodDispatchOrder_test.t t/cmop/ClassEncapsulatedAttributes_test.t t/cmop/Class_C3_compatibility.t t/cmop/InsideOutClass_test.t t/cmop/InstanceCountingClass_test.t t/cmop/LazyClass_test.t t/cmop/Perl6Attribute_test.t t/cmop/RT_27329_fix.t t/cmop/RT_39001_fix.t t/cmop/RT_41255.t t/cmop/add_attribute_alternate.t t/cmop/add_method_debugmode.t t/cmop/add_method_modifier.t t/cmop/advanced_methods.t t/cmop/anon_class.t t/cmop/anon_class_create_init.t t/cmop/anon_class_keep_alive.t t/cmop/anon_class_leak.t t/cmop/anon_class_removal.t t/cmop/anon_packages.t t/cmop/attribute.t t/cmop/attribute_duplication.t t/cmop/attribute_errors_and_edge_cases.t t/cmop/attribute_get_read_write.t t/cmop/attribute_initializer.t t/cmop/attribute_introspection.t t/cmop/attribute_non_alpha_name.t t/cmop/attributes.t t/cmop/basic.t t/cmop/before_after_dollar_under.t t/cmop/class_errors_and_edge_cases.t t/cmop/class_is_pristine.t t/cmop/class_precedence_list.t t/cmop/constant_codeinfo.t t/cmop/create_class.t t/cmop/custom_instance.t t/cmop/deprecated.t t/cmop/get_code_info.t t/cmop/immutable_custom_trait.t t/cmop/immutable_metaclass.t t/cmop/immutable_w_constructors.t t/cmop/immutable_w_custom_metaclass.t t/cmop/inline_and_dollar_at.t t/cmop/inline_structor.t t/cmop/insertion_order.t t/cmop/instance.t t/cmop/instance_inline.t t/cmop/instance_metaclass_incompat.t t/cmop/instance_metaclass_incompat_dyn.t t/cmop/lib/ArrayBasedStorage.pm t/cmop/lib/AttributesWithHistory.pm t/cmop/lib/BinaryTree.pm t/cmop/lib/C3MethodDispatchOrder.pm t/cmop/lib/ClassEncapsulatedAttributes.pm t/cmop/lib/InsideOutClass.pm t/cmop/lib/InstanceCountingClass.pm t/cmop/lib/LazyClass.pm t/cmop/lib/MyMetaClass.pm t/cmop/lib/MyMetaClass/Attribute.pm t/cmop/lib/MyMetaClass/Instance.pm t/cmop/lib/MyMetaClass/Method.pm t/cmop/lib/MyMetaClass/Random.pm t/cmop/lib/Perl6Attribute.pm t/cmop/lib/SyntaxError.pm t/cmop/load.t t/cmop/magic.t t/cmop/make_mutable.t t/cmop/meta_method.t t/cmop/meta_package.t t/cmop/meta_package_extension.t t/cmop/metaclass.t t/cmop/metaclass_incompatibility.t t/cmop/metaclass_incompatibility_dyn.t t/cmop/metaclass_inheritance.t t/cmop/metaclass_loads_classes.t t/cmop/metaclass_reinitialize.t t/cmop/method.t t/cmop/method_modifiers.t t/cmop/methods.t t/cmop/modify_parent_method.t t/cmop/new_and_clone_metaclasses.t t/cmop/null_stash.t t/cmop/numeric_defaults.t t/cmop/package_variables.t t/cmop/random_eval_bug.t t/cmop/rebless_instance.t t/cmop/rebless_instance_away.t t/cmop/rebless_overload.t t/cmop/rebless_with_extra_params.t t/cmop/scala_style_mixin_composition.t t/cmop/self_introspection.t t/cmop/subclasses.t t/cmop/subname.t t/cmop/universal_methods.t t/compat/composite_metaroles.t t/compat/extends_nonmoose_that_isa_moose_with_metarole.t t/compat/foreign_inheritence.t t/compat/inc_hash.t t/compat/module_refresh_compat.t t/compat/moose_respects_base.t t/examples/Child_Parent_attr_inherit.t t/examples/example1.t t/examples/example2.t t/examples/example_Moose_POOP.t t/examples/example_Protomoose.t t/examples/example_w_DCS.t t/examples/example_w_TestDeep.t t/examples/record_set_iterator.t t/exceptions/attribute.t t/exceptions/class-mop-attribute.t t/exceptions/class-mop-class-immutable-trait.t t/exceptions/class-mop-class.t t/exceptions/class-mop-method-accessor.t t/exceptions/class-mop-method-constructor.t t/exceptions/class-mop-method-generated.t t/exceptions/class-mop-method-meta.t t/exceptions/class-mop-method-wrapped.t t/exceptions/class-mop-method.t t/exceptions/class-mop-mixin-hasattributes.t t/exceptions/class-mop-mixin-hasmethods.t t/exceptions/class-mop-module.t t/exceptions/class-mop-object.t t/exceptions/class-mop-package.t t/exceptions/class.t t/exceptions/cmop.t t/exceptions/exception-lazyattributeneedsadefault.t t/exceptions/frame-leak.t t/exceptions/meta-role.t t/exceptions/metaclass.t t/exceptions/moose-exporter.t t/exceptions/moose-meta-attribute-native-traits.t t/exceptions/moose-meta-class-immutable-trait.t t/exceptions/moose-meta-method-accessor-native-array.t t/exceptions/moose-meta-method-accessor-native-collection.t t/exceptions/moose-meta-method-accessor-native-grep.t t/exceptions/moose-meta-method-accessor-native-hash-set.t t/exceptions/moose-meta-method-accessor-native-hash.t t/exceptions/moose-meta-method-accessor-native-string-match.t t/exceptions/moose-meta-method-accessor-native-string-replace.t t/exceptions/moose-meta-method-accessor-native-string-substr.t t/exceptions/moose-meta-method-accessor-native.t t/exceptions/moose-meta-method-accessor.t t/exceptions/moose-meta-method-augmented.t t/exceptions/moose-meta-method-constructor.t t/exceptions/moose-meta-method-delegation.t t/exceptions/moose-meta-method-destructor.t t/exceptions/moose-meta-method-overridden.t t/exceptions/moose-meta-role-application-rolesummation.t t/exceptions/moose-meta-role-application-toclass.t t/exceptions/moose-meta-role-application-torole.t t/exceptions/moose-meta-role-application.t t/exceptions/moose-meta-role-attribute.t t/exceptions/moose-meta-role-composite.t t/exceptions/moose-meta-typecoercion-union.t t/exceptions/moose-meta-typecoercion.t t/exceptions/moose-meta-typeconstraint-enum.t t/exceptions/moose-meta-typeconstraint-parameterizable.t t/exceptions/moose-meta-typeconstraint-parameterized.t t/exceptions/moose-meta-typeconstraint-registry.t t/exceptions/moose-meta-typeconstraint.t t/exceptions/moose-role.t t/exceptions/moose-util-metarole.t t/exceptions/moose-util-typeconstraints.t t/exceptions/moose.t t/exceptions/object.t t/exceptions/overload.t t/exceptions/rt-92818.t t/exceptions/rt-94795.t t/exceptions/stringify.t t/exceptions/traits.t t/exceptions/typeconstraints.t t/exceptions/util.t t/exceptions/with-debugging.t t/exceptions/without-debugging.t t/immutable/apply_roles_to_immutable.t t/immutable/buildargs.t t/immutable/constructor_is_not_moose.t t/immutable/constructor_is_wrapped.t t/immutable/default_values.t t/immutable/definition_context.t t/immutable/immutable_constructor_error.t t/immutable/immutable_destroy.t t/immutable/immutable_meta_class.t t/immutable/immutable_metaclass_with_traits.t t/immutable/immutable_moose.t t/immutable/immutable_roundtrip.t t/immutable/immutable_trigger_from_constructor.t t/immutable/inline_close_over.t t/immutable/inline_fallbacks.t t/immutable/inlined_constructors_n_types.t t/immutable/multiple_demolish_inline.t t/lib/Bar.pm t/lib/Bar7/Meta/Trait.pm t/lib/Bar7/Meta/Trait2.pm t/lib/Foo.pm t/lib/Moose/Meta/Attribute/Custom/Bar.pm t/lib/Moose/Meta/Attribute/Custom/Foo.pm t/lib/Moose/Meta/Attribute/Custom/Trait/Bar.pm t/lib/Moose/Meta/Attribute/Custom/Trait/Foo.pm t/lib/MyExporter.pm t/lib/MyMetaclassRole.pm t/lib/MyMooseA.pm t/lib/MyMooseB.pm t/lib/MyMooseObject.pm t/lib/NoInlineAttribute.pm t/lib/Overloading/ClassConsumesRoleConsumesOverloads.pm t/lib/Overloading/ClassWithCombiningRole.pm t/lib/Overloading/ClassWithOneRole.pm t/lib/Overloading/CombiningClass.pm t/lib/Overloading/CombiningRole.pm t/lib/Overloading/RoleConsumesOverloads.pm t/lib/Overloading/RoleWithOverloads.pm t/lib/Overloading/RoleWithoutOverloads.pm t/lib/OverloadingTests.pm t/lib/Real/Package.pm t/lib/Role/BreakOnLoad.pm t/lib/Role/Child.pm t/lib/Role/Interface.pm t/lib/Role/Parent.pm t/metaclasses/create_anon_with_required_attr.t t/metaclasses/custom_attr_meta_as_role.t t/metaclasses/custom_attr_meta_with_roles.t t/metaclasses/easy_init_meta.t t/metaclasses/export_with_prototype.t t/metaclasses/exporter_also_with_trait.t t/metaclasses/exporter_meta_lookup.t t/metaclasses/exporter_sub_names.t t/metaclasses/goto_moose_import.t t/metaclasses/immutable_metaclass_compat_bug.t t/metaclasses/meta_name.t t/metaclasses/metaclass_compat.t t/metaclasses/metaclass_compat_no_fixing_bug.t t/metaclasses/metaclass_compat_role_conflicts.t t/metaclasses/metaclass_parameterized_traits.t t/metaclasses/metaclass_traits.t t/metaclasses/metarole.t t/metaclasses/metarole_combination.t t/metaclasses/metarole_on_anon.t t/metaclasses/metarole_w_metaclass_pm.t t/metaclasses/metaroles_of_metaroles.t t/metaclasses/moose_exporter.t t/metaclasses/moose_exporter_trait_aliases.t t/metaclasses/moose_for_meta.t t/metaclasses/moose_nonmoose_metatrait_init_order.t t/metaclasses/moose_nonmoose_moose_chain_init_meta.t t/metaclasses/moose_w_metaclass.t t/metaclasses/new_metaclass.t t/metaclasses/new_object_BUILD.t t/metaclasses/overloading.t t/metaclasses/reinitialize.t t/metaclasses/use_base_of_moose.t t/moose_util/apply_roles.t t/moose_util/create_alias.t t/moose_util/ensure_all_roles.t t/moose_util/method_mod_args.t t/moose_util/moose_util.t t/moose_util/moose_util_does_role.t t/moose_util/moose_util_search_class_by_role.t t/moose_util/resolve_alias.t t/moose_util/with_traits.t t/native_traits/array_coerce.t t/native_traits/array_from_role.t t/native_traits/array_subtypes.t t/native_traits/array_trigger.t t/native_traits/collection_with_roles.t t/native_traits/custom_instance.t t/native_traits/hash_coerce.t t/native_traits/hash_subtypes.t t/native_traits/hash_trigger.t t/native_traits/remove_attribute.t t/native_traits/shallow_clone.t t/native_traits/trait_array.t t/native_traits/trait_bool.t t/native_traits/trait_code.t t/native_traits/trait_counter.t t/native_traits/trait_hash.t t/native_traits/trait_number.t t/native_traits/trait_string.t t/recipes/basics_bankaccount_methodmodifiersandsubclassing.t t/recipes/basics_binarytree_attributefeatures.t t/recipes/basics_company_subtypes.t t/recipes/basics_datetime_extendingnonmooseparent.t t/recipes/basics_document_augmentandinner.t t/recipes/basics_genome_overloadingsubtypesandcoercion.t t/recipes/basics_http_subtypesandcoercion.t t/recipes/basics_point_attributesandsubclassing.t t/recipes/extending_debugging_baseclassrole.t t/recipes/extending_mooseish_moosesugar.t t/recipes/legacy_debugging_baseclassreplacement.t t/recipes/legacy_labeled_attributemetaclass.t t/recipes/meta_globref_instancemetaclass.t t/recipes/meta_labeled_attributetrait.t t/recipes/meta_privateorpublic_methodmetaclass.t t/recipes/meta_table_metaclasstrait.t t/recipes/roles_applicationtoinstance.t t/recipes/roles_comparable_codereuse.t t/recipes/roles_restartable_advancedcomposition.t t/roles/anonymous_roles.t t/roles/application_toclass.t t/roles/apply_role.t t/roles/build.t t/roles/conflict_many_methods.t t/roles/create_role.t t/roles/create_role_subclass.t t/roles/empty_method_modifiers_meta_bug.t t/roles/extending_role_attrs.t t/roles/free_anonymous_roles.t t/roles/imported_required_method.t t/roles/meta_role.t t/roles/method_aliasing_in_composition.t t/roles/method_exclusion_in_composition.t t/roles/method_modifiers.t t/roles/methods.t t/roles/more_alias_and_exclude.t t/roles/more_role_edge_cases.t t/roles/new_meta_role.t t/roles/overloading_combine_to_class.t t/roles/overloading_combine_to_instance.t t/roles/overloading_combine_to_role.t t/roles/overloading_composition_errors.t t/roles/overloading_remove_attributes_bug.t t/roles/overloading_to_class.t t/roles/overloading_to_instance.t t/roles/overloading_to_role.t t/roles/overriding.t t/roles/reinitialize_anon_role.t t/roles/role.t t/roles/role_attr_application.t t/roles/role_attribute_conflict.t t/roles/role_attrs.t t/roles/role_compose_requires.t t/roles/role_composite.t t/roles/role_composite_exclusion.t t/roles/role_composition_attributes.t t/roles/role_composition_conflict_detection.t t/roles/role_composition_errors.t t/roles/role_composition_method_mods.t t/roles/role_composition_methods.t t/roles/role_composition_override.t t/roles/role_composition_req_methods.t t/roles/role_conflict_detection.t t/roles/role_conflict_edge_cases.t t/roles/role_consumers.t t/roles/role_exclusion.t t/roles/role_exclusion_and_alias_bug.t t/roles/role_for_combination.t t/roles/roles_and_method_cloning.t t/roles/roles_and_req_method_edge_cases.t t/roles/roles_applied_in_create.t t/roles/run_time_role_composition.t t/roles/runtime_roles_and_attrs.t t/roles/runtime_roles_and_nonmoose.t t/roles/runtime_roles_w_params.t t/roles/use_base_does.t t/test_moose/test_moose.t t/test_moose/test_moose_does_ok.t t/test_moose/test_moose_has_attribute_ok.t t/test_moose/test_moose_meta_ok.t t/test_moose/with_immutable.t t/todo_tests/exception_reflects_failed_constraint.t t/todo_tests/immutable_n_around.t t/todo_tests/moose_and_threads.t t/todo_tests/replacing_super_methods.t t/todo_tests/required_role_accessors.t t/todo_tests/role_insertion_order.t t/todo_tests/various_role_features.t t/todo_tests/wrong-inner.t t/type_constraints/advanced_type_creation.t t/type_constraints/class_subtypes.t t/type_constraints/class_type_constraint.t t/type_constraints/coerced_parameterized_types.t t/type_constraints/container_type_coercion.t t/type_constraints/container_type_constraint.t t/type_constraints/custom_parameterized_types.t t/type_constraints/custom_type_errors.t t/type_constraints/define_type_twice_throws.t t/type_constraints/duck_type_handles.t t/type_constraints/duck_types.t t/type_constraints/enum.t t/type_constraints/inlining.t t/type_constraints/match_type_operator.t t/type_constraints/maybe_type_constraint.t t/type_constraints/misc_type_tests.t t/type_constraints/name_conflicts.t t/type_constraints/normalize_type_name.t t/type_constraints/parameterize_from.t t/type_constraints/role_type_constraint.t t/type_constraints/subtype_auto_vivify_parent.t t/type_constraints/subtyping_parameterized_types.t t/type_constraints/subtyping_union_types.t t/type_constraints/throw_error.t t/type_constraints/type_coersion_on_lazy_attributes.t t/type_constraints/type_names.t t/type_constraints/type_notation_parser.t t/type_constraints/types_and_undef.t t/type_constraints/union_is_a_type_of.t t/type_constraints/union_types.t t/type_constraints/union_types_and_coercions.t t/type_constraints/util_find_type_constraint.t t/type_constraints/util_more_type_coercion.t t/type_constraints/util_std_type_constraints.t t/type_constraints/util_type_coercion.t t/type_constraints/util_type_constraints.t t/type_constraints/util_type_constraints_export.t t/type_constraints/util_type_reloading.t t/type_constraints/with-specio.t t/type_constraints/with-type-tiny.t t/zzz-check-breaks.t weaver.ini xs/Attribute.xs xs/AttributeCore.xs xs/Class.xs xs/Generated.xs xs/HasAttributes.xs xs/HasMethods.xs xs/Inlined.xs xs/Instance.xs xs/MOP.xs xs/Method.xs xs/Moose.xs xs/Package.xs xs/ToInstance.xs xs/typemap xt/author/authority.t xt/author/debugger-duck_type.t xt/author/distmeta.t xt/author/eol.t xt/author/memory_leaks.t xt/author/mojibake.t xt/author/no-tabs.t xt/author/pod-coverage.t xt/author/pod-spell.t xt/author/pod-syntax.t xt/author/test-my-dependents.t xt/release/00-compile.t xt/release/changes_has_content.t xt/release/cpan-changes.t xt/release/kwalitee.t Moose-2.2200/mop.h000640 000766 000024 00000005362 14137574636 014122 0ustar00etherstaff000000 000000 #ifndef __MOP_H__ #define __MOP_H__ #include "EXTERN.h" #include "perl.h" #include "XSUB.h" #define NEED_sv_2pv_nolen #include "ppport.h" /* In theory, ExtUtils::ParseXS provide backcompat for this. However, the only * available version doing that right now is 3.03_02, which is a dev release. We * don't want to depend on dev releases, so we copy the code here. It should be * removed once there's a stable ExtUtils::ParseXS version newer than 3.03_02. */ #ifndef XS_EXTERNAL # define XS_EXTERNAL XS #endif #define MOP_CALL_BOOT(name) mop_call_xs(aTHX_ name, cv, mark); #ifndef CvISXSUB #define CvISXSUB(cv) (CvXSUB(cv) ? TRUE : FALSE) #endif void mop_call_xs (pTHX_ XSPROTO(subaddr), CV *cv, SV **mark); typedef enum { KEY__expected_method_class, KEY_ISA, KEY_VERSION, KEY_accessor, KEY_associated_class, KEY_associated_metaclass, KEY_associated_methods, KEY_attribute_metaclass, KEY_attributes, KEY_body, KEY_builder, KEY_clearer, KEY_constructor_class, KEY_constructor_name, KEY_definition_context, KEY_destructor_class, KEY_immutable_trait, KEY_init_arg, KEY_initializer, KEY_insertion_order, KEY_instance_metaclass, KEY_is_inline, KEY_method_metaclass, KEY_methods, KEY_name, KEY_package, KEY_package_name, KEY_predicate, KEY_reader, KEY_wrapped_method_metaclass, KEY_writer, KEY_package_cache_flag, KEY__version, KEY_operator, key_last, } mop_prehashed_key_t; #define KEY_FOR(name) mop_prehashed_key_for(KEY_ ##name) #define HASH_FOR(name) mop_prehashed_hash_for(KEY_ ##name) void mop_prehash_keys (void); SV *mop_prehashed_key_for (mop_prehashed_key_t key); U32 mop_prehashed_hash_for (mop_prehashed_key_t key); #define INSTALL_SIMPLE_READER(klass, name) INSTALL_SIMPLE_READER_WITH_KEY(klass, name, name) #define INSTALL_SIMPLE_READER_WITH_KEY(klass, name, key) \ { \ CV *cv = newXS("Class::MOP::" #klass "::" #name, mop_xs_simple_reader, __FILE__); \ CvXSUBANY(cv).any_i32 = KEY_ ##key; \ } XS_EXTERNAL(mop_xs_simple_reader); extern SV *mop_method_metaclass; extern SV *mop_associated_metaclass; extern SV *mop_wrap; UV mop_check_package_cache_flag(pTHX_ HV *stash); int mop_get_code_info (SV *coderef, char **pkg, char **name); SV *mop_call0(pTHX_ SV *const self, SV *const method); typedef enum { TYPE_FILTER_NONE, TYPE_FILTER_CODE, TYPE_FILTER_ARRAY, TYPE_FILTER_IO, TYPE_FILTER_HASH, TYPE_FILTER_SCALAR, } type_filter_t; typedef bool (*get_package_symbols_cb_t) (const char *, STRLEN, SV *, void *); void mop_get_package_symbols(HV *stash, type_filter_t filter, get_package_symbols_cb_t cb, void *ud); HV *mop_get_all_package_symbols (HV *stash, type_filter_t filter); #endif Moose-2.2200/ppport.h000644 000766 000024 00002046612 14137574636 014664 0ustar00etherstaff000000 000000 #if 0 my $void = <<'SKIP'; #endif /* ---------------------------------------------------------------------- ppport.h -- Perl/Pollution/Portability Version 3.63 Automatically created by Devel::PPPort running under perl 5.035005. Do NOT edit this file directly! -- Edit PPPort_pm.PL and the includes in parts/inc/ instead. Use 'perldoc ppport.h' to view the documentation below. ---------------------------------------------------------------------- SKIP =pod =head1 NAME ppport.h - Perl/Pollution/Portability version 3.63 =head1 SYNOPSIS perl ppport.h [options] [source files] Searches current directory for files if no [source files] are given --help show short help --version show version --patch=file write one patch file with changes --copy=suffix write changed copies with suffix --diff=program use diff program and options --compat-version=version provide compatibility with Perl version --cplusplus accept C++ comments --quiet don't output anything except fatal errors --nodiag don't show diagnostics --nohints don't show hints --nochanges don't suggest changes --nofilter don't filter input files --strip strip all script and doc functionality from ppport.h --list-provided list provided API --list-unsupported list API that isn't supported all the way back --api-info=name show Perl API portability information =head1 COMPATIBILITY This version of F is designed to support operation with Perl installations back to 5.003_07, and has been tested up to 5.35.1. =head1 OPTIONS =head2 --help Display a brief usage summary. =head2 --version Display the version of F. =head2 --patch=I If this option is given, a single patch file will be created if any changes are suggested. This requires a working diff program to be installed on your system. =head2 --copy=I If this option is given, a copy of each file will be saved with the given suffix that contains the suggested changes. This does not require any external programs. Note that this does not automagically add a dot between the original filename and the suffix. If you want the dot, you have to include it in the option argument. If neither C<--patch> or C<--copy> are given, the default is to simply print the diffs for each file. This requires either C or a C program to be installed. =head2 --diff=I Manually set the diff program and options to use. The default is to use C, when installed, and output unified context diffs. =head2 --compat-version=I Tell F to check for compatibility with the given Perl version. The default is to check for compatibility with Perl version 5.003_07. You can use this option to reduce the output of F if you intend to be backward compatible only down to a certain Perl version. =head2 --cplusplus Usually, F will detect C++ style comments and replace them with C style comments for portability reasons. Using this option instructs F to leave C++ comments untouched. =head2 --quiet Be quiet. Don't print anything except fatal errors. =head2 --nodiag Don't output any diagnostic messages. Only portability alerts will be printed. =head2 --nohints Don't output any hints. Hints often contain useful portability notes. Warnings will still be displayed. =head2 --nochanges Don't suggest any changes. Only give diagnostic output and hints unless these are also deactivated. =head2 --nofilter Don't filter the list of input files. By default, files not looking like source code (i.e. not *.xs, *.c, *.cc, *.cpp or *.h) are skipped. =head2 --strip Strip all script and documentation functionality from F. This reduces the size of F dramatically and may be useful if you want to include F in smaller modules without increasing their distribution size too much. The stripped F will have a C<--unstrip> option that allows you to undo the stripping, but only if an appropriate C module is installed. =head2 --list-provided Lists the API elements for which compatibility is provided by F. Also lists if it must be explicitly requested, if it has dependencies, and if there are hints or warnings for it. =head2 --list-unsupported Lists the API elements that are known not to be FULLY supported by F, and below which version of Perl they probably won't be available or work. By FULLY, we mean that support isn't provided all the way back to the first version of Perl that F supports at all. =head2 --api-info=I Show portability information for elements matching I. If I is surrounded by slashes, it is interpreted as a regular expression. Normally, only API elements are shown, but if there are no matching API elements but there are some other matching elements, those are shown. This allows you to conveniently find when functions internal to the core implementation were added; only people working on the core are likely to find this last part useful. =head1 DESCRIPTION In order for a Perl extension (XS) module to be as portable as possible across differing versions of Perl itself, certain steps need to be taken. =over 4 =item * Including this header is the first major one. This alone will give you access to a large part of the Perl API that hasn't been available in earlier Perl releases. Use perl ppport.h --list-provided to see which API elements are provided by ppport.h. =item * You should avoid using deprecated parts of the API. For example, using global Perl variables without the C prefix is deprecated. Also, some API functions used to have a C prefix. Using this form is also deprecated. You can safely use the supported API, as F will provide wrappers for older Perl versions. =item * Although the purpose of F is to keep you from having to concern yourself with what version you are running under, there may arise instances where you have to do so. These macros, the same ones as in base Perl, are available to you in all versions, and are what you should use: =over 4 =item C(major, minor, patch)> Returns whether or not the perl currently being compiled has the specified relationship I to the perl given by the parameters. I is one of C, C, C, C, C, C. For example, #if PERL_VERSION_GT(5,24,2) code that will only be compiled on perls after v5.24.2 #else fallback code #endif Note that this is usable in making compile-time decisions You may use the special value '*' for the final number to mean ALL possible values for it. Thus, #if PERL_VERSION_EQ(5,31,'*') means all perls in the 5.31 series. And #if PERL_VERSION_NE(5,24,'*') means all perls EXCEPT 5.24 ones. And #if PERL_VERSION_LE(5,9,'*') is effectively #if PERL_VERSION_LT(5,10,0) =back =item * If you use one of a few functions or variables that were not present in earlier versions of Perl, and that can't be provided using a macro, you have to explicitly request support for these functions by adding one or more C<#define>s in your source code before the inclusion of F. These functions or variables will be marked C in the list shown by C<--list-provided>. Depending on whether you module has a single or multiple files that use such functions or variables, you want either C or global variants. For a C function or variable (used only in a single source file), use: #define NEED_function #define NEED_variable For a global function or variable (used in multiple source files), use: #define NEED_function_GLOBAL #define NEED_variable_GLOBAL Note that you mustn't have more than one global request for the same function or variable in your project. Function / Variable Static Request Global Request ----------------------------------------------------------------------------------------- caller_cx() NEED_caller_cx NEED_caller_cx_GLOBAL ck_warner() NEED_ck_warner NEED_ck_warner_GLOBAL ck_warner_d() NEED_ck_warner_d NEED_ck_warner_d_GLOBAL croak_xs_usage() NEED_croak_xs_usage NEED_croak_xs_usage_GLOBAL die_sv() NEED_die_sv NEED_die_sv_GLOBAL eval_pv() NEED_eval_pv NEED_eval_pv_GLOBAL grok_bin() NEED_grok_bin NEED_grok_bin_GLOBAL grok_hex() NEED_grok_hex NEED_grok_hex_GLOBAL grok_number() NEED_grok_number NEED_grok_number_GLOBAL grok_numeric_radix() NEED_grok_numeric_radix NEED_grok_numeric_radix_GLOBAL grok_oct() NEED_grok_oct NEED_grok_oct_GLOBAL load_module() NEED_load_module NEED_load_module_GLOBAL mess() NEED_mess NEED_mess_GLOBAL mess_nocontext() NEED_mess_nocontext NEED_mess_nocontext_GLOBAL mess_sv() NEED_mess_sv NEED_mess_sv_GLOBAL mg_findext() NEED_mg_findext NEED_mg_findext_GLOBAL my_snprintf() NEED_my_snprintf NEED_my_snprintf_GLOBAL my_sprintf() NEED_my_sprintf NEED_my_sprintf_GLOBAL my_strlcat() NEED_my_strlcat NEED_my_strlcat_GLOBAL my_strlcpy() NEED_my_strlcpy NEED_my_strlcpy_GLOBAL my_strnlen() NEED_my_strnlen NEED_my_strnlen_GLOBAL newCONSTSUB() NEED_newCONSTSUB NEED_newCONSTSUB_GLOBAL newSVpvn_share() NEED_newSVpvn_share NEED_newSVpvn_share_GLOBAL PL_parser NEED_PL_parser NEED_PL_parser_GLOBAL PL_signals NEED_PL_signals NEED_PL_signals_GLOBAL pv_display() NEED_pv_display NEED_pv_display_GLOBAL pv_escape() NEED_pv_escape NEED_pv_escape_GLOBAL pv_pretty() NEED_pv_pretty NEED_pv_pretty_GLOBAL sv_catpvf_mg() NEED_sv_catpvf_mg NEED_sv_catpvf_mg_GLOBAL sv_catpvf_mg_nocontext() NEED_sv_catpvf_mg_nocontext NEED_sv_catpvf_mg_nocontext_GLOBAL sv_setpvf_mg() NEED_sv_setpvf_mg NEED_sv_setpvf_mg_GLOBAL sv_setpvf_mg_nocontext() NEED_sv_setpvf_mg_nocontext NEED_sv_setpvf_mg_nocontext_GLOBAL sv_unmagicext() NEED_sv_unmagicext NEED_sv_unmagicext_GLOBAL utf8_to_uvchr_buf() NEED_utf8_to_uvchr_buf NEED_utf8_to_uvchr_buf_GLOBAL vload_module() NEED_vload_module NEED_vload_module_GLOBAL vmess() NEED_vmess NEED_vmess_GLOBAL warner() NEED_warner NEED_warner_GLOBAL To avoid namespace conflicts, you can change the namespace of the explicitly exported functions / variables using the C macro. Just C<#define> the macro before including C: #define DPPP_NAMESPACE MyOwnNamespace_ #include "ppport.h" The default namespace is C. =back The good thing is that most of the above can be checked by running F on your source code. See the next section for details. =head1 EXAMPLES To verify whether F is needed for your module, whether you should make any changes to your code, and whether any special defines should be used, F can be run as a Perl script to check your source code. Simply say: perl ppport.h The result will usually be a list of patches suggesting changes that should at least be acceptable, if not necessarily the most efficient solution, or a fix for all possible problems. If you know that your XS module uses features only available in newer Perl releases, if you're aware that it uses C++ comments, and if you want all suggestions as a single patch file, you could use something like this: perl ppport.h --compat-version=5.6.0 --cplusplus --patch=test.diff If you only want your code to be scanned without any suggestions for changes, use: perl ppport.h --nochanges You can specify a different C program or options, using the C<--diff> option: perl ppport.h --diff='diff -C 10' This would output context diffs with 10 lines of context. If you want to create patched copies of your files instead, use: perl ppport.h --copy=.new To display portability information for the C function, use: perl ppport.h --api-info=newSVpvn Since the argument to C<--api-info> can be a regular expression, you can use perl ppport.h --api-info=/_nomg$/ to display portability information for all C<_nomg> functions or perl ppport.h --api-info=/./ to display information for all known API elements. =head1 BUGS Some of the suggested edits and/or generated patches may not compile as-is without tweaking manually. This is generally due to the need for an extra parameter to be added to the call to prevent buffer overflow. If this version of F is causing failure during the compilation of this module, please check if newer versions of either this module or C are available on CPAN before sending a bug report. If F was generated using the latest version of C and is causing failure of this module, please file a bug report at L Please include the following information: =over 4 =item 1. The complete output from running "perl -V" =item 2. This file. =item 3. The name and version of the module you were trying to build. =item 4. A full log of the build that failed. =item 5. Any other information that you think could be relevant. =back For the latest version of this code, please get the C module from CPAN. =head1 COPYRIGHT Version 3.x, Copyright (c) 2004-2013, Marcus Holland-Moritz. Version 2.x, Copyright (C) 2001, Paul Marquess. Version 1.x, Copyright (C) 1999, Kenneth Albanowski. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =head1 SEE ALSO See L. =cut # These are tools that must be included in ppport.h. It doesn't work if given # a .pl suffix. # # WARNING: Use only constructs that are legal as far back as D:P handles, as # this is run in the perl version being tested. # What revisions are legal, to be output as-is and converted into a pattern # that matches them precisely my $r_pat = "[57]"; sub format_version { # Given an input version that is acceptable to parse_version(), return a # string of the standard representation of it. my($r,$v,$s) = parse_version(shift); if ($r < 5 || ($r == 5 && $v < 6)) { my $ver = sprintf "%d.%03d", $r, $v; $s > 0 and $ver .= sprintf "_%02d", $s; return $ver; } return sprintf "%d.%d.%d", $r, $v, $s; } sub parse_version { # Returns a triplet, (revision, major, minor) from the input, treated as a # string, which can be in any of several typical formats. my $ver = shift; $ver = "" unless defined $ver; my($r,$v,$s); if ( ($r, $v, $s) = $ver =~ /^([0-9]+)([0-9]{3})([0-9]{3})$/ # 5029010, from the file # names in our # parts/base/ and # parts/todo directories or ($r, $v, $s) = $ver =~ /^([0-9]+)\.([0-9]+)\.([0-9]+)$/ # 5.25.7 or ($r, $v, $s) = $ver =~ /^([0-9]+)\.([0-9]{3})([0-9]{3})$/ # 5.025008, from the # output of $] or ($r, $v, $s) = $ver =~ /^([0-9]+)\.([0-9]{1,3})()$/ # 5.24, 5.004 or ($r, $v, $s) = $ver =~ /^([0-9]+)\.(00[1-5])_?([0-9]{2})$/ # 5.003_07 ) { $s = 0 unless $s; die "Only Perl $r_pat are supported '$ver'\n" unless $r =~ / ^ $r_pat $ /x; die "Invalid version number: $ver\n" if $v >= 1000 || $s >= 1000; return (0 +$r, 0 + $v, 0 + $s); } # For some safety, don't assume something is a version number if it has a # literal dot as one of the three characters. This will have to be fixed # when we reach x.46 (since 46 is ord('.')) if ($ver !~ /\./ && (($r, $v, $s) = $ver =~ /^(.)(.)(.)$/)) # vstring 5.25.7 { $r = ord $r; $v = ord $v; $s = ord $s; die "Only Perl $r_pat are supported '$ver'\n" unless $r =~ / ^ $r_pat $ /x; return ($r, $v, $s); } my $mesg = ""; $mesg = ". (In 5.00x_yz, x must be 1-5.)" if $ver =~ /_/; die "Invalid version number format: '$ver'$mesg\n"; } sub int_parse_version { # Returns integer 7 digit human-readable version, suitable for use in file # names in parts/todo parts/base. return 0 + join "", map { sprintf("%03d", $_) } parse_version(shift); } sub ivers # Shorter name for int_parse_version { return int_parse_version(shift); } sub format_version_line { # Returns a floating point representation of the input version my $version = int_parse_version(shift); $version =~ s/ ^ ( $r_pat ) \B /$1./x; return $version; } BEGIN { if ("$]" < "5.006" ) { # On early perls, the implicit pass by reference doesn't work, so we have # to use the globals to initialize. eval q[sub dictionary_order($$) { _dictionary_order($a, $b) } ]; } elsif ("$]" < "5.022" ) { eval q[sub dictionary_order($$) { _dictionary_order(@_) } ]; } else { eval q[sub dictionary_order :prototype($$) { _dictionary_order(@_) } ]; } } sub _dictionary_order { # Sort caselessly, ignoring punct my ($valid_a, $valid_b) = @_; my ($lc_a, $lc_b); my ($squeezed_a, $squeezed_b); $valid_a = '' unless defined $valid_a; $valid_b = '' unless defined $valid_b; $lc_a = lc $valid_a; $lc_b = lc $valid_b; $squeezed_a = $lc_a; $squeezed_a =~ s/^_+//g; # No leading underscores $squeezed_a =~ s/\B_+\B//g; # No connecting underscores $squeezed_a =~ s/[\W]//g; # No punct $squeezed_b = $lc_b; $squeezed_b =~ s/^_+//g; $squeezed_b =~ s/\B_+\B//g; $squeezed_b =~ s/[\W]//g; return( $squeezed_a cmp $squeezed_b or $lc_a cmp $lc_b or $valid_a cmp $valid_b); } sub sort_api_lines # Sort lines of the form flags|return|name|args... # by 'name' { $a =~ / ^ [^|]* \| [^|]* \| ( [^|]* ) /x; # 3rd field '|' is sep my $a_name = $1; $b =~ / ^ [^|]* \| [^|]* \| ( [^|]* ) /x; my $b_name = $1; return dictionary_order($a_name, $b_name); } 1; use strict; BEGIN { require warnings if "$]" > '5.006' } # Disable broken TRIE-optimization BEGIN { eval '${^RE_TRIE_MAXBUF} = -1' if "$]" >= "5.009004" && "$]" <= "5.009005"} my $VERSION = 3.63; my %opt = ( quiet => 0, diag => 1, hints => 1, changes => 1, cplusplus => 0, filter => 1, strip => 0, version => 0, ); my($ppport) = $0 =~ /([\w.]+)$/; my $LF = '(?:\r\n|[\r\n])'; # line feed my $HS = "[ \t]"; # horizontal whitespace # Never use C comments in this file! my $ccs = '/'.'*'; my $cce = '*'.'/'; my $rccs = quotemeta $ccs; my $rcce = quotemeta $cce; eval { require Getopt::Long; Getopt::Long::GetOptions(\%opt, qw( help quiet diag! filter! hints! changes! cplusplus strip version patch=s copy=s diff=s compat-version=s list-provided list-unsupported api-info=s )) or usage(); }; if ($@ and grep /^-/, @ARGV) { usage() if "@ARGV" =~ /^--?h(?:elp)?$/; die "Getopt::Long not found. Please don't use any options.\n"; } if ($opt{version}) { print "This is $0 $VERSION.\n"; exit 0; } usage() if $opt{help}; strip() if $opt{strip}; $opt{'compat-version'} = 5.003_07 unless exists $opt{'compat-version'}; $opt{'compat-version'} = int_parse_version($opt{'compat-version'}); my $int_min_perl = int_parse_version(5.003_07); # Each element of this hash looks something like: # 'Poison' => { # 'base' => '5.008000', # 'provided' => 1, # 'todo' => '5.003007' # }, my %API = map { /^(\w+)\|([^|]*)\|([^|]*)\|(\w*)$/ ? ( $1 => { ($2 ? ( base => $2 ) : ()), ($3 ? ( todo => $3 ) : ()), (index($4, 'v') >= 0 ? ( varargs => 1 ) : ()), (index($4, 'p') >= 0 ? ( provided => 1 ) : ()), (index($4, 'n') >= 0 ? ( noTHXarg => 1 ) : ()), (index($4, 'c') >= 0 ? ( core_only => 1 ) : ()), (index($4, 'd') >= 0 ? ( deprecated => 1 ) : ()), (index($4, 'i') >= 0 ? ( inaccessible => 1 ) : ()), (index($4, 'x') >= 0 ? ( experimental => 1 ) : ()), (index($4, 'u') >= 0 ? ( undocumented => 1 ) : ()), (index($4, 'o') >= 0 ? ( ppport_fnc => 1 ) : ()), (index($4, 'V') >= 0 ? ( unverified => 1 ) : ()), } ) : die "invalid spec: $_" } qw( ABDAY_1|5.027010||Viu ABDAY_2|5.027010||Viu ABDAY_3|5.027010||Viu ABDAY_4|5.027010||Viu ABDAY_5|5.027010||Viu ABDAY_6|5.027010||Viu ABDAY_7|5.027010||Viu ABMON_10|5.027010||Viu ABMON_11|5.027010||Viu ABMON_12|5.027010||Viu ABMON_1|5.027010||Viu ABMON_2|5.027010||Viu ABMON_3|5.027010||Viu ABMON_4|5.027010||Viu ABMON_5|5.027010||Viu ABMON_6|5.027010||Viu ABMON_7|5.027010||Viu ABMON_8|5.027010||Viu ABMON_9|5.027010||Viu ABORT|5.003007||Viu abort|5.005000||Viu abort_execution|5.025010||Viu accept|5.005000||Viu ACCEPT|5.009005||Viu ACCEPT_t8_p8|5.033003||Viu ACCEPT_t8_pb|5.033003||Viu ACCEPT_tb_p8|5.033003||Viu ACCEPT_tb_pb|5.033003||Viu access|5.005000||Viu add_above_Latin1_folds|5.021001||Viu add_cp_to_invlist|5.013011||Viu add_data|5.005000||Vniu add_multi_match|5.021004||Viu _add_range_to_invlist|5.016000||cViu add_utf16_textfilter|5.011001||Viu adjust_size_and_find_bucket|5.019003||Vniu advance_one_LB|5.023007||Viu advance_one_SB|5.021009||Viu advance_one_WB|5.021009||Viu AHOCORASICK|5.009005||Viu AHOCORASICKC|5.009005||Viu AHOCORASICKC_t8_p8|5.033003||Viu AHOCORASICKC_t8_pb|5.033003||Viu AHOCORASICKC_tb_p8|5.033003||Viu AHOCORASICKC_tb_pb|5.033003||Viu AHOCORASICK_t8_p8|5.033003||Viu AHOCORASICK_t8_pb|5.033003||Viu AHOCORASICK_tb_p8|5.033003||Viu AHOCORASICK_tb_pb|5.033003||Viu alloccopstash|5.017001|5.017001|x alloc_LOGOP|5.025004||xViu allocmy|5.008001||Viu ALLOC_THREAD_KEY|5.005003||Viu ALT_DIGITS|5.027010||Viu amagic_call|5.003007|5.003007|u amagic_cmp|5.009003||Viu amagic_cmp_desc|5.031011||Viu amagic_cmp_locale|5.009003||Viu amagic_cmp_locale_desc|5.031011||Viu amagic_deref_call|5.013007|5.013007|u amagic_i_ncmp|5.009003||Viu amagic_i_ncmp_desc|5.031011||Viu amagic_is_enabled|5.015008||Viu amagic_ncmp|5.009003||Viu amagic_ncmp_desc|5.031011||Viu AMG_CALLun|5.003007||Viu AMG_CALLunary|5.013009||Viu AMGfallNEVER|5.003007||Viu AMGfallNO|5.003007||Viu AMGfallYES|5.003007||Viu AMGf_assign|5.003007||Viu AMGf_noleft|5.003007||Viu AMGf_noright|5.003007||Viu AMGf_numarg|5.021009||Viu AMGf_numeric|5.013002||Viu AMGf_unary|5.003007||Viu AMGf_want_list|5.017002||Viu AM_STR|5.027010||Viu AMT_AMAGIC|5.004000||Viu AMT_AMAGIC_off|5.004000||Viu AMT_AMAGIC_on|5.004000||Viu AMTf_AMAGIC|5.004000||Viu _aMY_CXT|5.009000|5.009000|p aMY_CXT|5.009000|5.009000|p aMY_CXT_|5.009000|5.009000|p anchored_end_shift|5.009005||Viu anchored_offset|5.005000||Viu anchored_substr|5.005000||Viu anchored_utf8|5.008000||Viu ANGSTROM_SIGN|5.017003||Viu anonymise_cv_maybe|5.013003||Viu any_dup|5.006000||Vu ANYOF|5.003007||Viu ANYOF_ALNUM|5.006000||Viu ANYOF_ALNUML|5.004000||Viu ANYOF_ALPHA|5.006000||Viu ANYOF_ALPHANUMERIC|5.017008||Viu ANYOF_ASCII|5.006000||Viu ANYOF_BIT|5.004005||Viu ANYOF_BITMAP|5.006000||Viu ANYOF_BITMAP_BYTE|5.006000||Viu ANYOF_BITMAP_CLEAR|5.006000||Viu ANYOF_BITMAP_CLEARALL|5.007003||Viu ANYOF_BITMAP_SET|5.006000||Viu ANYOF_BITMAP_SETALL|5.007003||Viu ANYOF_BITMAP_SIZE|5.006000||Viu ANYOF_BITMAP_TEST|5.006000||Viu ANYOF_BITMAP_ZERO|5.006000||Viu ANYOF_BLANK|5.006001||Viu ANYOF_CASED|5.017008||Viu ANYOF_CLASS_OR|5.017007||Viu ANYOF_CLASS_SETALL|5.013011||Viu ANYOF_CLASS_TEST_ANY_SET|5.013008||Viu ANYOF_CNTRL|5.006000||Viu ANYOF_COMMON_FLAGS|5.019008||Viu ANYOFD|5.023003||Viu ANYOF_DIGIT|5.006000||Viu ANYOFD_t8_p8|5.033003||Viu ANYOFD_t8_pb|5.033003||Viu ANYOFD_tb_p8|5.033003||Viu ANYOFD_tb_pb|5.033003||Viu ANYOF_FLAGS|5.006000||Viu ANYOF_FLAGS_ALL|5.006000||Viu ANYOF_GRAPH|5.006000||Viu ANYOFH|5.029007||Viu ANYOFHb|5.031001||Viu ANYOFHb_t8_p8|5.033003||Viu ANYOFHb_t8_pb|5.033003||Viu ANYOFHb_tb_p8|5.033003||Viu ANYOFHb_tb_pb|5.033003||Viu ANYOF_HORIZWS|5.009005||Viu ANYOFHr|5.031002||Viu ANYOFHr_t8_p8|5.033003||Viu ANYOFHr_t8_pb|5.033003||Viu ANYOFHr_tb_p8|5.033003||Viu ANYOFHr_tb_pb|5.033003||Viu ANYOFHs|5.031007||Viu ANYOFHs_t8_p8|5.033003||Viu ANYOFHs_t8_pb|5.033003||Viu ANYOFHs_tb_p8|5.033003||Viu ANYOFHs_tb_pb|5.033003||Viu ANYOFH_t8_p8|5.033003||Viu ANYOFH_t8_pb|5.033003||Viu ANYOFH_tb_p8|5.033003||Viu ANYOFH_tb_pb|5.033003||Viu ANYOF_INVERT|5.004000||Viu ANYOFL|5.021008||Viu ANYOFL_FOLD|5.023007||Viu ANYOF_LOCALE_FLAGS|5.019005||Viu ANYOF_LOWER|5.006000||Viu ANYOFL_SHARED_UTF8_LOCALE_fold_HAS_MATCHES_nonfold_REQD|5.023007||Viu ANYOFL_SOME_FOLDS_ONLY_IN_UTF8_LOCALE|5.023007||Viu ANYOFL_t8_p8|5.033003||Viu ANYOFL_t8_pb|5.033003||Viu ANYOFL_tb_p8|5.033003||Viu ANYOFL_tb_pb|5.033003||Viu ANYOFL_UTF8_LOCALE_REQD|5.023007||Viu ANYOFM|5.027009||Viu ANYOF_MATCHES_ALL_ABOVE_BITMAP|5.021004||Viu ANYOF_MATCHES_POSIXL|5.021004||Viu ANYOF_MAX|5.006000||Viu ANYOFM_t8_p8|5.033003||Viu ANYOFM_t8_pb|5.033003||Viu ANYOFM_tb_p8|5.033003||Viu ANYOFM_tb_pb|5.033003||Viu ANYOF_NALNUM|5.006000||Viu ANYOF_NALNUML|5.004000||Viu ANYOF_NALPHA|5.006000||Viu ANYOF_NALPHANUMERIC|5.017008||Viu ANYOF_NASCII|5.006000||Viu ANYOF_NBLANK|5.006001||Viu ANYOF_NCASED|5.017008||Viu ANYOF_NCNTRL|5.006000||Viu ANYOF_NDIGIT|5.006000||Viu ANYOF_NGRAPH|5.006000||Viu ANYOF_NHORIZWS|5.009005||Viu ANYOF_NLOWER|5.006000||Viu ANYOF_NPRINT|5.006000||Viu ANYOF_NPUNCT|5.006000||Viu ANYOF_NSPACE|5.006000||Viu ANYOF_NSPACEL|5.004000||Viu ANYOF_NUPPER|5.006000||Viu ANYOF_NVERTWS|5.009005||Viu ANYOF_NWORDCHAR|5.017005||Viu ANYOF_NXDIGIT|5.006000||Viu ANYOF_ONLY_HAS_BITMAP|5.021004||Viu ANYOFPOSIXL|5.029004||Viu ANYOF_POSIXL_AND|5.019005||Viu ANYOF_POSIXL_CLEAR|5.019005||Viu ANYOF_POSIXL_MAX|5.019005||Viu ANYOF_POSIXL_OR|5.019005||Viu ANYOF_POSIXL_SET|5.019005||Viu ANYOF_POSIXL_SETALL|5.019005||Viu ANYOF_POSIXL_SET_TO_BITMAP|5.029004||Viu ANYOF_POSIXL_SSC_TEST_ALL_SET|5.019009||Viu ANYOF_POSIXL_SSC_TEST_ANY_SET|5.019009||Viu ANYOFPOSIXL_t8_p8|5.033003||Viu ANYOFPOSIXL_t8_pb|5.033003||Viu ANYOFPOSIXL_tb_p8|5.033003||Viu ANYOFPOSIXL_tb_pb|5.033003||Viu ANYOF_POSIXL_TEST|5.019005||Viu ANYOF_POSIXL_TEST_ALL_SET|5.019005||Viu ANYOF_POSIXL_TEST_ANY_SET|5.019005||Viu ANYOF_POSIXL_ZERO|5.019005||Viu ANYOF_PRINT|5.006000||Viu ANYOF_PUNCT|5.006000||Viu ANYOFR|5.031007||Viu ANYOFRb|5.031007||Viu ANYOFRbase|5.031007||Viu ANYOFR_BASE_BITS|5.031007||Viu ANYOFRb_t8_p8|5.033003||Viu ANYOFRb_t8_pb|5.033003||Viu ANYOFRb_tb_p8|5.033003||Viu ANYOFRb_tb_pb|5.033003||Viu ANYOFRdelta|5.031007||Viu ANYOFR_t8_p8|5.033003||Viu ANYOFR_t8_pb|5.033003||Viu ANYOFR_tb_p8|5.033003||Viu ANYOFR_tb_pb|5.033003||Viu ANYOF_SHARED_d_MATCHES_ALL_NON_UTF8_NON_ASCII_non_d_WARN_SUPER|5.023003||Viu ANYOF_SHARED_d_UPPER_LATIN1_UTF8_STRING_MATCHES_non_d_RUNTIME_USER_PROP|5.023006||Viu ANYOF_SPACE|5.006000||Viu ANYOF_SPACEL|5.004000||Viu ANYOF_t8_p8|5.033003||Viu ANYOF_t8_pb|5.033003||Viu ANYOF_tb_p8|5.033003||Viu ANYOF_tb_pb|5.033003||Viu ANYOF_UNIPROP|5.017006||Viu ANYOF_UPPER|5.006000||Viu ANYOF_VERTWS|5.009005||Viu ANYOF_WORDCHAR|5.017005||Viu ANYOF_XDIGIT|5.006000||Viu ao|5.005000||Viu _append_range_to_invlist|5.013010||Viu append_utf8_from_native_byte|5.019004||cVniu apply|5.003007||Viu apply_attrs|5.006000||Viu apply_attrs_my|5.007003||Viu apply_attrs_string|5.006001|5.006001|xu ARCHLIB|5.003007|5.003007|Vn ARCHLIB_EXP|5.003007|5.003007|Vn ARCHNAME|5.004000|5.004000|Vn ARG1|5.003007||Viu ARG1_LOC|5.005000||Viu ARG1_SET|5.005000||Viu ARG2|5.003007||Viu ARG2L|5.009005||Viu ARG2L_LOC|5.009005||Viu ARG2_LOC|5.005000||Viu ARG2L_SET|5.009005||Viu ARG2_SET|5.005000||Viu ARG|5.005000||Viu ARG_LOC|5.005000||Viu ARGp|5.031010||Viu ARGp_LOC|5.031010||Viu ARGp_SET|5.031010||Viu ARG__SET|5.005000||Viu ARG_SET|5.005000||Viu ARGTARG|5.003007||Viu ARG_VALUE|5.005000||Viu argvout_final|5.029006||Viu ASCIIish|5.005003||Viu ASCII_MORE_RESTRICT_PAT_MODS|5.013010||Viu ASCII_RESTRICT_PAT_MOD|5.013009||Viu ASCII_RESTRICT_PAT_MODS|5.013009||Viu ASCII_TO_NATIVE|5.007001||Viu ASCII_TO_NEED|5.019004||dcVnu asctime|5.009000||Viu ASCTIME_R_PROTO|5.008000|5.008000|Vn assert|5.003007||Viu __ASSERT_|5.019007|5.008008|p ASSERT_CURPAD_ACTIVE|5.008001||Viu ASSERT_CURPAD_LEGAL|5.008001||Viu assert_not_glob|5.009004||Viu assert_not_ROK|5.008001||Viu assert_uft8_cache_coherent|5.013003||Viu assignment_type|5.021005||Viu ASSUME|5.019006|5.003007|p atfork_lock|5.007002|5.007002|nu atfork_unlock|5.007002|5.007002|nu aTHX|5.006000|5.003007|p aTHX_|5.006000|5.003007|p aTHXa|5.017006||Viu aTHXo|5.006000||Viu aTHXR||5.003007|ponu aTHXR_||5.003007|ponu aTHXx|5.006000||Viu Atof|5.006000||Viu Atol|5.006000||Viu atoll|5.008000||Viu Atoul|5.006000||Viu AvALLOC|5.003007||Viu AvARRAY|5.003007|5.003007| AvARYLEN|5.003007||Viu av_arylen_p|||cu av_clear|5.003007|5.003007| av_count|5.033001|5.003007|p av_create_and_push|5.009005|5.009005|x av_create_and_unshift_one|5.009005|5.009005|x av_delete|5.006000|5.006000| av_exists|5.006000|5.006000| av_extend|5.003007|5.003007| av_extend_guts|5.017004||Viu av_fetch|5.003007|5.003007| av_fill|5.003007|5.003007| AvFILL|5.003007|5.003007| AvFILLp|5.004005||pcV av_iter_p|||cu av_len|5.003007|5.003007| av_make|5.003007|5.003007| AvMAX|5.003007||Viu av_new_alloc|5.035001|5.035001| av_nonelem|5.027009||Viu av_pop|5.003007|5.003007| av_push|5.003007|5.003007| AvREAL|5.003007||Viu AvREALISH|5.003007||Viu AvREAL_off|5.003007||Viu AvREAL_on|5.003007||Viu AvREAL_only|5.009003||Viu AvREIFY|5.003007||Viu av_reify|5.004004||cViu AvREIFY_off|5.003007||Viu AvREIFY_on|5.003007||Viu AvREIFY_only|5.009003||Viu av_shift|5.003007|5.003007| av_store|5.003007|5.003007| av_tindex|5.017009|5.003007|p av_tindex_skip_len_mg|5.025010||Viu av_top_index|5.017009|5.003007|p av_top_index_skip_len_mg|5.025010||Viu av_undef|5.003007|5.003007| av_unshift|5.003007|5.003007| ax|5.003007|5.003007| backup_one_GCB|5.025003||Viu backup_one_LB|5.023007||Viu backup_one_SB|5.021009||Viu backup_one_WB|5.021009||Viu bad_type_gv|5.019002||Viu bad_type_pv|5.016000||Viu BADVERSION|5.011004||Viu BASEOP|5.003007||Viu BhkDISABLE|5.013003||xV BhkENABLE|5.013003||xV BhkENTRY|5.013003||xVi BhkENTRY_set|5.013003||xV BHKf_bhk_eval|5.013006||Viu BHKf_bhk_post_end|5.013006||Viu BHKf_bhk_pre_end|5.013006||Viu BHKf_bhk_start|5.013006||Viu BhkFLAGS|5.013003||xVi BIN|5.003007|5.003007|Vn bind|5.005000||Viu bind_match|5.003007||Viu BIN_EXP|5.004000|5.004000|Vn BIT_BUCKET|5.003007||Viu BIT_DIGITS|5.004000||Viu BITMAP_BYTE|5.009005||Viu BITMAP_TEST|5.009005||Viu blk_eval|5.003007||Viu blk_format|5.011000||Viu blk_gimme|5.003007||Viu blk_givwhen|5.027008||Viu blk_loop|5.003007||Viu blk_oldcop|5.003007||Viu blk_oldmarksp|5.003007||Viu blk_oldpm|5.003007||Viu blk_oldsaveix|5.023008||Viu blk_oldscopesp|5.003007||Viu blk_oldsp|5.003007||Viu blk_old_tmpsfloor|5.023008||Viu blk_sub|5.003007||Viu blk_u16|5.011000||Viu block_end|5.004000|5.004000| block_gimme|5.004000|5.004000|u blockhook_register|5.013003|5.013003|x block_start|5.004000|5.004000| BmFLAGS|5.009005||Viu BmPREVIOUS|5.003007||Viu BmRARE|5.003007||Viu BmUSEFUL|5.003007||Viu BOL|5.003007||Viu BOL_t8_p8|5.033003||Viu BOL_t8_pb|5.033003||Viu BOL_tb_p8|5.033003||Viu BOL_tb_pb|5.033003||Viu BOM_UTF8|5.025005|5.003007|p BOM_UTF8_FIRST_BYTE|5.019004||Viu BOM_UTF8_TAIL|5.019004||Viu bool|5.003007||Viu boolSV|5.004000|5.003007|p boot_core_mro|5.009005||Viu boot_core_PerlIO|5.007002||Viu boot_core_UNIVERSAL|5.003007||Viu BOUND|5.003007||Viu BOUNDA|5.013009||Viu BOUNDA_t8_p8|5.033003||Viu BOUNDA_t8_pb|5.033003||Viu BOUNDA_tb_p8|5.033003||Viu BOUNDA_tb_pb|5.033003||Viu BOUNDL|5.004000||Viu BOUNDL_t8_p8|5.033003||Viu BOUNDL_t8_pb|5.033003||Viu BOUNDL_tb_p8|5.033003||Viu BOUNDL_tb_pb|5.033003||Viu BOUND_t8_p8|5.033003||Viu BOUND_t8_pb|5.033003||Viu BOUND_tb_p8|5.033003||Viu BOUND_tb_pb|5.033003||Viu BOUNDU|5.013009||Viu BOUNDU_t8_p8|5.033003||Viu BOUNDU_t8_pb|5.033003||Viu BOUNDU_tb_p8|5.033003||Viu BOUNDU_tb_pb|5.033003||Viu BRANCH|5.003007||Viu BRANCHJ|5.005000||Viu BRANCHJ_t8_p8|5.033003||Viu BRANCHJ_t8_pb|5.033003||Viu BRANCHJ_tb_p8|5.033003||Viu BRANCHJ_tb_pb|5.033003||Viu BRANCH_next|5.009005||Viu BRANCH_next_fail|5.009005||Viu BRANCH_next_fail_t8_p8|5.033003||Viu BRANCH_next_fail_t8_pb|5.033003||Viu BRANCH_next_fail_tb_p8|5.033003||Viu BRANCH_next_fail_tb_pb|5.033003||Viu BRANCH_next_t8_p8|5.033003||Viu BRANCH_next_t8_pb|5.033003||Viu BRANCH_next_tb_p8|5.033003||Viu BRANCH_next_tb_pb|5.033003||Viu BRANCH_t8_p8|5.033003||Viu BRANCH_t8_pb|5.033003||Viu BRANCH_tb_p8|5.033003||Viu BRANCH_tb_pb|5.033003||Viu BSD_GETPGRP|5.003007||Viu BSDish|5.008001||Viu BSD_SETPGRP|5.003007||Viu BUFSIZ|5.003007||Viu _byte_dump_string|5.025006||cViu BYTEORDER|5.003007|5.003007|Vn bytes_cmp_utf8|5.013007|5.013007| bytes_from_utf8|5.007001|5.007001|x bytes_from_utf8_loc|5.027001||xcVn bytes_to_utf8|5.006001|5.006001|x call_argv|5.006000|5.003007|p call_atexit|5.006000|5.006000|u CALL_BLOCK_HOOKS|5.013003||xVi CALL_CHECKER_REQUIRE_GV|5.021004|5.021004| caller_cx|5.013005|5.006000|p CALL_FPTR|5.006000||Viu call_list|5.004000|5.004000|u call_method|5.006000|5.003007|p calloc|5.007002|5.007002|n call_pv|5.006000|5.003007|p CALLREGCOMP|5.005000||Viu CALLREGCOMP_ENG|5.009005||Viu CALLREGDUPE|5.009005||Viu CALLREGDUPE_PVT|5.009005||Viu CALLREGEXEC|5.005000||Viu CALLREGFREE|5.006000||Viu CALLREGFREE_PVT|5.009005||Viu CALLREG_INTUIT_START|5.006000||Viu CALLREG_INTUIT_STRING|5.006000||Viu CALLREG_NAMED_BUFF_ALL|5.009005||Viu CALLREG_NAMED_BUFF_CLEAR|5.009005||Viu CALLREG_NAMED_BUFF_COUNT|5.009005||Viu CALLREG_NAMED_BUFF_DELETE|5.009005||Viu CALLREG_NAMED_BUFF_EXISTS|5.009005||Viu CALLREG_NAMED_BUFF_FETCH|5.009005||Viu CALLREG_NAMED_BUFF_FIRSTKEY|5.009005||Viu CALLREG_NAMED_BUFF_NEXTKEY|5.009005||Viu CALLREG_NAMED_BUFF_SCALAR|5.009005||Viu CALLREG_NAMED_BUFF_STORE|5.009005||Viu CALLREG_NUMBUF_FETCH|5.009005||Viu CALLREG_NUMBUF_LENGTH|5.009005||Viu CALLREG_NUMBUF_STORE|5.009005||Viu CALLREG_PACKAGE|5.009005||Viu CALLRUNOPS|5.005000||Viu call_sv|5.006000|5.003007|p CAN64BITHASH|5.027001||Viu CAN_COW_FLAGS|5.009000||Viu CAN_COW_MASK|5.009000||Viu cando|5.003007||Viu CAN_PROTOTYPE|5.003007||Viu C_ARRAY_END|5.013002|5.003007|p C_ARRAY_LENGTH|5.008001|5.003007|p case_100_SBOX32|5.027001||Viu case_101_SBOX32|5.027001||Viu case_102_SBOX32|5.027001||Viu case_103_SBOX32|5.027001||Viu case_104_SBOX32|5.027001||Viu case_105_SBOX32|5.027001||Viu case_106_SBOX32|5.027001||Viu case_107_SBOX32|5.027001||Viu case_108_SBOX32|5.027001||Viu case_109_SBOX32|5.027001||Viu case_10_SBOX32|5.027001||Viu case_110_SBOX32|5.027001||Viu case_111_SBOX32|5.027001||Viu case_112_SBOX32|5.027001||Viu case_113_SBOX32|5.027001||Viu case_114_SBOX32|5.027001||Viu case_115_SBOX32|5.027001||Viu case_116_SBOX32|5.027001||Viu case_117_SBOX32|5.027001||Viu case_118_SBOX32|5.027001||Viu case_119_SBOX32|5.027001||Viu case_11_SBOX32|5.027001||Viu case_120_SBOX32|5.027001||Viu case_121_SBOX32|5.027001||Viu case_122_SBOX32|5.027001||Viu case_123_SBOX32|5.027001||Viu case_124_SBOX32|5.027001||Viu case_125_SBOX32|5.027001||Viu case_126_SBOX32|5.027001||Viu case_127_SBOX32|5.027001||Viu case_128_SBOX32|5.027001||Viu case_129_SBOX32|5.027001||Viu case_12_SBOX32|5.027001||Viu case_130_SBOX32|5.027001||Viu case_131_SBOX32|5.027001||Viu case_132_SBOX32|5.027001||Viu case_133_SBOX32|5.027001||Viu case_134_SBOX32|5.027001||Viu case_135_SBOX32|5.027001||Viu case_136_SBOX32|5.027001||Viu case_137_SBOX32|5.027001||Viu case_138_SBOX32|5.027001||Viu case_139_SBOX32|5.027001||Viu case_13_SBOX32|5.027001||Viu case_140_SBOX32|5.027001||Viu case_141_SBOX32|5.027001||Viu case_142_SBOX32|5.027001||Viu case_143_SBOX32|5.027001||Viu case_144_SBOX32|5.027001||Viu case_145_SBOX32|5.027001||Viu case_146_SBOX32|5.027001||Viu case_147_SBOX32|5.027001||Viu case_148_SBOX32|5.027001||Viu case_149_SBOX32|5.027001||Viu case_14_SBOX32|5.027001||Viu case_150_SBOX32|5.027001||Viu case_151_SBOX32|5.027001||Viu case_152_SBOX32|5.027001||Viu case_153_SBOX32|5.027001||Viu case_154_SBOX32|5.027001||Viu case_155_SBOX32|5.027001||Viu case_156_SBOX32|5.027001||Viu case_157_SBOX32|5.027001||Viu case_158_SBOX32|5.027001||Viu case_159_SBOX32|5.027001||Viu case_15_SBOX32|5.027001||Viu case_160_SBOX32|5.027001||Viu case_161_SBOX32|5.027001||Viu case_162_SBOX32|5.027001||Viu case_163_SBOX32|5.027001||Viu case_164_SBOX32|5.027001||Viu case_165_SBOX32|5.027001||Viu case_166_SBOX32|5.027001||Viu case_167_SBOX32|5.027001||Viu case_168_SBOX32|5.027001||Viu case_169_SBOX32|5.027001||Viu case_16_SBOX32|5.027001||Viu case_170_SBOX32|5.027001||Viu case_171_SBOX32|5.027001||Viu case_172_SBOX32|5.027001||Viu case_173_SBOX32|5.027001||Viu case_174_SBOX32|5.027001||Viu case_175_SBOX32|5.027001||Viu case_176_SBOX32|5.027001||Viu case_177_SBOX32|5.027001||Viu case_178_SBOX32|5.027001||Viu case_179_SBOX32|5.027001||Viu case_17_SBOX32|5.027001||Viu case_180_SBOX32|5.027001||Viu case_181_SBOX32|5.027001||Viu case_182_SBOX32|5.027001||Viu case_183_SBOX32|5.027001||Viu case_184_SBOX32|5.027001||Viu case_185_SBOX32|5.027001||Viu case_186_SBOX32|5.027001||Viu case_187_SBOX32|5.027001||Viu case_188_SBOX32|5.027001||Viu case_189_SBOX32|5.027001||Viu case_18_SBOX32|5.027001||Viu case_190_SBOX32|5.027001||Viu case_191_SBOX32|5.027001||Viu case_192_SBOX32|5.027001||Viu case_193_SBOX32|5.027001||Viu case_194_SBOX32|5.027001||Viu case_195_SBOX32|5.027001||Viu case_196_SBOX32|5.027001||Viu case_197_SBOX32|5.027001||Viu case_198_SBOX32|5.027001||Viu case_199_SBOX32|5.027001||Viu case_19_SBOX32|5.027001||Viu case_1_SBOX32|5.027001||Viu case_200_SBOX32|5.027001||Viu case_201_SBOX32|5.027001||Viu case_202_SBOX32|5.027001||Viu case_203_SBOX32|5.027001||Viu case_204_SBOX32|5.027001||Viu case_205_SBOX32|5.027001||Viu case_206_SBOX32|5.027001||Viu case_207_SBOX32|5.027001||Viu case_208_SBOX32|5.027001||Viu case_209_SBOX32|5.027001||Viu case_20_SBOX32|5.027001||Viu case_210_SBOX32|5.027001||Viu case_211_SBOX32|5.027001||Viu case_212_SBOX32|5.027001||Viu case_213_SBOX32|5.027001||Viu case_214_SBOX32|5.027001||Viu case_215_SBOX32|5.027001||Viu case_216_SBOX32|5.027001||Viu case_217_SBOX32|5.027001||Viu case_218_SBOX32|5.027001||Viu case_219_SBOX32|5.027001||Viu case_21_SBOX32|5.027001||Viu case_220_SBOX32|5.027001||Viu case_221_SBOX32|5.027001||Viu case_222_SBOX32|5.027001||Viu case_223_SBOX32|5.027001||Viu case_224_SBOX32|5.027001||Viu case_225_SBOX32|5.027001||Viu case_226_SBOX32|5.027001||Viu case_227_SBOX32|5.027001||Viu case_228_SBOX32|5.027001||Viu case_229_SBOX32|5.027001||Viu case_22_SBOX32|5.027001||Viu case_230_SBOX32|5.027001||Viu case_231_SBOX32|5.027001||Viu case_232_SBOX32|5.027001||Viu case_233_SBOX32|5.027001||Viu case_234_SBOX32|5.027001||Viu case_235_SBOX32|5.027001||Viu case_236_SBOX32|5.027001||Viu case_237_SBOX32|5.027001||Viu case_238_SBOX32|5.027001||Viu case_239_SBOX32|5.027001||Viu case_23_SBOX32|5.027001||Viu case_240_SBOX32|5.027001||Viu case_241_SBOX32|5.027001||Viu case_242_SBOX32|5.027001||Viu case_243_SBOX32|5.027001||Viu case_244_SBOX32|5.027001||Viu case_245_SBOX32|5.027001||Viu case_246_SBOX32|5.027001||Viu case_247_SBOX32|5.027001||Viu case_248_SBOX32|5.027001||Viu case_249_SBOX32|5.027001||Viu case_24_SBOX32|5.027001||Viu case_250_SBOX32|5.027001||Viu case_251_SBOX32|5.027001||Viu case_252_SBOX32|5.027001||Viu case_253_SBOX32|5.027001||Viu case_254_SBOX32|5.027001||Viu case_255_SBOX32|5.027001||Viu case_256_SBOX32|5.027001||Viu case_25_SBOX32|5.027001||Viu case_26_SBOX32|5.027001||Viu case_27_SBOX32|5.027001||Viu case_28_SBOX32|5.027001||Viu case_29_SBOX32|5.027001||Viu case_2_SBOX32|5.027001||Viu case_30_SBOX32|5.027001||Viu case_31_SBOX32|5.027001||Viu case_32_SBOX32|5.027001||Viu case_33_SBOX32|5.027001||Viu case_34_SBOX32|5.027001||Viu case_35_SBOX32|5.027001||Viu case_36_SBOX32|5.027001||Viu case_37_SBOX32|5.027001||Viu case_38_SBOX32|5.027001||Viu case_39_SBOX32|5.027001||Viu case_3_SBOX32|5.027001||Viu case_40_SBOX32|5.027001||Viu case_41_SBOX32|5.027001||Viu case_42_SBOX32|5.027001||Viu case_43_SBOX32|5.027001||Viu case_44_SBOX32|5.027001||Viu case_45_SBOX32|5.027001||Viu case_46_SBOX32|5.027001||Viu case_47_SBOX32|5.027001||Viu case_48_SBOX32|5.027001||Viu case_49_SBOX32|5.027001||Viu case_4_SBOX32|5.027001||Viu case_50_SBOX32|5.027001||Viu case_51_SBOX32|5.027001||Viu case_52_SBOX32|5.027001||Viu case_53_SBOX32|5.027001||Viu case_54_SBOX32|5.027001||Viu case_55_SBOX32|5.027001||Viu case_56_SBOX32|5.027001||Viu case_57_SBOX32|5.027001||Viu case_58_SBOX32|5.027001||Viu case_59_SBOX32|5.027001||Viu case_5_SBOX32|5.027001||Viu case_60_SBOX32|5.027001||Viu case_61_SBOX32|5.027001||Viu case_62_SBOX32|5.027001||Viu case_63_SBOX32|5.027001||Viu case_64_SBOX32|5.027001||Viu case_65_SBOX32|5.027001||Viu case_66_SBOX32|5.027001||Viu case_67_SBOX32|5.027001||Viu case_68_SBOX32|5.027001||Viu case_69_SBOX32|5.027001||Viu case_6_SBOX32|5.027001||Viu case_70_SBOX32|5.027001||Viu case_71_SBOX32|5.027001||Viu case_72_SBOX32|5.027001||Viu case_73_SBOX32|5.027001||Viu case_74_SBOX32|5.027001||Viu case_75_SBOX32|5.027001||Viu case_76_SBOX32|5.027001||Viu case_77_SBOX32|5.027001||Viu case_78_SBOX32|5.027001||Viu case_79_SBOX32|5.027001||Viu case_7_SBOX32|5.027001||Viu case_80_SBOX32|5.027001||Viu case_81_SBOX32|5.027001||Viu case_82_SBOX32|5.027001||Viu case_83_SBOX32|5.027001||Viu case_84_SBOX32|5.027001||Viu case_85_SBOX32|5.027001||Viu case_86_SBOX32|5.027001||Viu case_87_SBOX32|5.027001||Viu case_88_SBOX32|5.027001||Viu case_89_SBOX32|5.027001||Viu case_8_SBOX32|5.027001||Viu case_90_SBOX32|5.027001||Viu case_91_SBOX32|5.027001||Viu case_92_SBOX32|5.027001||Viu case_93_SBOX32|5.027001||Viu case_94_SBOX32|5.027001||Viu case_95_SBOX32|5.027001||Viu case_96_SBOX32|5.027001||Viu case_97_SBOX32|5.027001||Viu case_98_SBOX32|5.027001||Viu case_99_SBOX32|5.027001||Viu case_9_SBOX32|5.027001||Viu CASE_STD_PMMOD_FLAGS_PARSE_SET|5.009005||Viu CASTFLAGS|5.003007|5.003007|Vn cast_i32|5.006000||cVnu cast_iv|5.006000||cVnu CASTNEGFLOAT|5.003007|5.003007|Vn cast_ulong|5.003007||cVnu cast_uv|5.006000||cVnu CAT2|5.003007|5.003007|Vn CATCH_GET|5.004000||Viu CATCH_SET|5.004000||Viu category_name|5.027008||Vniu cBINOP|5.003007||Viu cBINOPo|5.004005||Viu cBINOPx|5.006000||Viu cBOOL|5.013000|5.003007|p cCOP|5.003007||Viu cCOPo|5.004005||Viu cCOPx|5.006000||Viu C_FAC_POSIX|5.009003||Viu cGVOP_gv|5.006000||Viu cGVOPo_gv|5.006000||Viu cGVOPx_gv|5.006000||Viu change_engine_size|5.029004||Viu CHANGE_MULTICALL_FLAGS|5.018000||Viu CHARBITS|5.011002|5.011002|Vn CHARSET_PAT_MODS|5.013010||Viu chdir|5.005000||Viu checkcomma|5.003007||Viu check_end_shift|5.009005||Viu check_locale_boundary_crossing|5.015006||Viu CHECK_MALLOC_TAINT|5.008001||Viu CHECK_MALLOC_TOO_LATE_FOR|5.008001||Viu check_offset_max|5.005000||Viu check_offset_min|5.005000||Viu check_substr|5.005000||Viu check_type_and_open|5.009003||Viu check_uni|5.003007||Viu check_utf8|5.008000||Viu check_utf8_print|5.013009||Viu child_offset_bits|5.009003||Viu chmod|5.005000||Viu chsize|5.005000||Viu ckDEAD|5.006000||Viu ck_entersub_args_core|||iu ck_entersub_args_list|5.013006|5.013006| ck_entersub_args_proto|5.013006|5.013006| ck_entersub_args_proto_or_list|5.013006|5.013006| ckWARN2|5.006000|5.003007|p ckWARN2_d|5.006000|5.003007|p ckWARN3|5.007003|5.003007|p ckWARN3_d|5.007003|5.003007|p ckWARN4|5.007003|5.003007|p ckWARN4_d|5.007003|5.003007|p ckWARN|5.006000|5.003007|p ckwarn_common|5.011001||Viu ckwarn|||cu ckWARN_d|5.006000|5.003007|p ckwarn_d|||cu ck_warner|5.011001|5.004000|pv ck_warner_d|5.011001|5.004000|pv CLANG_DIAG_IGNORE|5.023006||Viu CLANG_DIAG_IGNORE_DECL|5.027007||Viu CLANG_DIAG_IGNORE_STMT|5.027007||Viu CLANG_DIAG_PRAGMA|5.023006||Viu CLANG_DIAG_RESTORE|5.023006||Viu CLANG_DIAG_RESTORE_DECL|5.027007||Viu CLANG_DIAG_RESTORE_STMT|5.027007||Viu CLASS||5.003007| CLEAR_ARGARRAY|5.006000||Viu clear_defarray|5.023008|5.023008|u clearerr|5.003007||Viu CLEAR_ERRSV|5.025007|5.025007| CLEARFEATUREBITS|5.031006||Viu clear_placeholders|5.009004||xViu clear_special_blocks|5.021003||Viu cLISTOP|5.003007||Viu cLISTOPo|5.004005||Viu cLISTOPx|5.006000||Viu cLOGOP|5.003007||Viu cLOGOPo|5.004005||Viu cLOGOPx|5.006000||Viu CLONEf_CLONE_HOST|5.007002||Viu CLONEf_COPY_STACKS|5.007001||Viu CLONEf_JOIN_IN|5.008001||Viu CLONEf_KEEP_PTR_TABLE|5.007001||Viu clone_params_del|5.013002|5.013002|nu clone_params_new|5.013002|5.013002|nu cLOOP|5.003007||Viu cLOOPo|5.004005||Viu cLOOPx|5.006000||Viu CLOSE|5.003007||Viu close|5.005000||Viu closedir|5.005000||Viu closest_cop|5.007002||Viu CLOSE_t8_p8|5.033003||Viu CLOSE_t8_pb|5.033003||Viu CLOSE_tb_p8|5.033003||Viu CLOSE_tb_pb|5.033003||Viu CLUMP_2IV|5.006000||Viu CLUMP_2UV|5.006000||Viu CLUMP|5.006000||Viu CLUMP_t8_p8|5.033003||Viu CLUMP_t8_pb|5.033003||Viu CLUMP_tb_p8|5.033003||Viu CLUMP_tb_pb|5.033003||Viu cMETHOPx|5.021005||Viu cMETHOPx_meth|5.021005||Viu cMETHOPx_rclass|5.021007||Viu cmpchain_extend|5.031011||Viu cmpchain_finish|5.031011||Viu cmpchain_start|5.031011||Viu cmp_desc|5.031011||Viu cmp_locale_desc|5.031011||Viu cntrl_to_mnemonic|5.021004||cVniu CODESET|5.027010||Viu COMBINING_DOT_ABOVE_UTF8|5.029008||Viu COMBINING_GRAVE_ACCENT_UTF8|5.017004||Viu COMMIT|5.009005||Viu COMMIT_next|5.009005||Viu COMMIT_next_fail|5.009005||Viu COMMIT_next_fail_t8_p8|5.033003||Viu COMMIT_next_fail_t8_pb|5.033003||Viu COMMIT_next_fail_tb_p8|5.033003||Viu COMMIT_next_fail_tb_pb|5.033003||Viu COMMIT_next_t8_p8|5.033003||Viu COMMIT_next_t8_pb|5.033003||Viu COMMIT_next_tb_p8|5.033003||Viu COMMIT_next_tb_pb|5.033003||Viu COMMIT_t8_p8|5.033003||Viu COMMIT_t8_pb|5.033003||Viu COMMIT_tb_p8|5.033003||Viu COMMIT_tb_pb|5.033003||Viu compile_wildcard|5.031010||Viu compute_EXACTish|5.017003||Vniu COND_BROADCAST|5.005000||Viu COND_DESTROY|5.005000||Viu COND_INIT|5.005000||Viu COND_SIGNAL|5.005000||Viu COND_WAIT|5.005000||Viu connect|5.005000||Viu construct_ahocorasick_from_trie|5.021001||Viu CONTINUE_PAT_MOD|5.009005||Viu cop_fetch_label|5.015001|5.015001|x CopFILE|5.006000|5.003007|p CopFILEAV|5.006000|5.003007|p CopFILEAVx|5.009003||Viu CopFILE_free|5.007003||Viu CopFILEGV|5.006000|5.003007|p CopFILEGV_set|5.006000|5.003007|p CopFILE_set|5.006000|5.003007|p CopFILE_setn|5.009005||Viu CopFILESV|5.006000|5.003007|p cop_free|5.006000||Viu cophh_2hv|5.013007|5.013007|x cophh_copy|5.013007|5.013007|x cophh_delete_pv|5.013007|5.013007|x cophh_delete_pvn|5.013007|5.013007|x cophh_delete_pvs|5.013007|5.013007|x cophh_delete_sv|5.013007|5.013007|x COPHH_EXISTS|5.033008||Viu cophh_exists_pv|5.033008|5.033008|x cophh_exists_pvn|5.033008|5.033008|x cophh_exists_pvs|5.033008|5.033008|x cophh_exists_sv|5.033008|5.033008|x cophh_fetch_pv|5.013007|5.013007|x cophh_fetch_pvn|5.013007|5.013007|x cophh_fetch_pvs|5.013007|5.013007|x cophh_fetch_sv|5.013007|5.013007|x cophh_free|5.013007|5.013007|x COPHH_KEY_UTF8|5.013007|5.013007| cophh_new_empty|5.013007|5.013007|x cophh_store_pv|5.013007|5.013007|x cophh_store_pvn|5.013007|5.013007|x cophh_store_pvs|5.013007|5.013007|x cophh_store_sv|5.013007|5.013007|x CopHINTHASH_get|5.013007||Viu CopHINTHASH_set|5.013007||Viu cop_hints_2hv|5.013007|5.013007| cop_hints_exists_pv|5.033008|5.033008| cop_hints_exists_pvn|5.033008|5.033008| cop_hints_exists_pvs|5.033008|5.033008| cop_hints_exists_sv|5.033008|5.033008| cop_hints_fetch_pv|5.013007|5.013007| cop_hints_fetch_pvn|5.013007|5.013007| cop_hints_fetch_pvs|5.013007|5.013007| cop_hints_fetch_sv|5.013007|5.013007| CopHINTS_get|5.009004||Viu CopHINTS_set|5.009004||Viu CopLABEL|5.009005|5.009005| CopLABEL_alloc|5.009005||Viu CopLABEL_len|5.016000|5.016000| CopLABEL_len_flags|5.016000|5.016000| CopLINE|5.006000|5.006000| CopLINE_dec|5.006000||Viu CopLINE_inc|5.006000||Viu CopLINE_set|5.006000||Viu COP_SEQMAX_INC|5.021006||Viu COP_SEQ_RANGE_HIGH|5.009005||Viu COP_SEQ_RANGE_LOW|5.009005||Viu CopSTASH|5.006000|5.003007|p CopSTASH_eq|5.006000|5.003007|p CopSTASH_ne|5.006000||Viu CopSTASHPV|5.006000|5.003007|p CopSTASHPV_set|5.017001|5.017001|p CopSTASH_set|5.006000|5.003007|p cop_store_label|5.015001|5.015001|x Copy|5.003007|5.003007| CopyD|5.009002|5.003007|p core_prototype|5.015002||Vi coresub_op|5.015003||Viu CowREFCNT|5.017007||Viu cPADOP|5.006000||Viu cPADOPo|5.006000||Viu cPADOPx|5.006000||Viu CPERLarg|5.005000||Viu CPERLscope|5.005000|5.003007|pdV cPMOP|5.003007||Viu cPMOPo|5.004005||Viu cPMOPx|5.006000||Viu CPPLAST|5.006000|5.006000|Vn CPPMINUS|5.003007|5.003007|Vn CPPRUN|5.006000|5.006000|Vn CPPSTDIN|5.003007|5.003007|Vn cPVOP|5.003007||Viu cPVOPo|5.004005||Viu cPVOPx|5.006000||Viu create_eval_scope|5.009004||xViu CR_NATIVE|5.019004||Viu CRNCYSTR|5.027010||Viu croak|5.006000|5.003007|v croak_caller|5.025004||vVniu croak_memory_wrap|5.019003||pcVnu croak_nocontext|5.006000||pvVn croak_no_mem|5.017006||Vniu croak_no_modify|5.013003|5.003007|pn croak_popstack|5.017008||cVniu croak_sv|5.013001|5.003007|p croak_xs_usage|5.010001|5.003007|pn cr_textfilter|5.006000||Viu crypt|5.009000||Viu CRYPT_R_PROTO|5.008000|5.008000|Vn CSH|5.003007|5.003007|Vn csighandler1|5.031007||cVnu csighandler3|5.031007||cVnu csighandler|5.008001||cVnu cSVOP|5.003007||Viu cSVOPo|5.004005||Viu cSVOPo_sv|5.006000||Viu cSVOP_sv|5.006000||Viu cSVOPx|5.006000||Viu cSVOPx_sv|5.006000||Viu cSVOPx_svp|5.006000||Viu ctermid|5.009000||Viu CTERMID_R_PROTO|5.008000|5.008000|Vn ctime|5.009000||Viu CTIME_R_PROTO|5.008000|5.008000|Vn Ctl|5.003007||Viu CTYPE256|5.003007||Viu cUNOP|5.003007||Viu cUNOP_AUX|5.021007||Viu cUNOP_AUXo|5.021007||Viu cUNOP_AUXx|5.021007||Viu cUNOPo|5.004005||Viu cUNOPx|5.006000||Viu CURLY|5.003007||Viu CURLY_B_max|5.009005||Viu CURLY_B_max_fail|5.009005||Viu CURLY_B_max_fail_t8_p8|5.033003||Viu CURLY_B_max_fail_t8_pb|5.033003||Viu CURLY_B_max_fail_tb_p8|5.033003||Viu CURLY_B_max_fail_tb_pb|5.033003||Viu CURLY_B_max_t8_p8|5.033003||Viu CURLY_B_max_t8_pb|5.033003||Viu CURLY_B_max_tb_p8|5.033003||Viu CURLY_B_max_tb_pb|5.033003||Viu CURLY_B_min|5.009005||Viu CURLY_B_min_fail|5.009005||Viu CURLY_B_min_fail_t8_p8|5.033003||Viu CURLY_B_min_fail_t8_pb|5.033003||Viu CURLY_B_min_fail_tb_p8|5.033003||Viu CURLY_B_min_fail_tb_pb|5.033003||Viu CURLY_B_min_t8_p8|5.033003||Viu CURLY_B_min_t8_pb|5.033003||Viu CURLY_B_min_tb_p8|5.033003||Viu CURLY_B_min_tb_pb|5.033003||Viu CURLYM|5.005000||Viu CURLYM_A|5.009005||Viu CURLYM_A_fail|5.009005||Viu CURLYM_A_fail_t8_p8|5.033003||Viu CURLYM_A_fail_t8_pb|5.033003||Viu CURLYM_A_fail_tb_p8|5.033003||Viu CURLYM_A_fail_tb_pb|5.033003||Viu CURLYM_A_t8_p8|5.033003||Viu CURLYM_A_t8_pb|5.033003||Viu CURLYM_A_tb_p8|5.033003||Viu CURLYM_A_tb_pb|5.033003||Viu CURLYM_B|5.009005||Viu CURLYM_B_fail|5.009005||Viu CURLYM_B_fail_t8_p8|5.033003||Viu CURLYM_B_fail_t8_pb|5.033003||Viu CURLYM_B_fail_tb_p8|5.033003||Viu CURLYM_B_fail_tb_pb|5.033003||Viu CURLYM_B_t8_p8|5.033003||Viu CURLYM_B_t8_pb|5.033003||Viu CURLYM_B_tb_p8|5.033003||Viu CURLYM_B_tb_pb|5.033003||Viu CURLYM_t8_p8|5.033003||Viu CURLYM_t8_pb|5.033003||Viu CURLYM_tb_p8|5.033003||Viu CURLYM_tb_pb|5.033003||Viu CURLYN|5.005000||Viu CURLYN_t8_p8|5.033003||Viu CURLYN_t8_pb|5.033003||Viu CURLYN_tb_p8|5.033003||Viu CURLYN_tb_pb|5.033003||Viu CURLY_t8_p8|5.033003||Viu CURLY_t8_pb|5.033003||Viu CURLY_tb_p8|5.033003||Viu CURLY_tb_pb|5.033003||Viu CURLYX|5.003007||Viu CURLYX_end|5.009005||Viu CURLYX_end_fail|5.009005||Viu CURLYX_end_fail_t8_p8|5.033003||Viu CURLYX_end_fail_t8_pb|5.033003||Viu CURLYX_end_fail_tb_p8|5.033003||Viu CURLYX_end_fail_tb_pb|5.033003||Viu CURLYX_end_t8_p8|5.033003||Viu CURLYX_end_t8_pb|5.033003||Viu CURLYX_end_tb_p8|5.033003||Viu CURLYX_end_tb_pb|5.033003||Viu CURLYX_t8_p8|5.033003||Viu CURLYX_t8_pb|5.033003||Viu CURLYX_tb_p8|5.033003||Viu CURLYX_tb_pb|5.033003||Viu CURRENT_FEATURE_BUNDLE|5.015007||Viu CURRENT_HINTS|5.015007||Viu current_re_engine|5.017001||cViu curse|5.013009||Viu custom_op_desc|5.007003|5.007003|d custom_op_get_field|5.019006||cViu custom_op_name|5.007003|5.007003|d custom_op_register|5.013007|5.013007| CUTGROUP|5.009005||Viu CUTGROUP_next|5.009005||Viu CUTGROUP_next_fail|5.009005||Viu CUTGROUP_next_fail_t8_p8|5.033003||Viu CUTGROUP_next_fail_t8_pb|5.033003||Viu CUTGROUP_next_fail_tb_p8|5.033003||Viu CUTGROUP_next_fail_tb_pb|5.033003||Viu CUTGROUP_next_t8_p8|5.033003||Viu CUTGROUP_next_t8_pb|5.033003||Viu CUTGROUP_next_tb_p8|5.033003||Viu CUTGROUP_next_tb_pb|5.033003||Viu CUTGROUP_t8_p8|5.033003||Viu CUTGROUP_t8_pb|5.033003||Viu CUTGROUP_tb_p8|5.033003||Viu CUTGROUP_tb_pb|5.033003||Viu CvANON|5.003007||Viu CvANONCONST|5.021008||Viu CvANONCONST_off|5.021008||Viu CvANONCONST_on|5.021008||Viu CvANON_off|5.003007||Viu CvANON_on|5.003007||Viu CvAUTOLOAD|5.015004||Viu CvAUTOLOAD_off|5.015004||Viu CvAUTOLOAD_on|5.015004||Viu cv_ckproto|5.009004||Viu cv_ckproto_len_flags|5.015004||xcViu cv_clone|5.003007|5.003007| CvCLONE|5.003007||Viu CvCLONED|5.003007||Viu CvCLONED_off|5.003007||Viu CvCLONED_on|5.003007||Viu cv_clone_into|5.017004||Viu CvCLONE_off|5.003007||Viu CvCLONE_on|5.003007||Viu CvCONST|5.007001||Viu CvCONST_off|5.007001||Viu CvCONST_on|5.007001||Viu cv_const_sv|5.003007|5.003007|n cv_const_sv_or_av|5.019003||Vniu CvCVGV_RC|5.013003||Viu CvCVGV_RC_off|5.013003||Viu CvCVGV_RC_on|5.013003||Viu CvDEPTH|5.003007|5.003007|nu CvDEPTHunsafe|5.021006||Viu cv_dump|5.006000||Vi CvDYNFILE|5.015002||Viu CvDYNFILE_off|5.015002||Viu CvDYNFILE_on|5.015002||Viu CvEVAL|5.005003||Viu CvEVAL_off|5.005003||Viu CvEVAL_on|5.005003||Viu CVf_ANON|5.003007||Viu CVf_ANONCONST|5.021008||Viu CVf_AUTOLOAD|5.015004||Viu CVf_BUILTIN_ATTRS|5.008000||Viu CVf_CLONE|5.003007||Viu CVf_CLONED|5.003007||Viu CVf_CONST|5.007001||Viu CVf_CVGV_RC|5.013003||Viu CVf_DYNFILE|5.015002||Viu CVf_HASEVAL|5.017002||Viu CvFILE|5.006000||Viu CvFILEGV|5.003007||Viu CvFILE_set_from_cop|5.007002||Viu CVf_ISXSUB|5.009004||Viu CvFLAGS|5.003007||Viu CVf_LEXICAL|5.021004||Viu CVf_LVALUE|5.006000||Viu CVf_METHOD|5.005000||Viu CVf_NAMED|5.017004||Viu CVf_NODEBUG|5.004000||Viu cv_forget_slab|5.017002||Vi CVf_SLABBED|5.017002||Viu CVf_UNIQUE|5.004000||Viu CVf_WEAKOUTSIDE|5.008001||Viu cv_get_call_checker|5.013006|5.013006| cv_get_call_checker_flags|5.027003|5.027003| CvGV|5.003007|5.003007| cvgv_from_hek|||ciu cvgv_set|5.013003||cViu CvGV_set|5.013003||Viu CvHASEVAL|5.017002||Viu CvHASEVAL_off|5.017002||Viu CvHASEVAL_on|5.017002||Viu CvHASGV|5.021004||Viu CvHSCXT|5.021006||Viu CvISXSUB|5.009004||Viu CvISXSUB_off|5.009004||Viu CvISXSUB_on|5.009004||Viu CvLEXICAL|5.021004||Viu CvLEXICAL_off|5.021004||Viu CvLEXICAL_on|5.021004||Viu CvLVALUE|5.006000||Viu CvLVALUE_off|5.006000||Viu CvLVALUE_on|5.006000||Viu CvMETHOD|5.005000||Viu CvMETHOD_off|5.005000||Viu CvMETHOD_on|5.005000||Viu cv_name|5.021005|5.021005| CvNAMED|5.017004||Viu CvNAMED_off|5.017004||Viu CvNAMED_on|5.017004||Viu CvNAME_HEK_set|5.017004||Viu CV_NAME_NOTQUAL|5.021005|5.021005| CvNODEBUG|5.004000||Viu CvNODEBUG_off|5.004000||Viu CvNODEBUG_on|5.004000||Viu CvOUTSIDE|5.003007||Viu CvOUTSIDE_SEQ|5.008001||Viu CvPADLIST|5.008001|5.008001|x CvPADLIST_set|5.021006||Viu CvPROTO|5.015004||Viu CvPROTOLEN|5.015004||Viu CvROOT|5.003007||Viu cv_set_call_checker|5.013006|5.013006| cv_set_call_checker_flags|5.021004|5.021004| CvSLABBED|5.017002||Viu CvSLABBED_off|5.017002||Viu CvSLABBED_on|5.017002||Viu CvSPECIAL|5.005003||Viu CvSPECIAL_off|5.005003||Viu CvSPECIAL_on|5.005003||Viu CvSTART|5.003007||Viu CvSTASH|5.003007|5.003007| cvstash_set|5.013007||cViu CvSTASH_set|5.013007||Viu cv_undef|5.003007|5.003007| cv_undef_flags|5.021004||Viu CV_UNDEF_KEEP_NAME|5.021004||Viu CvUNIQUE|5.004000||Viu CvUNIQUE_off|5.004000||Viu CvUNIQUE_on|5.004000||Viu CvWEAKOUTSIDE|5.008001||Vi CvWEAKOUTSIDE_off|5.008001||Viu CvWEAKOUTSIDE_on|5.008001||Viu CvXSUB|5.003007||Viu CvXSUBANY|5.003007||Viu CX_CUR|5.023008||Viu CX_CURPAD_SAVE|5.008001||Vi CX_CURPAD_SV|5.008001||Vi CX_DEBUG|5.023008||Viu cx_dump|5.003007||cVu cx_dup|5.006000||cVu CxEVALBLOCK|5.033007||Viu CxEVAL_TXT_REFCNTED|5.025007||Viu CxFOREACH|5.009003||Viu CxHASARGS|5.010001||Viu cxinc|5.003007||cVu CXINC|5.003007||Viu CxITERVAR|5.006000||Viu CxLABEL|5.010001||Viu CxLABEL_len|5.016000||Viu CxLABEL_len_flags|5.016000||Viu CX_LEAVE_SCOPE|5.023008||Viu CxLVAL|5.010001||Viu CxMULTICALL|5.009003||Viu CxOLD_IN_EVAL|5.010001||Viu CxOLD_OP_TYPE|5.010001||Viu CxONCE|5.010001||Viu CxPADLOOP|5.006000||Viu CXp_EVALBLOCK|5.033007||Viu CXp_FOR_DEF|5.027008||Viu CXp_FOR_GV|5.023008||Viu CXp_FOR_LVREF|5.021005||Viu CXp_FOR_PAD|5.023008||Viu CXp_HASARGS|5.011000||Viu CXp_MULTICALL|5.009003||Viu CXp_ONCE|5.011000||Viu CX_POP|5.023008||Viu cx_popblock|5.023008||xcVu cx_popeval|5.023008||xcVu cx_popformat|5.023008||xcVu cx_popgiven|5.027008||xcVu cx_poploop|5.023008||xcVu CX_POP_SAVEARRAY|5.023008||Viu cx_popsub|5.023008||xcVu cx_popsub_args|5.023008||xcVu cx_popsub_common|5.023008||xcVu CX_POPSUBST|5.023008||Viu cx_popwhen|5.027008||xcVu CXp_REAL|5.005003||Viu CXp_SUB_RE|5.018000||Viu CXp_SUB_RE_FAKE|5.018000||Viu CXp_TRY|5.033007||Viu CXp_TRYBLOCK|5.006000||Viu cx_pushblock|5.023008||xcVu cx_pusheval|5.023008||xcVu cx_pushformat|5.023008||xcVu cx_pushgiven|5.027008||xcVu cx_pushloop_for|5.023008||xcVu cx_pushloop_plain|5.023008||xcVu cx_pushsub|5.023008||xcVu CX_PUSHSUB_GET_LVALUE_MASK|5.023008||Viu CX_PUSHSUBST|5.023008||Viu cx_pushtry|5.033007||xcVu cx_pushwhen|5.027008||xcVu CxREALEVAL|5.005003||Viu cxstack|5.005000||Viu cxstack_ix|5.005000||Viu cxstack_max|5.005000||Viu CXt_BLOCK|5.003007||Viu CXt_EVAL|5.003007||Viu CXt_FORMAT|5.006000||Viu CXt_GIVEN|5.027008||Viu CXt_LOOP_ARY|5.023008||Viu CXt_LOOP_LAZYIV|5.011000||Viu CXt_LOOP_LAZYSV|5.011000||Viu CXt_LOOP_LIST|5.023008||Viu CXt_LOOP_PLAIN|5.011000||Viu CXt_NULL|5.003007||Viu cx_topblock|5.023008||xcVu CxTRY|5.033007||Viu CxTRYBLOCK|5.006000||Viu CXt_SUB|5.003007||Viu CXt_SUBST|5.003007||Viu CXt_WHEN|5.027008||Viu CxTYPE|5.005003||Viu cx_type|5.009005||Viu CxTYPE_is_LOOP|5.011000||Viu CXTYPEMASK|5.005003||Viu dATARGET|5.003007||Viu dAX|5.007002|5.003007|p dAXMARK|5.009003|5.003007|p DAY_1|5.027010||Viu DAY_2|5.027010||Viu DAY_3|5.027010||Viu DAY_4|5.027010||Viu DAY_5|5.027010||Viu DAY_6|5.027010||Viu DAY_7|5.027010||Viu DB_Hash_t|5.003007|5.003007|Vn DBM_ckFilter|5.008001||Viu DBM_setFilter|5.008001||Viu DB_Prefix_t|5.003007|5.003007|Vn DBVARMG_COUNT|5.021005||Viu DBVARMG_SIGNAL|5.021005||Viu DBVARMG_SINGLE|5.021005||Viu DBVARMG_TRACE|5.021005||Viu DB_VERSION_MAJOR_CFG|5.007002|5.007002|Vn DB_VERSION_MINOR_CFG|5.007002|5.007002|Vn DB_VERSION_PATCH_CFG|5.007002|5.007002|Vn deb|5.007003|5.007003|vu deb_curcv|5.007002||Viu deb_nocontext|5.007003|5.007003|vnu debop|5.005000|5.005000|u debprof|5.005000||Viu debprofdump|5.005000|5.005000|u debstack|5.007003|5.007003|u deb_stack_all|5.008001||Viu deb_stack_n|5.008001||Viu debstackptrs|5.007003|5.007003|u DEBUG|5.003007||Viu DEBUG_A|5.009001||Viu DEBUG_A_FLAG|5.009001||Viu DEBUG_A_TEST|5.009001||Viu DEBUG_B|5.011000||Viu DEBUG_B_FLAG|5.011000||Viu DEBUG_BOTH_FLAGS_TEST|5.033007||Viu DEBUG_B_TEST|5.011000||Viu DEBUG_BUFFERS_r|5.009005||Viu DEBUG_c|5.003007||Viu DEBUG_C|5.009000||Viu DEBUG_c_FLAG|5.007001||Viu DEBUG_C_FLAG|5.009000||Viu DEBUG_COMPILE_r|5.009002||Viu DEBUG_c_TEST|5.007001||Viu DEBUG_C_TEST|5.009000||Viu DEBUG_D|5.003007||Viu DEBUG_DB_RECURSE_FLAG|5.007001||Viu DEBUG_D_FLAG|5.007001||Viu DEBUG_D_TEST|5.007001||Viu DEBUG_DUMP_PRE_OPTIMIZE_r|5.031004||Viu DEBUG_DUMP_r|5.009004||Viu DEBUG_EXECUTE_r|5.009002||Viu DEBUG_EXTRA_r|5.009004||Viu DEBUG_f|5.003007||Viu DEBUG_f_FLAG|5.007001||Viu DEBUG_FLAGS_r|5.009005||Viu DEBUG_f_TEST|5.007001||Viu DEBUG_GPOS_r|5.011000||Viu DEBUG_i|5.025002||Viu DEBUG_i_FLAG|5.025002||Viu DEBUG_INTUIT_r|5.009004||Viu DEBUG_i_TEST|5.025002||Viu DEBUG_J_FLAG|5.007003||Viu DEBUG_J_TEST|5.007003||Viu DEBUG_l|5.003007||Viu DEBUG_L|5.019009||Viu DEBUG_l_FLAG|5.007001||Viu DEBUG_L_FLAG|5.019009||Viu DEBUG_l_TEST|5.007001||Viu DEBUG_L_TEST|5.019009||Viu DEBUG_Lv|5.023003||Viu DEBUG_Lv_TEST|5.023003||Viu DEBUG_m|5.003007||Viu DEBUG_M|5.027008||Viu DEBUG_MASK|5.007001||Viu DEBUG_MATCH_r|5.009004||Viu DEBUG_m_FLAG|5.007001||Viu DEBUG_M_FLAG|5.027008||Viu DEBUG_m_TEST|5.007001||Viu DEBUG_M_TEST|5.027008||Viu DEBUG_o|5.003007||Viu DEBUG_OFFSETS_r|5.009002||Viu DEBUG_o_FLAG|5.007001||Viu DEBUG_OPTIMISE_MORE_r|5.009005||Viu DEBUG_OPTIMISE_r|5.009002||Viu DEBUG_o_TEST|5.007001||Viu DEBUG_P|5.003007||Viu DEBUG_p|5.003007||Viu DEBUG_PARSE_r|5.009004||Viu DEBUG_P_FLAG|5.007001||Viu DEBUG_p_FLAG|5.007001||Viu DEBUG_POST_STMTS|5.033008||Viu DEBUG_PRE_STMTS|5.033008||Viu DEBUG_P_TEST|5.007001||Viu DEBUG_p_TEST|5.007001||Viu DEBUG_Pv|5.013008||Viu DEBUG_Pv_TEST|5.013008||Viu DEBUG_q|5.009001||Viu DEBUG_q_FLAG|5.009001||Viu DEBUG_q_TEST|5.009001||Viu DEBUG_r|5.003007||Viu DEBUG_R|5.007001||Viu DEBUG_R_FLAG|5.007001||Viu DEBUG_r_FLAG|5.007001||Viu DEBUG_R_TEST|5.007001||Viu DEBUG_r_TEST|5.007001||Viu DEBUG_s|5.003007||Viu DEBUG_S|5.017002||Viu DEBUG_SBOX32_HASH|5.027001||Viu DEBUG_SCOPE|5.008001||Viu DEBUG_s_FLAG|5.007001||Viu DEBUG_S_FLAG|5.017002||Viu DEBUG_STACK_r|5.009005||Viu debug_start_match|5.009004||Viu DEBUG_STATE_r|5.009004||Viu DEBUG_s_TEST|5.007001||Viu DEBUG_S_TEST|5.017002||Viu DEBUG_t|5.003007||Viu DEBUG_T|5.007001||Viu DEBUG_TEST_r|5.021005||Viu DEBUG_T_FLAG|5.007001||Viu DEBUG_t_FLAG|5.007001||Viu DEBUG_TOP_FLAG|5.007001||Viu DEBUG_TRIE_COMPILE_MORE_r|5.009002||Viu DEBUG_TRIE_COMPILE_r|5.009002||Viu DEBUG_TRIE_EXECUTE_MORE_r|5.009002||Viu DEBUG_TRIE_EXECUTE_r|5.009002||Viu DEBUG_TRIE_r|5.009002||Viu DEBUG_T_TEST|5.007001||Viu DEBUG_t_TEST|5.007001||Viu DEBUG_u|5.003007||Viu DEBUG_U|5.009005||Viu DEBUG_u_FLAG|5.007001||Viu DEBUG_U_FLAG|5.009005||Viu DEBUG_u_TEST|5.007001||Viu DEBUG_U_TEST|5.009005||Viu DEBUG_Uv|5.009005||Viu DEBUG_Uv_TEST|5.009005||Viu DEBUG_v|5.008001||Viu DEBUG_v_FLAG|5.008001||Viu DEBUG_v_TEST|5.008001||Viu DEBUG_X|5.003007||Viu DEBUG_x|5.003007||Viu DEBUG_X_FLAG|5.007001||Viu DEBUG_x_FLAG|5.007001||Viu DEBUG_X_TEST|5.007001||Viu DEBUG_x_TEST|5.007001||Viu DEBUG_Xv|5.008001||Viu DEBUG_Xv_TEST|5.008001||Viu DEBUG_y|5.031007||Viu DEBUG_y_FLAG|5.031007||Viu DEBUG_y_TEST|5.031007||Viu DEBUG_yv|5.031007||Viu DEBUG_yv_TEST|5.031007||Viu DEBUG_ZAPHOD32_HASH|5.027001||Viu DECLARATION_FOR_LC_NUMERIC_MANIPULATION|5.021010|5.021010|p DECLARE_AND_GET_RE_DEBUG_FLAGS|5.031011||Viu DECLARE_AND_GET_RE_DEBUG_FLAGS_NON_REGEX|5.031011||Viu DEFAULT_INC_EXCLUDES_DOT|5.025011|5.025011|Vn DEFAULT_PAT_MOD|5.013006||Viu defelem_target|5.019002||Viu DEFINE_INC_MACROS|5.027006||Viu DEFINEP|5.009005||Viu DEFINEP_t8_p8|5.033003||Viu DEFINEP_t8_pb|5.033003||Viu DEFINEP_tb_p8|5.033003||Viu DEFINEP_tb_pb|5.033003||Viu DEFSV|5.004005|5.003007|p DEFSV_set|5.010001|5.003007|p delete_eval_scope|5.009004||xViu delimcpy|5.004000|5.004000|n delimcpy_no_escape|5.025005||cVni DEL_NATIVE|5.017010||Viu del_sv|5.005000||Viu DEPENDS_PAT_MOD|5.013009||Viu DEPENDS_PAT_MODS|5.013009||Viu deprecate|5.011001||Viu deprecate_disappears_in|5.025009||Viu deprecate_fatal_in|5.025009||Viu despatch_signals|5.007001||cVu destroy_matcher|5.027008||Viu DETACH|5.005000||Viu dEXT|5.003007||Viu dEXTCONST|5.004000||Viu D_FMT|5.027010||Viu DIE|5.003007||Viu die|5.006000|5.003007|v die_nocontext|5.006000||vVn die_sv|5.013001|5.003007|p die_unwind|5.013001||Viu Direntry_t|5.003007|5.003007|Vn dirp_dup|5.013007|5.013007|u dITEMS|5.007002|5.003007|p div128|5.005000||Viu dJMPENV|5.004000||Viu djSP|5.004005||Vi dMARK|5.003007|5.003007| DM_ARRAY_ISA|5.013002||Viu DM_DELAY|5.003007||Viu DM_EGID|5.003007||Viu DM_EUID|5.003007||Viu DM_GID|5.003007||Viu DM_RGID|5.003007||Viu DM_RUID|5.003007||Viu DM_UID|5.003007||Viu dMULTICALL|5.009003|5.009003| dMY_CXT|5.009000|5.009000|p dMY_CXT_INTERP|5.009003||Viu dMY_CXT_SV|5.007003|5.003007|pV dNOOP|5.006000|5.003007|p do_aexec|5.009003||Viu do_aexec5|5.006000||Viu do_aspawn|5.008000||Vu do_binmode|5.004005|5.004005|du docatch|5.005000||Vi do_chomp|5.003007||Viu do_close|5.003007|5.003007|u do_delete_local|5.011000||Viu do_dump_pad|5.008001||Vi do_eof|5.003007||Viu does_utf8_overflow|5.025006||Vniu doeval_compile|5.023008||Viu do_exec3|5.006000||Viu do_exec|5.009003||Viu dofile|5.005003||Viu dofindlabel|5.003007||Viu doform|5.005000||Viu do_gv_dump|5.006000||cVu do_gvgv_dump|5.006000||cVu do_hv_dump|5.006000||cVu doing_taint|5.008001||cVnu DOINIT|5.003007||Viu do_ipcctl|5.003007||Viu do_ipcget|5.003007||Viu do_join|5.003007|5.003007|u do_magic_dump|5.006000||cVu do_msgrcv|5.003007||Viu do_msgsnd|5.003007||Viu do_ncmp|5.015001||Viu do_oddball|5.006000||Viu dooneliner|5.006000||Viu do_op_dump|5.006000||cVu do_open|5.003007|5.003007|u do_open6|5.019010||xViu do_open9|5.006000|5.006000|du do_openn|5.007001|5.007001|u doopen_pm|5.008001||Viu do_open_raw|5.019010||xViu doparseform|5.005000||Viu do_pmop_dump|5.006000||cVu dopoptoeval|5.003007||Viu dopoptogivenfor|5.027008||Viu dopoptolabel|5.005000||Viu dopoptoloop|5.005000||Viu dopoptosub_at|5.005000||Viu dopoptowhen|5.027008||Viu do_print|5.003007||Viu do_readline|5.003007||Viu doref|5.009003|5.009003|u dORIGMARK|5.003007|5.003007| do_seek|5.003007||Viu do_semop|5.003007||Viu do_shmio|5.003007||Viu DOSISH|5.003007||Viu do_smartmatch|5.027008||Viu do_spawn|5.008000||Vu do_spawn_nowait|5.008000||Vu do_sprintf|5.003007|5.003007|u do_sv_dump|5.006000||cVu do_sysseek|5.004000||Viu do_tell|5.003007||Viu do_trans|5.003007||Viu do_trans_complex|5.006001||Viu do_trans_count|5.006001||Viu do_trans_count_invmap|5.031006||Viu do_trans_invmap|5.031006||Viu do_trans_simple|5.006001||Viu DOUBLE_BIG_ENDIAN|5.021009||Viu DOUBLE_HAS_INF|5.025003|5.025003|Vn DOUBLE_HAS_NAN|5.025003|5.025003|Vn DOUBLE_HAS_NEGATIVE_ZERO|5.025007|5.025007|Vn DOUBLE_HAS_SUBNORMALS|5.025007|5.025007|Vn DOUBLEINFBYTES|5.023000|5.023000|Vn DOUBLE_IS_CRAY_SINGLE_64_BIT|5.025006|5.025006|Vn DOUBLE_IS_IBM_DOUBLE_64_BIT|5.025006|5.025006|Vn DOUBLE_IS_IBM_SINGLE_32_BIT|5.025006|5.025006|Vn DOUBLE_IS_IEEE_754_128_BIT_BIG_ENDIAN|5.021006|5.021006|Vn DOUBLE_IS_IEEE_754_128_BIT_LITTLE_ENDIAN|5.021006|5.021006|Vn DOUBLE_IS_IEEE_754_32_BIT_BIG_ENDIAN|5.021006|5.021006|Vn DOUBLE_IS_IEEE_754_32_BIT_LITTLE_ENDIAN|5.021006|5.021006|Vn DOUBLE_IS_IEEE_754_64_BIT_BIG_ENDIAN|5.021006|5.021006|Vn DOUBLE_IS_IEEE_754_64_BIT_LITTLE_ENDIAN|5.021006|5.021006|Vn DOUBLE_IS_IEEE_754_64_BIT_MIXED_ENDIAN_BE_LE|5.021006|5.021006|Vn DOUBLE_IS_IEEE_754_64_BIT_MIXED_ENDIAN_LE_BE|5.021006|5.021006|Vn DOUBLE_IS_IEEE_FORMAT|5.025003||Viu DOUBLE_IS_UNKNOWN_FORMAT|5.021006|5.021006|Vn DOUBLE_IS_VAX_D_FLOAT|5.025003|5.025003|Vn DOUBLE_IS_VAX_F_FLOAT|5.025003|5.025003|Vn DOUBLE_IS_VAX_FLOAT|5.025003||Viu DOUBLE_IS_VAX_G_FLOAT|5.025003|5.025003|Vn DOUBLEKIND|5.021006|5.021006|Vn DOUBLE_LITTLE_ENDIAN|5.021009||Viu DOUBLEMANTBITS|5.023000|5.023000|Vn DOUBLE_MIX_ENDIAN|5.021009||Viu DOUBLENANBYTES|5.023000|5.023000|Vn DOUBLESIZE|5.005000|5.005000|Vn DOUBLE_STYLE_IEEE|5.025007|5.025007|Vn DOUBLE_VAX_ENDIAN|5.025003||Viu do_uniprop_match|5.031011||cVniu dounwind|5.003007|5.003007|u DO_UTF8|5.006000|5.006000| do_vecget|5.006000||Viu do_vecset|5.003007||Viu do_vop|5.003007||Viu dowantarray|5.003007|5.003007|u dPOPiv|5.003007||Viu dPOPnv|5.003007||Viu dPOPnv_nomg|5.013002||Viu dPOPPOPiirl|5.003007||Viu dPOPPOPnnrl|5.003007||Viu dPOPPOPssrl|5.003007||Viu dPOPss|5.003007||Viu dPOPTOPiirl|5.003007||Viu dPOPTOPiirl_nomg|5.013002||Viu dPOPTOPiirl_ul_nomg|5.013002||Viu dPOPTOPnnrl|5.003007||Viu dPOPTOPnnrl_nomg|5.013002||Viu dPOPTOPssrl|5.003007||Viu dPOPuv|5.004000||Viu dPOPXiirl|5.004000||Viu dPOPXiirl_ul_nomg|5.013002||Viu dPOPXnnrl|5.004000||Viu dPOPXssrl|5.004000||Viu DPTR2FPTR|5.009003||Viu Drand01|5.006000|5.006000| drand48_init_r|||cniu drand48_r|||cniu DRAND48_R_PROTO|5.008000|5.008000|Vn dSAVEDERRNO|5.010001||Vi dSAVE_ERRNO|5.010001||Vi dSP|5.003007|5.003007| dSS_ADD|5.017007||Viu dTARG|5.003007||Viu dTARGET|5.003007|5.003007| dTARGETSTACKED|5.003007||Viu D_T_FMT|5.027010||Viu dTHR|5.004005|5.003007|p dTHX|5.003007|5.003007|p dTHXa|5.006000|5.003007|p dTHX_DEBUGGING|5.027009||Viu dTHXo|5.006000||Viu dTHXoa|5.006001|5.003007|p dTHXR||5.003007|ponu dTHXs|5.007002||Viu dTHXx|5.006000||Viu dTOPiv|5.003007||Viu dTOPnv|5.003007||Viu dTOPss|5.003007||Viu dTOPuv|5.004000||Viu dtrace_probe_call|||ciu dtrace_probe_load|||ciu dtrace_probe_op|||ciu dtrace_probe_phase|||ciu dump_all|5.006000|5.006000| dump_all_perl|5.011000||Viu dump_c_backtrace|5.021001||V dump_eval|5.006000|5.006000|u dump_exec_pos|5.009004||Viu dump_form|5.006000|5.006000|u dump_indent|5.006000||vcVu dump_mstats|5.003007||Vu dump_packsubs|5.006000|5.006000| dump_packsubs_perl|5.011000||Viu dump_regex_sets_structures|5.025006||Viu dump_sub|5.006000|5.006000|u dump_sub_perl|5.011000||Viu dump_sv_child|5.009003||Viu dump_trie|5.009004||Viu dump_trie_interim_list|5.009004||Viu dump_trie_interim_table|5.009004||Viu dumpuntil|5.005000||Viu dump_vindent|5.006000||cVu dUNDERBAR|5.009002|5.003007|p dup2|5.005000||Viu dup|5.005000||Viu dup_attrlist|5.006000||Viu DUP_WARNINGS|5.009004||Viu dup_warnings|||ciu dVAR|5.009003|5.003007|p dXCPT|5.009002|5.003007|p dXSARGS|5.003007|5.003007| dXSBOOTARGSAPIVERCHK|5.021006||Viu dXSBOOTARGSNOVERCHK|5.021006||Viu dXSBOOTARGSXSAPIVERCHK|5.021006||Viu dXSFUNCTION|5.005000||Viu dXSI32|5.003007|5.003007|V dXSTARG|5.006000|5.003007|poVnu dXSUB_SYS|5.003007||Viu edit_distance|5.023008||Vniu EIGHT_BIT_UTF8_TO_NATIVE|5.023003||Viu ELEMENT_RANGE_MATCHES_INVLIST|5.023002||Viu EMBEDMYMALLOC|5.006000||Viu emulate_cop_io|||xciu emulate_setlocale|5.027009||Vniu END|5.003007||Viu END_EXTERN_C|5.005000|5.003007|pV endgrent|5.009000||Viu ENDGRENT_R_HAS_FPTR|5.008000||Viu ENDGRENT_R_PROTO|5.008000|5.008000|Vn endhostent|5.005000||Viu ENDHOSTENT_R_PROTO|5.008000|5.008000|Vn ENDLIKE|5.009005||Viu ENDLIKE_t8_p8|5.033003||Viu ENDLIKE_t8_pb|5.033003||Viu ENDLIKE_tb_p8|5.033003||Viu ENDLIKE_tb_pb|5.033003||Viu endnetent|5.005000||Viu ENDNETENT_R_PROTO|5.008000|5.008000|Vn endprotoent|5.005000||Viu ENDPROTOENT_R_PROTO|5.008000|5.008000|Vn endpwent|5.009000||Viu ENDPWENT_R_HAS_FPTR|5.008000||Viu ENDPWENT_R_PROTO|5.008000|5.008000|Vn endservent|5.005000||Viu ENDSERVENT_R_PROTO|5.008000|5.008000|Vn END_t8_p8|5.033003||Viu END_t8_pb|5.033003||Viu END_tb_p8|5.033003||Viu END_tb_pb|5.033003||Viu ENTER|5.003007|5.003007| ENTER_with_name|5.011002|5.011002| ENV_INIT|5.031011||Viu environ|5.003007||Viu ENV_LOCALE_LOCK|5.031011||Viu ENV_LOCALE_READ_LOCK|5.031011||Viu ENV_LOCALE_READ_UNLOCK|5.031011||Viu ENV_LOCALE_UNLOCK|5.031011||Viu ENV_LOCK|5.031011||Viu ENV_READ_LOCK|5.033005||Viu ENV_READ_UNLOCK|5.033005||Viu ENV_TERM|5.031011||Viu ENV_UNLOCK|5.031011||Viu EOF|5.003007||Viu EOF_NONBLOCK|5.003007|5.003007|Vn EOL|5.003007||Viu EOL_t8_p8|5.033003||Viu EOL_t8_pb|5.033003||Viu EOL_tb_p8|5.033003||Viu EOL_tb_pb|5.033003||Viu EOS|5.005000||Viu EOS_t8_p8|5.033003||Viu EOS_t8_pb|5.033003||Viu EOS_tb_p8|5.033003||Viu EOS_tb_pb|5.033003||Viu ERA|5.027010||Viu ERA_D_FMT|5.027010||Viu ERA_D_T_FMT|5.027010||Viu ERA_T_FMT|5.027010||Viu ERRSV|5.004005|5.003007|p ESC_NATIVE|5.021004||Viu EVAL|5.005000||Viu EVAL_B|5.025010||Viu EVAL_B_fail|5.025010||Viu EVAL_B_fail_t8_p8|5.033003||Viu EVAL_B_fail_t8_pb|5.033003||Viu EVAL_B_fail_tb_p8|5.033003||Viu EVAL_B_fail_tb_pb|5.033003||Viu EVAL_B_t8_p8|5.033003||Viu EVAL_B_t8_pb|5.033003||Viu EVAL_B_tb_p8|5.033003||Viu EVAL_B_tb_pb|5.033003||Viu EVAL_INEVAL|5.006000||Viu EVAL_INREQUIRE|5.007001||Viu EVAL_KEEPERR|5.006000||Viu EVAL_NULL|5.006000||Viu EVAL_postponed_AB|5.025010||Viu EVAL_postponed_AB_fail|5.025010||Viu EVAL_postponed_AB_fail_t8_p8|5.033003||Viu EVAL_postponed_AB_fail_t8_pb|5.033003||Viu EVAL_postponed_AB_fail_tb_p8|5.033003||Viu EVAL_postponed_AB_fail_tb_pb|5.033003||Viu EVAL_postponed_AB_t8_p8|5.033003||Viu EVAL_postponed_AB_t8_pb|5.033003||Viu EVAL_postponed_AB_tb_p8|5.033003||Viu EVAL_postponed_AB_tb_pb|5.033003||Viu eval_pv|5.006000|5.003007|p EVAL_RE_REPARSING|5.017011||Viu eval_sv|5.006000|5.003007|p EVAL_t8_p8|5.033003||Viu EVAL_t8_pb|5.033003||Viu EVAL_tb_p8|5.033003||Viu EVAL_tb_pb|5.033003||Viu EVAL_WARNONLY|5.006000||Viu EXACT|5.004000||Viu EXACTF|5.004000||Viu EXACTFAA|5.027009||Viu EXACTFAA_NO_TRIE|5.027009||Viu EXACTFAA_NO_TRIE_t8_p8|5.033003||Viu EXACTFAA_NO_TRIE_t8_pb|5.033003||Viu EXACTFAA_NO_TRIE_tb_p8|5.033003||Viu EXACTFAA_NO_TRIE_tb_pb|5.033003||Viu EXACTFAA_t8_p8|5.033003||Viu EXACTFAA_t8_pb|5.033003||Viu EXACTFAA_tb_p8|5.033003||Viu EXACTFAA_tb_pb|5.033003||Viu EXACTFL|5.004000||Viu EXACTFL_t8_p8|5.033003||Viu EXACTFL_t8_pb|5.033003||Viu EXACTFL_tb_p8|5.033003||Viu EXACTFL_tb_pb|5.033003||Viu EXACTFLU8|5.021008||Viu EXACTFLU8_t8_p8|5.033003||Viu EXACTFLU8_t8_pb|5.033003||Viu EXACTFLU8_tb_p8|5.033003||Viu EXACTFLU8_tb_pb|5.033003||Viu EXACTF_t8_p8|5.033003||Viu EXACTF_t8_pb|5.033003||Viu EXACTF_tb_p8|5.033003||Viu EXACTF_tb_pb|5.033003||Viu EXACTFU|5.013008||Viu EXACTFUP|5.029007||Viu EXACTFUP_t8_p8|5.033003||Viu EXACTFUP_t8_pb|5.033003||Viu EXACTFUP_tb_p8|5.033003||Viu EXACTFUP_tb_pb|5.033003||Viu EXACTFU_REQ8|5.031006||Viu EXACTFU_REQ8_t8_p8|5.033003||Viu EXACTFU_REQ8_t8_pb|5.033003||Viu EXACTFU_REQ8_tb_p8|5.033003||Viu EXACTFU_REQ8_tb_pb|5.033003||Viu EXACTFU_S_EDGE|5.029007||Viu EXACTFU_S_EDGE_t8_p8|5.033003||Viu EXACTFU_S_EDGE_t8_pb|5.033003||Viu EXACTFU_S_EDGE_tb_p8|5.033003||Viu EXACTFU_S_EDGE_tb_pb|5.033003||Viu EXACTFU_t8_p8|5.033003||Viu EXACTFU_t8_pb|5.033003||Viu EXACTFU_tb_p8|5.033003||Viu EXACTFU_tb_pb|5.033003||Viu EXACTL|5.021008||Viu EXACTL_t8_p8|5.033003||Viu EXACTL_t8_pb|5.033003||Viu EXACTL_tb_p8|5.033003||Viu EXACTL_tb_pb|5.033003||Viu EXACT_REQ8|5.031006||Viu EXACT_REQ8_t8_p8|5.033003||Viu EXACT_REQ8_t8_pb|5.033003||Viu EXACT_REQ8_tb_p8|5.033003||Viu EXACT_REQ8_tb_pb|5.033003||Viu EXACT_t8_p8|5.033003||Viu EXACT_t8_pb|5.033003||Viu EXACT_tb_p8|5.033003||Viu EXACT_tb_pb|5.033003||Viu EXEC_ARGV_CAST|5.007001||Viu exec_failed|5.009004||Viu execl|5.005000||Viu EXEC_PAT_MOD|5.009005||Viu EXEC_PAT_MODS|5.009005||Viu execute_wildcard|5.031010||Viu execv|5.005000||Viu execvp|5.005000||Viu exit|5.005000||Viu EXPECT|5.009004||Viu expect_number|5.007001||Viu EXT|5.003007||Viu EXTCONST|5.004000||Viu EXTEND|5.003007|5.003007| EXTEND_HWM_SET|5.027002||Viu EXTEND_MORTAL|5.004000||Viu EXTEND_SKIP|5.027002||Viu EXTERN_C|5.005000|5.003007|pV EXT_MGVTBL|5.009004||Viu EXT_PAT_MODS|5.009005||Viu EXTRA_SIZE|5.005000||Viu EXTRA_STEP_2ARGS|5.005000||Viu F0convert|5.009003||Vniu FAKE_BIT_BUCKET|5.009005||Viu FAKE_DEFAULT_SIGNAL_HANDLERS|5.009003||Viu FAKE_PERSISTENT_SIGNAL_HANDLERS|5.009003||Viu FALSE|5.003007||Viu FATAL_ABOVE_FF_MSG|5.027010||Viu F_atan2_amg|5.004000||Viu FBMcf_TAIL|5.006000||Viu FBMcf_TAIL_DOLLAR|5.006000||Viu FBMcf_TAIL_DOLLARM|5.006000||Viu FBMcf_TAIL_Z|5.006000||Viu FBMcf_TAIL_z|5.006000||Viu fbm_compile|5.005000|5.005000| fbm_instr|5.005000|5.005000| FBMrf_MULTILINE|5.006000||Viu fclose|5.003007||Viu fcntl|5.006000||Viu FCNTL_CAN_LOCK|5.007001|5.007001|Vn F_cos_amg|5.004000||Viu FD_CLR|5.008000||Viu FD_ISSET|5.008000||Viu fdopen|5.003007||Viu FD_SET|5.008000||Viu fd_set|5.008000||Viu FD_ZERO|5.008000||Viu FEATURE_BAREWORD_FILEHANDLES_BIT|5.033006||Viu FEATURE_BAREWORD_FILEHANDLES_IS_ENABLED|5.033006||Viu FEATURE_BITWISE_BIT|5.031006||Viu FEATURE_BITWISE_IS_ENABLED|5.021009||Viu FEATURE_BUNDLE_510|5.015007||Viu FEATURE_BUNDLE_511|5.015007||Viu FEATURE_BUNDLE_515|5.015007||Viu FEATURE_BUNDLE_523|5.023001||Viu FEATURE_BUNDLE_527|5.027008||Viu FEATURE_BUNDLE_CUSTOM|5.015007||Viu FEATURE_BUNDLE_DEFAULT|5.015007||Viu FEATURE_EVALBYTES_BIT|5.031006||Viu FEATURE_EVALBYTES_IS_ENABLED|5.015007||Viu FEATURE_FC_BIT|5.031006||Viu FEATURE_FC_IS_ENABLED|5.015008||Viu FEATURE_INDIRECT_BIT|5.031010||Viu FEATURE_INDIRECT_IS_ENABLED|5.031010||Viu FEATURE_ISA_BIT|5.031007||Viu FEATURE_ISA_IS_ENABLED|5.031007||Viu FEATURE_IS_ENABLED_MASK|5.031006||Viu FEATURE_MULTIDIMENSIONAL_BIT|5.033001||Viu FEATURE_MULTIDIMENSIONAL_IS_ENABLED|5.033001||Viu FEATURE_MYREF_BIT|5.031006||Viu FEATURE_MYREF_IS_ENABLED|5.025003||Viu FEATURE_POSTDEREF_QQ_BIT|5.031006||Viu FEATURE_POSTDEREF_QQ_IS_ENABLED|5.019005||Viu FEATURE_REFALIASING_BIT|5.031006||Viu FEATURE_REFALIASING_IS_ENABLED|5.021005||Viu FEATURE_SAY_BIT|5.031006||Viu FEATURE_SAY_IS_ENABLED|5.015007||Viu FEATURE_SIGNATURES_BIT|5.031006||Viu FEATURE_SIGNATURES_IS_ENABLED|5.019009||Viu FEATURE_STATE_BIT|5.031006||Viu FEATURE_STATE_IS_ENABLED|5.015007||Viu FEATURE___SUB___BIT|5.031006||Viu FEATURE___SUB___IS_ENABLED|5.015007||Viu FEATURE_SWITCH_BIT|5.031006||Viu FEATURE_SWITCH_IS_ENABLED|5.015007||Viu FEATURE_TRY_BIT|5.033007||Viu FEATURE_TRY_IS_ENABLED|5.033007||Viu FEATURE_UNICODE_BIT|5.031006||Viu FEATURE_UNICODE_IS_ENABLED|5.015007||Viu FEATURE_UNIEVAL_BIT|5.031006||Viu FEATURE_UNIEVAL_IS_ENABLED|5.015007||Viu feof|5.003007||Viu ferror|5.003007||Viu FETCHFEATUREBITSHH|5.031006||Viu F_exp_amg|5.004000||Viu FF_0DECIMAL|5.007001||Viu FF_BLANK|5.003007||Viu FF_CHECKCHOP|5.003007||Viu FF_CHECKNL|5.003007||Viu FF_CHOP|5.003007||Viu FF_DECIMAL|5.003007||Viu FF_END|5.003007||Viu FF_FETCH|5.003007||Viu FF_HALFSPACE|5.003007||Viu FF_ITEM|5.003007||Viu FF_LINEGLOB|5.003007||Viu FF_LINEMARK|5.003007||Viu FF_LINESNGL|5.009001||Viu FF_LITERAL|5.003007||Viu Fflush|5.003007||Viu fflush|5.003007||Viu FFLUSH_NULL|5.006000|5.006000|Vn FF_MORE|5.003007||Viu FF_NEWLINE|5.003007||Viu FF_SKIP|5.003007||Viu FF_SPACE|5.003007||Viu fgetc|5.003007||Viu fgetpos|5.003007||Viu fgets|5.003007||Viu FILE|5.003007||Viu FILE_base|5.007000|5.007000| FILE_bufsiz|5.007000|5.007000| FILE_cnt|5.007000|5.007000| fileno|5.003007||Viu FILE_ptr|5.007000|5.007000| FILL_ADVANCE_NODE_2L_ARG|5.021005||Viu FILL_ADVANCE_NODE|5.005000||Viu FILL_ADVANCE_NODE_ARG|5.005000||Viu FILL_ADVANCE_NODE_ARGp|5.031010||Viu FILL_NODE|5.029004||Viu filter_add|5.003007|5.003007| FILTER_DATA|5.003007||Viu filter_del|5.003007|5.003007|u filter_gets|5.005000||Viu FILTER_ISREADER|5.003007||Viu filter_read|5.003007|5.003007| FILTER_READ|5.003007||Viu finalize_op|5.015002||Viu finalize_optree|5.015002||Vi find_and_forget_pmops|5.009005||Viu find_array_subscript|5.009004||Viu find_beginning|5.005000||Viu find_byclass|5.006000||Viu find_default_stash|5.019004||Viu find_first_differing_byte_pos|5.031007||Vniu find_hash_subscript|5.009004||Viu find_in_my_stash|5.006001||Viu find_lexical_cv|5.019001||Viu find_next_masked|5.027009||Vniu find_runcv|5.008001|5.008001| FIND_RUNCV_level_eq|5.017002||Viu FIND_RUNCV_padid_eq|5.017004||Viu find_runcv_where|5.017002||Viu find_rundefsv|5.013002|5.013002| find_rundefsvoffset|5.009002|5.009002|d find_script|5.004005||Viu find_span_end|5.027009||Vniu find_span_end_mask|5.027009||Vniu find_uninit_var|5.009002||xVi FIRST_NON_ASCII_DECIMAL_DIGIT|5.027007||Viu first_symbol|5.009003||Vniu FITS_IN_8_BITS|5.013005||Viu fixup_errno_string|5.019007||Viu FLAGS|5.013006||Viu FLEXFILENAMES|5.003007|5.003007|Vn float_end_shift|5.009005||Viu float_max_offset|5.005000||Viu float_min_offset|5.005000||Viu float_substr|5.005000||Viu float_utf8|5.008000||Viu flock|5.005000||Viu flockfile|5.003007||Viu F_log_amg|5.004000||Viu FmLINES|5.003007||Viu fold_constants|5.003007||Viu foldEQ|5.013002|5.013002|n foldEQ_latin1|5.013008||cVnu foldEQ_latin1_s2_folded|5.029007||Vniu foldEQ_locale|5.013002|5.013002|n FOLDEQ_LOCALE|5.019009||cV FOLDEQ_S1_ALREADY_FOLDED|5.015004||cV FOLDEQ_S1_FOLDS_SANE|5.021008||cV FOLDEQ_S2_ALREADY_FOLDED|5.015004||cV FOLDEQ_S2_FOLDS_SANE|5.021008||cV foldEQ_utf8|5.013002|5.007003|p foldEQ_utf8_flags|5.013010||cVu FOLDEQ_UTF8_NOMIX_ASCII|5.013010||cV FOLD_FLAGS_FULL|5.015006||Viu FOLD_FLAGS_LOCALE|5.015006||Viu FOLD_FLAGS_NOMIX_ASCII|5.017000||Viu fopen|5.003007||Viu forbid_setid|5.005000||Viu force_ident|5.003007||Viu force_ident_maybe_lex|5.017004||Viu force_list|5.003007||Viu force_next|5.003007||Viu _force_out_malformed_utf8_message|5.025009||cVu force_strict_version|5.011004||Viu force_version|5.005000||Viu force_word|5.003007||Viu forget_pmop|5.017007||Viu form|5.006000|5.004000|v form_alien_digit_msg|5.031009||cViu form_cp_too_large_msg|5.031009||cViu form_nocontext|5.006000||vVn fp_dup|5.007003|5.007003|u Fpos_t|5.003007|5.003007|Vn F_pow_amg|5.004000||Viu FP_PINF|5.021004||Viu FP_QNAN|5.021004||Viu fprintf|5.003007||Viu fprintf_nocontext|5.006000||vdVnu FPTR2DPTR|5.009003||Viu fputc|5.003007||Viu fputs|5.003007||Viu fread|5.003007||Viu free|5.003007||Viu free_and_set_cop_warnings|5.031011||Viu free_c_backtrace|5.021001||Vi FreeOp|5.008001||Viu Free_t|5.003007|5.003007|Vn FREE_THREAD_KEY|5.006001||Viu free_tied_hv_pool|5.008001||Viu FREETMPS|5.003007|5.003007| free_tmps|5.003007||cVu freopen|5.003007||Viu frewind|5.005000||Viu FROM_INTERNAL_SIZE|5.023002||Viu fscanf|5.003007||Viu fseek|5.003007||Viu FSEEKSIZE|5.006000||Viu fsetpos|5.003007||Viu F_sin_amg|5.004000||Viu F_sqrt_amg|5.004000||Viu Fstat|5.003007||Viu fstat|5.005000||Viu ftell|5.003007||Viu ftruncate|5.006000||Viu ftrylockfile|5.003007||Viu FUNCTION|5.009003||Viu funlockfile|5.003007||Viu fwrite1|5.003007||Viu fwrite|5.003007||Viu G_ARRAY|5.003007||Viu GCB_BREAKABLE|5.025003||Viu GCB_EX_then_EM|5.025003||Viu GCB_Maybe_Emoji_NonBreak|5.029002||Viu GCB_NOBREAK|5.025003||Viu GCB_RI_then_RI|5.025003||Viu GCC_DIAG_IGNORE|5.019007||Viu GCC_DIAG_IGNORE_DECL|5.027007||Viu GCC_DIAG_IGNORE_STMT|5.027007||Viu GCC_DIAG_PRAGMA|5.021001||Viu GCC_DIAG_RESTORE|5.019007||Viu GCC_DIAG_RESTORE_DECL|5.027007||Viu GCC_DIAG_RESTORE_STMT|5.027007||Viu Gconvert|5.003007|5.003007| GDBMNDBM_H_USES_PROTOTYPES|5.032001|5.032001|Vn G_DISCARD|5.003007|5.003007| gen_constant_list|5.003007||Viu get_and_check_backslash_N_name|5.017006||cViu get_and_check_backslash_N_name_wrapper|5.029009||Viu get_ANYOF_cp_list_for_ssc|5.019005||Viu get_ANYOFM_contents|5.027009||Viu GETATARGET|5.003007||Viu get_aux_mg|5.011000||Viu get_av|5.006000|5.003007|p getc|5.003007||Viu get_c_backtrace|5.021001||Vi get_c_backtrace_dump|5.021001||V get_context|5.006000|5.006000|nu getc_unlocked|5.003007||Viu get_cv|5.006000|5.003007|p get_cvn_flags|5.009005|5.003007|p get_cvs|5.011000|5.003007|p getcwd_sv|5.007002|5.007002| get_db_sub|||iu get_debug_opts|5.008001||Viu get_deprecated_property_msg|5.031011||cVniu getegid|5.005000||Viu getenv|5.005000||Viu getenv_len|5.006000||Viu GETENV_LOCK|5.033005||Viu GETENV_PRESERVES_OTHER_THREAD|5.033005|5.033005|Vn GETENV_UNLOCK|5.033005||Viu geteuid|5.005000||Viu getgid|5.005000||Viu getgrent|5.009000||Viu GETGRENT_R_HAS_BUFFER|5.008000||Viu GETGRENT_R_HAS_FPTR|5.008000||Viu GETGRENT_R_HAS_PTR|5.008000||Viu GETGRENT_R_PROTO|5.008000|5.008000|Vn getgrgid|5.009000||Viu GETGRGID_R_HAS_BUFFER|5.008000||Viu GETGRGID_R_HAS_PTR|5.008000||Viu GETGRGID_R_PROTO|5.008000|5.008000|Vn getgrnam|5.009000||Viu GETGRNAM_R_HAS_BUFFER|5.008000||Viu GETGRNAM_R_HAS_PTR|5.008000||Viu GETGRNAM_R_PROTO|5.008000|5.008000|Vn get_hash_seed|5.008001||Viu gethostbyaddr|5.005000||Viu GETHOSTBYADDR_R_HAS_BUFFER|5.008000||Viu GETHOSTBYADDR_R_HAS_ERRNO|5.008000||Viu GETHOSTBYADDR_R_HAS_PTR|5.008000||Viu GETHOSTBYADDR_R_PROTO|5.008000|5.008000|Vn gethostbyname|5.005000||Viu GETHOSTBYNAME_R_HAS_BUFFER|5.008000||Viu GETHOSTBYNAME_R_HAS_ERRNO|5.008000||Viu GETHOSTBYNAME_R_HAS_PTR|5.008000||Viu GETHOSTBYNAME_R_PROTO|5.008000|5.008000|Vn gethostent|5.005000||Viu GETHOSTENT_R_HAS_BUFFER|5.008000||Viu GETHOSTENT_R_HAS_ERRNO|5.008000||Viu GETHOSTENT_R_HAS_PTR|5.008000||Viu GETHOSTENT_R_PROTO|5.008000|5.008000|Vn gethostname|5.005000||Viu get_hv|5.006000|5.003007|p get_invlist_iter_addr|5.015001||Vniu get_invlist_offset_addr|5.019002||Vniu get_invlist_previous_index_addr|5.017004||Vniu getlogin|5.005000||Viu GETLOGIN_R_PROTO|5.008000|5.008000|Vn get_mstats|5.006000||Vu getnetbyaddr|5.005000||Viu GETNETBYADDR_R_HAS_BUFFER|5.008000||Viu GETNETBYADDR_R_HAS_ERRNO|5.008000||Viu GETNETBYADDR_R_HAS_PTR|5.008000||Viu GETNETBYADDR_R_PROTO|5.008000|5.008000|Vn getnetbyname|5.005000||Viu GETNETBYNAME_R_HAS_BUFFER|5.008000||Viu GETNETBYNAME_R_HAS_ERRNO|5.008000||Viu GETNETBYNAME_R_HAS_PTR|5.008000||Viu GETNETBYNAME_R_PROTO|5.008000|5.008000|Vn getnetent|5.005000||Viu GETNETENT_R_HAS_BUFFER|5.008000||Viu GETNETENT_R_HAS_ERRNO|5.008000||Viu GETNETENT_R_HAS_PTR|5.008000||Viu GETNETENT_R_PROTO|5.008000|5.008000|Vn get_no_modify|5.005000||Viu get_num|5.008001||Viu get_opargs|5.005000||Viu get_op_descs|5.005000|5.005000|u get_op_names|5.005000|5.005000|u getpeername|5.005000||Viu getpid|5.006000||Viu get_ppaddr|5.006000|5.006000|u get_prop_definition|5.031011||cViu get_prop_values|5.031011||cVniu getprotobyname|5.005000||Viu GETPROTOBYNAME_R_HAS_BUFFER|5.008000||Viu GETPROTOBYNAME_R_HAS_PTR|5.008000||Viu GETPROTOBYNAME_R_PROTO|5.008000|5.008000|Vn getprotobynumber|5.005000||Viu GETPROTOBYNUMBER_R_HAS_BUFFER|5.008000||Viu GETPROTOBYNUMBER_R_HAS_PTR|5.008000||Viu GETPROTOBYNUMBER_R_PROTO|5.008000|5.008000|Vn getprotoent|5.005000||Viu GETPROTOENT_R_HAS_BUFFER|5.008000||Viu GETPROTOENT_R_HAS_PTR|5.008000||Viu GETPROTOENT_R_PROTO|5.008000|5.008000|Vn getpwent|5.009000||Viu GETPWENT_R_HAS_BUFFER|5.008000||Viu GETPWENT_R_HAS_FPTR|5.008000||Viu GETPWENT_R_HAS_PTR|5.008000||Viu GETPWENT_R_PROTO|5.008000|5.008000|Vn getpwnam|5.009000||Viu GETPWNAM_R_HAS_BUFFER|5.008000||Viu GETPWNAM_R_HAS_PTR|5.008000||Viu GETPWNAM_R_PROTO|5.008000|5.008000|Vn getpwuid|5.009000||Viu GETPWUID_R_HAS_PTR|5.008000||Viu GETPWUID_R_PROTO|5.008000|5.008000|Vn get_quantifier_value|5.033006||Viu get_re_arg|||xciu get_re_gclass_nonbitmap_data|5.031011||Viu get_regclass_nonbitmap_data|5.031011||Viu get_regex_charset_name|5.031004||Vniu getservbyname|5.005000||Viu GETSERVBYNAME_R_HAS_BUFFER|5.008000||Viu GETSERVBYNAME_R_HAS_PTR|5.008000||Viu GETSERVBYNAME_R_PROTO|5.008000|5.008000|Vn getservbyport|5.005000||Viu GETSERVBYPORT_R_HAS_BUFFER|5.008000||Viu GETSERVBYPORT_R_HAS_PTR|5.008000||Viu GETSERVBYPORT_R_PROTO|5.008000|5.008000|Vn getservent|5.005000||Viu GETSERVENT_R_HAS_BUFFER|5.008000||Viu GETSERVENT_R_HAS_PTR|5.008000||Viu GETSERVENT_R_PROTO|5.008000|5.008000|Vn getsockname|5.005000||Viu getsockopt|5.005000||Viu getspnam|5.009000||Viu GETSPNAM_R_HAS_BUFFER|5.031011||Viu GETSPNAM_R_HAS_PTR|5.008000||Viu GETSPNAM_R_PROTO|5.008000|5.008000|Vn get_sv|5.006000|5.003007|p GETTARGET|5.003007||Viu GETTARGETSTACKED|5.003007||Viu gettimeofday|5.008000||Viu getuid|5.005000||Viu get_vtbl|5.005003|5.005003|u getw|5.003007||Viu G_EVAL|5.003007|5.003007| G_FAKINGEVAL|5.009004||Viu Gid_t|5.003007|5.003007|Vn Gid_t_f|5.006000|5.006000|Vn Gid_t_sign|5.006000|5.006000|Vn Gid_t_size|5.006000|5.006000|Vn GIMME|5.003007|5.003007|d GIMME_V|5.004000|5.004000| gimme_V|5.031005||xcVu G_KEEPERR|5.003007|5.003007| G_LIST|5.035001|5.003007| glob_2number|5.009004||Viu GLOBAL_PAT_MOD|5.009005||Viu glob_assign_glob|5.009004||Viu G_METHOD|5.006001|5.003007|p G_METHOD_NAMED|5.019002|5.019002| gmtime|5.031011||Viu GMTIME_MAX|5.010001|5.010001|Vn GMTIME_MIN|5.010001|5.010001|Vn GMTIME_R_PROTO|5.008000|5.008000|Vn G_NOARGS|5.003007|5.003007| G_NODEBUG|5.004005||Viu GOSUB|5.009005||Viu GOSUB_t8_p8|5.033003||Viu GOSUB_t8_pb|5.033003||Viu GOSUB_tb_p8|5.033003||Viu GOSUB_tb_pb|5.033003||Viu gp_dup|5.007003|5.007003|u gp_free|5.003007|5.003007|u GPOS|5.004000||Viu GPOS_t8_p8|5.033003||Viu GPOS_t8_pb|5.033003||Viu GPOS_tb_p8|5.033003||Viu GPOS_tb_pb|5.033003||Viu gp_ref|5.003007|5.003007|u GREEK_CAPITAL_LETTER_MU|5.013011||Viu GREEK_SMALL_LETTER_MU|5.013008||Viu G_RE_REPARSING|5.017011||Viu G_RETHROW|5.031002|5.003007|p grok_atoUV|5.021010||cVni grok_bin|5.007003|5.003007|p grok_bin_oct_hex|5.031008||cVu grok_bslash_c|5.013001||cViu grok_bslash_N|5.017003||Viu grok_bslash_o|5.013003||cViu grok_bslash_x|5.017002||cViu grok_hex|5.007003|5.003007|p grok_infnan|5.021004|5.021004| grok_number|5.007002|5.003007|p grok_number_flags|5.021002|5.021002| GROK_NUMERIC_RADIX|5.007002|5.003007|p grok_numeric_radix|5.007002|5.003007|p grok_oct|5.007003|5.003007|p group_end|5.007003||Viu GROUPP|5.005000||Viu GROUPPN|5.031001||Viu GROUPPN_t8_p8|5.033003||Viu GROUPPN_t8_pb|5.033003||Viu GROUPPN_tb_p8|5.033003||Viu GROUPPN_tb_pb|5.033003||Viu GROUPP_t8_p8|5.033003||Viu GROUPP_t8_pb|5.033003||Viu GROUPP_tb_p8|5.033003||Viu GROUPP_tb_pb|5.033003||Viu Groups_t|5.003007|5.003007|Vn GRPASSWD|5.005000|5.005000|Vn G_SCALAR|5.003007|5.003007| G_UNDEF_FILL|5.013001||Viu GV_ADD|5.003007|5.003007| gv_add_by_type|5.011000|5.011000|u GV_ADDMG|5.015003|5.015003| GV_ADDMULTI|5.003007|5.003007| GV_ADDWARN|5.003007|5.003007| Gv_AMG|5.003007||Viu Gv_AMupdate|5.011000|5.011000|u GvASSUMECV|5.003007||Viu GvASSUMECV_off|5.003007||Viu GvASSUMECV_on|5.003007||Viu gv_autoload4|5.004000|5.004000| GV_AUTOLOAD|5.011000||Viu GV_AUTOLOAD_ISMETHOD|5.015004||Viu gv_autoload_pv|5.015004|5.015004|u gv_autoload_pvn|5.015004|5.015004|u gv_autoload_sv|5.015004|5.015004|u GvAV|5.003007|5.003007| gv_AVadd|5.003007|5.003007|u GvAVn|5.003007||Viu GV_CACHE_ONLY|5.021004||Vi gv_check|5.003007||cVu gv_const_sv|5.009003|5.009003| GV_CROAK|5.011000||Viu GvCV|5.003007|5.003007| GvCVGEN|5.003007||Viu GvCV_set|5.013010||Viu GvCVu|5.004000||Viu gv_dump|5.006000|5.006000|u gv_efullname3|5.003007|5.003007|u gv_efullname4|5.006001|5.006001|u gv_efullname|5.003007|5.003007|du GvEGV|5.003007||Viu GvEGVx|5.013000||Viu GvENAME|5.003007||Viu GvENAME_HEK|5.015004||Viu GvENAMELEN|5.015004||Viu GvENAMEUTF8|5.015004||Viu GvESTASH|5.003007||Viu GVf_ASSUMECV|5.003007||Viu gv_fetchfile|5.003007|5.003007| gv_fetchfile_flags|5.009005|5.009005| gv_fetchmeth|5.003007|5.003007| gv_fetchmeth_autoload|5.007003|5.007003| gv_fetchmeth_internal|5.021007||Viu gv_fetchmethod|5.003007|5.003007| gv_fetchmethod_autoload|5.004000|5.004000| gv_fetchmethod_flags|5.015004||Viu gv_fetchmethod_pv_flags|5.015004|5.015004|xu gv_fetchmethod_pvn_flags|5.015004|5.015004|xu gv_fetchmethod_sv_flags|5.015004|5.015004|xu gv_fetchmeth_pv|5.015004|5.015004| gv_fetchmeth_pv_autoload|5.015004|5.015004| gv_fetchmeth_pvn|5.015004|5.015004| gv_fetchmeth_pvn_autoload|5.015004|5.015004| gv_fetchmeth_sv|5.015004|5.015004| gv_fetchmeth_sv_autoload|5.015004|5.015004| gv_fetchpv|5.003007|5.003007| gv_fetchpvn|5.013006|5.013006| gv_fetchpvn_flags|5.009002|5.003007|p gv_fetchpvs|5.009004|5.003007|p gv_fetchsv|5.009002|5.003007|p gv_fetchsv_nomg|5.015003|5.015003| GvFILE|5.006000||Viu GvFILEGV|5.003007||Viu GvFILE_HEK|5.009004||Viu GvFILEx|5.019006||Viu GVf_IMPORTED|5.003007||Viu GVf_IMPORTED_AV|5.003007||Viu GVf_IMPORTED_CV|5.003007||Viu GVf_IMPORTED_HV|5.003007||Viu GVf_IMPORTED_SV|5.003007||Viu GVf_INTRO|5.003007||Viu GvFLAGS|5.003007||Viu GVf_MULTI|5.003007||Viu GvFORM|5.003007||Viu gv_fullname3|5.003007|5.003007|u gv_fullname4|5.006001|5.006001|u gv_fullname|5.003007|5.003007|du GvGP|5.003007||Viu GvGPFLAGS|5.021004||Viu GvGP_set|5.013010||Viu gv_handler|5.007001|5.007001|u GvHV|5.003007|5.003007| gv_HVadd|5.003007|5.003007|u GvHVn|5.003007||Viu GvIMPORTED|5.003007||Viu GvIMPORTED_AV|5.003007||Viu GvIMPORTED_AV_off|5.003007||Viu GvIMPORTED_AV_on|5.003007||Viu GvIMPORTED_CV|5.003007||Viu GvIMPORTED_CV_off|5.003007||Viu GvIMPORTED_CV_on|5.003007||Viu GvIMPORTED_HV|5.003007||Viu GvIMPORTED_HV_off|5.003007||Viu GvIMPORTED_HV_on|5.003007||Viu GvIMPORTED_off|5.003007||Viu GvIMPORTED_on|5.003007||Viu GvIMPORTED_SV|5.003007||Viu GvIMPORTED_SV_off|5.003007||Viu GvIMPORTED_SV_on|5.003007||Viu gv_init|5.003007|5.003007| gv_init_pv|5.015004|5.015004| gv_init_pvn|5.015004|5.003007|p gv_init_sv|5.015004|5.015004| gv_init_svtype|5.015004||Viu GvIN_PAD|5.006000||Viu GvIN_PAD_off|5.006000||Viu GvIN_PAD_on|5.006000||Viu GvINTRO|5.003007||Viu GvINTRO_off|5.003007||Viu GvINTRO_on|5.003007||Viu GvIO|5.003007||Viu gv_IOadd|5.003007|5.003007|u GvIOn|5.003007||Viu GvIOp|5.003007||Viu gv_is_in_main|5.019004||Viu GvLINE|5.003007||Viu gv_magicalize|5.019004||Viu gv_magicalize_isa|5.013005||Viu gv_method_changed|5.017007||Viu GvMULTI|5.003007||Viu GvMULTI_off|5.003007||Viu GvMULTI_on|5.003007||Viu GvNAME|5.003007||Viu GvNAME_get|5.009004||Viu GvNAME_HEK|5.009004||Viu GvNAMELEN|5.003007||Viu GvNAMELEN_get|5.009004||Viu gv_name_set|5.009004|5.009004|u GvNAMEUTF8|5.015004||Viu GV_NOADD_MASK|5.009005||Viu GV_NOADD_NOINIT|5.009003|5.009003| GV_NOEXPAND|5.009003|5.009003| GV_NOINIT|5.004005|5.004005| GV_NO_SVGMAGIC|5.015003|5.015003| GV_NOTQUAL|5.009004|5.009004| GV_NOUNIVERSAL|5.033009||Viu G_VOID|5.004000|5.004000| gv_override|5.019006||Viu GvREFCNT|5.003007||Viu gv_setref|5.021005||Viu GvSTASH|5.003007||Viu gv_stashpv|5.003007|5.003007| gv_stashpvn|5.003007|5.003007|p gv_stashpvn_internal|5.021004||Viu gv_stashpvs|5.009003|5.003007|p gv_stashsv|5.003007|5.003007| gv_stashsvpvn_cached|5.021004||Vi GV_SUPER|5.017004|5.017004| GvSV|5.003007|5.003007| gv_SVadd|5.011000||Vu GvSVn|5.009003|5.003007|p gv_try_downgrade|5.011002||xcVi GvXPVGV|5.003007||Viu G_WANT|5.010001||Viu G_WARN_ALL_MASK|5.006000||Viu G_WARN_ALL_OFF|5.006000||Viu G_WARN_ALL_ON|5.006000||Viu G_WARN_OFF|5.006000||Viu G_WARN_ON|5.006000||Viu G_WARN_ONCE|5.006000||Viu G_WRITING_TO_STDERR|5.013009||Viu handle_named_backref|5.023008||Viu handle_names_wildcard|5.031011||Viu handle_possible_posix|5.023008||Viu handle_regex_sets|5.017009||Viu handle_user_defined_property|5.029008||Viu HAS_ACCEPT4|5.027008|5.027008|Vn HAS_ACCESS|5.006000|5.006000|Vn HAS_ACOSH|5.021004|5.021004|Vn HAS_ALARM|5.003007|5.003007|Vn HAS_ASCTIME_R|5.010000|5.010000|Vn HAS_ASINH|5.021006|5.021006|Vn HAS_ATANH|5.021006|5.021006|Vn HAS_ATOLL|5.006000|5.006000|Vn HASATTRIBUTE_ALWAYS_INLINE|5.031007|5.031007|Vn HASATTRIBUTE_DEPRECATED|5.010001|5.010001|Vn HASATTRIBUTE_FORMAT|5.009003|5.009003|Vn HASATTRIBUTE_MALLOC|5.009003|5.009003|Vn HASATTRIBUTE_NONNULL|5.009003|5.009003|Vn HASATTRIBUTE_NORETURN|5.009003|5.009003|Vn HASATTRIBUTE_PURE|5.009003|5.009003|Vn HASATTRIBUTE_UNUSED|5.009003|5.009003|Vn HASATTRIBUTE_WARN_UNUSED_RESULT|5.009003|5.009003|Vn HAS_BACKTRACE|5.021001|5.021001|Vn HAS_BOOL|5.003007||Viu HAS_BUILTIN_CHOOSE_EXPR|5.009004|5.009004|Vn HAS_BUILTIN_EXPECT|5.010001|5.010001|Vn __has_builtin|||piu HAS_BUILTIN_UNREACHABLE|5.033003||Viu HAS_C99|5.021004||Viu HAS_C99_VARIADIC_MACROS|5.009004|5.009004|Vn HAS_CBRT|5.021006|5.021006|Vn HAS_CF_AUX_TABLES|5.027011||Viu HAS_CHOWN|5.003007|5.003007|Vn HAS_CHROOT|5.003007|5.003007|Vn HAS_CHSIZE|5.004005|5.004005|Vn HAS_CLEARENV|5.009003|5.009003|Vn HAS_COPYSIGN|5.021006|5.021006|Vn HAS_COPYSIGNL|5.008001|5.008001|Vn HAS_CRYPT|5.003007|5.003007|Vn HAS_CRYPT_R|5.010000|5.010000|Vn HAS_CSH|5.005000|5.005000|Vn HAS_CTERMID|5.009005|5.009005|Vn HAS_CTIME_R|5.010000|5.010000|Vn HAS_CUSERID|5.003007|5.003007|Vn HAS_DBMINIT_PROTO|5.032001|5.032001|Vn HAS_DIFFTIME|5.003007|5.003007|Vn HAS_DIRFD|5.007003|5.007003|Vn HAS_DLADDR|5.021001|5.021001|Vn HAS_DLERROR|5.003007|5.003007|Vn HAS_DRAND48_PROTO|5.006000|5.006000|Vn HAS_DRAND48_R|5.010000|5.010000|Vn HAS_DUP2|5.003007|5.003007|Vn HAS_DUP3|5.027008|5.027008|Vn HAS_DUPLOCALE|5.027011|5.027011|Vn HAS_EACCESS|5.006000|5.006000|Vn HAS_ENDGRENT|5.005000|5.005000|Vn HAS_ENDHOSTENT|5.005000|5.005000|Vn HAS_ENDNETENT|5.005000|5.005000|Vn HAS_ENDPROTOENT|5.005000|5.005000|Vn HAS_ENDPWENT|5.005000|5.005000|Vn HAS_ENDSERVENT|5.005000|5.005000|Vn HAS_ERF|5.021006|5.021006|Vn HAS_ERFC|5.021006|5.021006|Vn HAS_EXP2|5.021006|5.021006|Vn HAS_EXPM1|5.021006|5.021006|Vn HAS_FAST_STDIO|5.008001|5.008001|Vn HAS_FCHDIR|5.007002|5.007002|Vn HAS_FCHMOD|5.003007|5.003007|Vn HAS_FCHMODAT|5.027004|5.027004|Vn HAS_FCHOWN|5.003007|5.003007|Vn HAS_FCNTL|5.003007|5.003007|Vn HAS_FDIM|5.021006|5.021006|Vn HAS_FD_SET|5.006000|5.006000|Vn HAS_FEGETROUND|5.021004|5.021004|Vn HAS_FFS|5.035001|5.035001|Vn HAS_FFSL|5.035001|5.035001|Vn HAS_FGETPOS|5.003007|5.003007|Vn HAS_FINITE|5.007003|5.007003|Vn HAS_FINITEL|5.007003|5.007003|Vn HAS_FLOCK|5.003007|5.003007|Vn HAS_FLOCK_PROTO|5.007002|5.007002|Vn HAS_FMA|5.021006|5.021006|Vn HAS_FMAX|5.021006|5.021006|Vn HAS_FMIN|5.021006|5.021006|Vn HAS_FORK|5.003007|5.003007|Vn HAS_FPATHCONF|5.003007|5.003007|Vn HAS_FPCLASSIFY|5.021004|5.021004|Vn HAS_FREELOCALE|5.023009|5.023009|Vn HAS_FREXPL|5.006001|5.006001|Vn HAS_FSEEKO|5.006000|5.006000|Vn HAS_FSETPOS|5.003007|5.003007|Vn HAS_FSTATFS|5.023005|5.023005|Vn HAS_FSTATVFS|5.023005|5.023005|Vn HAS_FSYNC|5.007001|5.007001|Vn HAS_FTELLO|5.006000|5.006000|Vn HAS_FUTIMES|5.009003|5.009003|Vn HAS_GAI_STRERROR|5.025004|5.025004|Vn HAS_GETADDRINFO|5.010001|5.010001|Vn HAS_GETCWD|5.006000|5.006000|Vn HAS_GETGRENT|5.005000|5.005000|Vn HAS_GETGRENT_R|5.010000|5.010000|Vn HAS_GETGRGID_R|5.010000|5.010000|Vn HAS_GETGRNAM_R|5.010000|5.010000|Vn HAS_GETGROUPS|5.003007|5.003007|Vn HAS_GETHOSTBYADDR|5.005000|5.005000|Vn HAS_GETHOSTBYADDR_R|5.010000|5.010000|Vn HAS_GETHOSTBYNAME|5.005000|5.005000|Vn HAS_GETHOSTBYNAME_R|5.010000|5.010000|Vn HAS_GETHOSTENT|5.003007|5.003007|Vn HAS_GETHOSTENT_R|5.010000|5.010000|Vn HAS_GETHOSTNAME|5.006000|5.006000|Vn HAS_GETHOST_PROTOS|5.005000|5.005000|Vn HAS_GETITIMER|5.007001|5.007001|Vn HAS_GETLOGIN|5.003007|5.003007|Vn HAS_GETLOGIN_R|5.010000|5.010000|Vn HAS_GETMNTENT|5.023005|5.023005|Vn HAS_GETNAMEINFO|5.010001|5.010001|Vn HAS_GETNETBYADDR|5.005000|5.005000|Vn HAS_GETNETBYADDR_R|5.010000|5.010000|Vn HAS_GETNETBYNAME|5.005000|5.005000|Vn HAS_GETNETBYNAME_R|5.010000|5.010000|Vn HAS_GETNETENT|5.005000|5.005000|Vn HAS_GETNETENT_R|5.010000|5.010000|Vn HAS_GETNET_PROTOS|5.005000|5.005000|Vn HAS_GETPAGESIZE|5.007001|5.007001|Vn HAS_GETPGID|5.003007|5.003007|Vn HAS_GETPGRP|5.003007|5.003007|Vn HAS_GETPPID|5.003007|5.003007|Vn HAS_GETPRIORITY|5.003007|5.003007|Vn HAS_GETPROTOBYNAME|5.005000|5.005000|Vn HAS_GETPROTOBYNAME_R|5.010000|5.010000|Vn HAS_GETPROTOBYNUMBER|5.005000|5.005000|Vn HAS_GETPROTOBYNUMBER_R|5.010000|5.010000|Vn HAS_GETPROTOENT|5.005000|5.005000|Vn HAS_GETPROTOENT_R|5.010000|5.010000|Vn HAS_GETPROTO_PROTOS|5.005000|5.005000|Vn HAS_GETPWENT|5.005000|5.005000|Vn HAS_GETPWENT_R|5.010000|5.010000|Vn HAS_GETPWNAM_R|5.010000|5.010000|Vn HAS_GETPWUID_R|5.010000|5.010000|Vn HAS_GETSERVBYNAME|5.005000|5.005000|Vn HAS_GETSERVBYNAME_R|5.010000|5.010000|Vn HAS_GETSERVBYPORT|5.005000|5.005000|Vn HAS_GETSERVBYPORT_R|5.010000|5.010000|Vn HAS_GETSERVENT|5.005000|5.005000|Vn HAS_GETSERVENT_R|5.010000|5.010000|Vn HAS_GETSERV_PROTOS|5.005000|5.005000|Vn HAS_GETSPNAM|5.006000|5.006000|Vn HAS_GETSPNAM_R|5.010000|5.010000|Vn HAS_GETTIMEOFDAY|5.004000|5.004000|Vn HAS_GMTIME_R|5.010000|5.010000|Vn HAS_GNULIBC|5.004005|5.004005|Vn HAS_GROUP|5.003007||Viu HAS_HASMNTOPT|5.023005|5.023005|Vn HAS_HTONL|5.003007|5.003007|Vn HAS_HTONS|5.003007|5.003007|Vn HAS_HYPOT|5.021006|5.021006|Vn HAS_ILOGB|5.021006|5.021006|Vn HAS_ILOGBL|5.008001|5.008001|Vn HAS_INET_ATON|5.004000|5.004000|Vn HAS_INETNTOP|5.010001|5.010001|Vn HAS_INETPTON|5.010001|5.010001|Vn HAS_INT64_T|5.006000|5.006000|Vn HAS_IOCTL|5.003007||Viu HAS_IP_MREQ|5.017002|5.017002|Vn HAS_IP_MREQ_SOURCE|5.017004|5.017004|Vn HAS_IPV6_MREQ|5.015008|5.015008|Vn HAS_ISASCII|5.003007|5.003007|Vn HAS_ISBLANK|5.015007|5.015007|Vn HAS_ISFINITE|5.021004|5.021004|Vn HAS_ISINF|5.007003|5.007003|Vn HAS_ISINFL|5.021004|5.021004|Vn HAS_ISLESS|5.031007|5.031007|Vn HAS_ISNAN|5.006001|5.006001|Vn HAS_ISNANL|5.006001|5.006001|Vn HAS_ISNORMAL|5.021006|5.021006|Vn HAS_IVCF_AUX_TABLES|5.027011||Viu HAS_J0|5.021004|5.021004|Vn HAS_J0L|5.021004|5.021004|Vn HAS_KILL|5.003007||Viu HAS_KILLPG|5.003007|5.003007|Vn HAS_LC_AUX_TABLES|5.027011||Viu HAS_LCHOWN|5.005000|5.005000|Vn HAS_LC_MONETARY_2008|5.021005|5.021005|Vn HAS_LDBL_DIG|5.006000|5.006000|Vn HAS_LDEXPL|5.021003|5.021003|Vn HAS_LGAMMA|5.021006|5.021006|Vn HAS_LGAMMA_R|5.021006|5.021006|Vn HAS_LINK|5.003007|5.003007|Vn HAS_LINKAT|5.027004|5.027004|Vn HAS_LLRINT|5.021006|5.021006|Vn HAS_LLRINTL|5.021009|5.021009|Vn HAS_LLROUND|5.021006|5.021006|Vn HAS_LLROUNDL|5.021009|5.021009|Vn HAS_LOCALECONV|5.003007|5.003007|Vn HAS_LOCALTIME_R|5.010000|5.010000|Vn HAS_LOCKF|5.003007|5.003007|Vn HAS_LOG1P|5.021006|5.021006|Vn HAS_LOG2|5.021006|5.021006|Vn HAS_LOGB|5.021006|5.021006|Vn HAS_LONG_DOUBLE|5.005000|5.005000|Vn HAS_LONG_LONG|5.005000|5.005000|Vn HAS_LRINT|5.021006|5.021006|Vn HAS_LRINTL|5.021009|5.021009|Vn HAS_LROUND|5.021006|5.021006|Vn HAS_LROUNDL|5.021009|5.021009|Vn HAS_LSEEK_PROTO|5.006000|5.006000|Vn HAS_LSTAT|5.003007|5.003007|Vn HAS_MADVISE|5.006000|5.006000|Vn HAS_MBLEN|5.003007|5.003007|Vn HAS_MBRLEN|5.027006|5.027006|Vn HAS_MBRTOWC|5.027006|5.027006|Vn HAS_MBSTOWCS|5.003007|5.003007|Vn HAS_MBTOWC|5.003007|5.003007|Vn HAS_MEMMEM|5.024000|5.024000|Vn HAS_MEMRCHR|5.027005|5.027005|Vn HAS_MKDIR|5.003007|5.003007|Vn HAS_MKDTEMP|5.006000|5.006000|Vn HAS_MKFIFO|5.003007|5.003007|Vn HAS_MKOSTEMP|5.027008|5.027008|Vn HAS_MKSTEMP|5.006000|5.006000|Vn HAS_MKSTEMPS|5.006000|5.006000|Vn HAS_MKTIME|5.003007|5.003007|Vn HAS_MMAP|5.006000|5.006000|Vn HAS_MODFL|5.006001|5.006001|Vn HAS_MODFL_PROTO|5.009003|5.009003|Vn HAS_MPROTECT|5.006000|5.006000|Vn HAS_MSG|5.003007|5.003007|Vn HAS_MSYNC|5.006000|5.006000|Vn HAS_MUNMAP|5.006000|5.006000|Vn HAS_NAN|5.021006|5.021006|Vn HAS_NANOSLEEP|5.027006|5.027006|Vn HAS_NEARBYINT|5.021006|5.021006|Vn HAS_NEWLOCALE|5.023009|5.023009|Vn HAS_NEXTAFTER|5.021006|5.021006|Vn HAS_NEXTTOWARD|5.021006|5.021006|Vn HAS_NICE|5.003007|5.003007|Vn HAS_NL_LANGINFO|5.007002|5.007002|Vn HAS_NL_LANGINFO_L|5.035001|5.035001|Vn HAS_NON_INT_BITFIELDS|5.035001|5.035001|Vn HAS_NONLATIN1_FOLD_CLOSURE|5.033005||Viu HAS_NONLATIN1_SIMPLE_FOLD_CLOSURE|5.033005||Viu HAS_NTOHL|5.003007|5.003007|Vn HAS_NTOHS|5.003007|5.003007|Vn HAS_OFF64_T|5.010000|5.010000|Vn HAS_OPEN3|5.003007|5.003007|Vn HAS_OPENAT|5.027004|5.027004|Vn HAS_PASSWD|5.003007||Viu HAS_PATHCONF|5.003007|5.003007|Vn HAS_PAUSE|5.003007|5.003007|Vn HAS_PIPE2|5.027008|5.027008|Vn HAS_PIPE|5.003007|5.003007|Vn HAS_POLL|5.003007|5.003007|Vn HAS_POSIX_2008_LOCALE|5.027003||Viu HAS_PRCTL|5.013000|5.013000|Vn HAS_PRCTL_SET_NAME|5.013000|5.013000|Vn HAS_PROCSELFEXE|5.007003|5.007003|Vn HAS_PTHREAD_ATFORK|5.010000|5.010000|Vn HAS_PTHREAD_ATTR_SETSCOPE|5.008001|5.008001|Vn HAS_PTHREAD_UNCHECKED_GETSPECIFIC_NP|5.007002||Viu HAS_PTHREAD_YIELD|5.009005|5.009005|Vn HAS_PTRDIFF_T|5.021001|5.021001|Vn HAS_QUAD|5.003007|5.003007|Vn HAS_RANDOM_R|5.010000|5.010000|Vn HAS_READDIR|5.003007|5.003007|Vn HAS_READDIR64_R|5.010000|5.010000|Vn HAS_READDIR_R|5.010000|5.010000|Vn HAS_READLINK|5.003007|5.003007|Vn HAS_READV|5.007001|5.007001|Vn HAS_RECVMSG|5.007001|5.007001|Vn HAS_REGCOMP|5.021007|5.021007|Vn HAS_REMAINDER|5.021006|5.021006|Vn HAS_REMQUO|5.021006|5.021006|Vn HAS_RENAME|5.003007|5.003007|Vn HAS_RENAMEAT|5.027004|5.027004|Vn HAS_REWINDDIR|5.003007|5.003007|Vn HAS_RINT|5.021006|5.021006|Vn HAS_RMDIR|5.003007|5.003007|Vn HAS_ROUND|5.021006|5.021006|Vn HAS_SBRK_PROTO|5.007001|5.007001|Vn HAS_SCALBN|5.021006|5.021006|Vn HAS_SCALBNL|5.008001|5.008001|Vn HAS_SCHED_YIELD|5.005000|5.005000|Vn HAS_SCX_AUX_TABLES|5.027008||Viu HAS_SEEKDIR|5.003007|5.003007|Vn HAS_SELECT|5.003007|5.003007|Vn HAS_SEM|5.003007|5.003007|Vn HAS_SENDMSG|5.007001|5.007001|Vn HAS_SETEGID|5.003007|5.003007|Vn HAS_SETEUID|5.003007|5.003007|Vn HAS_SETGRENT|5.005000|5.005000|Vn HAS_SETGROUPS|5.004000|5.004000|Vn HAS_SETHOSTENT|5.005000|5.005000|Vn HAS_SETITIMER|5.007001|5.007001|Vn HAS_SETLINEBUF|5.003007|5.003007|Vn HAS_SETLOCALE|5.003007|5.003007|Vn HAS_SETNETENT|5.005000|5.005000|Vn HAS_SETPGID|5.003007|5.003007|Vn HAS_SETPGRP|5.003007|5.003007|Vn HAS_SETPRIORITY|5.003007|5.003007|Vn HAS_SETPROTOENT|5.005000|5.005000|Vn HAS_SETPWENT|5.005000|5.005000|Vn HAS_SETREGID|5.003007|5.003007|Vn HAS_SETRESGID|5.003007|5.003007|Vn HAS_SETRESGID_PROTO|5.010000|5.010000|Vn HAS_SETRESUID|5.003007|5.003007|Vn HAS_SETRESUID_PROTO|5.010000|5.010000|Vn HAS_SETREUID|5.003007|5.003007|Vn HAS_SETSERVENT|5.005000|5.005000|Vn HAS_SETSID|5.003007|5.003007|Vn HAS_SETVBUF|5.005000|5.005000|Vn HAS_SHM|5.003007|5.003007|Vn HAS_SHMAT_PROTOTYPE|5.003007|5.003007|Vn HAS_SIGACTION|5.003007|5.003007|Vn HAS_SIGINFO_SI_ADDR|5.023008|5.023008|Vn HAS_SIGINFO_SI_BAND|5.023008|5.023008|Vn HAS_SIGINFO_SI_ERRNO|5.023008|5.023008|Vn HAS_SIGINFO_SI_PID|5.023008|5.023008|Vn HAS_SIGINFO_SI_STATUS|5.023008|5.023008|Vn HAS_SIGINFO_SI_UID|5.023008|5.023008|Vn HAS_SIGINFO_SI_VALUE|5.023008|5.023008|Vn HAS_SIGNBIT|5.009005|5.009005|Vn HAS_SIGPROCMASK|5.007001|5.007001|Vn HAS_SIGSETJMP|5.003007|5.003007|Vn HAS_SIN6_SCOPE_ID|5.013009|5.013009|Vn HAS_SKIP_LOCALE_INIT|5.019002||Viu HAS_SNPRINTF|5.009003|5.009003|Vn HAS_SOCKADDR_IN6|5.015008|5.015008|Vn HAS_SOCKADDR_STORAGE|5.032001|5.032001|Vn HAS_SOCKATMARK|5.007001|5.007001|Vn HAS_SOCKATMARK_PROTO|5.007002|5.007002|Vn HAS_SOCKET|5.003007|5.003007|Vn HAS_SOCKETPAIR|5.003007|5.003007|Vn HAS_SQRTL|5.006000|5.006000|Vn HAS_SRAND48_R|5.010000|5.010000|Vn HAS_SRANDOM_R|5.010000|5.010000|Vn HAS_STAT|5.021007|5.021007|Vn HAS_STATIC_INLINE|5.013004|5.013004|Vn HAS_STRCOLL|5.003007|5.003007|Vn HAS_STRERROR_L|5.025002|5.025002|Vn HAS_STRERROR_R|5.010000|5.010000|Vn HAS_STRFTIME|5.007002|5.007002|Vn HAS_STRNLEN|5.027006|5.027006|Vn HAS_STRTOD|5.004000|5.004000|Vn HAS_STRTOD_L|5.027011|5.027011|Vn HAS_STRTOL|5.004000|5.004000|Vn HAS_STRTOLD|5.006000|5.006000|Vn HAS_STRTOLD_L|5.027006|5.027006|Vn HAS_STRTOLL|5.006000|5.006000|Vn HAS_STRTOQ|5.007001|5.007001|Vn HAS_STRTOUL|5.004000|5.004000|Vn HAS_STRTOULL|5.006000|5.006000|Vn HAS_STRTOUQ|5.006000|5.006000|Vn HAS_STRUCT_CMSGHDR|5.007001|5.007001|Vn HAS_STRUCT_MSGHDR|5.007001|5.007001|Vn HAS_STRUCT_STATFS|5.023005|5.023005|Vn HAS_STRUCT_STATFS_F_FLAGS|5.023005|5.023005|Vn HAS_STRXFRM|5.003007|5.003007|Vn HAS_STRXFRM_L|5.035001|5.035001|Vn HAS_SYMLINK|5.003007|5.003007|Vn HAS_SYSCALL|5.003007|5.003007|Vn HAS_SYSCALL_PROTO|5.007002|5.007002|Vn HAS_SYSCONF|5.003007|5.003007|Vn HAS_SYS_ERRLIST|5.003007|5.003007|Vn HAS_SYSTEM|5.003007|5.003007|Vn HAS_TC_AUX_TABLES|5.027011||Viu HAS_TCGETPGRP|5.003007|5.003007|Vn HAS_TCSETPGRP|5.003007|5.003007|Vn HAS_TELLDIR|5.003007|5.003007|Vn HAS_TELLDIR_PROTO|5.006000|5.006000|Vn HAS_TGAMMA|5.021006|5.021006|Vn HAS_THREAD_SAFE_NL_LANGINFO_L|5.027006|5.027006|Vn HAS_TIME|5.008000|5.008000|Vn HAS_TIMEGM|5.010001|5.010001|Vn HAS_TIMES|5.003007|5.003007|Vn HAS_TMPNAM_R|5.010000|5.010000|Vn HAS_TM_TM_GMTOFF|5.008001|5.008001|Vn HAS_TM_TM_ZONE|5.008000|5.008000|Vn HAS_TOWLOWER|5.029009|5.029009|Vn HAS_TOWUPPER|5.029009|5.029009|Vn HAS_TRUNC|5.021006|5.021006|Vn HAS_TRUNCATE|5.003007|5.003007|Vn HAS_TRUNCL|5.021004|5.021004|Vn HAS_TTYNAME_R|5.010000|5.010000|Vn HAS_TZNAME|5.003007|5.003007|Vn HAS_UALARM|5.007001|5.007001|Vn HAS_UC_AUX_TABLES|5.027011||Viu HAS_UMASK|5.003007|5.003007|Vn HAS_UNAME|5.003007|5.003007|Vn HAS_UNLINKAT|5.027004|5.027004|Vn HAS_UNSETENV|5.009003|5.009003|Vn HAS_USELOCALE|5.023009|5.023009|Vn HAS_USLEEP|5.007001|5.007001|Vn HAS_USLEEP_PROTO|5.007002|5.007002|Vn HAS_USTAT|5.023005|5.023005|Vn HAS_UTIME|5.003007||Viu HAS_VSNPRINTF|5.009003|5.009003|Vn HAS_WAIT4|5.003007|5.003007|Vn HAS_WAIT|5.003007||Viu HAS_WAITPID|5.003007|5.003007|Vn HAS_WCRTOMB|5.031007|5.031007|Vn HAS_WCSCMP|5.021001|5.021001|Vn HAS_WCSTOMBS|5.003007|5.003007|Vn HAS_WCSXFRM|5.021001|5.021001|Vn HAS_WCTOMB|5.003007|5.003007|Vn HAS_WRITEV|5.007001|5.007001|Vn he_dup|5.007003|5.007003|u HEf_SVKEY|5.003007|5.003007|p HeHASH|5.003007|5.003007| HEK_BASESIZE|5.004000||Viu hek_dup|5.009000|5.009000|u HeKEY|5.003007|5.003007| HeKEY_hek|5.004000||Viu HeKEY_sv|5.004000||Viu HEKf256|5.015004||Viu HEKf|5.015004||Viu HEKfARG|5.015004||Viu HEK_FLAGS|5.008000||Viu HeKFLAGS|5.008000||Viu HEK_HASH|5.004000||Viu HEK_KEY|5.004000||Viu HeKLEN|5.003007|5.003007| HEK_LEN|5.004000||Viu HeKLEN_UTF8|5.007001||Viu HEK_UTF8|5.007001||Viu HeKUTF8|5.007001||Viu HEK_UTF8_off|5.008000||Viu HEK_UTF8_on|5.008000||Viu HEK_WASUTF8|5.008000||Viu HeKWASUTF8|5.008000||Viu HEK_WASUTF8_off|5.008000||Viu HEK_WASUTF8_on|5.008000||Viu HeNEXT|5.003007||Viu HePV|5.004000|5.004000| HeSVKEY|5.003007|5.003007| HeSVKEY_force|5.003007|5.003007| HeSVKEY_set|5.004000|5.004000| HE_SVSLOT|5.009003||Viu HeUTF8|5.010001|5.008000|p HeVAL|5.003007|5.003007| hfree_next_entry|||iu HIGHEST_ANYOF_HRx_BYTE|5.031002||Viu HIGHEST_CASE_CHANGING_CP|5.033005||Viu HINT_ALL_STRICT|5.033002||Viu HINT_BLOCK_SCOPE|5.003007||Viu HINT_BYTES|5.007002||Viu HINT_EXPLICIT_STRICT_REFS|5.016000||Viu HINT_EXPLICIT_STRICT_SUBS|5.016000||Viu HINT_EXPLICIT_STRICT_VARS|5.016000||Viu HINT_FEATURE_MASK|5.015007||Viu HINT_FEATURE_SHIFT|5.015007||Viu HINT_FILETEST_ACCESS|5.006000||Viu HINT_INTEGER|5.003007||Viu HINT_LEXICAL_IO_IN|5.009005||Viu HINT_LEXICAL_IO_OUT|5.009005||Viu HINT_LOCALE|5.004000||Viu HINT_LOCALE_PARTIAL|5.021001||Viu HINT_LOCALIZE_HH|5.005000||Viu HINT_NEW_BINARY|5.005000||Viu HINT_NEW_FLOAT|5.005000||Viu HINT_NEW_INTEGER|5.005000||Viu HINT_NEW_RE|5.005000||Viu HINT_NEW_STRING|5.005000||Viu HINT_NO_AMAGIC|5.010001||Viu HINT_RE_EVAL|5.005000||Viu HINT_RE_FLAGS|5.013007||Viu HINT_RE_TAINT|5.004005||Viu HINTS_DEFAULT|5.033002||Viu HINT_SORT_STABLE|5.007003||Viu HINT_SORT_UNSTABLE|5.027004||Viu HINTS_REFCNT_INIT|5.009004||Viu HINTS_REFCNT_LOCK|5.009004||Viu HINTS_REFCNT_TERM|5.009004||Viu HINTS_REFCNT_UNLOCK|5.009004||Viu HINT_STRICT_REFS|5.003007||Viu HINT_STRICT_SUBS|5.003007||Viu HINT_STRICT_VARS|5.003007||Viu HINT_UNI_8_BIT|5.011002||Viu HINT_UTF8|5.006000||Viu H_PERL|5.003007||Viu HS_APIVERLEN_MAX|5.021006||Viu HS_CXT|5.021006||Viu HSf_IMP_CXT|5.021006||Viu HSf_NOCHK|5.021006||Viu HSf_POPMARK|5.021006||Viu HSf_SETXSUBFN|5.021006||Viu HS_GETAPIVERLEN|5.021006||Viu HS_GETINTERPSIZE|5.021006||Viu HS_GETXSVERLEN|5.021006||Viu HS_KEY|5.021006||Viu HS_KEYp|5.021006||Viu HSm_APIVERLEN|5.021006||Viu HSm_INTRPSIZE|5.021006||Viu HSm_KEY_MATCH|5.021006||Viu HSm_XSVERLEN|5.021006||Viu hsplit|5.005000||Viu HS_XSVERLEN_MAX|5.021006||Viu htoni|5.003007||Viu htonl|5.003007||Viu htons|5.003007||Viu htovl|5.003007||Viu htovs|5.003007||Viu HvAMAGIC|5.017000||Viu HvAMAGIC_off|5.017000||Viu HvAMAGIC_on|5.017000||Viu HvARRAY|5.003007||Viu hv_assert|5.008009|5.008009| HvAUX|5.009003||Viu HvAUXf_NO_DEREF|5.019010||Viu HvAUXf_SCAN_STASH|5.019010||Viu hv_auxinit|5.009003||Viu hv_auxinit_internal|5.019010||Vniu hv_backreferences_p|||xiu hv_bucket_ratio|5.025003|5.025003|x hv_clear|5.003007|5.003007| hv_clear_placeholders|5.009001|5.009001| hv_common|5.010000||cVu hv_common_key_len|5.010000||cVu hv_copy_hints_hv|5.009004|5.009004| hv_delayfree_ent|5.004000|5.004000|u hv_delete|5.003007|5.003007| HV_DELETE|5.009005||Viu hv_delete_common|5.009001||xViu hv_delete_ent|5.003007|5.003007| hv_deletehek|5.019006||Viu hv_deletes|5.025006||Viu HV_DISABLE_UVAR_XKEY|5.010000||Viu HvEITER|5.003007||Viu HvEITER_get|5.009003||Viu hv_eiter_p|5.009003|5.009003|u hv_eiter_set|5.009003|5.009003|u HvEITER_set|5.009003||Viu HvENAME|5.013007|5.013007| hv_ename_add|5.013007||Vi hv_ename_delete|5.013007||Vi HvENAME_get|5.013007||Viu HvENAME_HEK|5.013007||Viu HvENAME_HEK_NN|5.013007||Viu HvENAMELEN|5.015004|5.015004| HvENAMELEN_get|5.013007||Viu HvENAMEUTF8|5.015004|5.015004| hv_exists|5.003007|5.003007| hv_exists_ent|5.003007|5.003007| hv_existss|5.025006||Viu hv_fetch|5.003007|5.003007| HV_FETCH_EMPTY_HE|5.013007||Viu hv_fetch_ent|5.003007|5.003007| hv_fetchhek|5.019006||Viu HV_FETCH_ISEXISTS|5.009005||Viu HV_FETCH_ISSTORE|5.009005||Viu HV_FETCH_JUST_SV|5.009005||Viu HV_FETCH_LVALUE|5.009005||Viu hv_fetchs|5.009003|5.003007|p HvFILL|5.003007|5.003007| hv_fill|5.013002|5.013002| hv_free_ent|5.004000|5.004000|u hv_free_ent_ret|5.015000||Viu hv_free_entries|5.027002||Viu HvHASKFLAGS|5.008000||Viu HvHASKFLAGS_off|5.008000||Viu HvHASKFLAGS_on|5.008000||Viu HVhek_ENABLEHVKFLAGS|5.008002||Viu HVhek_FREEKEY|5.008000||Viu HVhek_KEYCANONICAL|5.010001||Viu HVhek_MASK|5.008000||Viu HVhek_PLACEHOLD|5.008000||Viu HVhek_UNSHARED|5.009004||Viu HVhek_UTF8|5.008000||Viu HVhek_WASUTF8|5.008000||Viu hv_iterinit|5.003007|5.003007| hv_iterkey|5.003007|5.003007| hv_iterkeysv|5.003007|5.003007| hv_iternext|5.003007|5.003007| hv_iternext_flags|5.008000|5.008000|x hv_iternextsv|5.003007|5.003007| HV_ITERNEXT_WANTPLACEHOLDERS|5.008000|5.008000| hv_iterval|5.003007|5.003007| HvKEYS|5.003007||Viu hv_kill_backrefs|||xiu hv_ksplit|5.003007|5.003007|u HvLASTRAND_get|5.017011||Viu HvLAZYDEL|5.003007||Viu HvLAZYDEL_off|5.003007||Viu HvLAZYDEL_on|5.003007||Viu hv_magic|5.003007|5.003007| hv_magic_check|5.006000||Vniu HvMAX|5.003007||Viu HvMROMETA|5.010001|5.010001| HvNAME|5.003007|5.003007| HvNAME_get|5.009003||pcV HvNAME_HEK|5.009003||Viu HvNAME_HEK_NN|5.013007||Viu HvNAMELEN|5.015004|5.015004| HvNAMELEN_get|5.009003|5.003007|p hv_name_set|5.009003|5.009003|u HV_NAME_SETALL|5.013008||Viu hv_name_sets|5.025006||Viu HvNAMEUTF8|5.015004|5.015004| hv_notallowed|5.008000||Viu HvPLACEHOLDERS|5.007003||Viu hv_placeholders_get|5.009003|5.009003|u HvPLACEHOLDERS_get|5.009003||Viu hv_placeholders_p|||ciu hv_placeholders_set|5.009003|5.009003|u HvPLACEHOLDERS_set|5.009003||Viu hv_pushkv|5.027003||Viu HvRAND_get|5.017011||Viu hv_rand_set|5.018000|5.018000|u HVrhek_delete|5.009004||Viu HVrhek_IV|5.009004||Viu HVrhek_PV|5.009004||Viu HVrhek_PV_UTF8|5.009005||Viu HVrhek_typemask|5.009004||Viu HVrhek_undef|5.009004||Viu HVrhek_UV|5.009004||Viu HvRITER|5.003007||Viu HvRITER_get|5.009003||Viu hv_riter_p|5.009003|5.009003|u hv_riter_set|5.009003|5.009003|u HvRITER_set|5.009003||Viu hv_scalar|5.009001|5.009001| HvSHAREKEYS|5.003007||Viu HvSHAREKEYS_off|5.003007||Viu HvSHAREKEYS_on|5.003007||Viu hv_store|5.003007|5.003007| hv_store_ent|5.003007|5.003007| hv_store_flags|5.008000|5.008000|xu hv_storehek|5.019006||Viu hv_stores|5.009004|5.003007|p HvTOTALKEYS|5.007003||Viu hv_undef|5.003007|5.003007| hv_undef_flags|||ciu HvUSEDKEYS|5.007003||Viu HYPHEN_UTF8|5.017004||Viu I16_MAX|5.003007||Viu I16_MIN|5.003007||Viu I16SIZE|5.006000|5.006000|Vn I16TYPE|5.006000|5.006000|Vn I_32|5.006000|5.003007| I32_MAX|5.003007||Viu I32_MAX_P1|5.007002||Viu I32_MIN|5.003007||Viu I32SIZE|5.006000|5.006000|Vn I32TYPE|5.006000|5.006000|Vn I64SIZE|5.006000|5.006000|Vn I64TYPE|5.006000|5.006000|Vn I8SIZE|5.006000|5.006000|Vn I8_TO_NATIVE|5.015006||Viu I8_TO_NATIVE_UTF8|5.019004||Viu I8TYPE|5.006000|5.006000|Vn I_ARPA_INET|5.005000|5.005000|Vn ibcmp|5.003007|5.003007| ibcmp_locale|5.004000|5.004000| ibcmp_utf8|5.007003|5.007003| I_CRYPT|5.008000|5.008000|Vn I_DBM|5.032001|5.032001|Vn I_DIRENT|5.003007|5.003007|Vn I_DLFCN|5.003007|5.003007|Vn I_EXECINFO|5.021001|5.021001|Vn I_FENV|5.021004|5.021004|Vn IFMATCH|5.003007||Viu IFMATCH_A|5.009005||Viu IFMATCH_A_fail|5.009005||Viu IFMATCH_A_fail_t8_p8|5.033003||Viu IFMATCH_A_fail_t8_pb|5.033003||Viu IFMATCH_A_fail_tb_p8|5.033003||Viu IFMATCH_A_fail_tb_pb|5.033003||Viu IFMATCH_A_t8_p8|5.033003||Viu IFMATCH_A_t8_pb|5.033003||Viu IFMATCH_A_tb_p8|5.033003||Viu IFMATCH_A_tb_pb|5.033003||Viu IFMATCH_t8_p8|5.033003||Viu IFMATCH_t8_pb|5.033003||Viu IFMATCH_tb_p8|5.033003||Viu IFMATCH_tb_pb|5.033003||Viu IFTHEN|5.005000||Viu IFTHEN_t8_p8|5.033003||Viu IFTHEN_t8_pb|5.033003||Viu IFTHEN_tb_p8|5.033003||Viu IFTHEN_tb_pb|5.033003||Viu I_GDBM|5.021007|5.021007|Vn I_GDBMNDBM|5.021007|5.021007|Vn IGNORE_PAT_MOD|5.009005||Viu I_GRP|5.003007|5.003007|Vn I_INTTYPES|5.006000|5.006000|Vn I_LANGINFO|5.007002|5.007002|Vn I_LIMITS|5.003007||Viu ILLEGAL_UTF8_BYTE|5.019004||Viu I_LOCALE|5.003007|5.003007|Vn I_MNTENT|5.023005|5.023005|Vn IN_BYTES|5.007002||Viu incline|5.005000||Viu INCLUDE_PROTOTYPES|5.007001||Viu INCMARK|5.023005||Viu incpush|5.005000||Viu INCPUSH_APPLLIB_EXP|5.027006||Viu INCPUSH_APPLLIB_OLD_EXP|5.027006||Viu INCPUSH_ARCHLIB_EXP|5.027006||Viu incpush_if_exists|5.009003||Viu INCPUSH_PERL5LIB|5.027006||Viu INCPUSH_PERL_OTHERLIBDIRS|5.027006||Viu INCPUSH_PERL_OTHERLIBDIRS_ARCHONLY|5.027006||Viu INCPUSH_PERL_VENDORARCH_EXP|5.027006||Viu INCPUSH_PERL_VENDORLIB_EXP|5.027006||Viu INCPUSH_PERL_VENDORLIB_STEM|5.027006||Viu INCPUSH_PRIVLIB_EXP|5.027006||Viu INCPUSH_SITEARCH_EXP|5.027006||Viu INCPUSH_SITELIB_EXP|5.027006||Viu INCPUSH_SITELIB_STEM|5.027006||Viu incpush_use_sep|5.011000||Viu I_NDBM|5.032001|5.032001|Vn inet_addr|5.005000||Viu I_NETDB|5.005000|5.005000|Vn I_NETINET_IN|5.003007|5.003007|Vn I_NETINET_TCP|5.006000|5.006000|Vn inet_ntoa|5.005000||Viu INFNAN_NV_U8_DECL|5.023000||Viu INFNAN_U8_NV_DECL|5.023000||Viu ingroup|5.003007||Viu INIT|5.003007||Viu init_argv_symbols|5.007003||Viu init_constants|5.017003||Viu init_dbargs|||iu init_debugger|5.005000||Viu init_i18nl10n|5.006000||cVu init_i18nl14n|5.006000||dcVu initialize_invlist_guts|5.029002||Viu init_ids|5.005000||Viu init_interp|5.005000||Viu init_main_stash|5.005000||Viu init_named_cv|5.027010||cViu init_os_extras|5.005000||Viu init_perllib|5.005000||Viu init_postdump_symbols|5.005000||Viu init_predump_symbols|5.005000||Viu init_stacks|5.005000|5.005000|u INIT_THREADS|5.005000||Viu init_tm|5.007002|5.007002|u INIT_TRACK_MEMPOOL|5.009004||Viu init_uniprops|5.027011||Viu IN_LC|5.021001||Viu IN_LC_ALL_COMPILETIME|5.021001||Viu IN_LC_ALL_RUNTIME|5.021001||Viu IN_LC_COMPILETIME|5.021001||Viu IN_LC_PARTIAL_COMPILETIME|5.021001||Viu IN_LC_PARTIAL_RUNTIME|5.021001||Viu IN_LC_RUNTIME|5.021001||Viu IN_LOCALE|5.007002|5.004000|p IN_LOCALE_COMPILETIME|5.007002|5.004000|p IN_LOCALE_RUNTIME|5.007002|5.004000|p IN_PERL_COMPILETIME|5.008001|5.003007|p IN_PERL_RUNTIME|5.008001|5.008001| inplace_aassign|5.015003||Viu inRANGE|5.029010||Viu inRANGE_helper|5.033005||Viu IN_SOME_LOCALE_FORM|5.015008||Viu IN_SOME_LOCALE_FORM_COMPILETIME|5.015008||Viu IN_SOME_LOCALE_FORM_RUNTIME|5.015008||Viu instr|5.003007|5.003007|n INSUBP|5.009005||Viu INSUBP_t8_p8|5.033003||Viu INSUBP_t8_pb|5.033003||Viu INSUBP_tb_p8|5.033003||Viu INSUBP_tb_pb|5.033003||Viu INT16_C|5.003007|5.003007| INT2PTR|5.006000|5.003007|p INT32_C|5.003007|5.003007| INT32_MIN|5.007002||Viu INT64_C|5.023002|5.023002| INT64_MIN|5.007002||Viu INT_64_T|5.011000||Viu INTMAX_C|5.003007|5.003007| INT_PAT_MODS|5.009005||Viu intro_my|5.004000|5.004000| INTSIZE|5.003007|5.003007|Vn intuit_method|5.005000||Viu intuit_more|5.003007||Viu IN_UNI_8_BIT|5.011002||Viu IN_UTF8_CTYPE_LOCALE|5.019009||Viu _inverse_folds|5.027011||cViu invert|5.003007||Viu invlist_array|5.013010||Vniu _invlist_array_init|5.015001||Vniu invlist_clear|5.023009||Viu invlist_clone|5.015001||cViu _invlist_contains_cp|5.017003||Vniu invlist_contents|5.023008||Viu _invlist_dump|5.019003||cViu _invlistEQ|5.023006||cViu invlist_extend|5.013010||Viu invlist_highest|5.017002||Vniu _invlist_intersection|5.015001||Viu _invlist_intersection_maybe_complement_2nd|5.015008||cViu _invlist_invert|5.015001||cViu invlist_is_iterating|5.017008||Vniu invlist_iterfinish|5.017008||Vniu invlist_iterinit|5.015001||Vniu invlist_iternext|5.015001||Vniu _invlist_len|5.017004||Vniu invlist_lowest|5.031007||xVniu invlist_max|5.013010||Vniu invlist_previous_index|5.017004||Vniu invlist_replace_list_destroys_src|5.023009||Viu _invlist_search|5.017003||cVniu invlist_set_len|5.013010||Viu invlist_set_previous_index|5.017004||Vniu _invlist_subtract|5.015001||Viu invlist_trim|5.013010||Vniu _invlist_union|5.015001||cVu _invlist_union_maybe_complement_2nd|5.015008||cViu invmap_dump|5.031006||Viu invoke_exception_hook|5.013001||Viu IoANY|5.006001||Viu IoBOTTOM_GV|5.003007||Viu IoBOTTOM_NAME|5.003007||Viu io_close|5.003007||Viu IOCPARM_LEN|5.003007||Viu ioctl|5.005000||Viu IoDIRP|5.003007||Viu IOf_ARGV|5.003007||Viu IOf_DIDTOP|5.003007||Viu IOf_FAKE_DIRP|5.006000||Viu IOf_FLUSH|5.003007||Viu IoFLAGS|5.003007||Viu IoFMT_GV|5.003007||Viu IoFMT_NAME|5.003007||Viu IOf_NOLINE|5.005003||Viu IOf_START|5.003007||Viu IOf_UNTAINT|5.003007||Viu IoIFP|5.003007||Viu IoLINES|5.003007||Viu IoLINES_LEFT|5.003007||Viu IoOFP|5.003007||Viu IoPAGE|5.003007||Viu IoPAGE_LEN|5.003007||Viu IoTOP_GV|5.003007||Viu IoTOP_NAME|5.003007||Viu IoTYPE|5.003007||Viu IoTYPE_APPEND|5.006001||Viu IoTYPE_CLOSED|5.006001||Viu IoTYPE_IMPLICIT|5.008001||Viu IoTYPE_NUMERIC|5.008001||Viu IoTYPE_PIPE|5.006001||Viu IoTYPE_RDONLY|5.006001||Viu IoTYPE_RDWR|5.006001||Viu IoTYPE_SOCKET|5.006001||Viu IoTYPE_STD|5.006001||Viu IoTYPE_WRONLY|5.006001||Viu I_POLL|5.006000|5.006000|Vn I_PTHREAD|5.005003|5.005003|Vn I_PWD|5.003007|5.003007|Vn isALNUM|5.003007|5.003007|p isALNUM_A|5.031003|5.003007|p isALNUMC|5.006000|5.003007|p isALNUMC_A|5.013006|5.003007|p isALNUMC_L1|5.013006|5.003007|p isALNUMC_LC|5.006000|5.006000| isALNUMC_LC_utf8_safe|5.031007||Viu isALNUMC_LC_uvchr|5.017007|5.017007| isALNUMC_uni|5.017007||Viu isALNUMC_utf8|5.017007||Viu isALNUMC_utf8_safe|5.031007||Viu isALNUM_lazy_if_safe|5.031007||Viu isALNUM_LC|5.004000|5.004000| isALNUM_LC_utf8|5.006000||Viu isALNUM_LC_utf8_safe|5.031007||Viu isALNUM_LC_uvchr|5.007001|5.007001| isALNUMU|5.011005||Viu isALNUM_uni|5.006000||Viu isALNUM_utf8|5.006000||Viu isALNUM_utf8_safe|5.031007||Viu isa_lookup|5.005000||Viu isALPHA|5.003007|5.003007|p isALPHA_A|5.013006|5.003007|p isALPHA_FOLD_EQ|5.021004||Viu isALPHA_FOLD_NE|5.021004||Viu isALPHA_L1|5.013006|5.003007|p isALPHA_LC|5.004000|5.004000| isALPHA_LC_utf8|5.006000||Viu isALPHA_LC_utf8_safe|5.025009|5.006000|p isALPHA_LC_uvchr|5.007001|5.007001| isALPHANUMERIC|5.017008|5.003007|p isALPHANUMERIC_A|5.017008|5.003007|p isALPHANUMERIC_L1|5.017008|5.003007|p isALPHANUMERIC_LC|5.017008|5.004000|p isALPHANUMERIC_LC_utf8|5.017008||Viu isALPHANUMERIC_LC_utf8_safe|5.025009|5.006000|p isALPHANUMERIC_LC_uvchr|5.017008|5.017008| isALPHANUMERIC_uni|5.017008||Viu isALPHANUMERIC_utf8|5.031005|5.031005| isALPHANUMERIC_utf8_safe|5.025009|5.006000|p isALPHANUMERIC_uvchr|5.023009|5.006000|p isALPHAU|5.011005||Viu isALPHA_uni|5.006000||Viu isALPHA_utf8|5.031005|5.031005| isALPHA_utf8_safe|5.025009|5.006000|p isALPHA_uvchr|5.023009|5.006000|p is_an_int|5.005000||Viu is_ANYOF_SYNTHETIC|5.019009||Viu IS_ANYOF_TRIE|5.009005||Viu isASCII|5.006000|5.003007|p isASCII_A|5.013006|5.003007|p isASCII_L1|5.015004|5.003007|p isASCII_LC|5.015008|5.003007|p isASCII_LC_utf8|5.017007||Viu isASCII_LC_utf8_safe|5.025009|5.025009| isASCII_LC_uvchr|5.017007|5.017007| is_ascii_string|5.011000|5.011000|n isASCII_uni|5.006000||Viu isASCII_utf8|5.031005|5.031005| isASCII_utf8_safe|5.025009|5.003007|p isASCII_uvchr|5.023009|5.003007|p isatty|5.005000||Viu ISA_VERSION_OBJ|5.019008||Viu isBLANK|5.006001|5.003007|p isBLANK_A|5.013006|5.003007|p isBLANK_L1|5.013006|5.003007|p isBLANK_LC|5.006001|5.003007|p isBLANK_LC_uni|5.006001||Viu isBLANK_LC_utf8|5.006001||Viu isBLANK_LC_utf8_safe|5.025009|5.006000|p isBLANK_LC_uvchr|5.017007|5.017007| isBLANK_uni|5.006001||Viu isBLANK_utf8|5.031005|5.031005| isBLANK_utf8_safe|5.025009|5.006000|p isBLANK_uvchr|5.023009|5.006000|p isC9_STRICT_UTF8_CHAR|5.025005|5.025005|n is_C9_STRICT_UTF8_CHAR_utf8_no_length_checks|5.025005||Viu is_C9_STRICT_UTF8_CHAR_utf8_no_length_checks_part0|5.025008||Viu is_C9_STRICT_UTF8_CHAR_utf8_no_length_checks_part1|5.025008||Viu is_c9strict_utf8_string|5.025006|5.025006|n is_c9strict_utf8_string_loc|5.025006|5.025006|n is_c9strict_utf8_string_loclen|5.025006|5.025006|n isCHARNAME_CONT|5.011005||Viu isCNTRL|5.006000|5.003007|p isCNTRL_A|5.013006|5.003007|p isCNTRL_L1|5.013006|5.003007|p isCNTRL_LC|5.006000|5.006000| isCNTRL_LC_utf8|5.006000||Viu isCNTRL_LC_utf8_safe|5.025009|5.006000|p isCNTRL_LC_uvchr|5.007001|5.007001| isCNTRL_uni|5.006000||Viu isCNTRL_utf8|5.031005|5.031005| isCNTRL_utf8_safe|5.025009|5.006000|p isCNTRL_uvchr|5.023009|5.006000|p _is_cur_LC_category_utf8|5.021001||cVu isDEBUG_WILDCARD|5.031011||Viu isDIGIT|5.003007|5.003007|p isDIGIT_A|5.013006|5.003007|p isDIGIT_L1|5.013006|5.003007|p isDIGIT_LC|5.004000|5.004000| isDIGIT_LC_utf8|5.006000||Viu isDIGIT_LC_utf8_safe|5.025009|5.006000|p isDIGIT_LC_uvchr|5.007001|5.007001| isDIGIT_uni|5.006000||Viu isDIGIT_utf8|5.031005|5.031005| isDIGIT_utf8_safe|5.025009|5.006000|p isDIGIT_uvchr|5.023009|5.006000|p isEXACTFish|5.033003||Viu isEXACT_REQ8|5.033003||Viu isFF_OVERLONG|5.025007||Vniu is_FOLDS_TO_MULTI_utf8|5.019009||Viu isFOO_lc|5.017007||Viu isFOO_utf8_lc|5.017008||Viu isGCB|5.021009||Viu isGRAPH|5.006000|5.003007|p isGRAPH_A|5.013006|5.003007|p is_grapheme|5.031007||Viu isGRAPH_L1|5.013006|5.003007|p isGRAPH_LC|5.006000|5.006000| isGRAPH_LC_utf8|5.006000||Viu isGRAPH_LC_utf8_safe|5.025009|5.006000|p isGRAPH_LC_uvchr|5.007001|5.007001| isGRAPH_uni|5.006000||Viu isGRAPH_utf8|5.031005|5.031005| isGRAPH_utf8_safe|5.025009|5.006000|p isGRAPH_uvchr|5.023009|5.006000|p isGV|5.003007||Viu isGV_or_RVCV|5.027005||Viu isGV_with_GP|5.009004|5.003007|p isGV_with_GP_off|5.009005||Viu isGV_with_GP_on|5.009005||Viu I_SHADOW|5.006000|5.006000|Vn is_handle_constructor|5.006000||Vniu is_HANGUL_ED_utf8_safe|5.029001||Viu is_HORIZWS_cp_high|5.017006||Viu is_HORIZWS_high|5.017006||Viu isIDCONT|5.017008|5.003007|p isIDCONT_A|5.017008|5.003007|p isIDCONT_L1|5.017008|5.003007|p isIDCONT_LC|5.017008|5.004000|p isIDCONT_LC_utf8|5.017008||Viu isIDCONT_LC_utf8_safe|5.025009|5.006000|p isIDCONT_LC_uvchr|5.017008|5.017008| isIDCONT_uni|5.017008||Viu isIDCONT_utf8|5.031005|5.031005| isIDCONT_utf8_safe|5.025009|5.006000|p isIDCONT_uvchr|5.023009|5.006000|p isIDFIRST|5.003007|5.003007|p isIDFIRST_A|5.013006|5.003007|p isIDFIRST_L1|5.013006|5.003007|p isIDFIRST_lazy_if_safe|5.025009||Viu isIDFIRST_LC|5.004000|5.004000|p isIDFIRST_LC_utf8|5.006000||Viu isIDFIRST_LC_utf8_safe|5.025009|5.006000|p isIDFIRST_LC_uvchr|5.007001|5.007001| isIDFIRST_uni|5.006000||Viu isIDFIRST_utf8|5.031005|5.031005| isIDFIRST_utf8_safe|5.025009|5.006000|p isIDFIRST_uvchr|5.023009|5.006000|p isinfnan|5.021004|5.021004|n isinfnansv|5.021005||Vi _is_in_locale_category|5.021001||cViu IS_IN_SOME_FOLD_L1|5.033005||Viu is_invariant_string|5.021007|5.011000|pn is_invlist|5.029002||Vniu is_LAX_VERSION|5.011004||Viu isLB|5.023007||Viu isLEXWARN_off|5.006000||Viu isLEXWARN_on|5.006000||Viu is_LNBREAK_latin1_safe|5.009005||Viu is_LNBREAK_safe|5.009005||Viu is_LNBREAK_utf8_safe|5.009005||Viu isLOWER|5.003007|5.003007|p isLOWER_A|5.013006|5.003007|p isLOWER_L1|5.013006|5.003007|p isLOWER_LC|5.004000|5.004000| isLOWER_LC_utf8|5.006000||Viu isLOWER_LC_utf8_safe|5.025009|5.006000|p isLOWER_LC_uvchr|5.007001|5.007001| isLOWER_uni|5.006000||Viu isLOWER_utf8|5.031005|5.031005| isLOWER_utf8_safe|5.025009|5.006000|p isLOWER_uvchr|5.023009|5.006000|p is_lvalue_sub|5.007001|5.007001|u isMNEMONIC_CNTRL|5.031009||Viu is_MULTI_CHAR_FOLD_latin1_safe|5.019010||Viu is_MULTI_CHAR_FOLD_utf8_safe|5.019010||Viu is_MULTI_CHAR_FOLD_utf8_safe_part0|5.019010||Viu is_MULTI_CHAR_FOLD_utf8_safe_part1|5.019010||Viu is_MULTI_CHAR_FOLD_utf8_safe_part2|5.025008||Viu is_MULTI_CHAR_FOLD_utf8_safe_part3|5.025008||Viu is_NONCHAR_utf8_safe|5.025005||Viu IS_NON_FINAL_FOLD|5.033005||Viu isnormal|5.021004||Viu IS_NUMBER_GREATER_THAN_UV_MAX|5.007002|5.003007|p IS_NUMBER_INFINITY|5.007002|5.003007|p IS_NUMBER_IN_UV|5.007002|5.003007|p IS_NUMBER_NAN|5.007003|5.003007|p IS_NUMBER_NEG|5.007002|5.003007|p IS_NUMBER_NOT_INT|5.007002|5.003007|p IS_NUMBER_TRAILING|5.021002||Viu IS_NUMERIC_RADIX|5.006000||Viu isOCTAL|5.013005|5.003007|p isOCTAL_A|5.013006|5.003007|p isOCTAL_L1|5.013006|5.003007|p IS_PADCONST|5.006000||Viu IS_PADGV|5.006000||Viu is_PATWS_safe|5.017008||Viu isPOWER_OF_2|5.029006||Viu isPRINT|5.004000|5.003007|p isPRINT_A|5.013006|5.003007|p isPRINT_L1|5.013006|5.003007|p isPRINT_LC|5.004000|5.004000| isPRINT_LC_utf8|5.006000||Viu isPRINT_LC_utf8_safe|5.025009|5.006000|p isPRINT_LC_uvchr|5.007001|5.007001| isPRINT_uni|5.006000||Viu isPRINT_utf8|5.031005|5.031005| isPRINT_utf8_safe|5.025009|5.006000|p isPRINT_uvchr|5.023009|5.006000|p is_PROBLEMATIC_LOCALE_FOLD_cp|5.019009||Viu is_PROBLEMATIC_LOCALE_FOLDEDS_START_cp|5.019009||Viu is_PROBLEMATIC_LOCALE_FOLDEDS_START_utf8|5.019009||Viu is_PROBLEMATIC_LOCALE_FOLD_utf8|5.019009||Viu isPSXSPC|5.006001|5.003007|p isPSXSPC_A|5.013006|5.003007|p isPSXSPC_L1|5.013006|5.003007|p isPSXSPC_LC|5.006001|5.006001| isPSXSPC_LC_utf8|5.006001||Viu isPSXSPC_LC_utf8_safe|5.025009|5.006000|p isPSXSPC_LC_uvchr|5.017007|5.017007| isPSXSPC_uni|5.006001||Viu isPSXSPC_utf8|5.031005|5.031005| isPSXSPC_utf8_safe|5.025009|5.006000|p isPSXSPC_uvchr|5.023009|5.006000|p isPUNCT|5.006000|5.003007|p isPUNCT_A|5.013006|5.003007|p isPUNCT_L1|5.013006|5.003007|p isPUNCT_LC|5.006000|5.006000| isPUNCT_LC_utf8|5.006000||Viu isPUNCT_LC_utf8_safe|5.025009|5.006000|p isPUNCT_LC_uvchr|5.007001|5.007001| isPUNCT_uni|5.006000||Viu isPUNCT_utf8|5.031005|5.031005| isPUNCT_utf8_safe|5.025009|5.006000|p isPUNCT_uvchr|5.023009|5.006000|p is_QUOTEMETA_high|5.017004||Viu is_QUOTEMETA_high_part0|5.021001||Viu is_QUOTEMETA_high_part1|5.021001||Viu isREGEXP|5.017006||Viu IS_SAFE_PATHNAME|5.019004||Viu IS_SAFE_SYSCALL|5.019004|5.019004| is_safe_syscall|5.019004|5.019004| isSB|5.021009||Viu isSCRIPT_RUN|5.027008||cVi isSPACE|5.003007|5.003007|p isSPACE_A|5.013006|5.003007|p isSPACE_L1|5.013006|5.003007|p isSPACE_LC|5.004000|5.004000| isSPACE_LC_utf8|5.006000||Viu isSPACE_LC_utf8_safe|5.025009|5.006000|p isSPACE_LC_uvchr|5.007001|5.007001| isSPACE_uni|5.006000||Viu isSPACE_utf8|5.031005|5.031005| isSPACE_utf8_safe|5.025009|5.006000|p isSPACE_uvchr|5.023009|5.006000|p is_ssc_worth_it|5.021005||Vniu isSTRICT_UTF8_CHAR|5.025005|5.025005|n is_STRICT_UTF8_CHAR_utf8_no_length_checks|5.025005||Viu is_STRICT_UTF8_CHAR_utf8_no_length_checks_part0|5.025005||Viu is_STRICT_UTF8_CHAR_utf8_no_length_checks_part1|5.025005||Viu is_STRICT_UTF8_CHAR_utf8_no_length_checks_part2|5.025008||Viu is_STRICT_UTF8_CHAR_utf8_no_length_checks_part3|5.025008||Viu is_strict_utf8_string|5.025006|5.025006|n is_strict_utf8_string_loc|5.025006|5.025006|n is_strict_utf8_string_loclen|5.025006|5.025006|n is_STRICT_VERSION|5.011004||Viu is_SURROGATE_utf8_safe|5.025005||Viu I_STDARG|5.003007||Viu I_STDBOOL|5.015003|5.015003|Vn I_STDINT|5.021004|5.021004|Vn is_THREE_CHAR_FOLD_HEAD_latin1_safe|5.031007||Viu is_THREE_CHAR_FOLD_HEAD_utf8_safe|5.031007||Viu is_THREE_CHAR_FOLD_latin1_safe|5.031007||Viu is_THREE_CHAR_FOLD_utf8_safe|5.031007||Viu IS_TRIE_AC|5.009005||Viu _is_uni_FOO|5.017008||cVu _is_uni_perl_idcont|5.017008||cVu _is_uni_perl_idstart|5.017007||cVu isUPPER|5.003007|5.003007|p isUPPER_A|5.013006|5.003007|p isUPPER_L1|5.013006|5.003007|p isUPPER_LC|5.004000|5.004000| isUPPER_LC_utf8|5.006000||Viu isUPPER_LC_utf8_safe|5.025009|5.006000|p isUPPER_LC_uvchr|5.007001|5.007001| isUPPER_uni|5.006000||Viu isUPPER_utf8|5.031005|5.031005| isUPPER_utf8_safe|5.025009|5.006000|p isUPPER_uvchr|5.023009|5.006000|p is_utf8_char|5.006000|5.006000|dn IS_UTF8_CHAR|5.009003||Viu isUTF8_CHAR|5.021001|5.006001|pn is_utf8_char_buf|5.015008|5.015008|n isUTF8_CHAR_flags|5.025005|5.025005| is_utf8_char_helper|5.031004||cVnu is_UTF8_CHAR_utf8_no_length_checks|5.021001||Viu is_utf8_common|5.009003||Viu is_utf8_cp_above_31_bits|5.025005||Vniu is_utf8_fixed_width_buf_flags|5.025006|5.025006|n is_utf8_fixed_width_buf_loc_flags|5.025006|5.025006|n is_utf8_fixed_width_buf_loclen_flags|5.025006|5.025006|n _is_utf8_FOO|5.031006||cVu is_utf8_invariant_string|5.025005|5.011000|pn is_utf8_invariant_string_loc|5.027001|5.027001|n is_utf8_non_invariant_string|5.027007||cVni is_utf8_overlong_given_start_byte_ok|5.025006||Vniu _is_utf8_perl_idcont|5.031006||cVu _is_utf8_perl_idstart|5.031006||cVu isUTF8_POSSIBLY_PROBLEMATIC|5.023003||Viu is_utf8_string|5.006001|5.006001|n is_utf8_string_flags|5.025006|5.025006|n is_utf8_string_loc|5.008001|5.008001|n is_utf8_string_loc_flags|5.025006|5.025006|n is_utf8_string_loclen|5.009003|5.009003|n is_utf8_string_loclen_flags|5.025006|5.025006|n is_utf8_valid_partial_char|5.025005|5.025005|n is_utf8_valid_partial_char_flags|5.025005|5.025005|n is_VERTWS_cp_high|5.017006||Viu is_VERTWS_high|5.017006||Viu isVERTWS_uni|5.017006||Viu isVERTWS_utf8|5.017006||Viu isVERTWS_utf8_safe|5.025009||Viu isVERTWS_uvchr|5.023009||Viu isWARNf_on|5.006001||Viu isWARN_on|5.006000||Viu isWARN_ONCE|5.006000||Viu isWB|5.021009||Viu isWORDCHAR|5.013006|5.003007|p isWORDCHAR_A|5.013006|5.003007|p isWORDCHAR_L1|5.013006|5.003007|p isWORDCHAR_lazy_if_safe|5.025009||Viu isWORDCHAR_LC|5.017007|5.004000|p isWORDCHAR_LC_utf8|5.017007||Viu isWORDCHAR_LC_utf8_safe|5.025009|5.006000|p isWORDCHAR_LC_uvchr|5.017007|5.017007| isWORDCHAR_uni|5.017006||Viu isWORDCHAR_utf8|5.031005|5.031005| isWORDCHAR_utf8_safe|5.025009|5.006000|p isWORDCHAR_uvchr|5.023009|5.006000|p isXDIGIT|5.006000|5.003007|p isXDIGIT_A|5.013006|5.003007|p is_XDIGIT_cp_high|5.017006||Viu is_XDIGIT_high|5.017006||Viu isXDIGIT_L1|5.013006|5.003007|p isXDIGIT_LC|5.017007|5.003007|p isXDIGIT_LC_utf8|5.017007||Viu isXDIGIT_LC_utf8_safe|5.025009|5.006000|p isXDIGIT_LC_uvchr|5.017007|5.017007| isXDIGIT_uni|5.006000||Viu isXDIGIT_utf8|5.031005|5.031005| isXDIGIT_utf8_safe|5.025009|5.006000|p isXDIGIT_uvchr|5.023009|5.006000|p is_XPERLSPACE_cp_high|5.017006||Viu is_XPERLSPACE_high|5.017006||Viu I_SYS_DIR|5.003007|5.003007|Vn I_SYS_FILE|5.003007|5.003007|Vn I_SYS_IOCTL|5.003007|5.003007|Vn I_SYSLOG|5.006000|5.006000|Vn I_SYS_MOUNT|5.023005|5.023005|Vn I_SYS_PARAM|5.003007|5.003007|Vn I_SYS_POLL|5.010001|5.010001|Vn I_SYS_RESOURCE|5.003007|5.003007|Vn I_SYS_SELECT|5.003007|5.003007|Vn I_SYS_STAT|5.003007|5.003007|Vn I_SYS_STATFS|5.023005|5.023005|Vn I_SYS_STATVFS|5.023005|5.023005|Vn I_SYS_TIME|5.003007|5.003007|Vn I_SYS_TIMES|5.003007|5.003007|Vn I_SYS_TYPES|5.003007|5.003007|Vn I_SYSUIO|5.006000|5.006000|Vn I_SYS_UN|5.003007|5.003007|Vn I_SYSUTSNAME|5.006000|5.006000|Vn I_SYS_VFS|5.023005|5.023005|Vn I_SYS_WAIT|5.003007|5.003007|Vn items||5.003007| I_TERMIOS|5.003007|5.003007|Vn I_TIME|5.003007|5.003007|Vn I_UNISTD|5.003007|5.003007|Vn I_USTAT|5.023005|5.023005|Vn I_UTIME|5.003007|5.003007|Vn I_V|5.006000|5.003007| IVdf|5.006000|5.003007|poVn IV_DIG|5.006000||Viu IV_IS_QUAD|5.006000||Viu IV_MAX|5.003007|5.003007| IV_MAX_P1|5.007002||Viu IV_MIN|5.003007|5.003007| IVSIZE|5.006000|5.003007|poVn IVTYPE|5.006000|5.003007|poVn I_WCHAR|5.027006|5.027006|Vn I_WCTYPE|5.029009|5.029009|Vn ix||5.003007| I_XLOCALE|5.025004|5.025004|Vn JE_OLD_STACK_HWM_restore|5.027002||Viu JE_OLD_STACK_HWM_save|5.027002||Viu JE_OLD_STACK_HWM_zero|5.027002||Viu jmaybe|5.003007||Viu JMPENV_BOOTSTRAP|5.006000||Viu JMPENV_JUMP|5.004000|5.004000| JMPENV_POP|5.004000||Viu JMPENV_PUSH|5.004000||Viu JOIN|5.005000||Viu join_exact|5.009004||Viu kBINOP|5.003007||Viu kCOP|5.003007||Viu KEEPCOPY_PAT_MOD|5.009005||Viu KEEPCOPY_PAT_MODS|5.009005||Viu KEEPS|5.009005||Viu KEEPS_next|5.009005||Viu KEEPS_next_fail|5.009005||Viu KEEPS_next_fail_t8_p8|5.033003||Viu KEEPS_next_fail_t8_pb|5.033003||Viu KEEPS_next_fail_tb_p8|5.033003||Viu KEEPS_next_fail_tb_pb|5.033003||Viu KEEPS_next_t8_p8|5.033003||Viu KEEPS_next_t8_pb|5.033003||Viu KEEPS_next_tb_p8|5.033003||Viu KEEPS_next_tb_pb|5.033003||Viu KEEPS_t8_p8|5.033003||Viu KEEPS_t8_pb|5.033003||Viu KEEPS_tb_p8|5.033003||Viu KEEPS_tb_pb|5.033003||Viu KELVIN_SIGN|5.017003||Viu KERNEL|5.003007||Viu KEY_abs|5.003007||Viu KEY_accept|5.003007||Viu KEY_alarm|5.003007||Viu KEY_and|5.003007||Viu KEY_atan2|5.003007||Viu KEY_AUTOLOAD|5.003007||Viu KEY_BEGIN|5.003007||Viu KEY_bind|5.003007||Viu KEY_binmode|5.003007||Viu KEY_bless|5.003007||Viu KEY_break|5.027008||Viu KEY_caller|5.003007||Viu KEY_catch|5.033007||Viu KEY_chdir|5.003007||Viu KEY_CHECK|5.006000||Viu KEY_chmod|5.003007||Viu KEY_chomp|5.003007||Viu KEY_chop|5.003007||Viu KEY_chown|5.003007||Viu KEY_chr|5.003007||Viu KEY_chroot|5.003007||Viu KEY_close|5.003007||Viu KEY_closedir|5.003007||Viu KEY_cmp|5.003007||Viu KEY_connect|5.003007||Viu KEY_continue|5.003007||Viu KEY_cos|5.003007||Viu KEY_crypt|5.003007||Viu KEY___DATA|5.003007||Viu KEY_dbmclose|5.003007||Viu KEY_dbmopen|5.003007||Viu KEY_default|5.027008||Viu KEY_defined|5.003007||Viu KEY_delete|5.003007||Viu KEY_DESTROY|5.003007||Viu KEY_die|5.003007||Viu KEY_do|5.003007||Viu KEY_dump|5.003007||Viu KEY_each|5.003007||Viu KEY_else|5.003007||Viu KEY_elsif|5.003007||Viu KEY___END|5.003007||Viu KEY_END|5.003007||Viu KEY_endgrent|5.003007||Viu KEY_endhostent|5.003007||Viu KEY_endnetent|5.003007||Viu KEY_endprotoent|5.003007||Viu KEY_endpwent|5.003007||Viu KEY_endservent|5.003007||Viu KEY_eof|5.003007||Viu KEY_eq|5.003007||Viu KEY_eval|5.003007||Viu KEY_evalbytes|5.015005||Viu KEY_exec|5.003007||Viu KEY_exists|5.003007||Viu KEY_exit|5.003007||Viu KEY_exp|5.003007||Viu KEY_fc|5.015008||Viu KEY_fcntl|5.003007||Viu KEY___FILE|5.003007||Viu KEY_fileno|5.003007||Viu KEY_flock|5.003007||Viu KEY_for|5.003007||Viu KEY_foreach|5.003007||Viu KEY_fork|5.003007||Viu KEY_format|5.003007||Viu KEY_formline|5.003007||Viu KEY_ge|5.003007||Viu KEY_getc|5.003007||Viu KEY_getgrent|5.003007||Viu KEY_getgrgid|5.003007||Viu KEY_getgrnam|5.003007||Viu KEY_gethostbyaddr|5.003007||Viu KEY_gethostbyname|5.003007||Viu KEY_gethostent|5.003007||Viu KEY_getlogin|5.003007||Viu KEY_getnetbyaddr|5.003007||Viu KEY_getnetbyname|5.003007||Viu KEY_getnetent|5.003007||Viu KEY_getpeername|5.003007||Viu KEY_getpgrp|5.003007||Viu KEY_getppid|5.003007||Viu KEY_getpriority|5.003007||Viu KEY_getprotobyname|5.003007||Viu KEY_getprotobynumber|5.003007||Viu KEY_getprotoent|5.003007||Viu KEY_getpwent|5.003007||Viu KEY_getpwnam|5.003007||Viu KEY_getpwuid|5.003007||Viu KEY_getservbyname|5.003007||Viu KEY_getservbyport|5.003007||Viu KEY_getservent|5.003007||Viu KEY_getsockname|5.003007||Viu KEY_getsockopt|5.003007||Viu KEY_getspnam|5.031011||Viu KEY_given|5.009003||Viu KEY_glob|5.003007||Viu KEY_gmtime|5.003007||Viu KEY_goto|5.003007||Viu KEY_grep|5.003007||Viu KEY_gt|5.003007||Viu KEY_hex|5.003007||Viu KEY_if|5.003007||Viu KEY_index|5.003007||Viu KEY_INIT|5.005000||Viu KEY_int|5.003007||Viu KEY_ioctl|5.003007||Viu KEY_isa|5.031007||Viu KEY_join|5.003007||Viu KEY_keys|5.003007||Viu KEY_kill|5.003007||Viu KEY_last|5.003007||Viu KEY_lc|5.003007||Viu KEY_lcfirst|5.003007||Viu KEY_le|5.003007||Viu KEY_length|5.003007||Viu KEY___LINE|5.003007||Viu KEY_link|5.003007||Viu KEY_listen|5.003007||Viu KEY_local|5.003007||Viu KEY_localtime|5.003007||Viu KEY_lock|5.005000||Viu KEY_log|5.003007||Viu KEY_lstat|5.003007||Viu KEY_lt|5.003007||Viu KEY_m|5.003007||Viu KEY_map|5.003007||Viu KEY_mkdir|5.003007||Viu KEY_msgctl|5.003007||Viu KEY_msgget|5.003007||Viu KEY_msgrcv|5.003007||Viu KEY_msgsnd|5.003007||Viu KEY_my|5.003007||Viu KEY_ne|5.003007||Viu KEY_next|5.003007||Viu KEY_no|5.003007||Viu KEY_not|5.003007||Viu KEY_NULL|5.003007||Viu KEY_oct|5.003007||Viu KEY_open|5.003007||Viu KEY_opendir|5.003007||Viu KEY_or|5.003007||Viu KEY_ord|5.003007||Viu KEY_our|5.006000||Viu KEY_pack|5.003007||Viu KEY_package|5.003007||Viu KEY___PACKAGE|5.004000||Viu KEY_pipe|5.003007||Viu KEY_pop|5.003007||Viu KEY_pos|5.003007||Viu KEY_print|5.003007||Viu KEY_printf|5.003007||Viu KEY_prototype|5.003007||Viu KEY_push|5.003007||Viu KEY_q|5.003007||Viu KEY_qq|5.003007||Viu KEY_qr|5.005000||Viu KEY_quotemeta|5.003007||Viu KEY_qw|5.003007||Viu KEY_qx|5.003007||Viu KEY_rand|5.003007||Viu KEY_read|5.003007||Viu KEY_readdir|5.003007||Viu KEY_readline|5.003007||Viu KEY_readlink|5.003007||Viu KEY_readpipe|5.003007||Viu KEY_recv|5.003007||Viu KEY_redo|5.003007||Viu KEY_ref|5.003007||Viu KEY_rename|5.003007||Viu KEY_require|5.003007||Viu KEY_reset|5.003007||Viu KEY_return|5.003007||Viu KEY_reverse|5.003007||Viu KEY_rewinddir|5.003007||Viu KEY_rindex|5.003007||Viu KEY_rmdir|5.003007||Viu KEY_s|5.003007||Viu KEY_say|5.009003||Viu KEY_scalar|5.003007||Viu KEY_seek|5.003007||Viu KEY_seekdir|5.003007||Viu KEY_select|5.003007||Viu KEY_semctl|5.003007||Viu KEY_semget|5.003007||Viu KEY_semop|5.003007||Viu KEY_send|5.003007||Viu KEY_setgrent|5.003007||Viu KEY_sethostent|5.003007||Viu KEY_setnetent|5.003007||Viu KEY_setpgrp|5.003007||Viu KEY_setpriority|5.003007||Viu KEY_setprotoent|5.003007||Viu KEY_setpwent|5.003007||Viu KEY_setservent|5.003007||Viu KEY_setsockopt|5.003007||Viu KEY_shift|5.003007||Viu KEY_shmctl|5.003007||Viu KEY_shmget|5.003007||Viu KEY_shmread|5.003007||Viu KEY_shmwrite|5.003007||Viu KEY_shutdown|5.003007||Viu KEY_sigvar|5.025004||Viu KEY_sin|5.003007||Viu KEY_sleep|5.003007||Viu KEY_socket|5.003007||Viu KEY_socketpair|5.003007||Viu KEY_sort|5.003007||Viu KEY_splice|5.003007||Viu KEY_split|5.003007||Viu KEY_sprintf|5.003007||Viu KEY_sqrt|5.003007||Viu KEY_srand|5.003007||Viu KEY_stat|5.003007||Viu KEY_state|5.009004||Viu KEY_study|5.003007||Viu KEY_sub|5.003007||Viu KEY___SUB|5.015006||Viu KEY_substr|5.003007||Viu KEY_symlink|5.003007||Viu KEY_syscall|5.003007||Viu KEY_sysopen|5.003007||Viu KEY_sysread|5.003007||Viu KEY_sysseek|5.004000||Viu KEY_system|5.003007||Viu KEY_syswrite|5.003007||Viu KEY_tell|5.003007||Viu KEY_telldir|5.003007||Viu KEY_tie|5.003007||Viu KEY_tied|5.003007||Viu KEY_time|5.003007||Viu KEY_times|5.003007||Viu KEY_tr|5.003007||Viu KEY_truncate|5.003007||Viu KEY_try|5.033007||Viu KEY_uc|5.003007||Viu KEY_ucfirst|5.003007||Viu KEY_umask|5.003007||Viu KEY_undef|5.003007||Viu KEY_UNITCHECK|5.009005||Viu KEY_unless|5.003007||Viu KEY_unlink|5.003007||Viu KEY_unpack|5.003007||Viu KEY_unshift|5.003007||Viu KEY_untie|5.003007||Viu KEY_until|5.003007||Viu KEY_use|5.003007||Viu KEY_utime|5.003007||Viu KEY_values|5.003007||Viu KEY_vec|5.003007||Viu KEY_wait|5.003007||Viu KEY_waitpid|5.003007||Viu KEY_wantarray|5.003007||Viu KEY_warn|5.003007||Viu KEY_when|5.027008||Viu KEY_while|5.003007||Viu keyword|5.003007||Viu KEYWORD_PLUGIN_DECLINE|5.011002||Viu KEYWORD_PLUGIN_EXPR|5.011002||Viu KEYWORD_PLUGIN_MUTEX_INIT|5.027006||Viu KEYWORD_PLUGIN_MUTEX_LOCK|5.027006||Viu KEYWORD_PLUGIN_MUTEX_TERM|5.027006||Viu KEYWORD_PLUGIN_MUTEX_UNLOCK|5.027006||Viu keyword_plugin_standard|||iu KEYWORD_PLUGIN_STMT|5.011002||Viu KEY_write|5.003007||Viu KEY_x|5.003007||Viu KEY_xor|5.003007||Viu KEY_y|5.003007||Viu kGVOP_gv|5.006000||Viu kill|5.005000||Viu killpg|5.005000||Viu kLISTOP|5.003007||Viu kLOGOP|5.003007||Viu kLOOP|5.003007||Viu kPADOP|5.006000||Viu kPMOP|5.003007||Viu kPVOP|5.003007||Viu kSVOP|5.003007||Viu kSVOP_sv|5.006000||Viu kUNOP|5.003007||Viu kUNOP_AUX|5.021007||Viu LATIN1_TO_NATIVE|5.019004|5.003007|p LATIN_CAPITAL_LETTER_A_WITH_RING_ABOVE|5.013011||Viu LATIN_CAPITAL_LETTER_A_WITH_RING_ABOVE_NATIVE|5.017004||Viu LATIN_CAPITAL_LETTER_I_WITH_DOT_ABOVE|5.023002||Viu LATIN_CAPITAL_LETTER_I_WITH_DOT_ABOVE_UTF8|5.023002||Viu LATIN_CAPITAL_LETTER_SHARP_S|5.014000||Viu LATIN_CAPITAL_LETTER_SHARP_S_UTF8|5.019001||Viu LATIN_CAPITAL_LETTER_Y_WITH_DIAERESIS|5.013011||Viu LATIN_SMALL_LETTER_A_WITH_RING_ABOVE|5.013011||Viu LATIN_SMALL_LETTER_A_WITH_RING_ABOVE_NATIVE|5.017004||Viu LATIN_SMALL_LETTER_DOTLESS_I|5.023002||Viu LATIN_SMALL_LETTER_DOTLESS_I_UTF8|5.023002||Viu LATIN_SMALL_LETTER_LONG_S|5.017003||Viu LATIN_SMALL_LETTER_LONG_S_UTF8|5.019001||Viu LATIN_SMALL_LETTER_SHARP_S|5.011002||Viu LATIN_SMALL_LETTER_SHARP_S_NATIVE|5.017004||Viu LATIN_SMALL_LETTER_SHARP_S_UTF8|5.033003||Viu LATIN_SMALL_LETTER_Y_WITH_DIAERESIS|5.011002||Viu LATIN_SMALL_LETTER_Y_WITH_DIAERESIS_NATIVE|5.017004||Viu LATIN_SMALL_LIGATURE_LONG_S_T|5.019004||Viu LATIN_SMALL_LIGATURE_LONG_S_T_UTF8|5.019004||Viu LATIN_SMALL_LIGATURE_ST|5.019004||Viu LATIN_SMALL_LIGATURE_ST_UTF8|5.019004||Viu LB_BREAKABLE|5.023007||Viu LB_CM_ZWJ_foo|5.025003||Viu LB_HY_or_BA_then_foo|5.023007||Viu LB_NOBREAK|5.023007||Viu LB_NOBREAK_EVEN_WITH_SP_BETWEEN|5.023007||Viu LB_PR_or_PO_then_OP_or_HY|5.023007||Viu LB_RI_then_RI|5.025003||Viu LB_SP_foo|5.023007||Viu LB_SY_or_IS_then_various|5.023007||Viu LB_various_then_PO_or_PR|5.023007||Viu LC_NUMERIC_LOCK|5.027009||pVu LC_NUMERIC_UNLOCK|5.027009||pVu LDBL_DIG|5.006000||Viu LEAVE|5.003007|5.003007| leave_adjust_stacks|5.023008|5.023008|xu leave_scope|5.003007|5.003007|u LEAVE_SCOPE|5.003007||Viu LEAVE_with_name|5.011002|5.011002| LEXACT|5.031005||Viu LEXACT_REQ8|5.031006||Viu LEXACT_REQ8_t8_p8|5.033003||Viu LEXACT_REQ8_t8_pb|5.033003||Viu LEXACT_REQ8_tb_p8|5.033003||Viu LEXACT_REQ8_tb_pb|5.033003||Viu LEXACT_t8_p8|5.033003||Viu LEXACT_t8_pb|5.033003||Viu LEXACT_tb_p8|5.033003||Viu LEXACT_tb_pb|5.033003||Viu lex_bufutf8|5.011002|5.011002|x lex_discard_to|5.011002|5.011002|x LEX_DONT_CLOSE_RSFP|5.015009||Viu LEX_EVALBYTES|5.015005||Viu lex_grow_linestr|5.011002|5.011002|x LEX_IGNORE_UTF8_HINTS|5.015005||Viu LEX_KEEP_PREVIOUS|5.011002|5.011002| lex_next_chunk|5.011002|5.011002|x LEX_NOTPARSING|5.004004||Viu lex_peek_unichar|5.011002|5.011002|x lex_read_space|5.011002|5.011002|x lex_read_to|5.011002|5.011002|x lex_read_unichar|5.011002|5.011002|x lex_start|5.009005|5.009005|x LEX_START_COPIED|5.015005||Viu LEX_START_FLAGS|5.015005||Viu LEX_START_SAME_FILTER|5.014000||Viu lex_stuff_pv|5.013006|5.013006|x lex_stuff_pvn|5.011002|5.011002|x lex_stuff_pvs|5.013005|5.013005|x lex_stuff_sv|5.011002|5.011002|x LEX_STUFF_UTF8|5.011002|5.011002| lex_unstuff|5.011002|5.011002|x LF_NATIVE|5.019004||Viu LIB_INVARG|5.008001||Viu LIBM_LIB_VERSION|5.009003|5.009003|Vn LIKELY|5.009004|5.003007|p link|5.006000||Viu LINKLIST|5.013006|5.013006| list|5.003007||Viu listen|5.005000||Viu listkids|5.003007||Viu LNBREAK|5.009005||Viu LNBREAK_t8_p8|5.033003||Viu LNBREAK_t8_pb|5.033003||Viu LNBREAK_tb_p8|5.033003||Viu LNBREAK_tb_pb|5.033003||Viu load_charnames|5.031010||cViu load_module|5.006000|5.003007|pv load_module_nocontext|5.006000||vVn LOCALECONV_LOCK|5.033005||Viu LOCALECONV_UNLOCK|5.033005||Viu LOCALE_INIT|5.024000||Viu LOCALE_INIT_LC_NUMERIC|5.033005||Viu LOCALE_LOCK|5.024000||Viu LOCALE_PAT_MOD|5.013006||Viu LOCALE_PAT_MODS|5.013006||Viu LOCALE_READ_LOCK|5.033005||Viu LOCALE_READ_UNLOCK|5.033005||Viu LOCALE_TERM|5.024000||Viu LOCALE_TERM_LC_NUMERIC|5.033005||Viu LOCALE_TERM_POSIX_2008|5.033005||Viu LOCALE_UNLOCK|5.024000||Viu localize|5.003007||Viu LOCAL_PATCH_COUNT|5.003007||Viu localtime|5.031011||Viu LOCALTIME_MAX|5.010001|5.010001|Vn LOCALTIME_MIN|5.010001|5.010001|Vn LOCALTIME_R_NEEDS_TZSET|5.010000|5.010000|Vn LOCALTIME_R_PROTO|5.008000|5.008000|Vn LOCK_DOLLARZERO_MUTEX|5.008001||Viu lockf|5.006000||Viu LOCK_LC_NUMERIC_STANDARD|5.021010||poVnu LOCK_NUMERIC_STANDARD|||piu LOC_SED|5.003007|5.003007|Vn LOGICAL|5.005000||Viu LOGICAL_t8_p8|5.033003||Viu LOGICAL_t8_pb|5.033003||Viu LOGICAL_tb_p8|5.033003||Viu LOGICAL_tb_pb|5.033003||Viu LONGDBLINFBYTES|5.023000|5.023000|Vn LONGDBLMANTBITS|5.023000|5.023000|Vn LONGDBLNANBYTES|5.023000|5.023000|Vn LONGDOUBLE_BIG_ENDIAN|5.021009||Viu LONGDOUBLE_DOUBLEDOUBLE|5.021009||Viu LONG_DOUBLE_EQUALS_DOUBLE|5.007001||Viu LONG_DOUBLE_IS_DOUBLE|5.021003|5.021003|Vn LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_BE_BE|5.023006|5.023006|Vn LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_BE_LE|5.023006|5.023006|Vn LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_BIG_ENDIAN|5.021003|5.021003|Vn LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_LE_BE|5.023006|5.023006|Vn LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_LE_LE|5.023006|5.023006|Vn LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_LITTLE_ENDIAN|5.021003|5.021003|Vn LONG_DOUBLE_IS_IEEE_754_128_BIT_BIG_ENDIAN|5.021003|5.021003|Vn LONG_DOUBLE_IS_IEEE_754_128_BIT_LITTLE_ENDIAN|5.021003|5.021003|Vn LONG_DOUBLE_IS_UNKNOWN_FORMAT|5.021003|5.021003|Vn LONG_DOUBLE_IS_VAX_H_FLOAT|5.025004|5.025004|Vn LONG_DOUBLE_IS_X86_80_BIT_BIG_ENDIAN|5.021003|5.021003|Vn LONG_DOUBLE_IS_X86_80_BIT_LITTLE_ENDIAN|5.021003|5.021003|Vn LONG_DOUBLEKIND|5.021003|5.021003|Vn LONGDOUBLE_LITTLE_ENDIAN|5.021009||Viu LONGDOUBLE_MIX_ENDIAN|5.023006||Viu LONG_DOUBLESIZE|5.005000|5.005000|Vn LONG_DOUBLE_STYLE_IEEE|5.025007|5.025007|Vn LONG_DOUBLE_STYLE_IEEE_EXTENDED|5.025007|5.025007|Vn LONGDOUBLE_VAX_ENDIAN|5.025004||Viu LONGDOUBLE_X86_80_BIT|5.021009||Viu LONGJMP|5.005000||Viu longjmp|5.005000||Viu LONGJMP_t8_p8|5.033003||Viu LONGJMP_t8_pb|5.033003||Viu LONGJMP_tb_p8|5.033003||Viu LONGJMP_tb_pb|5.033003||Viu LONGLONGSIZE|5.005000|5.005000|Vn LONGSIZE|5.004000|5.003007|oVn looks_like_bool|5.027008||Viu looks_like_number|5.003007|5.003007| LOOP_PAT_MODS|5.009005||Viu lop|5.005000||Viu lossless_NV_to_IV|5.031001||Vniu LOWEST_ANYOF_HRx_BYTE|5.031002||Viu L_R_TZSET|5.009005|5.009005|Vn lseek|5.005000||Viu LSEEKSIZE|5.006000|5.006000|Vn lstat|5.005000||Viu LvFLAGS|5.015006||Viu LVf_NEG_LEN|5.027001||Viu LVf_NEG_OFF|5.027001||Viu LVf_OUT_OF_RANGE|5.027001||Viu LVRET|5.007001||Vi LvSTARGOFF|5.019004||Viu LvTARG|5.003007||Viu LvTARGLEN|5.003007||Viu LvTARGOFF|5.003007||Viu LvTYPE|5.003007||Viu magic_clear_all_env|5.004001||Viu magic_cleararylen_p|5.017002||Viu magic_clearenv|5.003007||Viu magic_clearhint|5.009004||Vi magic_clearhints|5.011000||Vi magic_clearisa|5.010001||Viu magic_clearpack|5.003007||Viu magic_clearsig|5.003007||Viu magic_copycallchecker|5.017000||Viu magic_dump|5.006000|5.006000|u magic_existspack|5.003007||Viu magic_freearylen_p|5.009003||Viu magic_freecollxfrm|5.033004||Viu magic_freemglob|5.033004||Viu magic_freeovrld|5.007001||Viu magic_freeutf8|5.033004||Viu magic_get|5.003007||Viu magic_getarylen|5.003007||Viu magic_getdebugvar|5.021005||Viu magic_getdefelem|5.004000||Viu magic_getnkeys|5.004005||Viu magic_getpack|5.003007||Viu magic_getpos|5.003007||Viu magic_getsig|5.003007||Viu magic_getsubstr|5.004005||Viu magic_gettaint|5.003007||Viu magic_getuvar|5.003007||Viu magic_getvec|5.004005||Viu magic_killbackrefs|5.006000||Viu magic_methcall1|5.013001||Viu magic_methcall|||vi magic_methpack|5.005000||Viu magic_nextpack|5.003007||Viu magic_regdata_cnt|5.006000||Viu magic_regdatum_get|5.006000||Viu magic_regdatum_set|5.006001||Viu magic_scalarpack|5.009001||Viu magic_set|5.003007||Viu magic_set_all_env|5.004004||Viu magic_setarylen|5.003007||Viu magic_setcollxfrm|5.004000||Viu magic_setdbline|5.003007||Viu magic_setdebugvar|5.021005||Viu magic_setdefelem|5.004000||Viu magic_setenv|5.003007||Viu magic_sethint|5.009004||Vi magic_sethint_feature|5.031007||Viu magic_setisa|5.003007||Viu magic_setlvref|5.021005||Viu magic_setmglob|5.003007||Viu magic_setnkeys|5.003007||Viu magic_setnonelem|5.027009||Viu magic_setpack|5.003007||Viu magic_setpos|5.003007||Viu magic_setregexp|5.008001||Viu magic_setsig|5.003007||Viu magic_setsigall|5.035001||Viu magic_setsubstr|5.003007||Viu magic_settaint|5.003007||Viu magic_setutf8|5.008001||Viu magic_setuvar|5.003007||Viu magic_setvec|5.003007||Viu magic_sizepack|5.005000||Viu magic_wipepack|5.003007||Viu make_exactf_invlist|5.031006||Viu make_matcher|5.027008||Viu make_trie|5.009002||Viu malloc|5.007002|5.007002|n MALLOC_CHECK_TAINT2|5.008001||Viu MALLOC_CHECK_TAINT|5.008001||Viu malloced_size|5.005000||Vniu malloc_good_size|5.010001||Vniu MALLOC_INIT|5.005000||Viu MALLOC_OVERHEAD|5.006000||Viu Malloc_t|5.003007|5.003007|Vn MALLOC_TERM|5.005000||Viu MALLOC_TOO_LATE_FOR|5.008001||Viu MARK|5.003007|5.003007| MARKPOINT|5.009005||Viu MARKPOINT_next|5.009005||Viu MARKPOINT_next_fail|5.009005||Viu MARKPOINT_next_fail_t8_p8|5.033003||Viu MARKPOINT_next_fail_t8_pb|5.033003||Viu MARKPOINT_next_fail_tb_p8|5.033003||Viu MARKPOINT_next_fail_tb_pb|5.033003||Viu MARKPOINT_next_t8_p8|5.033003||Viu MARKPOINT_next_t8_pb|5.033003||Viu MARKPOINT_next_tb_p8|5.033003||Viu MARKPOINT_next_tb_pb|5.033003||Viu MARKPOINT_t8_p8|5.033003||Viu MARKPOINT_t8_pb|5.033003||Viu MARKPOINT_tb_p8|5.033003||Viu MARKPOINT_tb_pb|5.033003||Viu markstack_grow|5.021001|5.021001|u matcher_matches_sv|5.027008||Viu MAX|5.025006||Viu MAX_ANYOF_HRx_BYTE|5.031002||Viu MAXARG|5.003007||Viu MAX_CHARSET_NAME_LENGTH|5.013009||Viu MAX_FEATURE_LEN|5.013010||Viu MAX_FOLD_FROMS|5.029006||Viu MAX_LEGAL_CP|5.029002||Viu MAX_MATCHES|5.033005||Viu MAXO|5.003007||Viu MAXPATHLEN|5.006000||Viu MAX_PORTABLE_UTF8_TWO_BYTE|5.011002||Viu MAX_PRINT_A|5.033005||Viu MAX_RECURSE_EVAL_NOCHANGE_DEPTH|5.009005||Viu MAXSYSFD|5.003007||Viu MAX_UNICODE_UTF8|5.027006||Viu MAX_UNI_KEYWORD_INDEX|5.027011||Viu MAX_UTF8_TWO_BYTE|5.019004||Viu MAYBE_DEREF_GV|5.015003||Viu MAYBE_DEREF_GV_flags|5.015003||Viu MAYBE_DEREF_GV_nomg|5.015003||Viu maybe_multimagic_gv|5.019004||Viu mayberelocate|5.015006||Viu MBLEN_LOCK|5.033005||Viu MBLEN_UNLOCK|5.033005||Viu MBOL|5.003007||Viu MBOL_t8_p8|5.033003||Viu MBOL_t8_pb|5.033003||Viu MBOL_tb_p8|5.033003||Viu MBOL_tb_pb|5.033003||Viu MBTOWC_LOCK|5.033005||Viu MBTOWC_UNLOCK|5.033005||Viu MDEREF_ACTION_MASK|5.021007||Viu MDEREF_AV_gvav_aelem|5.021007||Viu MDEREF_AV_gvsv_vivify_rv2av_aelem|5.021007||Viu MDEREF_AV_padav_aelem|5.021007||Viu MDEREF_AV_padsv_vivify_rv2av_aelem|5.021007||Viu MDEREF_AV_pop_rv2av_aelem|5.021007||Viu MDEREF_AV_vivify_rv2av_aelem|5.021007||Viu MDEREF_FLAG_last|5.021007||Viu MDEREF_HV_gvhv_helem|5.021007||Viu MDEREF_HV_gvsv_vivify_rv2hv_helem|5.021007||Viu MDEREF_HV_padhv_helem|5.021007||Viu MDEREF_HV_padsv_vivify_rv2hv_helem|5.021007||Viu MDEREF_HV_pop_rv2hv_helem|5.021007||Viu MDEREF_HV_vivify_rv2hv_helem|5.021007||Viu MDEREF_INDEX_const|5.021007||Viu MDEREF_INDEX_gvsv|5.021007||Viu MDEREF_INDEX_MASK|5.021007||Viu MDEREF_INDEX_none|5.021007||Viu MDEREF_INDEX_padsv|5.021007||Viu MDEREF_MASK|5.021007||Viu MDEREF_reload|5.021007||Viu MDEREF_SHIFT|5.021007||Viu measure_struct|5.007003||Viu MEM_ALIGNBYTES|5.003007|5.003007|Vn memBEGINPs|5.027006||Viu memBEGINs|5.027006||Viu MEMBER_TO_FPTR|5.006000||Viu memCHRs|5.031008|5.003007|p mem_collxfrm|5.003007||dViu _mem_collxfrm|5.025002||Viu memENDPs|5.027006||Viu memENDs|5.027006||Viu memEQ|5.004000|5.003007|p memEQs|5.009005|5.003007|p memGE|5.025005||Viu memGT|5.025005||Viu memLE|5.025005||Viu MEM_LOG_ALLOC|5.009003||Viu mem_log_alloc|5.024000||Vniu mem_log_common|5.010001||Vniu MEM_LOG_FREE|5.009003||Viu mem_log_free|5.024000||Vniu MEM_LOG_REALLOC|5.009003||Viu mem_log_realloc|5.024000||Vniu memLT|5.025005||Viu memNE|5.004000|5.003007|p memNEs|5.009005|5.003007|p MEM_SIZE|5.003007||Viu MEM_SIZE_MAX|5.009005||Viu MEM_WRAP_CHECK_1|5.009002||Viu MEM_WRAP_CHECK|5.009002||Viu MEM_WRAP_CHECK_s|5.027010||Viu memzero|5.003007|5.003007| MEOL|5.003007||Viu MEOL_t8_p8|5.033003||Viu MEOL_t8_pb|5.033003||Viu MEOL_tb_p8|5.033003||Viu MEOL_tb_pb|5.033003||Viu mess|5.006000|5.004000|pv mess_alloc|5.005000||Viu mess_nocontext|5.006000||pvVn mess_sv|5.013001|5.004000|p MEXTEND|5.003007||Viu mfree|5.007002|5.007002|nu MgBYTEPOS|5.019004||Viu MgBYTEPOS_set|5.019004||Viu mg_clear|5.003007|5.003007| mg_copy|5.003007|5.003007| mg_dup|5.007003|5.007003|u MGf_BYTES|5.019004||Viu MGf_COPY|5.007003||Viu MGf_DUP|5.007003||Viu MGf_GSKIP|5.003007||Viu mg_find|5.003007|5.003007|n mg_findext|5.013008|5.003007|pn mg_find_mglob|5.019002||cViu MGf_LOCAL|5.009003||Viu MGf_MINMATCH|5.003007||Viu MGf_PERSIST|5.021005||Viu mg_free|5.003007|5.003007| mg_freeext|5.027004|5.027004| mg_free_type|5.013006|5.013006| MGf_REFCOUNTED|5.003007||Viu MGf_REQUIRE_GV|5.021004||Viu MGf_TAINTEDDIR|5.003007||Viu mg_get|5.003007|5.003007| mg_length|5.005000|5.005000|d mg_localize|5.009003||Vi mg_magical|5.003007|5.003007|n MgPV|5.003007||Viu MgPV_const|5.009003||Viu MgPV_nolen_const|5.009003||Viu mg_set|5.003007|5.003007| mg_size|5.005000|5.005000|u MgSV|5.033009||Viu MgTAINTEDDIR|5.003007||Viu MgTAINTEDDIR_off|5.004000||Viu MgTAINTEDDIR_on|5.003007||Viu MICRO_SIGN|5.011002||Viu MICRO_SIGN_NATIVE|5.017004||Viu MICRO_SIGN_UTF8|5.033003||Viu MIN|5.025006||Viu mini_mktime|5.007002|5.007002|n MINMOD|5.003007||Viu MINMOD_t8_p8|5.033003||Viu MINMOD_t8_pb|5.033003||Viu MINMOD_tb_p8|5.033003||Viu MINMOD_tb_pb|5.033003||Viu minus_v|5.015006||Viu missingterm|5.005000||Viu MJD_OFFSET_DEBUG|5.009004||Viu Mkdir|5.004000||Viu mkdir|5.005000||Viu mktemp|5.005000||Viu Mmap_t|5.006000|5.006000|Vn mode_from_discipline|5.006000||Viu Mode_t|5.003007|5.003007|Vn modkids|5.003007||Viu MON_10|5.027010||Viu MON_11|5.027010||Viu MON_12|5.027010||Viu MON_1|5.027010||Viu MON_2|5.027010||Viu MON_3|5.027010||Viu MON_4|5.027010||Viu MON_5|5.027010||Viu MON_6|5.027010||Viu MON_7|5.027010||Viu MON_8|5.027010||Viu MON_9|5.027010||Viu more_bodies|||iu more_sv|5.009004||Viu moreswitches|5.003007||cVu mortal_getenv|5.031011||cVnu Move|5.003007|5.003007| MoveD|5.009002|5.003007|p move_proto_attr|5.019005||Viu M_PAT_MODS|5.009005||Viu MPH_BUCKETS|5.027011||Viu MPH_RSHIFT|5.027011||Viu MPH_VALt|5.027011||Viu mPUSHi|5.009002|5.003007|p mPUSHn|5.009002|5.003007|p mPUSHp|5.009002|5.003007|p mPUSHs|5.010001|5.003007|p mPUSHu|5.009002|5.003007|p mro_clean_isarev|5.013007||Viu mro_gather_and_rename|5.013007||Viu mro_get_from_name|5.010001|5.010001|u mro_get_linear_isa|5.009005|5.009005| mro_get_linear_isa_c3|||i mro_get_linear_isa_dfs|5.009005||Vi MRO_GET_PRIVATE_DATA|5.010001|5.010001| mro_get_private_data|||cu mro_isa_changed_in|5.009005||Vi mro_meta_dup|5.009005||Viu mro_meta_init|||ciu mro_method_changed_in|5.009005|5.009005| mro_package_moved|5.013006||Vi mro_register|5.010001|5.010001| mro_set_mro|5.010001|5.010001|u mro_set_private_data|5.010001|5.010001| MSPAGAIN|5.003007||Viu MSVC_DIAG_IGNORE|5.029010||Viu MSVC_DIAG_IGNORE_DECL|5.029010||Viu MSVC_DIAG_IGNORE_STMT|5.029010||Viu MSVC_DIAG_RESTORE|5.029010||Viu MSVC_DIAG_RESTORE_DECL|5.029010||Viu MSVC_DIAG_RESTORE_STMT|5.029010||Viu mul128|5.005000||Viu MULTICALL|5.009003|5.009003| multiconcat_stringify|5.027006||cViu multideref_stringify|5.021009||cViu MULTILINE_PAT_MOD|5.009005||Viu MULTIPLICITY|5.006000|5.006000|Vn MUTABLE_AV|5.010001|5.003007|p MUTABLE_CV|5.010001|5.003007|p MUTABLE_GV|5.010001|5.003007|p MUTABLE_HV|5.010001|5.003007|p MUTABLE_IO|5.010001|5.003007|p MUTABLE_PTR|5.010001|5.003007|p MUTABLE_SV|5.010001|5.003007|p MUTEX_DESTROY|5.005000||Viu MUTEX_INIT|5.005000||Viu MUTEX_INIT_NEEDS_MUTEX_ZEROED|5.005003||Viu MUTEX_LOCK|5.005000||Viu MUTEX_UNLOCK|5.005000||Viu mXPUSHi|5.009002|5.003007|p mXPUSHn|5.009002|5.003007|p mXPUSHp|5.009002|5.003007|p mXPUSHs|5.010001|5.003007|p mXPUSHu|5.009002|5.003007|p my|5.011000||Viu my_atof2|5.029000||cVu my_atof3|5.029000||cVu my_atof|5.006000|5.006000| my_attrs|5.006000||Viu my_binmode|5.006000||Viu my_bytes_to_utf8|5.021009||Vniu my_chsize|5.003007||Vu my_clearenv|5.009003||Viu MY_CXT|5.009000|5.009000|p MY_CXT_CLONE|5.009002|5.009000|p MY_CXT_INDEX|5.009005||Viu MY_CXT_INIT|5.009000|5.009000|p my_cxt_init|5.009000|5.009000|u MY_CXT_INIT_ARG|5.013005||Viu MY_CXT_INIT_INTERP|5.009003||Viu my_dirfd|5.009005|5.009005|nu my_exit|5.003007|5.003007| my_exit_jump|5.005000||Viu my_failure_exit|5.004000|5.004000|u my_fflush_all|5.006000|5.006000|u my_fork|5.007003|5.007003|nu my_kid|5.006000||Viu my_lstat|5.013003||Viu my_lstat_flags|5.013003||cViu my_memrchr|5.027006||Vniu my_mkostemp_cloexec|||niu my_mkostemp|||niu my_mkstemp_cloexec|||niu my_mkstemp|||niu my_nl_langinfo|5.027006||Vniu my_pclose|5.003007|5.003007|u my_popen|5.003007|5.003007|u my_popen_list|5.007001|5.007001|u my_setenv|5.003007|5.003007| my_snprintf|5.009004|5.003007|pvn my_socketpair|5.007003|5.007003|nu my_sprintf|5.009003|5.003007|pdn my_stat|5.013003||Viu my_stat_flags|5.013003||cViu my_strerror|5.021001||Viu my_strftime|5.007002|5.007002| my_strlcat|5.009004|5.003007|pn my_strlcpy|5.009004|5.003007|pn my_strnlen|5.027006|5.003007|pn my_strtod|5.029010|5.029010|n my_unexec|5.003007||Viu my_vsnprintf|5.009004|5.009004|n N0|5.029001||Viu N10|5.029001||Viu N11|5.029001||Viu N1|5.029001||Viu N2|5.029001||Viu N3|5.029001||Viu N4|5.029001||Viu N5|5.029001||Viu N6|5.029001||Viu N7|5.029001||Viu N8|5.029001||Viu N9|5.029001||Viu NAN_COMPARE_BROKEN|5.021005||Viu NANYOFM|5.029005||Viu NANYOFM_t8_p8|5.033003||Viu NANYOFM_t8_pb|5.033003||Viu NANYOFM_tb_p8|5.033003||Viu NANYOFM_tb_pb|5.033003||Viu NATIVE8_TO_UNI|5.011000||Viu NATIVE_BYTE_IS_INVARIANT|5.019004||Viu NATIVE_SKIP|5.019004||Viu NATIVE_TO_ASCII|5.007001||Viu NATIVE_TO_I8|5.015006||Viu NATIVE_TO_LATIN1|5.019004|5.003007|p NATIVE_TO_NEED|5.019004||dcVnu NATIVE_TO_UNI|5.007001|5.003007|p NATIVE_TO_UTF|5.007001||Viu NATIVE_UTF8_TO_I8|5.019004||Viu nBIT_MASK|5.033001||Viu nBIT_UMAX|5.033001||Viu NBOUND|5.003007||Viu NBOUNDA|5.013009||Viu NBOUNDA_t8_p8|5.033003||Viu NBOUNDA_t8_pb|5.033003||Viu NBOUNDA_tb_p8|5.033003||Viu NBOUNDA_tb_pb|5.033003||Viu NBOUNDL|5.004000||Viu NBOUNDL_t8_p8|5.033003||Viu NBOUNDL_t8_pb|5.033003||Viu NBOUNDL_tb_p8|5.033003||Viu NBOUNDL_tb_pb|5.033003||Viu NBOUND_t8_p8|5.033003||Viu NBOUND_t8_pb|5.033003||Viu NBOUND_tb_p8|5.033003||Viu NBOUND_tb_pb|5.033003||Viu NBOUNDU|5.013009||Viu NBOUNDU_t8_p8|5.033003||Viu NBOUNDU_t8_pb|5.033003||Viu NBOUNDU_tb_p8|5.033003||Viu NBOUNDU_tb_pb|5.033003||Viu NBSP_NATIVE|5.021001||Viu NBSP_UTF8|5.021001||Viu NDBM_H_USES_PROTOTYPES|5.032001|5.032001|Vn NDEBUG|5.021007||Viu NEED_PTHREAD_INIT|5.005000||Viu need_utf8|5.009003||Vniu NEED_VA_COPY|5.007001|5.007001|Vn NEGATIVE_INDICES_VAR|5.008001||Viu Netdb_hlen_t|5.005000|5.005000|Vn Netdb_host_t|5.005000|5.005000|Vn Netdb_name_t|5.005000|5.005000|Vn Netdb_net_t|5.005000|5.005000|Vn NETDB_R_OBSOLETE|5.008000||Viu New|5.003007||Viu newANONATTRSUB|5.006000|5.006000|u newANONHASH|5.003007|5.003007|u newANONLIST|5.003007|5.003007|u newANONSUB|5.003007|5.003007|u newASSIGNOP|5.003007|5.003007| newATTRSUB|5.006000|5.006000| newATTRSUB_x|5.019008||cVi newAV|5.003007|5.003007| newAV_alloc_x|5.035001|5.035001| newAV_alloc_xz|5.035001|5.035001| newAVREF|5.003007|5.003007|u newBINOP|5.003007|5.003007| Newc|5.003007||Viu new_collate|5.006000||Viu newCONDOP|5.003007|5.003007| new_constant|||iu newCONSTSUB|5.004005|5.003007|p newCONSTSUB_flags|5.015006|5.015006| new_ctype|5.006000||Viu newCVREF|5.003007|5.003007|u newDEFSVOP|5.021006|5.021006| newFORM|5.003007|5.003007|u newFOROP|5.013007|5.013007| newGIVENOP|5.009003|5.009003| newGIVWHENOP|5.027008||Viu newGP|||xiu newGVgen|5.003007|5.003007|u newGVgen_flags|5.015004|5.015004|u newGVOP|5.003007|5.003007| newGVREF|5.003007|5.003007|u new_he|5.005000||Viu newHV|5.003007|5.003007| newHVhv|5.005000|5.005000|u newHVREF|5.003007|5.003007|u _new_invlist|5.013010||cViu _new_invlist_C_array|5.015008||cViu newIO|5.003007|5.003007|u newLISTOP|5.003007|5.003007| newLOGOP|5.003007|5.003007| new_logop|5.005000||Viu newLOOPEX|5.003007|5.003007| newLOOPOP|5.003007|5.003007| newMETHOP|5.021005|5.021005| newMETHOP_internal|5.021005||Viu newMETHOP_named|5.021005|5.021005| new_msg_hv|5.027009||Viu newMYSUB|5.017004|5.017004|u newNULLLIST|5.003007|5.003007| new_numeric|5.006000||Viu newOP|5.003007|5.003007| NewOp|5.008001||Viu newPADNAMELIST|5.021007|5.021007|xn newPADNAMEouter|5.021007|5.021007|xn newPADNAMEpvn|5.021007|5.021007|xn newPADOP|5.006000||V newPMOP|5.003007|5.003007| newPROG|5.003007|5.003007|u newPVOP|5.003007|5.003007| newRANGE|5.003007|5.003007| newRV|5.003007|5.003007| newRV_inc|5.004000|5.003007|p newRV_noinc|5.004000|5.003007|p newSLICEOP|5.003007|5.003007| new_stackinfo|5.005000|5.005000|u newSTATEOP|5.003007|5.003007| newSTUB|5.017001||Viu newSUB|5.003007|5.003007| newSV|5.003007|5.003007| NEWSV|5.003007||Viu newSVavdefelem|5.019004||Viu newSVhek|5.009003|5.009003| newSViv|5.003007|5.003007| newSVnv|5.006000|5.003007| newSVOP|5.003007|5.003007| newSVpadname|5.017004|5.017004|x newSVpv|5.003007|5.003007| newSVpvf|5.006000|5.004000|v newSVpvf_nocontext|5.006000||vVn newSVpvn|5.004005|5.003007|p newSVpvn_flags|5.010001|5.003007|p newSVpvn_share|5.007001|5.003007|p newSVpvn_utf8|5.010001|5.003007|p newSVpvs|5.009003|5.003007|p newSVpvs_flags|5.010001|5.003007|p newSVpv_share|5.013006|5.013006| newSVpvs_share|5.009003|5.003007|p newSVREF|5.003007|5.003007|u newSVrv|5.003007|5.003007| newSVsv|5.003007|5.003007| newSVsv_flags|5.029009|5.003007|p newSVsv_nomg|5.029009|5.003007|p newSV_type|5.009005|5.003007|p newSVuv|5.006000|5.003007|p newTRYCATCHOP|5.033007|5.033007|x newUNOP|5.003007|5.003007| newUNOP_AUX|5.021007|5.021007| new_version|5.009000|5.009000| NEW_VERSION|5.019008||Viu new_warnings_bitfield|||xciu newWHENOP|5.027008|5.027008| newWHILEOP|5.013007|5.013007| Newx|5.009003|5.003007|p Newxc|5.009003|5.003007|p newXS|5.006000|5.006000| newXS_deffile|5.021006||cViu newXS_flags|5.009004|5.009004|xu newXS_len_flags|5.015006||Vi newXSproto|5.006000|5.006000| Newxz|5.009003|5.003007|p Newz|5.003007||Viu nextargv|5.003007||Viu nextchar|5.005000||Viu NEXT_LINE_CHAR|5.007003||Viu NEXT_OFF|5.005000||Viu NEXTOPER|5.003007||Viu next_symbol|5.007003||Viu ninstr|5.003007|5.003007|n NL_LANGINFO_LOCK|5.033005||Viu NL_LANGINFO_UNLOCK|5.033005||Viu no_bareword_allowed|5.005004||Viu no_bareword_filehandle|5.033006||Viu NOCAPTURE_PAT_MOD|5.021008||Viu NOCAPTURE_PAT_MODS|5.021008||Viu NODE_ALIGN|5.005000||Viu NODE_ALIGN_FILL|5.005000||Viu NODE_STEP_REGNODE|5.005000||Viu NODE_SZ_STR|5.006000||Viu NO_ENV_ARRAY_IN_MAIN|5.009004||Viu NOEXPR|5.027010||Viu NofAMmeth|5.003007||Viu no_fh_allowed|5.003007||Viu NOLINE|5.003007||Viu NO_LOCALE|5.007000||Viu NO_LOCALECONV_MON_THOUSANDS_SEP|5.005000||Viu NONDESTRUCT_PAT_MOD|5.013002||Viu NONDESTRUCT_PAT_MODS|5.013002||Viu NON_OTHER_COUNT|5.033005||Viu no_op|5.003007||Viu NOOP|5.005000|5.003007|p noperl_die|5.021006||vVniu NORETURN_FUNCTION_END|5.009003||Viu NORMAL|5.003007||Viu NOSTR|5.027010||Viu NO_TAINT_SUPPORT|5.017006||Viu not_a_number|5.005000||Viu NOTE3|5.027001||Viu NOTHING|5.003007||Viu NOTHING_t8_p8|5.033003||Viu NOTHING_t8_pb|5.033003||Viu NOTHING_tb_p8|5.033003||Viu NOTHING_tb_pb|5.033003||Viu nothreadhook|5.008000|5.008000| notify_parser_that_changed_to_utf8|5.025010||Viu not_incrementable|5.021002||Viu NOT_IN_PAD|5.005000||Viu NOT_REACHED|5.019006|5.003007|poVnu NPOSIXA|5.017003||Viu NPOSIXA_t8_p8|5.033003||Viu NPOSIXA_t8_pb|5.033003||Viu NPOSIXA_tb_p8|5.033003||Viu NPOSIXA_tb_pb|5.033003||Viu NPOSIXD|5.017003||Viu NPOSIXD_t8_p8|5.033003||Viu NPOSIXD_t8_pb|5.033003||Viu NPOSIXD_tb_p8|5.033003||Viu NPOSIXD_tb_pb|5.033003||Viu NPOSIXL|5.017003||Viu NPOSIXL_t8_p8|5.033003||Viu NPOSIXL_t8_pb|5.033003||Viu NPOSIXL_tb_p8|5.033003||Viu NPOSIXL_tb_pb|5.033003||Viu NPOSIXU|5.017003||Viu NPOSIXU_t8_p8|5.033003||Viu NPOSIXU_t8_pb|5.033003||Viu NPOSIXU_tb_p8|5.033003||Viu NPOSIXU_tb_pb|5.033003||Viu NSIG|5.009003||Viu ntohi|5.003007||Viu ntohl|5.003007||Viu ntohs|5.003007||Viu nuke_stacks|5.005000||Viu Null|5.003007||Viu Nullav|5.003007|5.003007|d Nullch|5.003007|5.003007| Nullcv|5.003007|5.003007|d Nullfp|5.003007||Viu Nullgv|5.003007||Viu Nullhe|5.003007||Viu Nullhek|5.004000||Viu Nullhv|5.003007|5.003007|d Nullop|5.003007||Viu Nullsv|5.003007|5.003007| NUM2PTR|5.006000||pVu NUM_ANYOF_CODE_POINTS|5.021004||Viu NUM_CLASSES|5.029001||Viu num_overflow|5.009001||Vniu NV_BIG_ENDIAN|5.021009||Viu NV_DIG|5.006000||Viu NVef|5.006001|5.003007|poVn NV_EPSILON|5.007003||Viu NVff|5.006001|5.003007|poVn NVgf|5.006001|5.003007|poVn NV_IMPLICIT_BIT|5.021009||Viu NV_INF|5.007003||Viu NV_LITTLE_ENDIAN|5.021009||Viu NVMANTBITS|5.023000|5.023000|Vn NV_MANT_DIG|5.006001||Viu NV_MAX_10_EXP|5.007003||Viu NV_MAX|5.006001||Viu NV_MAX_EXP|5.021003||Viu NV_MIN_10_EXP|5.007003||Viu NV_MIN|5.006001||Viu NV_MIN_EXP|5.021003||Viu NV_MIX_ENDIAN|5.021009||Viu NV_NAN|5.007003||Viu NV_NAN_BITS|5.023000||Viu NV_NAN_IS_QUIET|5.023000||Viu NV_NAN_IS_SIGNALING|5.023000||Viu NV_NAN_PAYLOAD_MASK|5.023000||Viu NV_NAN_PAYLOAD_MASK_IEEE_754_128_BE|5.023000||Viu NV_NAN_PAYLOAD_MASK_IEEE_754_128_LE|5.023000||Viu NV_NAN_PAYLOAD_MASK_IEEE_754_64_BE|5.023000||Viu NV_NAN_PAYLOAD_MASK_IEEE_754_64_LE|5.023000||Viu NV_NAN_PAYLOAD_MASK_SKIP_EIGHT|5.023006||Viu NV_NAN_PAYLOAD_PERM_0_TO_7|5.023000||Viu NV_NAN_PAYLOAD_PERM|5.023000||Viu NV_NAN_PAYLOAD_PERM_7_TO_0|5.023000||Viu NV_NAN_PAYLOAD_PERM_IEEE_754_128_BE|5.023000||Viu NV_NAN_PAYLOAD_PERM_IEEE_754_128_LE|5.023000||Viu NV_NAN_PAYLOAD_PERM_IEEE_754_64_BE|5.023000||Viu NV_NAN_PAYLOAD_PERM_IEEE_754_64_LE|5.023000||Viu NV_NAN_PAYLOAD_PERM_SKIP_EIGHT|5.023006||Viu NV_NAN_QS_BIT|5.023000||Viu NV_NAN_QS_BIT_OFFSET|5.023000||Viu NV_NAN_QS_BIT_SHIFT|5.023000||Viu NV_NAN_QS_BYTE|5.023000||Viu NV_NAN_QS_BYTE_OFFSET|5.023000||Viu NV_NAN_QS_QUIET|5.023000||Viu NV_NAN_QS_SIGNALING|5.023000||Viu NV_NAN_QS_TEST|5.023000||Viu NV_NAN_QS_XOR|5.023000||Viu NV_NAN_SET_QUIET|5.023000||Viu NV_NAN_SET_SIGNALING|5.023000||Viu NV_OVERFLOWS_INTEGERS_AT|5.010001|5.010001|Vn NV_PRESERVES_UV_BITS|5.006001|5.006001|Vn NVSIZE|5.006001|5.006001|Vn NVTYPE|5.006000|5.003007|poVn NV_VAX_ENDIAN|5.025003||Viu NV_WITHIN_IV|5.006000||Viu NV_WITHIN_UV|5.006000||Viu NV_X86_80_BIT|5.025004||Viu NV_ZERO_IS_ALLBITS_ZERO|5.035001|5.035001|Vn OA_AVREF|5.003007||Viu OA_BASEOP|5.005000||Viu OA_BASEOP_OR_UNOP|5.005000||Viu OA_BINOP|5.005000||Viu OA_CLASS_MASK|5.005000||Viu OA_COP|5.005000||Viu OA_CVREF|5.003007||Viu OA_DANGEROUS|5.003007||Viu OA_DEFGV|5.003007||Viu OA_FILEREF|5.003007||Viu OA_FILESTATOP|5.005000||Viu OA_FOLDCONST|5.003007||Viu OA_HVREF|5.003007||Viu OA_LIST|5.003007||Viu OA_LISTOP|5.005000||Viu OA_LOGOP|5.005000||Viu OA_LOOP|5.005000||Viu OA_LOOPEXOP|5.005000||Viu OA_MARK|5.003007||Viu OA_METHOP|5.021005||Viu OA_OPTIONAL|5.003007||Viu OA_OTHERINT|5.003007||Viu OA_PADOP|5.006000||Viu OA_PMOP|5.005000||Viu OA_PVOP_OR_SVOP|5.006000||Viu OA_RETSCALAR|5.003007||Viu OA_SCALAR|5.003007||Viu OA_SCALARREF|5.003007||Viu OASHIFT|5.003007||Viu OA_SVOP|5.005000||Viu OA_TARGET|5.003007||Viu OA_TARGLEX|5.006000||Viu OA_UNOP|5.005000||Viu OA_UNOP_AUX|5.021007||Viu O_BINARY|5.006000||Viu O_CREAT|5.006000||Viu OCSHIFT|5.006000||Viu OCTAL_VALUE|5.019008||Viu Off_t|5.003007|5.003007|Vn Off_t_size|5.006000|5.006000|Vn OFFUNI_IS_INVARIANT|5.023003||Viu OFFUNISKIP|5.019004||Viu ONCE_PAT_MOD|5.009005||Viu ONCE_PAT_MODS|5.009005||Viu oopsAV|5.003007||Viu oopsHV|5.003007||Viu OP|5.003007||Viu op_append_elem|5.013006|5.013006| op_append_list|5.013006|5.013006| opASSIGN|5.003007||Viu OP_BINARY|5.004000||Viu OP_CHECK_MUTEX_INIT|5.015008||Viu OP_CHECK_MUTEX_LOCK|5.015008||Viu OP_CHECK_MUTEX_TERM|5.015008||Viu OP_CHECK_MUTEX_UNLOCK|5.015008||Viu OP_CLASS|5.013007|5.013007| op_class|5.025010|5.025010| op_clear|5.006000||cViu OPCODE|5.003007||Viu op_contextualize|5.013006|5.013006| op_convert_list|5.021006|5.021006| OP_DESC|5.007003|5.007003| op_dump|5.006000|5.006000| OPEN|5.003007||Viu open|5.005000||Viu opendir|5.005000||Viu openn_cleanup|5.019010||Viu openn_setup|5.019010||Viu open_script|5.005000||Viu OPEN_t8_p8|5.033003||Viu OPEN_t8_pb|5.033003||Viu OPEN_tb_p8|5.033003||Viu OPEN_tb_pb|5.033003||Viu OPERAND|5.003007||Viu OPERANDl|5.031005||Viu OPERANDs|5.031005||Viu OPFAIL|5.009005||Viu OPFAIL_t8_p8|5.033003||Viu OPFAIL_t8_pb|5.033003||Viu OPFAIL_tb_p8|5.033003||Viu OPFAIL_tb_pb|5.033003||Viu OPf_FOLDED|5.021007||Viu OPf_KIDS|5.003007|5.003007| OPf_KNOW|5.003007||Viu OPf_LIST|5.003007||Viu OPf_MOD|5.003007||Viu OPf_PARENS|5.003007||Viu op_free|5.003007|5.003007| OP_FREED|5.017002||Viu OPf_REF|5.003007||Viu OPf_SPECIAL|5.003007||Viu OPf_STACKED|5.003007||Viu OPf_WANT|5.004000||Viu OPf_WANT_LIST|5.004000||Viu OPf_WANT_SCALAR|5.004000||Viu OPf_WANT_VOID|5.004000||Viu OP_GIMME|5.004000||Viu OP_GIMME_REVERSE|5.010001||Viu OpHAS_SIBLING|5.021007|5.003007|p op_integerize|5.015003||Viu OP_IS_DIRHOP|5.015003||Viu OP_IS_FILETEST|5.006001||Viu OP_IS_FILETEST_ACCESS|5.008001||Viu OP_IS_INFIX_BIT|5.021009||Viu OP_IS_NUMCOMPARE|5.015003||Viu OP_IS_SOCKET|5.006001||Viu OP_IS_STAT|5.031001||Viu OpLASTSIB_set|5.021011|5.003007|p op_linklist|5.013006|5.013006| op_lvalue|5.013007|5.013007|x op_lvalue_flags|||ciu OP_LVALUE_NO_CROAK|5.015001||Viu OpMAYBESIB_set|5.021011|5.003007|p opmethod_stash|5.021007||Viu OpMORESIB_set|5.021011|5.003007|p OP_NAME|5.007003|5.007003| op_null|5.007002|5.007002| OPpALLOW_FAKE|5.015006||Viu op_parent|5.025001|5.025001|n OPpARG1_MASK|5.021004||Viu OPpARG2_MASK|5.021004||Viu OPpARG3_MASK|5.021004||Viu OPpARG4_MASK|5.021004||Viu OPpARGELEM_AV|5.025004||Viu OPpARGELEM_HV|5.025004||Viu OPpARGELEM_MASK|5.025004||Viu OPpARGELEM_SV|5.025004||Viu OPpASSIGN_BACKWARDS|5.003007||Viu OPpASSIGN_COMMON_AGG|5.023002||Viu OPpASSIGN_COMMON_RC1|5.023002||Viu OPpASSIGN_COMMON_SCALAR|5.023002||Viu OPpASSIGN_CV_TO_GV|5.009003||Viu OPpASSIGN_TRUEBOOL|5.027003||Viu OPpAVHVSWITCH_MASK|5.025006||Viu OPpCONCAT_NESTED|5.027007||Viu OPpCONST_BARE|5.003007||Viu OPpCONST_ENTERED|5.003007||Viu OPpCONST_NOVER|5.009003||Viu OPpCONST_SHORTCIRCUIT|5.009001||Viu OPpCONST_STRICT|5.005004||Viu OPpCOREARGS_DEREF1|5.015003||Viu OPpCOREARGS_DEREF2|5.015003||Viu OPpCOREARGS_PUSHMARK|5.015003||Viu OPpCOREARGS_SCALARMOD|5.015003||Viu OPpDEREF|5.004000||Viu OPpDEREF_AV|5.003007||Viu OPpDEREF_HV|5.003007||Viu OPpDEREF_SV|5.004000||Viu OPpDONT_INIT_GV|5.009003||Viu OPpEARLY_CV|5.006000|5.006000| OPpENTERSUB_AMPER|5.003007|5.003007| OPpENTERSUB_DB|5.003007||Viu OPpENTERSUB_HASTARG|5.006000||Viu OPpENTERSUB_INARGS|5.006000||Viu OPpENTERSUB_LVAL_MASK|5.015001||Viu OPpENTERSUB_NOPAREN|5.005004||Viu OPpEVAL_BYTES|5.015005||Viu OPpEVAL_COPHH|5.015005||Viu OPpEVAL_HAS_HH|5.009003||Viu OPpEVAL_RE_REPARSING|5.017011||Viu OPpEVAL_UNICODE|5.015005||Viu OPpEXISTS_SUB|5.006000||Viu OPpFLIP_LINENUM|5.003007||Viu OPpFT_ACCESS|5.008001||Viu OPpFT_AFTER_t|5.015008||Viu OPpFT_STACKED|5.009001||Viu OPpFT_STACKING|5.015001||Viu OPpHINT_STRICT_REFS|5.021004||Viu OPpHUSH_VMSISH|5.007003||Viu OPpINDEX_BOOLNEG|5.027003||Viu OPpITER_DEF|5.027008||Viu OPpITER_REVERSED|5.009002||Viu OPpKVSLICE|5.027001||Viu OPpLIST_GUESSED|5.003007||Viu OPpLVAL_DEFER|5.004000||Viu OPpLVAL_INTRO|5.003007||Viu OPpLVALUE|5.019006||Viu OPpLVREF_AV|5.021005||Viu OPpLVREF_CV|5.021005||Viu OPpLVREF_ELEM|5.021005||Viu OPpLVREF_HV|5.021005||Viu OPpLVREF_ITER|5.021005||Viu OPpLVREF_SV|5.021005||Viu OPpLVREF_TYPE|5.021005||Viu OPpMAYBE_LVSUB|5.007001||Viu OPpMAYBE_TRUEBOOL|5.017004||Viu OPpMAY_RETURN_CONSTANT|5.009003||Viu OPpMULTICONCAT_APPEND|5.027006||Viu OPpMULTICONCAT_FAKE|5.027006||Viu OPpMULTICONCAT_STRINGIFY|5.027006||Viu OPpMULTIDEREF_DELETE|5.021007||Viu OPpMULTIDEREF_EXISTS|5.021007||Viu OPpOFFBYONE|5.015002||Viu OPpOPEN_IN_CRLF|5.006000||Viu OPpOPEN_IN_RAW|5.006000||Viu OPpOPEN_OUT_CRLF|5.006000||Viu OPpOPEN_OUT_RAW|5.006000||Viu OPpOUR_INTRO|5.006000||Viu OPpPADHV_ISKEYS|5.027003||Viu OPpPADRANGE_COUNTMASK|5.017006||Viu OPpPADRANGE_COUNTSHIFT|5.017006||Viu OPpPAD_STATE|5.009004||Viu OPpPV_IS_UTF8|5.016000||Viu OPpREFCOUNTED|5.006000||Viu OPpREPEAT_DOLIST|5.003007||Viu op_prepend_elem|5.013006|5.013006| OPpREVERSE_INPLACE|5.011002||Viu OPpRV2HV_ISKEYS|5.027003||Viu OPpSLICE|5.004000||Viu OPpSLICEWARNING|5.019004||Viu OPpSORT_DESCEND|5.009002||Viu OPpSORT_INPLACE|5.009001||Viu OPpSORT_INTEGER|5.006000||Viu OPpSORT_NUMERIC|5.006000||Viu OPpSORT_REVERSE|5.006000||Viu OPpSORT_STABLE|5.009003||Viu OPpSORT_UNSTABLE|5.027004||Viu OPpSPLIT_ASSIGN|5.025006||Viu OPpSPLIT_IMPLIM|5.019002||Viu OPpSPLIT_LEX|5.025006||Viu OPpSUBSTR_REPL_FIRST|5.015006||Viu OPpTARGET_MY|5.006000||Viu OPpTRANS_ALL|5.009001||Viu OPpTRANS_CAN_FORCE_UTF8|5.031006||Viu OPpTRANS_COMPLEMENT|5.003007||Viu OPpTRANS_DELETE|5.003007||Viu OPpTRANS_FROM_UTF|5.006000||Viu OPpTRANS_GROWS|5.006000||Viu OPpTRANS_IDENTICAL|5.006000||Viu OPpTRANS_SQUASH|5.003007||Viu OPpTRANS_TO_UTF|5.006000||Viu OPpTRANS_USE_SVOP|5.031006||Viu OPpTRUEBOOL|5.017004||Viu OpREFCNT_dec|5.006000||Viu op_refcnt_dec|||xiu OpREFCNT_inc|5.006000||Viu op_refcnt_inc|||xiu OP_REFCNT_INIT|5.006000||Viu OP_REFCNT_LOCK|5.006000||Viu op_refcnt_lock|5.009002|5.009002|u OpREFCNT_set|5.006000||Viu OP_REFCNT_TERM|5.006000||Viu OP_REFCNT_UNLOCK|5.006000||Viu op_refcnt_unlock|5.009002|5.009002|u op_relocate_sv|5.021005||Viu op_scope|5.013007|5.013007|x OP_SIBLING|5.021002||Viu OpSIBLING|5.021007|5.003007|p op_sibling_splice|5.021002|5.021002|n OpSLAB|5.017002||Viu opslab_force_free|5.017002||Viu opslab_free|5.017002||Viu opslab_free_nopad|5.017002||Viu OpslabREFCNT_dec|5.017002||Viu OpslabREFCNT_dec_padok|5.017002||Viu OpSLOT|5.017002||Viu OPSLOT_HEADER|5.017002||Viu OpSLOToff|5.033001||Viu op_std_init|5.015003||Viu OPTIMIZED|5.005000||Viu OPTIMIZED_t8_p8|5.033003||Viu OPTIMIZED_t8_pb|5.033003||Viu OPTIMIZED_tb_p8|5.033003||Viu OPTIMIZED_tb_pb|5.033003||Viu optimize_op|5.027006||Viu optimize_optree|5.027006||Vi optimize_regclass|5.035001||Viu OP_TYPE_IS|5.019007|5.019007| OP_TYPE_IS_NN|5.019010||Viu OP_TYPE_ISNT|5.019010||Viu OP_TYPE_ISNT_AND_WASNT|5.019010||Viu OP_TYPE_ISNT_AND_WASNT_NN|5.019010||Viu OP_TYPE_ISNT_NN|5.019010||Viu OP_TYPE_IS_OR_WAS|5.019010|5.019010| OP_TYPE_IS_OR_WAS_NN|5.019010||Viu op_unscope|5.017003||xViu O_RDONLY|5.006000||Viu O_RDWR|5.006000||Viu ORIGMARK|5.003007|5.003007| OSNAME|5.003007|5.003007|Vn OSVERS|5.007002|5.007002|Vn O_TEXT|5.006000||Viu OutCopFILE|5.007003||Viu output_non_portable|5.031008||Viu output_posix_warnings|5.029005||Viu O_VMS_DELETEONCLOSE|5.031002||Viu O_WRONLY|5.006000||Viu package|5.003007||Viu package_version|5.011001||Viu pack_cat|5.007003|5.007003|d packlist|5.008001|5.008001| pack_rec|5.008001||Viu packWARN2|5.007003|5.003007|p packWARN3|5.007003|5.003007|p packWARN4|5.007003|5.003007|p packWARN|5.007003|5.003007|p pad_add_anon|5.008001|5.008001| pad_add_name_pv|5.015001|5.015001| pad_add_name_pvn|5.015001|5.015001| pad_add_name_pvs|5.015001|5.015001| pad_add_name_sv|5.015001|5.015001| padadd_NO_DUP_CHECK|5.011002||Viu padadd_OUR|5.011002||Viu padadd_STALEOK|5.017003||Viu padadd_STATE|5.011002||Viu pad_add_weakref|5.021007||Viu pad_alloc|5.003007|5.003007|x pad_alloc_name|5.015001||Vi PadARRAY|5.017004|5.017004|x PAD_BASE_SV|5.008001||Vi pad_block_start|5.008001||Vi pad_check_dup|5.008001||Vi PAD_CLONE_VARS|5.008001||Vi PAD_COMPNAME|5.017004||Viu PAD_COMPNAME_FLAGS|5.008001||Vi PAD_COMPNAME_FLAGS_isOUR|5.009004||Viu PAD_COMPNAME_GEN|5.008001||Vi PAD_COMPNAME_GEN_set|5.009003||Vi PAD_COMPNAME_OURSTASH|5.008001||Vi PAD_COMPNAME_PV|5.008001||Vi PAD_COMPNAME_SV|5.009005||Viu PAD_COMPNAME_TYPE|5.008001||Vi pad_compname_type|5.009003|5.009003|d PAD_FAKELEX_ANON|5.009005||Viu PAD_FAKELEX_MULTI|5.009005||Viu pad_findlex|5.005000||Vi pad_findmy_pv|5.015001|5.015001| pad_findmy_pvn|5.015001|5.015001| pad_findmy_pvs|5.015001|5.015001| pad_findmy_sv|5.015001|5.015001| pad_fixup_inner_anons|5.008001||Vi pad_free|5.003007||Vi pad_leavemy|5.003007||Vi PadlistARRAY|5.017004|5.017004|x padlist_dup|5.013002||Vi PadlistMAX|5.017004|5.017004|x PadlistNAMES|5.017004|5.017004|x PadlistNAMESARRAY|5.017004|5.017004|x PadlistNAMESMAX|5.017004|5.017004|x PadlistREFCNT|5.017004|5.017004|x padlist_store|5.017004||Viu PadMAX|5.017004|5.017004|x padname_dup|5.021007||Vi PadnameFLAGS|5.021007||Viu padname_free|||ciu PADNAME_FROM_PV|5.021007||Viu PadnameIN_SCOPE|5.031004||Vniu PadnameIsOUR|5.017004||Vi PadnameIsSTATE|5.017004||Vi PadnameIsSTATE_on|5.021007||Viu PadnameLEN|5.017004|5.017004|x PadnamelistARRAY|5.017004|5.017004|x padnamelist_dup|5.021007||Vi padnamelist_fetch|5.021007|5.021007|xn padnamelist_free|||ciu PadnamelistMAX|5.017004|5.017004|x PadnamelistMAXNAMED|5.019003||Viu PadnamelistREFCNT|5.021007|5.021007|x PadnamelistREFCNT_dec|5.021007|5.021007|x padnamelist_store|5.021007|5.021007|x PadnameLVALUE|5.021006||Viu PadnameLVALUE_on|5.021006||Viu PadnameOURSTASH|5.017004||Vi PadnameOURSTASH_set|5.021007||Viu PadnameOUTER|5.017004||Vi PadnamePROTOCV|5.021007||Viu PadnamePV|5.017004|5.017004|x PadnameREFCNT|5.021007|5.021007|x PadnameREFCNT_dec|5.021007|5.021007|x PadnameSV|5.017004|5.017004|x PADNAMEt_LVALUE|5.021007||Viu PADNAMEt_OUR|5.021007||Viu PADNAMEt_OUTER|5.021007|5.021007| PADNAMEt_STATE|5.021007||Viu PADNAMEt_TYPED|5.021007||Viu PadnameTYPE|5.017004||Vi PadnameTYPE_set|5.021007||Viu PadnameUTF8|5.017004|5.017004|x pad_new|5.008001|5.008001| padnew_CLONE|5.008001||Viu padnew_SAVE|5.008001||Viu padnew_SAVESUB|5.008001||Viu pad_peg|5.009004||Viu pad_push|5.008001||cVi pad_reset|5.003007||Vi PAD_RESTORE_LOCAL|5.008001||Vi PAD_SAVE_LOCAL|5.008001||Vi PAD_SAVE_SETNULLPAD|5.008001||Vi PAD_SET_CUR|5.008001||Vi PAD_SET_CUR_NOSAVE|5.008002||Vi pad_setsv|5.008001||cV PAD_SETSV|5.008001||Vi pad_sv|5.003007||cV PAD_SV|5.003007||Vi PAD_SVl|5.008001||Vi pad_swipe|5.003007||Vi pad_tidy|5.008001|5.008001|x panic_write2|5.008001||Viu PARENT_FAKELEX_FLAGS|5.009005||Viu PARENT_PAD_INDEX|5.009005||Viu parse_arithexpr|5.013008|5.013008|x parse_barestmt|5.013007|5.013007|x parse_block|5.013007|5.013007|x parse_body|5.006000||Viu parse_fullexpr|5.013008|5.013008|x parse_fullstmt|5.013005|5.013005|x parse_gv_stash_name|5.019004||Viu parse_ident|5.017010||Viu parse_label|5.013007|5.013007|x parse_listexpr|5.013008|5.013008|x parse_lparen_question_flags|5.017009||Viu PARSE_OPTIONAL|5.013007|5.013007| parser_dup|5.009000|5.009000|u parser_free|5.009005||Viu parser_free_nexttoke_ops|5.017006||Viu parse_stmtseq|5.013006|5.013006|x parse_subsignature|5.031003|5.031003|x parse_termexpr|5.013008|5.013008|x parse_unicode_opts|5.008001||Viu parse_uniprop_string|5.027011||Viu PATCHLEVEL|5.003007||Viu path_is_searchable|5.019001||Vniu Pause|5.003007||Viu pause|5.005000||Viu pclose|5.003007||Viu peep|5.003007||Viu pending_ident|5.017004||Viu PERL_ABS|5.008001|5.003007|p Perl_acos|5.021004|5.021004|n perl_alloc|5.003007|5.003007|n PERL_ALLOC_CHECK|5.006000||Viu perl_alloc_using|5.006000||Vnu PERL_ANY_COW|5.017007||Viu PERL_API_REVISION|5.006000||Viu PERL_API_SUBVERSION|5.006000||Viu PERL_API_VERSION|5.006000||Viu PERL_API_VERSION_STRING|5.013004||Viu PERL_ARENA_ROOTS_SIZE|5.009004||Viu PERL_ARENA_SIZE|5.009003||Viu PERL_ARGS_ASSERT_CROAK_XS_USAGE|||ponu Perl_asin|5.021004|5.021004|n Perl_assert|5.011000||Viu perl_assert_ptr|5.027004||Viu PERL_ASYNC_CHECK|5.006000|5.006000| Perl_atan2|5.006000|5.006000|n Perl_atan|5.021004|5.021004|n Perl_atof2|5.006001||Viu Perl_atof|5.006000||Viu PERL_BCDVERSION||5.003007|onu PERL_BISON_VERSION|5.023008||Viu PERL_BITFIELD16|5.010001||Viu PERL_BITFIELD32|5.010001||Viu PERL_BITFIELD8|5.010001||Viu PERL_CALLCONV|5.005002||Viu PERL_CALLCONV_NO_RET|5.017002||Viu Perl_calloc|5.006000||Viu Perl_ceil|5.009001|5.009001|n PERL_CKDEF|5.006000||Viu perl_clone|5.006000||Vn perl_clone_using|5.006000||Vnu perl_construct|5.003007|5.003007|n PERL_COP_SEQMAX|5.013010||Viu PERL_COPY_ON_WRITE|5.023001||Viu Perl_cos|5.006000|5.006000|n Perl_cosh|5.021004|5.021004|n PERL_COUNT_MULTIPLIER|5.027007||Viu Perl_custom_op_xop|5.019006||V PERLDB_ALL|5.004002||Viu PERLDBf_GOTO|5.004005||Viu PERLDBf_INTER|5.004002||Viu PERLDBf_LINE|5.004002||Viu PERLDBf_NAMEANON|5.006000||Viu PERLDBf_NAMEEVAL|5.006000||Viu PERLDBf_NONAME|5.004005||Viu PERLDBf_NOOPT|5.004002||Viu PERLDBf_SAVESRC|5.010001||Viu PERLDBf_SAVESRC_INVALID|5.010001||Viu PERLDBf_SAVESRC_NOSUBS|5.010001||Viu PERLDBf_SINGLE|5.004002||Viu PERLDBf_SUB|5.004002||Viu PERLDBf_SUBLINE|5.004002||Viu PERLDB_GOTO|5.004005||Viu PERLDB_INTER|5.004002||Viu PERLDB_LINE|5.004002||Viu PERLDB_LINE_OR_SAVESRC|5.023002||Viu PERLDB_NAMEANON|5.006000||Viu PERLDB_NAMEEVAL|5.006000||Viu PERLDB_NOOPT|5.004002||Viu PERLDB_SAVESRC|5.010001||Viu PERLDB_SAVESRC_INVALID|5.010001||Viu PERLDB_SAVESRC_NOSUBS|5.010001||Viu PERLDB_SINGLE|5.004002||Viu PERLDB_SUB|5.004002||Viu PERLDB_SUBLINE|5.004002||Viu PERLDB_SUB_NN|5.004005||Viu PERL_DEB2|5.021007||Viu PERL_DEB|5.008001||Viu PERL_DEBUG|5.008001||Viu Perl_debug_log|5.003007||Viu PERL_DEBUG_PAD|5.007003||Viu PERL_DEBUG_PAD_ZERO|5.007003||Viu PERL_DECIMAL_VERSION|5.019008||Viu PERL_DEFAULT_DO_EXEC3_IMPLEMENTATION|5.009003||Viu perl_destruct|5.007003|5.007003|n PerlDir_chdir|5.005000||Viu PerlDir_close|5.005000||Viu PerlDir_mapA|5.006000||Viu PerlDir_mapW|5.006000||Viu PerlDir_mkdir|5.005000||Viu PerlDir_open|5.005000||Viu PerlDir_read|5.005000||Viu PerlDir_rewind|5.005000||Viu PerlDir_rmdir|5.005000||Viu PerlDir_seek|5.005000||Viu PerlDir_tell|5.005000||Viu PERL_DONT_CREATE_GVSV|5.009003||Viu Perl_drand48|5.019004||Viu Perl_drand48_init|5.019004||Viu PERL_DRAND48_QUAD|5.019004||Viu PERL_DTRACE_PROBE_ENTRY|5.023009||Viu PERL_DTRACE_PROBE_FILE_LOADED|5.023009||Viu PERL_DTRACE_PROBE_FILE_LOADING|5.023009||Viu PERL_DTRACE_PROBE_OP|5.023009||Viu PERL_DTRACE_PROBE_PHASE|5.023009||Viu PERL_DTRACE_PROBE_RETURN|5.023009||Viu PERL_EBCDIC_TABLES_H|5.027001||Viu PERL_ENABLE_EXPERIMENTAL_REGEX_OPTIMISATIONS|5.009004||Viu PERL_ENABLE_EXTENDED_TRIE_OPTIMISATION|5.009004||Viu PERL_ENABLE_POSITIVE_ASSERTION_STUDY|5.009005||Viu PERL_ENABLE_TRIE_OPTIMISATION|5.009004||Viu PerlEnv_clearenv|5.006000||Viu PerlEnv_ENVgetenv|5.006000||Viu PerlEnv_ENVgetenv_len|5.006000||Viu PerlEnv_free_childdir|5.006000||Viu PerlEnv_free_childenv|5.006000||Viu PerlEnv_get_childdir|5.006000||Viu PerlEnv_get_childenv|5.006000||Viu PerlEnv_get_child_IO|5.006000||Viu PerlEnv_getenv|5.005000||Viu PerlEnv_getenv_len|5.006000||Viu PerlEnv_lib_path|5.005000||Viu PerlEnv_os_id|5.006000||Viu PerlEnv_putenv|5.005000||Viu PerlEnv_sitelib_path|5.005000||Viu PerlEnv_uname|5.005004||Viu PerlEnv_vendorlib_path|5.006000||Viu Perl_error_log|5.006000||Viu Perl_eval_pv||5.003007|onu Perl_eval_sv||5.003007|onu PERL_EXIT_ABORT|5.019003|5.019003| PERL_EXIT_DESTRUCT_END|5.007003|5.007003| PERL_EXIT_EXPECTED|5.006000|5.006000| PERL_EXIT_WARN|5.019003|5.019003| Perl_exp|5.006000|5.006000|n PERL_FEATURE_H|5.029006||Viu PERL_FILE_IS_ABSOLUTE|5.006000||Viu PERL_FILTER_EXISTS|5.009005||Viu Perl_floor|5.006000|5.006000|n PERL_FLUSHALL_FOR_CHILD|5.006000||Viu Perl_fmod|5.006000|5.006000|n Perl_fp_class|5.007003||Viu Perl_fp_class_denorm|5.007003||Viu Perl_fp_class_inf|5.007003||Viu Perl_fp_class_nan|5.007003||Viu Perl_fp_class_ndenorm|5.007003||Viu Perl_fp_class_ninf|5.007003||Viu Perl_fp_class_nnorm|5.007003||Viu Perl_fp_class_norm|5.007003||Viu Perl_fp_class_nzero|5.007003||Viu Perl_fp_class_pdenorm|5.007003||Viu Perl_fp_class_pinf|5.007003||Viu Perl_fp_class_pnorm|5.007003||Viu Perl_fp_class_pzero|5.007003||Viu Perl_fp_class_qnan|5.007003||Viu Perl_fp_class_snan|5.007003||Viu Perl_fp_class_zero|5.007003||Viu PERL_FPU_INIT|5.007002||Viu PERL_FPU_POST_EXEC|5.008001||Viu PERL_FPU_PRE_EXEC|5.008001||Viu perl_free|5.003007|5.003007|n Perl_free_c_backtrace|5.021001||Viu Perl_frexp|5.006000|5.006000|n PERL_FS_VER_FMT|5.006000||Viu PERL_FS_VERSION|5.010001||Viu PERL_GCC_BRACE_GROUPS_FORBIDDEN|5.008001||Viu PERL_GET_CONTEXT|5.006000||Viu PERL_GET_INTERP|5.006000||Viu PERL_GET_THX|5.006000||Viu PERL_GIT_UNPUSHED_COMMITS|5.010001||Viu PERL_GPROF_MONCONTROL|5.007002||Viu PERL_HANDY_H|5.027001||Viu PERL_HASH|5.003007|5.003007|p PERL_HASH_DEFAULT_HvMAX|5.017011||Viu PERL_HASH_FUNC|5.017006||Viu PERL_HASH_FUNC_SIPHASH13|5.033007||Viu PERL_HASH_FUNC_ZAPHOD32|5.027001||Viu PERL_HASH_INTERNAL|5.008002||Viu PERL_HASH_ITER_BUCKET|5.018000||Viu PERL_HASH_RANDOMIZE_KEYS|5.018000||Viu PERL_HASH_SEED|5.008001||Viu PERL_HASH_SEED_BYTES|5.017006||Viu PERL_HASH_SEED_STATE|5.027001||Viu PERL_HASH_SEED_WORDS|5.033007||Viu PERL_HASH_STATE_BYTES|5.027001||Viu PERL_HASH_STATE_WORDS|5.033007||Viu PERL_HASH_USE_SBOX32_ALSO|5.027001||Viu PERL_HASH_WITH_SEED|5.021001||Viu PERL_HASH_WITH_STATE|5.027001||Viu PERL_HV_ALLOC_AUX_SIZE|5.019010||Viu PERL_HV_ARRAY_ALLOC_BYTES|5.006000||Viu PERL___I|5.009005||Viu PERL_IMPLICIT_CONTEXT|5.006000||Viu PERL_INC_VERSION_LIST|5.035001|5.035001|Vn Perl_internal_drand48|5.027004||Viu PERL_INTERPRETER_SIZE_UPTO_MEMBER|5.010000||Viu PERL_INT_MAX|5.003007|5.003007|p PERL_INT_MIN|5.003007|5.003007|p PERL_INVLIST_INLINE_H|5.029006||Viu PerlIO|5.003007||Viu PerlIO_apply_layers|5.007001|5.007001| PerlIOArg|5.007001||Viu PerlIOBase|5.007001||Viu PerlIO_binmode|5.007001|5.007001| PERLIOBUF_DEFAULT_BUFSIZ|5.013007||Viu PerlIO_canset_cnt|5.003007|5.003007|n PerlIO_clearerr|5.007003|5.007003| PerlIO_close|5.007003|5.007003| PerlIO_context_layers|5.009004|5.009004|u PerlIO_debug|5.007001|5.007001| PERLIO_DUP_CLONE|5.007003||Viu PERLIO_DUP_FD|5.007003||Viu PerlIO_eof|5.007003|5.007003| PerlIO_error|5.007003|5.007003| PerlIO_exportFILE|5.003007|5.003007|n PERLIO_F_APPEND|5.007001|5.007001| PerlIO_fast_gets|5.003007|5.003007|n PERLIO_F_CANREAD|5.007001|5.007001| PERLIO_F_CANWRITE|5.007001|5.007001| PERLIO_F_CLEARED|5.013008||Viu PERLIO_F_CRLF|5.007001|5.007001| PerlIO_fdopen|5.003007|5.003007|n PERLIO_F_EOF|5.007001|5.007001| PERLIO_F_ERROR|5.007001|5.007001| PERLIO_F_FASTGETS|5.007001|5.007001| PerlIO_fileno|5.007003|5.007003| PerlIO_fill|5.007003|5.007003|u PerlIO_findFILE|5.003007|5.003007|n PERLIO_F_LINEBUF|5.007001|5.007001| PerlIO_flush|5.007003|5.007003| PERLIO_F_NOTREG|5.008001||Viu PERLIO_F_OPEN|5.007001|5.007001| PERLIO_F_RDBUF|5.007001|5.007001| PERLIO_F_TEMP|5.007001|5.007001| PERLIO_F_TRUNCATE|5.007001|5.007001| PERLIO_F_TTY|5.007001||Viu PERLIO_F_UNBUF|5.007001|5.007001| PERLIO_FUNCS_CAST|5.009003||pVu PERLIO_FUNCS_DECL|5.009003|5.009003|pVu PERLIO_F_UTF8|5.007001|5.007001| PERLIO_F_WRBUF|5.007001|5.007001| PerlIO_get_base|5.007003|5.007003| PerlIO_get_bufsiz|5.007003|5.007003| PerlIO_getc|5.003007|5.003007|n PerlIO_get_cnt|5.007003|5.007003| PerlIO_getpos|5.003007|5.003007|n PerlIO_get_ptr|5.007003|5.007003| PERLIO_H|5.027001||Viu PerlIO_has_base|5.003007|5.003007|n PerlIO_has_cntptr|5.003007|5.003007|n PerlIO_importFILE|5.003007|5.003007|n PERLIO_INIT|5.009005||Viu PERLIO_K_BUFFERED|5.007001|5.007001| PERLIO_K_CANCRLF|5.007001|5.007001| PERLIO_K_DESTRUCT|5.007001||Viu PERLIO_K_DUMMY|5.007001||Viu PERLIO_K_FASTGETS|5.007001|5.007001| PERLIO_K_MULTIARG|5.007003|5.007003| PERLIO_K_RAW|5.007001|5.007001| PERLIO_K_UTF8|5.007001||Viu PERLIO_LAYERS|5.007001||Viu PERLIOL_H|5.027001||Viu PerlIONext|5.007001||Viu PERLIO_NOT_STDIO|5.003007||Viu PerlIO_open|5.003007|5.003007|n PerlIO_printf|5.006000|5.003007| PerlIO_putc|5.003007|5.003007|n PerlIO_puts|5.003007|5.003007|n PerlIO_read|5.007003|5.007003| PerlIO_releaseFILE|5.003007|5.003007|n PerlIO_reopen|5.003007|5.003007|n PerlIO_restore_errno|5.021006||cViu PerlIO_rewind|5.003007|5.003007|n PerlIO_save_errno|5.021006||cViu PerlIO_seek|5.007003|5.007003| PerlIOSelf|5.007001||Viu PerlIO_set_cnt|5.007003|5.007003| PerlIO_setlinebuf|5.007003|5.007003| PerlIO_setpos|5.003007|5.003007|n PerlIO_set_ptrcnt|5.007003|5.007003| PerlIO_stderr|5.007003|5.007003| PerlIO_stdin|5.007003|5.007003| PerlIO_stdout|5.007003|5.007003| PerlIO_stdoutf|5.006000|5.003007| PERLIO_STDTEXT|5.007001||Viu PerlIO_tell|5.007003|5.007003| PERLIO_TERM|5.009005||Viu PerlIO_ungetc|5.003007|5.003007|n PerlIO_unread|5.007003|5.007003|u PERLIO_USING_CRLF|5.007003||Viu PerlIOValid|5.007003||Viu PerlIO_vprintf|5.003007|5.003007|n PerlIO_write|5.007003|5.007003| Perl_isfinite|5.007003|5.007003|n Perl_isfinitel|5.021004||Viu PERL_IS_GCC|5.032001||Viu Perl_isinf|5.007003|5.007003|n Perl_isnan|5.006001|5.006001|n PERL_IS_SUBWORD_ADDR|5.027007||Viu PERL_JNP_TO_DECIMAL|5.033001||Viu Perl_langinfo|5.027004|5.027004|n PERL_LANGINFO_H|5.027004||Viu PERL_LAST_5_18_0_INTERP_MEMBER|5.017009||Viu Perl_ldexp|5.021003|5.021003|n PerlLIO_access|5.005000||Viu PerlLIO_chmod|5.005000||Viu PerlLIO_chown|5.005000||Viu PerlLIO_chsize|5.005000||Viu PerlLIO_close|5.005000||Viu PerlLIO_dup2|5.005000||Viu PerlLIO_dup2_cloexec|5.027008||Viu PerlLIO_dup|5.005000||Viu PerlLIO_dup_cloexec|5.027008||Viu PerlLIO_flock|5.005000||Viu PerlLIO_fstat|5.005000||Viu PerlLIO_ioctl|5.005000||Viu PerlLIO_isatty|5.005000||Viu PerlLIO_link|5.006000||Viu PerlLIO_lseek|5.005000||Viu PerlLIO_lstat|5.005000||Viu PerlLIO_mktemp|5.005000||Viu PerlLIO_open3|5.005000||Viu PerlLIO_open3_cloexec|5.027008||Viu PerlLIO_open|5.005000||Viu PerlLIO_open_cloexec|5.027008||Viu PerlLIO_read|5.005000||Viu PerlLIO_readlink|5.033005||Viu PerlLIO_rename|5.005000||Viu PerlLIO_setmode|5.005000||Viu PerlLIO_stat|5.005000||Viu PerlLIO_symlink|5.033005||Viu PerlLIO_tmpnam|5.005000||Viu PerlLIO_umask|5.005000||Viu PerlLIO_unlink|5.005000||Viu PerlLIO_utime|5.005000||Viu PerlLIO_write|5.005000||Viu PERL_LOADMOD_DENY|5.006000|5.003007| PERL_LOADMOD_IMPORT_OPS|5.006000|5.003007| PERL_LOADMOD_NOIMPORT|5.006000|5.003007| Perl_log10|5.021004|5.021004|n Perl_log|5.006000|5.006000|n PERL_LONG_MAX|5.003007|5.003007|p PERL_LONG_MIN|5.003007|5.003007|p PERL_MAGIC_arylen|5.007002|5.003007|p PERL_MAGIC_arylen_p|5.009003|5.009003| PERL_MAGIC_backref|5.007002|5.003007|p PERL_MAGIC_bm|5.007002|5.003007|p PERL_MAGIC_checkcall|5.013006|5.013006| PERL_MAGIC_collxfrm|5.007002|5.003007|p PERL_MAGIC_dbfile|5.007002|5.003007|p PERL_MAGIC_dbline|5.007002|5.003007|p PERL_MAGIC_debugvar|5.021005|5.021005| PERL_MAGIC_defelem|5.007002|5.003007|p PERL_MAGIC_env|5.007002|5.003007|p PERL_MAGIC_envelem|5.007002|5.003007|p PERL_MAGIC_ext|5.007002|5.003007|p PERL_MAGIC_fm|5.007002|5.003007|p PERL_MAGIC_glob||5.003007|ponu PERL_MAGIC_hints|5.009004|5.009004| PERL_MAGIC_hintselem|5.009004|5.009004| PERL_MAGIC_isa|5.007002|5.003007|p PERL_MAGIC_isaelem|5.007002|5.003007|p PERL_MAGIC_lvref|5.021005|5.021005| PERL_MAGIC_mutex||5.003007|ponu PERL_MAGIC_nkeys|5.007002|5.003007|p PERL_MAGIC_nonelem|5.027009|5.027009| PERL_MAGIC_overload||5.003007|ponu PERL_MAGIC_overload_elem||5.003007|ponu PERL_MAGIC_overload_table|5.007002|5.003007|p PERL_MAGIC_pos|5.007002|5.003007|p PERL_MAGIC_qr|5.007002|5.003007|p PERL_MAGIC_READONLY_ACCEPTABLE|5.015000||Viu PERL_MAGIC_regdata|5.007002|5.003007|p PERL_MAGIC_regdatum|5.007002|5.003007|p PERL_MAGIC_regex_global|5.007002|5.003007|p PERL_MAGIC_rhash|5.009003|5.009003| PERL_MAGIC_shared|5.007003|5.003007|p PERL_MAGIC_shared_scalar|5.007003|5.003007|p PERL_MAGIC_sig|5.007002|5.003007|p PERL_MAGIC_sigelem|5.007002|5.003007|p PERL_MAGIC_substr|5.007002|5.003007|p PERL_MAGIC_sv|5.007002|5.003007|p PERL_MAGIC_symtab|5.009003|5.009003| PERL_MAGIC_taint|5.007002|5.003007|p PERL_MAGIC_tied|5.007002|5.003007|p PERL_MAGIC_tiedelem|5.007002|5.003007|p PERL_MAGIC_tiedscalar|5.007002|5.003007|p PERL_MAGIC_TYPE_IS_VALUE_MAGIC|5.015000||Viu PERL_MAGIC_TYPE_READONLY_ACCEPTABLE|5.015000||Viu PERL_MAGIC_utf8|5.008001|5.003007|p PERL_MAGIC_UTF8_CACHESIZE|5.008001||Viu PERL_MAGIC_uvar|5.007002|5.003007|p PERL_MAGIC_uvar_elem|5.007003|5.003007|p PERL_MAGIC_VALUE_MAGIC|5.015000||Viu PERL_MAGIC_vec|5.007002|5.003007|p PERL_MAGIC_vstring|5.008001|5.003007|p PERL_MAGIC_VTABLE_MASK|5.015000||Viu Perl_malloc|5.006000||Viu PERL_MALLOC_CTL_H|5.027001||Viu Perl_malloc_good_size|5.010001||Viu PERL_MALLOC_WRAP|5.009002|5.009002|Vn PerlMem_calloc|5.006000||Viu PerlMem_free|5.005000||Viu PerlMem_free_lock|5.006000||Viu PerlMem_get_lock|5.006000||Viu PerlMem_is_locked|5.006000||Viu PerlMem_malloc|5.005000||Viu PERL_MEMORY_DEBUG_HEADER_SIZE|5.019009||Viu PerlMemParse_calloc|5.006000||Viu PerlMemParse_free|5.006000||Viu PerlMemParse_free_lock|5.006000||Viu PerlMemParse_get_lock|5.006000||Viu PerlMemParse_is_locked|5.006000||Viu PerlMemParse_malloc|5.006000||Viu PerlMemParse_realloc|5.006000||Viu PerlMem_realloc|5.005000||Viu PerlMemShared_calloc|5.006000||Viu PerlMemShared_free|5.006000||Viu PerlMemShared_free_lock|5.006000||Viu PerlMemShared_get_lock|5.006000||Viu PerlMemShared_is_locked|5.006000||Viu PerlMemShared_malloc|5.006000||Viu PerlMemShared_realloc|5.006000||Viu Perl_mfree|5.006000||Viu PERL_MG_UFUNC|5.007001||Viu Perl_modf|5.006000|5.006000|n PERL_MULTICONCAT_HEADER_SIZE|5.027006||Viu PERL_MULTICONCAT_IX_LENGTHS|5.027006||Viu PERL_MULTICONCAT_IX_NARGS|5.027006||Viu PERL_MULTICONCAT_IX_PLAIN_LEN|5.027006||Viu PERL_MULTICONCAT_IX_PLAIN_PV|5.027006||Viu PERL_MULTICONCAT_IX_UTF8_LEN|5.027006||Viu PERL_MULTICONCAT_IX_UTF8_PV|5.027006||Viu PERL_MULTICONCAT_MAXARG|5.027006||Viu Perl_my_mkostemp|5.027008||Viu Perl_my_mkstemp|5.027004||Viu PERL_MY_SNPRINTF_GUARDED|5.009004||Viu PERL_MY_SNPRINTF_POST_GUARD|5.021002||Viu PERL_MY_VSNPRINTF_GUARDED|5.009004||Viu PERL_MY_VSNPRINTF_POST_GUARD|5.021002||Viu PERL_NO_DEV_RANDOM|5.009004||Viu PERL_OBJECT_THIS|5.005000||Viu PERL_OP_PARENT|5.025001||Viu PERL_PADNAME_MINIMAL|5.021007||Viu PERL_PADSEQ_INTRO|5.013010||Viu perl_parse|5.006000|5.006000|n PERL_PATCHLEVEL_H_IMPLICIT|5.006000||Viu PERL_PATCHNUM|5.010001||Viu PERL_POISON_EXPR|5.019006||Viu Perl_pow|5.006000|5.006000|n Perl_pp_accept|5.013009||Viu Perl_pp_aelemfast_lex|5.015000||Viu Perl_pp_andassign|5.013009||Viu Perl_pp_avalues|5.013009||Viu Perl_pp_bind|5.013009||Viu Perl_pp_bit_xor|5.013009||Viu Perl_pp_chmod|5.013009||Viu Perl_pp_chomp|5.013009||Viu Perl_pp_connect|5.013009||Viu Perl_pp_cos|5.013009||Viu Perl_pp_custom|5.013009||Viu Perl_pp_dbmclose|5.013009||Viu PERL_PPDEF|5.006000||Viu Perl_pp_dofile|5.013009||Viu Perl_pp_dor|5.013009||Viu Perl_pp_dorassign|5.013009||Viu Perl_pp_dump|5.013009||Viu Perl_pp_egrent|5.013009||Viu Perl_pp_enetent|5.013009||Viu Perl_pp_eprotoent|5.013009||Viu Perl_pp_epwent|5.013009||Viu Perl_pp_eservent|5.013009||Viu Perl_pp_exp|5.013009||Viu Perl_pp_fcntl|5.013009||Viu Perl_pp_ftatime|5.013009||Viu Perl_pp_ftbinary|5.013009||Viu Perl_pp_ftblk|5.013009||Viu Perl_pp_ftchr|5.013009||Viu Perl_pp_ftctime|5.013009||Viu Perl_pp_ftdir|5.013009||Viu Perl_pp_fteexec|5.013009||Viu Perl_pp_fteowned|5.013009||Viu Perl_pp_fteread|5.013009||Viu Perl_pp_ftewrite|5.013009||Viu Perl_pp_ftfile|5.013009||Viu Perl_pp_ftmtime|5.013009||Viu Perl_pp_ftpipe|5.013009||Viu Perl_pp_ftrexec|5.013009||Viu Perl_pp_ftrwrite|5.013009||Viu Perl_pp_ftsgid|5.013009||Viu Perl_pp_ftsize|5.013009||Viu Perl_pp_ftsock|5.013009||Viu Perl_pp_ftsuid|5.013009||Viu Perl_pp_ftsvtx|5.013009||Viu Perl_pp_ftzero|5.013009||Viu Perl_pp_getpeername|5.013009||Viu Perl_pp_getsockname|5.013009||Viu Perl_pp_ggrgid|5.013009||Viu Perl_pp_ggrnam|5.013009||Viu Perl_pp_ghbyaddr|5.013009||Viu Perl_pp_ghbyname|5.013009||Viu Perl_pp_gnbyaddr|5.013009||Viu Perl_pp_gnbyname|5.013009||Viu Perl_pp_gpbyname|5.013009||Viu Perl_pp_gpbynumber|5.013009||Viu Perl_pp_gpwnam|5.013009||Viu Perl_pp_gpwuid|5.013009||Viu Perl_pp_gsbyname|5.013009||Viu Perl_pp_gsbyport|5.013009||Viu Perl_pp_gsockopt|5.013009||Viu Perl_pp_hex|5.013009||Viu Perl_pp_i_postdec|5.006000||Viu Perl_pp_i_postinc|5.006000||Viu Perl_pp_i_predec|5.006000||Viu Perl_pp_i_preinc|5.006000||Viu Perl_pp_keys|5.013009||Viu Perl_pp_kill|5.013009||Viu Perl_pp_lcfirst|5.013009||Viu Perl_pp_lineseq|5.013009||Viu Perl_pp_listen|5.013009||Viu Perl_pp_localtime|5.013009||Viu Perl_pp_log|5.013009||Viu Perl_pp_lstat|5.013009||Viu Perl_pp_mapstart|5.013009||Viu Perl_pp_msgctl|5.013009||Viu Perl_pp_msgget|5.013009||Viu Perl_pp_msgrcv|5.013009||Viu Perl_pp_msgsnd|5.013009||Viu Perl_pp_nbit_xor|5.021009||Viu Perl_pp_orassign|5.013009||Viu Perl_pp_padany|5.013009||Viu Perl_pp_pop|5.013009||Viu Perl_pp_read|5.013009||Viu Perl_pp_recv|5.013009||Viu Perl_pp_regcmaybe|5.013009||Viu Perl_pp_rindex|5.013009||Viu Perl_pp_rv2hv|5.013009||Viu Perl_pp_say|5.013009||Viu Perl_pp_sbit_xor|5.021009||Viu Perl_pp_scalar|5.013009||Viu Perl_pp_schomp|5.013009||Viu Perl_pp_scope|5.013009||Viu Perl_pp_seek|5.013009||Viu Perl_pp_semop|5.013009||Viu Perl_pp_send|5.013009||Viu Perl_pp_sge|5.013009||Viu Perl_pp_sgrent|5.013009||Viu Perl_pp_sgt|5.013009||Viu Perl_pp_shmctl|5.013009||Viu Perl_pp_shmget|5.013009||Viu Perl_pp_shmread|5.013009||Viu Perl_pp_shutdown|5.013009||Viu Perl_pp_slt|5.013009||Viu Perl_pp_snetent|5.013009||Viu Perl_pp_socket|5.013009||Viu Perl_pp_sprotoent|5.013009||Viu Perl_pp_spwent|5.013009||Viu Perl_pp_sqrt|5.013009||Viu Perl_pp_sservent|5.013009||Viu Perl_pp_ssockopt|5.013009||Viu Perl_pp_symlink|5.013009||Viu Perl_pp_transr|5.013009||Viu Perl_pp_unlink|5.013009||Viu Perl_pp_utime|5.013009||Viu Perl_pp_values|5.013009||Viu PERL_PRESERVE_IVUV|5.007001||Viu PERL_PRIeldbl|5.006001|5.006001|Vn PERL_PRIfldbl|5.006000|5.006000|Vn PERL_PRIgldbl|5.006000|5.006000|Vn PerlProc_abort|5.005000||Viu PerlProc_crypt|5.005000||Viu PerlProc_DynaLoad|5.006000||Viu PerlProc_execl|5.005000||Viu PerlProc_execv|5.005000||Viu PerlProc_execvp|5.005000||Viu PerlProc__exit|5.005000||Viu PerlProc_exit|5.005000||Viu PerlProc_fork|5.006000||Viu PerlProc_getegid|5.005000||Viu PerlProc_geteuid|5.005000||Viu PerlProc_getgid|5.005000||Viu PerlProc_getlogin|5.005000||Viu PerlProc_GetOSError|5.006000||Viu PerlProc_getpid|5.006000||Viu PerlProc_gettimeofday|5.008000||Viu PerlProc_getuid|5.005000||Viu PerlProc_kill|5.005000||Viu PerlProc_killpg|5.005000||Viu PerlProc_lasthost|5.007001||Viu PerlProc_longjmp|5.005000||Viu PerlProc_pause|5.005000||Viu PerlProc_pclose|5.005000||Viu PerlProc_pipe|5.005000||Viu PerlProc_pipe_cloexec|5.027008||Viu PerlProc_popen|5.005000||Viu PerlProc_popen_list|5.007001||Viu PerlProc_setgid|5.005000||Viu PerlProc_setjmp|5.005000||Viu PerlProc_setuid|5.005000||Viu PerlProc_signal|5.005000||Viu PerlProc_sleep|5.005000||Viu PerlProc_spawnvp|5.008000||Viu PerlProc_times|5.005000||Viu PerlProc_wait|5.005000||Viu PerlProc_waitpid|5.005000||Viu perl_pthread_mutex_lock|5.023006||Viu perl_pthread_mutex_unlock|5.023006||Viu PERL_PV_ESCAPE_ALL|5.009004|5.003007|p PERL_PV_ESCAPE_DWIM|5.019008||Viu PERL_PV_ESCAPE_FIRSTCHAR|5.009004|5.003007|p PERL_PV_ESCAPE_NOBACKSLASH|5.009004|5.003007|p PERL_PV_ESCAPE_NOCLEAR|5.009004|5.003007|p PERL_PV_ESCAPE_NONASCII|5.013009|5.013009| PERL_PV_ESCAPE_QUOTE|5.009004|5.003007|p PERL_PV_ESCAPE_RE|5.009005|5.003007|p PERL_PV_ESCAPE_UNI|5.009004|5.003007|p PERL_PV_ESCAPE_UNI_DETECT|5.009004|5.003007|p PERL_PV_PRETTY_DUMP|5.009004||pcV PERL_PV_PRETTY_ELLIPSES|5.010000|5.003007|p PERL_PV_PRETTY_EXACTSIZE|5.021005||Viu PERL_PV_PRETTY_LTGT|5.009004|5.003007|p PERL_PV_PRETTY_NOCLEAR|5.010000||pcV PERL_PV_PRETTY_QUOTE|5.009004|5.003007|p PERL_PV_PRETTY_REGPROP|5.009004||pcV PERL_QUAD_MAX|5.003007|5.003007|p PERL_QUAD_MIN|5.003007|5.003007|p PERL_READ_LOCK|5.033005||Viu PERL_READ_UNLOCK|5.033005||Viu Perl_realloc|5.006000||Viu PERL_REENTR_API|5.009005||Viu PERL_REENTR_H|5.027001||Viu PERL_REENTR_USING_ASCTIME_R|5.031011||Viu PERL_REENTR_USING_CRYPT_R|5.031011||Viu PERL_REENTR_USING_CTERMID_R|5.031011||Viu PERL_REENTR_USING_CTIME_R|5.031011||Viu PERL_REENTR_USING_ENDGRENT_R|5.031011||Viu PERL_REENTR_USING_ENDHOSTENT_R|5.031011||Viu PERL_REENTR_USING_ENDNETENT_R|5.031011||Viu PERL_REENTR_USING_ENDPROTOENT_R|5.031011||Viu PERL_REENTR_USING_ENDPWENT_R|5.031011||Viu PERL_REENTR_USING_ENDSERVENT_R|5.031011||Viu PERL_REENTR_USING_GETGRENT_R|5.031011||Viu PERL_REENTR_USING_GETGRGID_R|5.031011||Viu PERL_REENTR_USING_GETGRNAM_R|5.031011||Viu PERL_REENTR_USING_GETHOSTBYADDR_R|5.031011||Viu PERL_REENTR_USING_GETHOSTBYNAME_R|5.031011||Viu PERL_REENTR_USING_GETHOSTENT_R|5.031011||Viu PERL_REENTR_USING_GETLOGIN_R|5.031011||Viu PERL_REENTR_USING_GETNETBYADDR_R|5.031011||Viu PERL_REENTR_USING_GETNETBYNAME_R|5.031011||Viu PERL_REENTR_USING_GETNETENT_R|5.031011||Viu PERL_REENTR_USING_GETPROTOBYNAME_R|5.031011||Viu PERL_REENTR_USING_GETPROTOBYNUMBER_R|5.031011||Viu PERL_REENTR_USING_GETPROTOENT_R|5.031011||Viu PERL_REENTR_USING_GETPWENT_R|5.031011||Viu PERL_REENTR_USING_GETPWNAM_R|5.031011||Viu PERL_REENTR_USING_GETPWUID_R|5.031011||Viu PERL_REENTR_USING_GETSERVBYNAME_R|5.031011||Viu PERL_REENTR_USING_GETSERVBYPORT_R|5.031011||Viu PERL_REENTR_USING_GETSERVENT_R|5.031011||Viu PERL_REENTR_USING_GETSPNAM_R|5.031011||Viu PERL_REENTR_USING_GMTIME_R|5.031011||Viu PERL_REENTR_USING_LOCALTIME_R|5.031011||Viu PERL_REENTR_USING_READDIR64_R|5.031011||Viu PERL_REENTR_USING_READDIR_R|5.031011||Viu PERL_REENTR_USING_SETGRENT_R|5.031011||Viu PERL_REENTR_USING_SETHOSTENT_R|5.031011||Viu PERL_REENTR_USING_SETLOCALE_R|5.031011||Viu PERL_REENTR_USING_SETNETENT_R|5.031011||Viu PERL_REENTR_USING_SETPROTOENT_R|5.031011||Viu PERL_REENTR_USING_SETPWENT_R|5.031011||Viu PERL_REENTR_USING_SETSERVENT_R|5.031011||Viu PERL_REENTR_USING_STRERROR_R|5.031011||Viu PERL_REENTR_USING_TMPNAM_R|5.031011||Viu PERL_REENTR_USING_TTYNAME_R|5.031011||Viu PERL_REGCHARCLASS_H|5.027001||Viu PERL_REGCOMP_H|5.029006||Viu PERL_REGMATCH_SLAB_SLOTS|5.009004||Viu PERL_RELOCATABLE_INC|5.017002|5.017002|Vn PERL_REVISION|5.006000|5.006000|d perl_run|5.003007|5.003007|n PERL_RW_MUTEX_DESTROY|5.033005||Viu PERL_RW_MUTEX_INIT|5.033005||Viu Perl_safesysmalloc_size|5.010001||Viu PERL_SAWAMPERSAND|5.017010||Viu PERL_SCAN_ALLOW_MEDIAL_UNDERSCORES|5.031009||Viu PERL_SCAN_ALLOW_UNDERSCORES|5.007003|5.003007|p PERL_SCAN_DISALLOW_PREFIX|5.007003|5.003007|p PERL_SCAN_GREATER_THAN_UV_MAX|5.007003|5.003007|p PERL_SCAN_NOTIFY_ILLDIGIT|5.031008||Viu PERL_SCAN_SILENT_ILLDIGIT|5.008001|5.003007|p PERL_SCAN_SILENT_NON_PORTABLE|5.015001||Viu PERL_SCAN_SILENT_OVERFLOW|5.031009||Viu PERL_SCAN_TRAILING|5.021002|5.021002| PERL_SCNfldbl|5.006001|5.006001|Vn PERL_SCRIPT_MODE|5.004005||Viu PERL_SEEN_HV_FUNC_H|5.017010||Viu PERL_SEEN_HV_MACRO_H|5.027001||Viu PERL_SET_CONTEXT|5.006000||Viu PERL_SET_INTERP|5.006000||Viu Perl_setlocale|5.027002|5.027002|n PERL_SET_PHASE|5.015001||Viu PERL_SET_THX|5.006000||Viu Perl_sharepvn|5.006000||Viu PERL_SHORT_MAX|5.003007|5.003007|p PERL_SHORT_MIN|5.003007|5.003007|p PERLSI_DESTROY|5.005000||Viu PERLSI_DIEHOOK|5.005000||Viu PERL_SIGNALS_UNSAFE_FLAG|5.008001|5.003007|p Perl_signbit|5.009005|5.009005|xn PERLSI_MAGIC|5.005000||Viu PERLSI_MAIN|5.005000||Viu PERLSI_MULTICALL|5.023000||Viu Perl_sin|5.006000|5.006000|n Perl_sinh|5.021004|5.021004|n PerlSIO_canset_cnt|5.007001||Viu PerlSIO_clearerr|5.007001||Viu PerlSIO_fast_gets|5.007001||Viu PerlSIO_fclose|5.007001||Viu PerlSIO_fdopen|5.007001||Viu PerlSIO_fdupopen|5.007001||Viu PerlSIO_feof|5.007001||Viu PerlSIO_ferror|5.007001||Viu PerlSIO_fflush|5.007001||Viu PerlSIO_fgetc|5.007001||Viu PerlSIO_fgetpos|5.007001||Viu PerlSIO_fgets|5.007001||Viu PerlSIO_fileno|5.007001||Viu PerlSIO_fopen|5.007001||Viu PerlSIO_fputc|5.007001||Viu PerlSIO_fputs|5.007001||Viu PerlSIO_fread|5.007001||Viu PerlSIO_freopen|5.007001||Viu PerlSIO_fseek|5.007001||Viu PerlSIO_fsetpos|5.007001||Viu PerlSIO_ftell|5.007001||Viu PerlSIO_fwrite|5.007001||Viu PerlSIO_get_base|5.007001||Viu PerlSIO_get_bufsiz|5.007001||Viu PerlSIO_get_cnt|5.007001||Viu PerlSIO_get_ptr|5.007001||Viu PerlSIO_has_base|5.007001||Viu PerlSIO_has_cntptr|5.007001||Viu PerlSIO_init|5.007001||Viu PerlSIO_printf|5.007001||Viu PerlSIO_rewind|5.007001||Viu PerlSIO_setbuf|5.007001||Viu PerlSIO_set_cnt|5.007001||Viu PerlSIO_setlinebuf|5.007001||Viu PerlSIO_set_ptr|5.007001||Viu PerlSIO_setvbuf|5.007001||Viu PerlSIO_stderr|5.007001||Viu PerlSIO_stdin|5.007001||Viu PerlSIO_stdout|5.007001||Viu PerlSIO_stdoutf|5.007001||Viu PerlSIO_tmpfile|5.007001||Viu PerlSIO_ungetc|5.007001||Viu PERLSI_OVERLOAD|5.005000||Viu PerlSIO_vprintf|5.007001||Viu PERL_SIPHASH_FNC|5.025008||Viu PERLSI_REGCOMP|5.031011||Viu PERLSI_REQUIRE|5.005000||Viu PERLSI_SIGNAL|5.005000||Viu PERLSI_SORT|5.005000||Viu PERLSI_UNDEF|5.005000||Viu PERLSI_UNKNOWN|5.005000||Viu PERLSI_WARNHOOK|5.005000||Viu PERL_SMALL_MACRO_BUFFER|5.023008||Viu PERL_SNPRINTF_CHECK|5.021002||Viu PerlSock_accept|5.005000||Viu PerlSock_accept_cloexec|5.027008||Viu PerlSock_bind|5.005000||Viu PerlSock_closesocket|5.006000||Viu PerlSock_connect|5.005000||Viu PerlSock_endhostent|5.005000||Viu PerlSock_endnetent|5.005000||Viu PerlSock_endprotoent|5.005000||Viu PerlSock_endservent|5.005000||Viu PerlSock_gethostbyaddr|5.005000||Viu PerlSock_gethostbyname|5.005000||Viu PerlSock_gethostent|5.005000||Viu PerlSock_gethostname|5.005000||Viu PerlSock_getnetbyaddr|5.005000||Viu PerlSock_getnetbyname|5.005000||Viu PerlSock_getnetent|5.005000||Viu PerlSock_getpeername|5.005000||Viu PerlSock_getprotobyname|5.005000||Viu PerlSock_getprotobynumber|5.005000||Viu PerlSock_getprotoent|5.005000||Viu PerlSock_getservbyname|5.005000||Viu PerlSock_getservbyport|5.005000||Viu PerlSock_getservent|5.005000||Viu PerlSock_getsockname|5.005000||Viu PerlSock_getsockopt|5.005000||Viu PerlSock_htonl|5.005000||Viu PerlSock_htons|5.005000||Viu PerlSock_inet_addr|5.005000||Viu PerlSock_inet_ntoa|5.005000||Viu PerlSock_listen|5.005000||Viu PerlSock_ntohl|5.005000||Viu PerlSock_ntohs|5.005000||Viu PerlSock_recv|5.005000||Viu PerlSock_recvfrom|5.005000||Viu PerlSock_select|5.005000||Viu PerlSock_send|5.005000||Viu PerlSock_sendto|5.005000||Viu PerlSock_sethostent|5.005000||Viu PerlSock_setnetent|5.005000||Viu PerlSock_setprotoent|5.005000||Viu PerlSock_setservent|5.005000||Viu PerlSock_setsockopt|5.005000||Viu PerlSock_shutdown|5.005000||Viu PERL_SOCKS_NEED_PROTOTYPES|5.007001||Viu PerlSock_socket|5.005000||Viu PerlSock_socket_cloexec|5.027008||Viu PerlSock_socketpair|5.005000||Viu PerlSock_socketpair_cloexec|5.027008||Viu Perl_sqrt|5.006000|5.006000|n PERL_STACK_OVERFLOW_CHECK|5.006000||Viu PERL_STATIC_FORCE_INLINE|5.031011||Viu PERL_STATIC_FORCE_INLINE_NO_RET|5.031011||Viu PERL_STATIC_INLINE|5.013004|5.013004|Vn PERL_STATIC_INLINE_NO_RET|5.017005||Viu PERL_STATIC_NO_RET|5.017005||Viu PERL_STRLEN_EXPAND_SHIFT|5.013004||Viu PERL_STRLEN_ROUNDUP|5.009003||Viu PERL_STRLEN_ROUNDUP_QUANTUM|5.009003||Viu Perl_strtod|5.021004||Viu PERL_SUB_DEPTH_WARN|5.010001||Viu PERL_SUBVERSION|5.006000|5.003007|d PERL_SYS_FPU_INIT|5.021005||Viu PERL_SYS_INIT3|5.006000|5.006000| PERL_SYS_INIT3_BODY|5.010000||Viu PERL_SYS_INIT|5.003007|5.003007| PERL_SYS_INIT_BODY|5.010000||Viu PERL_SYS_TERM|5.003007|5.003007| PERL_SYS_TERM_BODY|5.010000||Viu Perl_tan|5.021004|5.021004|n Perl_tanh|5.021004|5.021004|n PERL_TARGETARCH|5.007002|5.007002|Vn PERL_TIME64_CONFIG_H|5.027001||Viu PERL_TIME64_H|5.027001||Viu PERL_TRACK_MEMPOOL|5.009003||Viu PERL_TSA|5.023006||Viu PERL_TSA_ACQUIRE|5.023006||Viu PERL_TSA_ACTIVE|5.023006||Viu PERL_TSA_CAPABILITY|5.023006||Viu PERL_TSA_EXCLUDES|5.023006||Viu PERL_TSA_GUARDED_BY|5.023006||Viu PERL_TSA_NO_TSA|5.023006||Viu PERL_TSA_PT_GUARDED_BY|5.023006||Viu PERL_TSA_RELEASE|5.023006||Viu PERL_TSA_REQUIRES|5.023006||Viu PERL_UCHAR_MAX|5.003007|5.003007|p PERL_UCHAR_MIN|5.003007|5.003007|p PERL_UINT_MAX|5.003007|5.003007|p PERL_UINT_MIN|5.003007|5.003007|p PERL_ULONG_MAX|5.003007|5.003007|p PERL_ULONG_MIN|5.003007|5.003007|p PERL_UNICODE_ALL_FLAGS|5.008001||Viu PERL_UNICODE_ARGV|5.008001||Viu PERL_UNICODE_ARGV_FLAG|5.008001||Viu PERL_UNICODE_CONSTANTS_H|5.027001||Viu PERL_UNICODE_DEFAULT_FLAGS|5.008001||Viu PERL_UNICODE_IN|5.008001||Viu PERL_UNICODE_IN_FLAG|5.008001||Viu PERL_UNICODE_INOUT|5.008001||Viu PERL_UNICODE_INOUT_FLAG|5.008001||Viu PERL_UNICODE_LOCALE|5.008001||Viu PERL_UNICODE_LOCALE_FLAG|5.008001||Viu PERL_UNICODE_MAX|5.007003||Viu PERL_UNICODE_OUT|5.008001||Viu PERL_UNICODE_OUT_FLAG|5.008001||Viu PERL_UNICODE_STD|5.008001||Viu PERL_UNICODE_STDERR|5.008001||Viu PERL_UNICODE_STDERR_FLAG|5.008001||Viu PERL_UNICODE_STD_FLAG|5.008001||Viu PERL_UNICODE_STDIN|5.008001||Viu PERL_UNICODE_STDIN_FLAG|5.008001||Viu PERL_UNICODE_STDOUT|5.008001||Viu PERL_UNICODE_STDOUT_FLAG|5.008001||Viu PERL_UNICODE_UTF8CACHEASSERT|5.009004||Viu PERL_UNICODE_UTF8CACHEASSERT_FLAG|5.009004||Viu PERL_UNICODE_WIDESYSCALLS|5.008001||Viu PERL_UNICODE_WIDESYSCALLS_FLAG|5.008001||Viu PERL_UNLOCK_HOOK|5.009004||Viu PERL_UNUSED_ARG|5.009003|5.003007|p PERL_UNUSED_CONTEXT|5.009004|5.003007|p PERL_UNUSED_DECL|5.007002|5.003007|p PERL_UNUSED_RESULT|5.021001|5.003007|p PERL_UNUSED_VAR|5.007002|5.003007|p PERL_UQUAD_MAX|5.003007|5.003007|p PERL_UQUAD_MIN|5.003007|5.003007|p PERL_USE_DEVEL|5.010001|5.010001|Vn PERL_USE_GCC_BRACE_GROUPS|5.009004|5.003007|pV PERL_USES_PL_PIDSTATUS|5.009003||Viu PERL_USHORT_MAX|5.003007|5.003007|p PERL_USHORT_MIN|5.003007|5.003007|p PERL_UTF8_H|5.027001||Viu PERL_UTIL_H|5.025012||Viu Perl_va_copy|5.007001||Viu PERLVAR|5.005000||Viu PERLVARA|5.006000||Viu PERLVARI|5.005000||Viu PERL_VARIANTS_WORD_MASK|5.027007||Viu PERLVARIC|5.005000||Viu PERL_VERSION|5.006000|5.003007|d PERL_VERSION_EQ|5.033001||p PERL_VERSION_GE|5.033001|5.003007|p PERL_VERSION_GT|5.033001|5.003007|p PERL_VERSION_LE|5.033001|5.003007|p PERL_VERSION_LT|5.033001|5.003007|p PERL_VERSION_MAJOR|5.033001||Viu PERL_VERSION_MINOR|5.033001||Viu PERL_VERSION_NE|5.033001||p PERL_VERSION_PATCH|5.033001||Viu PERL_VERSION_STRING|5.010001||Viu PERL_WAIT_FOR_CHILDREN|5.006000||Viu Perl_Warn_Bit|5.033003||Viu Perl_warner_nocontext||5.004000|ponu PERL_WARNHOOK_FATAL|5.009004||Viu Perl_Warn_Off|5.033003||Viu PERL_WORD_BOUNDARY_MASK|5.027007||Viu PERL_WORDSIZE|5.027007||Viu PERL_WRITE_LOCK|5.033005||Viu PERL_WRITE_MSG_TO_CONSOLE|5.007003||Viu PERL_WRITE_UNLOCK|5.033005||Viu PERL_XSUB_H|5.027001||Viu perly_sighandler|5.031007||cVnu PHOSTNAME|5.006000|5.006000|Vn pidgone|5.003007||Viu Pid_t|5.005000|5.005000|Vn pipe|5.005000||Viu PIPE_OPEN_MODE|5.008002||Viu PIPESOCK_MODE|5.008001||Viu PL_AboveLatin1|5.015008||Viu PL_amagic_generation|5.005000||Viu PL_an|5.005000||Viu PL_argvgv|5.005000||Viu PL_argvoutgv|5.005000||Viu PL_argvout_stack|5.006000||Viu PL_Assigned_invlist|5.025009||Viu PL_basetime|5.005000||Viu PL_beginav|5.005000||Viu PL_beginav_save|5.006001||Viu PL_blockhooks|5.013003||Viu PL_body_arenas|5.009004||Viu PL_body_roots|5.009003||Viu PL_bodytarget|5.005000||Viu PL_breakable_sub_gen|5.010001||Viu PL_bufend||5.003007|ponu PL_bufptr||5.003007|ponu PL_CCC_non0_non230|5.029008||Viu PL_check|5.009003|5.006000| PL_checkav|5.006000||Viu PL_checkav_save|5.008001||Viu PL_chopset|5.005000||Viu PL_clocktick|5.008001||Viu PL_collation_ix|5.005000||Viu PL_collation_name|5.005000||Viu PL_collation_standard|5.005000||Viu PL_collxfrm_base|5.005000||Viu PL_collxfrm_mult|5.005000||Viu PL_colors|5.005000||Viu PL_colorset|5.005000||Viu PL_compcv|5.005000||Viu PL_compiling|5.005000|5.003007|poVnu PL_comppad|5.008001|5.008001|x PL_comppad_name|5.017004|5.017004|x PL_comppad_name_fill|5.005000||Viu PL_comppad_name_floor|5.005000||Viu PL_constpadix|5.021004||Viu PL_copline||5.003007|ponu PL_cop_seqmax|5.005000||Viu PL_cshlen|5.005000||Viu PL_curcop|5.004005|5.003007|p PL_curcopdb|5.005000||Viu PL_curlocales|5.027009||Viu PL_curpad|5.005000|5.005000|x PL_curpm|5.005000||Viu PL_curpm_under|5.025007||Viu PL_curstack|5.005000||Viu PL_curstackinfo|5.005000||Viu PL_curstash|5.004005|5.003007|p PL_curstname|5.005000||Viu PL_custom_op_descs|5.007003||Viu PL_custom_op_names|5.007003||Viu PL_custom_ops|5.013007||Viu PL_cv_has_eval|5.009000||Viu PL_dbargs|5.005000||Viu PL_DBcontrol|5.021005||Viu PL_DBcv|5.005000||Viu PL_DBgv|5.005000||Viu PL_DBline|5.005000||Viu PL_DBsignal|5.005000|5.003007|poVnu PL_DBsignal_iv|5.021005||Viu PL_DBsingle|5.005000||pV PL_DBsingle_iv|5.021005||Viu PL_DBsub|5.005000||pV PL_DBtrace|5.005000||pV PL_DBtrace_iv|5.021005||Viu PL_debstash|5.005000|5.003007|poVnu PL_debug|5.005000||Viu PL_debug_pad|5.007003||Viu PL_defgv|5.004005|5.003007|p PL_def_layerlist|5.007003||Viu PL_defoutgv|5.005000||Viu PL_defstash|5.005000||Viu PL_delaymagic|5.005000||Viu PL_delaymagic_egid|5.015008||Viu PL_delaymagic_euid|5.015008||Viu PL_delaymagic_gid|5.015008||Viu PL_delaymagic_uid|5.015008||Viu PL_destroyhook|5.010000||Viu PL_diehook|5.005000|5.003007|poVnu PL_Dir|5.006000||Viu PL_dirty|5.005000|5.003007|poVnu PL_doswitches|5.005000||Viu PL_dowarn|5.005000||pV PL_dumper_fd|5.009003||Viu PL_dumpindent|5.006000||Viu PL_dump_re_max_len|5.023008||Viu PL_efloatbuf|5.006000||Viu PL_efloatsize|5.006000||Viu PL_E_FORMAT_PRECISION|5.029000||Viu PL_encoding|5.007003||Viu PL_endav|5.005000||Viu PL_Env|5.006000||Viu PL_envgv|5.005000||Viu PL_errgv|5.004005|5.003007|p PL_error_count||5.003007|ponu PL_errors|5.006000||Viu PL_e_script|5.005000||Viu PL_eval_root|5.005000||Viu PL_evalseq|5.005000||Viu PL_eval_start|5.005000||Viu PL_exit_flags|5.006000|5.006000| PL_exitlist|5.005000||Viu PL_exitlistlen|5.005000||Viu PL_expect||5.003007|ponu PL_fdpid|5.005000||Viu PL_filemode|5.005000||Viu PL_firstgv|5.005000||Viu PL_forkprocess|5.005000||Viu PL_formtarget|5.005000||Viu PL_GCB_invlist|5.021009||Viu PL_generation|5.005000||Viu PL_gensym|5.005000||Viu PL_globalstash|5.005000||Viu PL_globhook|5.015005||Viu PL_hash_rand_bits|5.017010||Viu PL_HASH_RAND_BITS_ENABLED|5.018000||Viu PL_hash_rand_bits_enabled|5.018000||Viu PL_hash_seed|5.033007||Viu PL_hash_state|5.033007||Viu PL_HasMultiCharFold|5.017005||Viu PL_hexdigit||5.003007|pn PL_hintgv|5.005000||Viu PL_hints|5.005000|5.003007|poVnu PL_hv_fetch_ent_mh|5.005000||Viu PL_incgv|5.005000||Viu PL_in_clean_all|5.005000||Viu PL_in_clean_objs|5.005000||Viu PL_in_eval|5.005000||Viu PL_initav|5.005000||Viu PL_in_load_module|5.008001||Viu PL_in_my||5.003007|ponu PL_in_my_stash||5.005000|ponu PL_inplace|5.005000||Viu PL_in_some_fold|5.029007||Viu PL_internal_random_state|5.027004||Viu PL_in_utf8_COLLATE_locale|5.025002||Viu PL_in_utf8_CTYPE_locale|5.019009||Viu PL_in_utf8_turkic_locale|5.029008||Viu PL_isarev|5.009005||Viu PL_keyword_plugin|5.011002|5.011002|x PL_known_layers|5.007003||Viu PL_langinfo_buf|5.027004||Viu PL_langinfo_bufsize|5.027004||Viu PL_lastfd|5.005000||Viu PL_lastgotoprobe|5.005000||Viu PL_last_in_gv|5.005000||Vi PL_laststatval|5.005000|5.003007|poVnu PL_laststype|5.005000||Viu PL_Latin1|5.015008||Viu PL_LB_invlist|5.023007||Viu PL_lc_numeric_mutex_depth|5.027009||Viu PL_lex_state||5.003007|ponu PL_lex_stuff||5.003007|ponu PL_linestr||5.003007|ponu PL_LIO|5.006000||Viu PL_locale_utf8ness|5.027009||Viu PL_localizing|5.005000||Viu PL_localpatches|5.005000||Viu PL_lockhook|5.007003||Viu PL_main_cv|5.005000||Viu PL_main_root|5.005000||Viu PL_mainstack|5.005000||Viu PL_main_start|5.005000||Viu PL_markstack|5.005000||Viu PL_markstack_max|5.005000||Viu PL_markstack_ptr|5.005000||Viu PL_max_intro_pending|5.005000||Viu PL_maxo|5.005000||Viu PL_maxsysfd|5.005000|5.005000| PL_mbrlen_ps|5.031010||Viu PL_mbrtowc_ps|5.031010||Viu PL_Mem|5.006000||Viu PL_mem_log|5.033005||Viu PL_memory_debug_header|5.009004||Viu PL_MemParse|5.006000||Viu PL_MemShared|5.006000||Viu PL_mess_sv|5.005000|5.004000|poVnu PL_min_intro_pending|5.005000||Viu PL_minus_a|5.005000||Viu PL_minus_c|5.005000||Viu PL_minus_E|5.009003||Viu PL_minus_F|5.005000||Viu PL_minus_l|5.005000||Viu PL_minus_n|5.005000||Viu PL_minus_p|5.005000||Viu PL_modcount|5.005000||Viu PL_modglobal|5.005000|5.005000| PL_multideref_pc|5.021007||Viu PL_my_cxt_list|5.009003||Viu PL_my_cxt_size|5.009003||Viu PL_na|5.004005|5.003007|p PL_nomemok|5.005000||Viu PL_no_modify||5.003007|ponu PL_numeric_name|5.005000||Viu PL_numeric_radix_sv|5.007002||Viu PL_numeric_standard|5.005000||Viu PL_numeric_underlying|5.027006||Viu PL_numeric_underlying_is_standard|5.027009||Viu PL_ofsgv|5.011000||Vi PL_oldname|5.005000||Viu PL_op|5.005000||Viu PL_op_exec_cnt|5.019002||Viu PL_opfreehook|5.011000|5.011000| PL_op_mask|5.005000||Viu PL_origalen|5.005000||Viu PL_origargc|5.005000||Viu PL_origargv|5.005000||Viu PL_origenviron|5.005000||Viu PL_origfilename|5.005000||Viu PL_ors_sv|5.007001||Viu PL_osname|5.005000||Viu PL_padix|5.005000||Viu PL_padix_floor|5.005000||Viu PL_padlist_generation|5.021007||Viu PL_padname_const|5.021007||Viu PL_padname_undef|5.021007||Viu PL_pad_reset_pending|5.005000||Viu PL_parser|5.009005|5.003007|p PL_patchlevel|5.005000||Viu PL_peepp|5.007003|5.007003| PL_perldb|5.005000|5.003007|poVnu PL_perl_destruct_level|5.004005|5.003007|p PL_perlio|5.007003||Viu PL_phase|5.013007|5.013007| PL_pidstatus|5.005000||Viu PL_Posix_ptrs|5.029000||Viu PL_ppaddr||5.003007|ponu PL_preambleav|5.005000||Viu PL_Private_Use|5.029009||Viu PL_Proc|5.006000||Viu PL_profiledata|5.005000||Viu PL_psig_name|5.006000||Viu PL_psig_pend|5.007001||Viu PL_psig_ptr|5.006000||Viu PL_ptr_table|5.006000||Viu PL_random_state|5.019004||Viu PL_RANDOM_STATE_TYPE|5.019004||Viu PL_reentrant_buffer|5.007002||Viu PL_reentrant_retint|5.008001||Viu PL_reg_curpm|5.006000||Viu PL_regex_pad|5.007002||Viu PL_regex_padav|5.007002||Viu PL_registered_mros|5.010001||Viu PL_regmatch_slab|5.009004||Viu PL_regmatch_state|5.009004||Viu PL_replgv|5.005000||Viu PL_restartjmpenv|5.013001||Viu PL_restartop|5.005000|5.005000| PL_rpeepp|5.013005|5.013005| PL_rs|5.005000||Vi PL_rsfp||5.003007|ponu PL_rsfp_filters||5.003007|ponu PL_runops|5.006000|5.006000| PL_savebegin|5.007003||Viu PL_savestack|5.005000||Viu PL_savestack_ix|5.005000||Viu PL_savestack_max|5.005000||Viu PL_sawampersand|5.005000||Viu PL_SB_invlist|5.021009||Viu PL_scopestack|5.005000||Viu PL_scopestack_ix|5.005000||Viu PL_scopestack_max|5.005000||Viu PL_scopestack_name|5.011002||Viu PL_SCX_invlist|5.027008||Viu PL_secondgv|5.005000||Viu PL_setlocale_buf|5.027009||Viu PL_setlocale_bufsize|5.027009||Viu PL_sharehook|5.007003||Viu PL_sighandler1p|5.031007||Viu PL_sighandler3p|5.031007||Viu PL_sighandlerp|5.005000||Viu PL_signalhook|5.013002||Viu PL_signals|5.008001|5.003007|poVnu PL_sig_pending|5.007001||Viu PL_Sock|5.006000||Viu PL_sortcop|5.005000||Viu PL_sortstash|5.005000||Viu PL_splitstr|5.005000||Viu PL_srand_called|5.006000||Viu PL_stack_base|5.005000|5.003007|poVnu PL_stack_max|5.005000||Viu PL_stack_sp|5.005000|5.003007|poVnu PL_start_env|5.005000||Viu PL_stashcache|5.008001||Viu PL_stashpad|5.017001||Viu PL_stashpadix|5.017001||Viu PL_stashpadmax|5.017001||Viu PL_statcache|5.005000|5.003007|poVnu PL_statgv|5.005000||Viu PL_statname|5.005000||Viu PL_statusvalue|5.005000||Viu PL_statusvalue_posix|5.009003||Viu PL_statusvalue_vms|5.005000||Viu PL_stderrgv|5.006000||Viu PL_stdingv|5.005000|5.003007|poVnu PL_StdIO|5.006000||Viu PL_strtab|5.005000||Viu PL_strxfrm_is_behaved|5.025002||Viu PL_strxfrm_max_cp|5.025002||Viu PL_strxfrm_NUL_replacement|5.025008||Viu PL_sub_generation|5.005000||Viu PL_subline|5.005000||Viu PL_subname|5.005000||Viu PL_Sv|5.005000||pcV PL_sv_arenaroot|5.005000|5.003007|poVnu PL_sv_consts|5.019002||Viu PL_sv_count|5.005000||Viu PL_sv_immortals|5.027003||Viu PL_sv_no|5.004005|5.003007|p PL_sv_root|5.005000||Viu PL_sv_serial|5.010001||Viu PL_sv_undef|5.004005|5.003007|p PL_sv_yes|5.004005|5.003007|p PL_sv_zero|5.027003|5.027003| PL_sys_intern|5.005000||Viu PL_tainted|5.005000|5.003007|poVnu PL_tainting|5.005000|5.003007|poVnu PL_taint_warn|5.007003||Viu PL_threadhook|5.008000||Viu PL_tmps_floor|5.005000||Viu PL_tmps_ix|5.005000||Viu PL_tmps_max|5.005000||Viu PL_tmps_stack|5.005000||Viu PL_tokenbuf||5.003007|ponu PL_top_env|5.005000||Viu PL_toptarget|5.005000||Viu PL_TR_SPECIAL_HANDLING_UTF8|5.031006||Viu PL_underlying_numeric_obj|5.027009||Viu PL_unicode|5.008001||Viu PL_unitcheckav|5.009005||Viu PL_unitcheckav_save|5.009005||Viu PL_unlockhook|5.007003||Viu PL_unsafe|5.005000||Viu PL_UpperLatin1|5.019005||Viu PLUS|5.003007||Viu PLUS_t8_p8|5.033003||Viu PLUS_t8_pb|5.033003||Viu PLUS_tb_p8|5.033003||Viu PLUS_tb_pb|5.033003||Viu PL_utf8cache|5.009004||Viu PL_utf8_charname_begin|5.017006||Viu PL_utf8_charname_continue|5.017006||Viu PL_utf8_foldclosures|5.013007||Viu PL_utf8_idcont|5.008000||Viu PL_utf8_idstart|5.008000||Viu PL_utf8locale|5.008001||Viu PL_utf8_mark|5.006000||Viu PL_utf8_perl_idcont|5.017008||Viu PL_utf8_perl_idstart|5.015004||Viu PL_utf8_tofold|5.007003||Viu PL_utf8_tolower|5.006000||Viu PL_utf8_tosimplefold|5.027011||Viu PL_utf8_totitle|5.006000||Viu PL_utf8_toupper|5.006000||Viu PL_utf8_xidcont|5.013010||Viu PL_utf8_xidstart|5.013010||Viu PL_vtbl_arylen|5.015000||Viu PL_vtbl_arylen_p|5.015000||Viu PL_vtbl_backref|5.015000||Viu PL_vtbl_bm|5.015000||Viu PL_vtbl_checkcall|5.017000||Viu PL_vtbl_collxfrm|5.015000||Viu PL_vtbl_dbline|5.015000||Viu PL_vtbl_debugvar|5.021005||Viu PL_vtbl_defelem|5.015000||Viu PL_vtbl_env|5.015000||Viu PL_vtbl_envelem|5.015000||Viu PL_vtbl_fm|5.015000||Viu PL_vtbl_hints|5.015000||Viu PL_vtbl_hintselem|5.015000||Viu PL_vtbl_isa|5.015000||Viu PL_vtbl_isaelem|5.015000||Viu PL_vtbl_lvref|5.021005||Viu PL_vtbl_mglob|5.015000||Viu PL_vtbl_nkeys|5.015000||Viu PL_vtbl_nonelem|5.027009||Viu PL_vtbl_ovrld|5.015000||Viu PL_vtbl_pack|5.015000||Viu PL_vtbl_packelem|5.015000||Viu PL_vtbl_pos|5.015000||Viu PL_vtbl_regdata|5.015000||Viu PL_vtbl_regdatum|5.015000||Viu PL_vtbl_regexp|5.015000||Viu PL_vtbl_sig|5.035001||Viu PL_vtbl_sigelem|5.015000||Viu PL_vtbl_substr|5.015000||Viu PL_vtbl_sv|5.015000||Viu PL_vtbl_taint|5.015000||Viu PL_vtbl_utf8|5.015000||Viu PL_vtbl_uvar|5.015000||Viu PL_vtbl_vec|5.015000||Viu PL_warnhook|5.005000||Viu PL_warn_locale|5.021008||Viu PL_watchaddr|5.006000||Viu PL_watchok|5.006000||Viu PL_WB_invlist|5.021009||Viu PL_wcrtomb_ps|5.031010||Viu PL_XPosix_ptrs|5.017008||Viu PL_Xpv|5.005000|5.003007|poVnu PL_xsubfilename|5.021006||Viu pm_description|5.009004||Viu PMf_BASE_SHIFT|5.013004||Viu PMf_CHARSET|5.017011||Viu PMf_CODELIST_PRIVATE|5.017001||Viu PMf_CONST|5.003007||Viu PMf_CONTINUE|5.004000||Viu PMf_EVAL|5.003007||Viu PMf_EXTENDED|5.003007||Viu PMf_EXTENDED_MORE|5.021005||Viu PMf_FOLD|5.003007||Viu PMf_GLOBAL|5.003007||Viu PMf_HAS_CV|5.017001||Viu PMf_HAS_ERROR|5.025010||Viu PMf_IS_QR|5.017001||Viu PMf_KEEP|5.003007||Viu PMf_KEEPCOPY|5.009005||Viu PMf_MULTILINE|5.003007||Viu PMf_NOCAPTURE|5.021008||Viu PMf_NONDESTRUCT|5.013002||Viu PMf_ONCE|5.003007||Viu PMf_RETAINT|5.004005||Viu PMf_SINGLELINE|5.003007||Viu PMf_SPLIT|5.017011||Viu PMf_STRICT|5.021008||Viu PMf_USED|5.009005||Viu PMf_USE_RE_EVAL|5.017001||Viu PMf_WILDCARD|5.031010||Viu PM_GETRE|5.007002||Viu pmop_dump|5.006000|5.006000|u PmopSTASH|5.007001||Viu PmopSTASHPV|5.007001||Viu PmopSTASHPV_set|5.007001||Viu PmopSTASH_set|5.007001||Viu pmruntime|5.003007||Viu PM_SETRE|5.007002||Viu PM_STR|5.027010||Viu pmtrans|5.003007||Viu pMY_CXT|5.009000|5.009000|p _pMY_CXT||5.009000|p pMY_CXT_||5.009000|p PNf|5.021007||Viu PNfARG|5.021007||Viu Poison|5.008000|5.003007|p PoisonFree|5.009004|5.003007|p PoisonNew|5.009004|5.003007|p PoisonPADLIST|5.021006||Viu PoisonWith|5.009004|5.003007|p popen|5.003007||Viu POPi|5.003007|5.003007| POPl|5.003007|5.003007| POPMARK|5.003007||cViu POP_MULTICALL|5.009003|5.009003| POPn|5.006000|5.003007| POPp|5.003007|5.003007| POPpbytex|5.007001|5.007001| POPpconstx|5.009003||Viu POPpx|5.005003|5.005003| POPs|5.003007|5.003007| pop_scope|5.003007|5.003007|u POPSTACK|5.005000||Viu POPSTACK_TO|5.005000||Viu POPu|5.004000|5.004000| POPul|5.006000|5.006000| populate_ANYOF_from_invlist|5.019005||Viu populate_isa|||viu POSIXA|5.017003||Viu POSIXA_t8_p8|5.033003||Viu POSIXA_t8_pb|5.033003||Viu POSIXA_tb_p8|5.033003||Viu POSIXA_tb_pb|5.033003||Viu POSIX_CC_COUNT|5.017008||Viu POSIXD|5.017003||Viu POSIXD_t8_p8|5.033003||Viu POSIXD_t8_pb|5.033003||Viu POSIXD_tb_p8|5.033003||Viu POSIXD_tb_pb|5.033003||Viu POSIXL|5.017003||Viu POSIXL_CLEAR|5.029004||Viu POSIXL_SET|5.029004||Viu POSIXL_t8_p8|5.033003||Viu POSIXL_t8_pb|5.033003||Viu POSIXL_tb_p8|5.033003||Viu POSIXL_tb_pb|5.033003||Viu POSIXL_TEST|5.029004||Viu POSIXL_ZERO|5.029004||Viu POSIXU|5.017003||Viu POSIXU_t8_p8|5.033003||Viu POSIXU_t8_pb|5.033003||Viu POSIXU_tb_p8|5.033003||Viu POSIXU_tb_pb|5.033003||Viu PP|5.003007||Viu pregcomp|5.009005|5.009005| pregexec|5.003007|5.003007| PREGf_ANCH|5.019009||Viu PREGf_ANCH_GPOS|5.019009||Viu PREGf_ANCH_MBOL|5.019009||Viu PREGf_ANCH_SBOL|5.019009||Viu PREGf_CUTGROUP_SEEN|5.009005||Viu PREGf_GPOS_FLOAT|5.019009||Viu PREGf_GPOS_SEEN|5.019009||Viu PREGf_IMPLICIT|5.009005||Viu PREGf_NAUGHTY|5.009005||Viu PREGf_NOSCAN|5.019009||Viu PREGf_RECURSE_SEEN|5.023009||Viu pregfree2|5.011000||cVu pregfree|5.003007|5.003007|u PREGf_SKIP|5.009005||Viu PREGf_USE_RE_EVAL|5.017001||Viu PREGf_VERBARG_SEEN|5.009005||Viu prepare_SV_for_RV|5.010001||Viu prescan_version|5.011004|5.011004| PRESCAN_VERSION|5.019008||Viu PREVOPER|5.003007||Viu PREV_RANGE_MATCHES_INVLIST|5.023002||Viu printbuf|5.009004||Viu print_bytes_for_locale|5.027002||Viu print_collxfrm_input_and_return|5.025004||Viu printf|5.003007||Viu PRINTF_FORMAT_NULL_OK|5.009005|5.009005|Vn printf_nocontext|5.007001|5.007001|vdnu PRIVLIB|5.003007|5.003007|Vn PRIVLIB_EXP|5.003007|5.003007|Vn PRIVSHIFT|5.003007||Viu process_special_blocks|5.009005||Viu PROCSELFEXE_PATH|5.007003|5.007003|Vn PRUNE|5.009005||Viu PRUNE_t8_p8|5.033003||Viu PRUNE_t8_pb|5.033003||Viu PRUNE_tb_p8|5.033003||Viu PRUNE_tb_pb|5.033003||Viu PSEUDO|5.009004||Viu PSEUDO_t8_p8|5.033003||Viu PSEUDO_t8_pb|5.033003||Viu PSEUDO_tb_p8|5.033003||Viu PSEUDO_tb_pb|5.033003||Viu pthread_addr_t|5.005000||Viu PTHREAD_ATFORK|5.007002||Viu pthread_attr_init|5.006000||Viu PTHREAD_ATTR_SETDETACHSTATE|5.006000||Viu pthread_condattr_default|5.005000||Viu PTHREAD_CREATE|5.006000||Viu pthread_create|5.008001||Viu PTHREAD_CREATE_JOINABLE|5.005000||Viu PTHREAD_GETSPECIFIC|5.007002||Viu PTHREAD_GETSPECIFIC_INT|5.006000||Viu pthread_key_create|5.005000||Viu pthread_keycreate|5.008001||Viu pthread_mutexattr_default|5.005000||Viu pthread_mutexattr_init|5.005000||Viu pthread_mutexattr_settype|5.005000||Viu pTHX_12|5.019010||Viu pTHX_1|5.006000||Viu pTHX_2|5.006000||Viu pTHX_3|5.006000||Viu pTHX_4|5.006000||Viu pTHX|5.006000|5.003007|p pTHX_5|5.009003||Viu pTHX_6|5.009003||Viu pTHX_7|5.009003||Viu pTHX_8|5.009003||Viu pTHX_9|5.009003||Viu pTHX_||5.003007|p pTHX__FORMAT|5.009002||Viu pTHX_FORMAT|5.009002||Viu pTHXo|5.006000||Viu pTHX__VALUE|5.009002||Viu pTHX_VALUE|5.009002||Viu pTHXx|5.006000||Viu PTR2IV|5.006000|5.003007|p PTR2nat|5.009003|5.003007|p PTR2NV|5.006000|5.003007|p PTR2ul|5.007001|5.003007|p PTR2UV|5.006000|5.003007|p Ptrdiff_t|5.029003||Viu ptr_hash|5.017010||Vniu PTRSIZE|5.005000|5.005000|Vn ptr_table_clear|5.009005|5.009005|du ptr_table_fetch|5.009005|5.009005|u ptr_table_find|5.009004||Vniu ptr_table_free|5.009005|5.009005|u ptr_table_new|5.009005|5.009005|u ptr_table_split|5.009005|5.009005|u ptr_table_store|5.009005|5.009005|u PTRV|5.006000|5.003007|poVnu PUSHi|5.003007|5.003007| PUSHMARK|5.003007|5.003007| PUSHmortal|5.009002|5.003007|p PUSH_MULTICALL|5.011000|5.011000| PUSH_MULTICALL_FLAGS|5.018000||Viu PUSHn|5.006000|5.003007| PUSHp|5.003007|5.003007| PUSHs|5.003007|5.003007| push_scope|5.003007|5.003007|u PUSHSTACK|5.005000||Viu PUSHSTACKi|5.005000||Viu PUSHSTACK_INIT_HWM|5.027002||Viu PUSHTARG|5.003007||Viu PUSHu|5.004000|5.003007|p PUTBACK|5.003007|5.003007| putc|5.003007||Viu put_charclass_bitmap_innards|5.021004||Viu put_charclass_bitmap_innards_common|5.023008||Viu put_charclass_bitmap_innards_invlist|5.023008||Viu put_code_point|5.021004||Viu putc_unlocked|5.003007||Viu putenv|5.005000||Viu put_range|5.019009||Viu putw|5.003007||Viu pv_display|5.006000|5.003007|p pv_escape|5.009004|5.003007|p pv_pretty|5.009004|5.003007|p pv_uni_display|5.007003|5.007003| pWARN_ALL|5.006000||Viu pWARN_NONE|5.006000||Viu pWARN_STD|5.006000||Viu PWGECOS|5.004005|5.004005|Vn PWPASSWD|5.005000|5.005000|Vn qerror|5.006000||cViu QR_PAT_MODS|5.009005||Viu QUAD_IS_INT|5.006000|5.006000|Vn QUAD_IS___INT64|5.015003|5.015003|Vn QUAD_IS_INT64_T|5.006000|5.006000|Vn QUAD_IS_LONG|5.006000|5.006000|Vn QUAD_IS_LONG_LONG|5.006000|5.006000|Vn QUADKIND|5.006000|5.006000|Vn quadmath_format_needed|5.021004||Vni quadmath_format_valid|5.031007||Vni Quad_t|5.003007|5.003007|Vn QUESTION_MARK_CTRL|5.021001||Viu RADIXCHAR|5.027010||Viu RANDBITS|5.003007|5.003007|Vn RANDOM_R_PROTO|5.008000|5.008000|Vn Rand_seed_t|5.006000|5.006000|Vn RANGE_INDICATOR|5.031006||Viu rck_elide_nothing|5.032001||Viu RD_NODATA|5.003007|5.003007|Vn read|5.005000||Viu readdir|5.005000||Viu readdir64|5.009000||Viu READDIR64_R_PROTO|5.008000|5.008000|Vn READDIR_R_PROTO|5.008000|5.008000|Vn READ_XDIGIT|5.017006|5.017006| realloc|5.007002|5.007002|n ReANY|5.017006||cVnu re_compile|5.009005|5.009005|u RE_COMPILE_RECURSION_INIT|5.029009||Viu RE_COMPILE_RECURSION_LIMIT|5.029009||Viu re_croak|||iu recv|5.006000||Viu recvfrom|5.005000||Viu RE_DEBUG_COMPILE_DUMP|5.009004||Viu RE_DEBUG_COMPILE_FLAGS|5.009005||Viu RE_DEBUG_COMPILE_MASK|5.009004||Viu RE_DEBUG_COMPILE_OPTIMISE|5.009004||Viu RE_DEBUG_COMPILE_PARSE|5.009004||Viu RE_DEBUG_COMPILE_TEST|5.021005||Viu RE_DEBUG_COMPILE_TRIE|5.009004||Viu RE_DEBUG_EXECUTE_INTUIT|5.009004||Viu RE_DEBUG_EXECUTE_MASK|5.009004||Viu RE_DEBUG_EXECUTE_MATCH|5.009004||Viu RE_DEBUG_EXECUTE_TRIE|5.009004||Viu RE_DEBUG_EXTRA_BUFFERS|5.009005||Viu RE_DEBUG_EXTRA_DUMP_PRE_OPTIMIZE|5.031004||Viu RE_DEBUG_EXTRA_GPOS|5.011000||Viu RE_DEBUG_EXTRA_MASK|5.009004||Viu RE_DEBUG_EXTRA_OFFDEBUG|5.009005||Viu RE_DEBUG_EXTRA_OFFSETS|5.009004||Viu RE_DEBUG_EXTRA_OPTIMISE|5.009005||Viu RE_DEBUG_EXTRA_STACK|5.009005||Viu RE_DEBUG_EXTRA_STATE|5.009004||Viu RE_DEBUG_EXTRA_TRIE|5.009004||Viu RE_DEBUG_EXTRA_WILDCARD|5.031011||Viu RE_DEBUG_FLAG|5.009004||Viu RE_DEBUG_FLAGS|5.009002||Viu re_dup_guts|5.011000|5.011000| reentrant_free|5.008000||cVu reentrant_init|5.008000||cVu REENTRANT_PROTO_B_B|5.008000||Viu REENTRANT_PROTO_B_BI|5.008000||Viu REENTRANT_PROTO_B_BW|5.008000||Viu REENTRANT_PROTO_B_CCD|5.008000||Viu REENTRANT_PROTO_B_CCS|5.008000||Viu REENTRANT_PROTO_B_IBI|5.008000||Viu REENTRANT_PROTO_B_IBW|5.008000||Viu REENTRANT_PROTO_B_SB|5.008000||Viu REENTRANT_PROTO_B_SBI|5.008000||Viu REENTRANT_PROTO_I_BI|5.008000||Viu REENTRANT_PROTO_I_BW|5.008000||Viu REENTRANT_PROTO_I_CCSBWR|5.008000||Viu REENTRANT_PROTO_I_CCSD|5.008000||Viu REENTRANT_PROTO_I_CII|5.008000||Viu REENTRANT_PROTO_I_CIISD|5.008000||Viu REENTRANT_PROTO_I_CSBI|5.008000||Viu REENTRANT_PROTO_I_CSBIR|5.008000||Viu REENTRANT_PROTO_I_CSBWR|5.008000||Viu REENTRANT_PROTO_I_CSBWRE|5.008000||Viu REENTRANT_PROTO_I_CSD|5.008000||Viu REENTRANT_PROTO_I_CWISBWRE|5.008000||Viu REENTRANT_PROTO_I_CWISD|5.008000||Viu REENTRANT_PROTO_I_D|5.008000||Viu REENTRANT_PROTO_I_H|5.008000||Viu REENTRANT_PROTO_I_IBI|5.008000||Viu REENTRANT_PROTO_I_IBW|5.008000||Viu REENTRANT_PROTO_I_ICBI|5.008000||Viu REENTRANT_PROTO_I_ICSBWR|5.008000||Viu REENTRANT_PROTO_I_ICSD|5.008000||Viu REENTRANT_PROTO_I_ID|5.008000||Viu REENTRANT_PROTO_I_IISD|5.008000||Viu REENTRANT_PROTO_I_ISBWR|5.008000||Viu REENTRANT_PROTO_I_ISD|5.008000||Viu REENTRANT_PROTO_I_LISBI|5.008000||Viu REENTRANT_PROTO_I_LISD|5.008000||Viu REENTRANT_PROTO_I_SB|5.008000||Viu REENTRANT_PROTO_I_SBI|5.008000||Viu REENTRANT_PROTO_I_SBIE|5.008000||Viu REENTRANT_PROTO_I_SBIH|5.008000||Viu REENTRANT_PROTO_I_SBIR|5.008000||Viu REENTRANT_PROTO_I_SBWR|5.008000||Viu REENTRANT_PROTO_I_SBWRE|5.008000||Viu REENTRANT_PROTO_I_SD|5.008000||Viu REENTRANT_PROTO_I_TISD|5.008000||Viu REENTRANT_PROTO_I_TS|5.008000||Viu REENTRANT_PROTO_I_TSBI|5.008000||Viu REENTRANT_PROTO_I_TSBIR|5.008000||Viu REENTRANT_PROTO_I_TSBWR|5.008000||Viu REENTRANT_PROTO_I_TsISBWRE|5.008001||Viu REENTRANT_PROTO_I_TSR|5.008000||Viu REENTRANT_PROTO_I_UISBWRE|5.008000||Viu REENTRANT_PROTO_I_uISBWRE|5.008001||Viu REENTRANT_PROTO_S_CBI|5.008000||Viu REENTRANT_PROTO_S_CCSBI|5.008000||Viu REENTRANT_PROTO_S_CIISBIE|5.008000||Viu REENTRANT_PROTO_S_CSBI|5.008000||Viu REENTRANT_PROTO_S_CSBIE|5.008000||Viu REENTRANT_PROTO_S_CWISBIE|5.008000||Viu REENTRANT_PROTO_S_CWISBWIE|5.008000||Viu REENTRANT_PROTO_S_ICSBI|5.008000||Viu REENTRANT_PROTO_S_ISBI|5.008000||Viu REENTRANT_PROTO_S_LISBI|5.008000||Viu REENTRANT_PROTO_S_SBI|5.008000||Viu REENTRANT_PROTO_S_SBIE|5.008000||Viu REENTRANT_PROTO_S_SBW|5.008000||Viu REENTRANT_PROTO_S_TISBI|5.008000||Viu REENTRANT_PROTO_S_TS|5.031011||Viu REENTRANT_PROTO_S_TSBI|5.008000||Viu REENTRANT_PROTO_S_TSBIE|5.008000||Viu REENTRANT_PROTO_S_TWISBIE|5.008000||Viu REENTRANT_PROTO_V_D|5.008000||Viu REENTRANT_PROTO_V_H|5.008000||Viu REENTRANT_PROTO_V_ID|5.008000||Viu reentrant_retry|5.008000||vcVnu reentrant_size|5.008000||cVu REENTR_MEMZERO|5.009003||Viu re_exec_indentf|5.023009||vViu REF|5.003007||Viu ref|5.009003||Viu ref_array_or_hash|5.027008||Viu refcounted_he_chain_2hv|5.013007||cVi REFCOUNTED_HE_EXISTS|5.015007||Viu refcounted_he_fetch_pv|5.013007||cVi refcounted_he_fetch_pvn|5.013007||cVi refcounted_he_fetch_pvs|5.013007||Vi refcounted_he_fetch_sv|5.013007||cVi refcounted_he_free|5.013007||cVi refcounted_he_inc|5.013007||cVi REFCOUNTED_HE_KEY_UTF8|5.013007||Viu refcounted_he_new_pv|5.013007||cVi refcounted_he_new_pvn|5.013007||cVi refcounted_he_new_pvs|5.013007||Vi refcounted_he_new_sv|5.013007||cVi refcounted_he_value|5.009004||Viu REFF|5.004001||Viu REFFA|5.013010||Viu REFFAN|5.031001||Viu REFFAN_t8_p8|5.033003||Viu REFFAN_t8_pb|5.033003||Viu REFFAN_tb_p8|5.033003||Viu REFFAN_tb_pb|5.033003||Viu REFFA_t8_p8|5.033003||Viu REFFA_t8_pb|5.033003||Viu REFFA_tb_p8|5.033003||Viu REFFA_tb_pb|5.033003||Viu REFFL|5.004001||Viu REFFLN|5.031001||Viu REFFLN_t8_p8|5.033003||Viu REFFLN_t8_pb|5.033003||Viu REFFLN_tb_p8|5.033003||Viu REFFLN_tb_pb|5.033003||Viu REFFL_t8_p8|5.033003||Viu REFFL_t8_pb|5.033003||Viu REFFL_tb_p8|5.033003||Viu REFFL_tb_pb|5.033003||Viu REFFN|5.031001||Viu REFFN_t8_p8|5.033003||Viu REFFN_t8_pb|5.033003||Viu REFFN_tb_p8|5.033003||Viu REFFN_tb_pb|5.033003||Viu REFF_t8_p8|5.033003||Viu REFF_t8_pb|5.033003||Viu REFF_tb_p8|5.033003||Viu REFF_tb_pb|5.033003||Viu REFFU|5.013008||Viu REFFUN|5.031001||Viu REFFUN_t8_p8|5.033003||Viu REFFUN_t8_pb|5.033003||Viu REFFUN_tb_p8|5.033003||Viu REFFUN_tb_pb|5.033003||Viu REFFU_t8_p8|5.033003||Viu REFFU_t8_pb|5.033003||Viu REFFU_tb_p8|5.033003||Viu REFFU_tb_pb|5.033003||Viu REF_HE_KEY|5.009005||Viu refkids|5.003007||Viu REFN|5.031001||Viu REFN_t8_p8|5.033003||Viu REFN_t8_pb|5.033003||Viu REFN_tb_p8|5.033003||Viu REFN_tb_pb|5.033003||Viu REF_t8_p8|5.033003||Viu REF_t8_pb|5.033003||Viu REF_tb_p8|5.033003||Viu REF_tb_pb|5.033003||Viu refto|5.005000||Viu reg2Lanode|5.021005||Viu reg|5.005000||Viu reganode|5.005000||Viu REG_ANY|5.006000||Viu REG_ANY_t8_p8|5.033003||Viu REG_ANY_t8_pb|5.033003||Viu REG_ANY_tb_p8|5.033003||Viu REG_ANY_tb_pb|5.033003||Viu regatom|5.005000||Viu regbranch|5.005000||Viu reg_check_named_buff_matched|5.009005||Vniu regclass|5.005000||Viu regcppop|5.005000||Viu regcppush|5.005000||Viu regcp_restore|5.025006||Viu regcurly|5.013010||cVniu REG_CUTGROUP_SEEN|5.019009||Viu regdump|5.005000|5.005000|u regdump_extflags|5.009005||Viu regdump_intflags|5.019002||Viu regdupe_internal|5.009005||cVu regexec_flags|5.005000||cVu REGEX_SET|5.031010||Viu regex_set_precedence|5.021010||Vniu REGEX_SET_t8_p8|5.033003||Viu REGEX_SET_t8_pb|5.033003||Viu REGEX_SET_tb_p8|5.033003||Viu REGEX_SET_tb_pb|5.033003||Viu REG_EXTFLAGS_NAME_SIZE|5.020000||Viu regfree_internal|5.009005||cVu REG_GPOS_SEEN|5.019009||Viu reghop3|5.007001||Vniu reghop4|5.009005||Vniu reghopmaybe3|5.007001||Vniu reginclass|5.005000||Viu REG_INFTY|5.004005||Viu reginitcolors|5.006000||cVu reginsert|5.005000||Viu REG_INTFLAGS_NAME_SIZE|5.020000||Viu register|5.003007||Viu REG_LOOKBEHIND_SEEN|5.019009||Viu REG_MAGIC|5.006000||Viu regmatch|5.005000||Viu REGMATCH_STATE_MAX|5.009005||Viu reg_named_buff|5.009005||cViu reg_named_buff_all|5.009005||cVu reg_named_buff_exists|5.009005||cVu reg_named_buff_fetch|5.009005||cVu reg_named_buff_firstkey|5.009005||cVu reg_named_buff_iter|5.009005||cViu reg_named_buff_nextkey|5.009005||cVu reg_named_buff_scalar|5.009005||cVu regnext|5.003007||cVu reg_node|5.005000||Viu regnode_guts|5.021005||Viu REGNODE_MAX|5.009004||Viu REGNODE_SIMPLE|5.013002||Viu REGNODE_VARIES|5.013002||Viu reg_numbered_buff_fetch|5.009005||cViu reg_numbered_buff_length|5.009005||cViu reg_numbered_buff_store|5.009005||cViu regpiece|5.005000||Viu regpnode|5.031010||Viu regprop|5.003007||Viu reg_qr_package|5.009005||cViu REG_RECURSE_SEEN|5.019009||Viu regrepeat|5.005000||Viu REG_RUN_ON_COMMENT_SEEN|5.019009||Viu reg_scan_name|5.009005||Viu reg_skipcomment|5.009005||Vniu regtail|5.005000||Viu regtail_study|5.009004||Viu reg_temp_copy|5.009005||cViu REG_TOP_LEVEL_BRANCHES_SEEN|5.019009||Viu regtry|5.005000||Viu REG_UNBOUNDED_QUANTIFIER_SEEN|5.019009||Viu REG_UNFOLDED_MULTI_SEEN|5.019009||Viu REG_VERBARG_SEEN|5.019009||Viu REG_ZERO_LEN_SEEN|5.019009||Viu re_indentf|5.023009||vViu re_intuit_start|5.006000||cVu re_intuit_string|5.006000||cVu rename|5.005000||Viu Renew|5.003007|5.003007| Renewc|5.003007|5.003007| RENUM|5.005000||Viu RENUM_t8_p8|5.033003||Viu RENUM_t8_pb|5.033003||Viu RENUM_tb_p8|5.033003||Viu RENUM_tb_pb|5.033003||Viu re_op_compile|5.017001||Viu repeatcpy|5.003007|5.003007|nu REPLACEMENT_CHARACTER_UTF8|5.025005|5.003007|p report_evil_fh|5.006001||Viu report_redefined_cv|5.015006||Viu report_uninit|5.006000||cVi report_wrongway_fh|5.013009||Viu re_printf|5.023009||vViu RE_PV_COLOR_DECL|5.009004||Viu RE_PV_QUOTED_DECL|5.009004||Viu require_pv|5.006000|5.006000| require_tie_mod|5.009005||Viu ReREFCNT_dec|5.005000||Viu ReREFCNT_inc|5.005000||Viu RESTORE_ERRNO|5.010001||Vi RESTORE_LC_NUMERIC|5.021010|5.021010|p restore_magic|5.009003||Viu restore_switched_locale|5.027009||Viu RE_SV_DUMPLEN|5.009004||Viu RE_SV_ESCAPE|5.009004||Viu RE_SV_TAIL|5.009004||Viu RETPUSHNO|5.003007||Viu RETPUSHUNDEF|5.003007||Viu RETPUSHYES|5.003007||Viu RE_TRACK_PATTERN_OFFSETS|5.009005||Viu RE_TRIE_MAXBUF_INIT|5.009002||Viu RE_TRIE_MAXBUF_NAME|5.009002||Viu RETSETNO|5.003007||Viu RETSETTARG|5.021009||Viu RETSETUNDEF|5.003007||Viu RETSETYES|5.003007||Viu RETURN|5.003007||Viu RETURNOP|5.003007||Viu RETURNX|5.003007||Viu RETVAL|5.003007|5.003007|V rewind|5.003007||Viu rewinddir|5.005000||Viu REXEC_CHECKED|5.005000||Viu REXEC_COPY_SKIP_POST|5.017004||Viu REXEC_COPY_SKIP_PRE|5.017004||Viu REXEC_COPY_STR|5.005000||Viu REXEC_FAIL_ON_UNDERFLOW|5.019003||Viu REXEC_IGNOREPOS|5.006000||Viu REXEC_NOT_FIRST|5.006000||Viu REXEC_SCREAM|5.006000||Viu rmdir|5.005000||Viu RMS_DIR|5.008001||Viu RMS_FAC|5.008001||Viu RMS_FEX|5.008001||Viu RMS_FNF|5.008001||Viu RMS_IFI|5.008001||Viu RMS_ISI|5.008001||Viu RMS_PRV|5.008001||Viu rninstr|5.003007|5.003007|n ROTL32|5.017010||Viu ROTL64|5.017010||Viu ROTL_UV|5.017010||Viu ROTR32|5.027001||Viu ROTR64|5.027001||Viu ROTR_UV|5.027001||Viu rpeep|5.013005||Viu rsignal|5.004000|5.004000| rsignal_restore|5.004000||Viu rsignal_save|5.004000||Viu rsignal_state|5.004000|5.004000|u RsPARA|5.003007||Viu RsRECORD|5.005000||Viu RsSIMPLE|5.003007||Viu RsSNARF|5.003007||Viu run_body|5.006000||Viu runops_debug|5.005000||cVu RUNOPS_DEFAULT|5.005000||Viu runops_standard|5.005000||cVu run_user_filter|5.009003||Viu rv2cv_op_cv|5.013006|5.013006| RV2CVOPCV_FLAG_MASK|5.021004||Viu RV2CVOPCV_MARK_EARLY|5.013006|5.013006| RV2CVOPCV_MAYBE_NAME_GV|5.021004||Viu RV2CVOPCV_RETURN_NAME_GV|5.013006|5.013006| RV2CVOPCV_RETURN_STUB|5.021004||Viu rvpv_dup|5.007003|5.007003|u RX_ANCHORED_SUBSTR|5.010001||Viu RX_ANCHORED_UTF8|5.010001||Viu RXapif_ALL|5.009005||Viu RXapif_CLEAR|5.009005||Viu RXapif_DELETE|5.009005||Viu RXapif_EXISTS|5.009005||Viu RXapif_FETCH|5.009005||Viu RXapif_FIRSTKEY|5.009005||Viu RXapif_NEXTKEY|5.009005||Viu RXapif_ONE|5.009005||Viu RXapif_REGNAME|5.009005||Viu RXapif_REGNAMES|5.009005||Viu RXapif_REGNAMES_COUNT|5.009005||Viu RXapif_SCALAR|5.009005||Viu RXapif_STORE|5.009005||Viu RX_BUFF_IDX_CARET_FULLMATCH|5.017004||Viu RX_BUFF_IDX_CARET_POSTMATCH|5.017004||Viu RX_BUFF_IDX_CARET_PREMATCH|5.017004||Viu RX_BUFF_IDX_FULLMATCH|5.009005||Viu RX_BUFF_IDX_POSTMATCH|5.009005||Viu RX_BUFF_IDX_PREMATCH|5.009005||Viu RX_CHECK_SUBSTR|5.010001||Viu RX_COMPFLAGS|5.017011||Viu RX_ENGINE|5.010001||Viu RX_EXTFLAGS|5.010001||Viu RXf_BASE_SHIFT|5.013004||Viu RXf_CHECK_ALL|5.009005||Viu RXf_COPY_DONE|5.009005||Viu RXf_EVAL_SEEN|5.009005||Viu RXf_INTUIT_TAIL|5.009005||Viu RXf_IS_ANCHORED|5.019009||Viu RX_FLOAT_SUBSTR|5.010001||Viu RX_FLOAT_UTF8|5.010001||Viu RXf_MATCH_UTF8|5.009005||Viu RXf_NO_INPLACE_SUBST|5.017011||Viu RXf_NULL|5.010000||Viu RXf_PMf_CHARSET|5.013009||Viu RXf_PMf_COMPILETIME|5.009005||Viu RXf_PMf_EXTENDED|5.009005||Viu RXf_PMf_EXTENDED_MORE|5.021005||Viu RXf_PMf_FLAGCOPYMASK|5.017011||Viu RXf_PMf_FOLD|5.009005||Viu RXf_PMf_KEEPCOPY|5.009005||Viu RXf_PMf_MULTILINE|5.009005||Viu RXf_PMf_NOCAPTURE|5.021008||Viu RXf_PMf_SINGLELINE|5.009005||Viu RXf_PMf_SPLIT|5.017011||Viu RXf_PMf_STD_PMMOD|5.009005||Viu RXf_PMf_STD_PMMOD_SHIFT|5.010001||Viu RXf_PMf_STRICT|5.021008||Viu RXf_SKIPWHITE|5.009005||Viu RXf_SPLIT|5.009005||Viu RXf_START_ONLY|5.009005||Viu RXf_TAINTED|5.009005||Viu RXf_TAINTED_SEEN|5.009005||Viu RXf_UNBOUNDED_QUANTIFIER_SEEN|5.019009||Viu RXf_USE_INTUIT|5.009005||Viu RXf_USE_INTUIT_ML|5.009005||Viu RXf_USE_INTUIT_NOML|5.009005||Viu RXf_WHITE|5.009005||Viu RX_GOFS|5.010001||Viu RXi_GET|5.009005||Viu RXi_GET_DECL|5.009005||Viu RX_INTFLAGS|5.019009||Viu RXi_SET|5.009005||Viu RX_ISTAINTED|5.017006||Viu RX_LASTCLOSEPAREN|5.010001||Viu RX_LASTPAREN|5.010001||Viu RX_MATCH_COPIED|5.006000||Viu RX_MATCH_COPIED_off|5.006000||Viu RX_MATCH_COPIED_on|5.006000||Viu RX_MATCH_COPIED_set|5.006000||Viu RX_MATCH_COPY_FREE|5.009000||Viu RX_MATCH_TAINTED|5.005000||Viu RX_MATCH_TAINTED_off|5.005000||Viu RX_MATCH_TAINTED_on|5.005000||Viu RX_MATCH_TAINTED_set|5.005000||Viu RX_MATCH_UTF8|5.008001||Viu RX_MATCH_UTF8_off|5.008001||Viu RX_MATCH_UTF8_on|5.008001||Viu RX_MATCH_UTF8_set|5.008001||Viu RX_MINLEN|5.010001||Viu RX_MINLENRET|5.010001||Viu RX_NPARENS|5.010001||Viu RX_OFFS|5.010001||Viu RXp_COMPFLAGS|5.017011||Viu RXp_ENGINE|5.027003||Viu RXp_EXTFLAGS|5.010001||Viu RXp_GOFS|5.027003||Viu RXp_HAS_CUTGROUP|5.027003||Viu RXp_INTFLAGS|5.019009||Viu RXp_ISTAINTED|5.027003||Viu RXp_MATCH_COPIED|5.010001||Viu RXp_MATCH_COPIED_off|5.010001||Viu RXp_MATCH_COPIED_on|5.010001||Viu RXp_MATCH_COPY_FREE|5.027003||Viu RXp_MATCH_TAINTED|5.010001||Viu RXp_MATCH_TAINTED_off|5.027003||Viu RXp_MATCH_TAINTED_on|5.017008||Viu RXp_MATCH_UTF8|5.010001||Viu RXp_MATCH_UTF8_off|5.027003||Viu RXp_MATCH_UTF8_on|5.027003||Viu RXp_MATCH_UTF8_set|5.027003||Viu RXp_MINLEN|5.027003||Viu RXp_MINLENRET|5.027003||Viu RXp_NPARENS|5.027003||Viu RXp_OFFS|5.027003||Viu RXp_PAREN_NAMES|5.010001||Viu RX_PRECOMP|5.010001||Viu RX_PRECOMP_const|5.010001||Viu RX_PRELEN|5.010001||Viu RXp_SAVED_COPY|5.027003||Viu RXp_SUBBEG|5.027003||Viu RXp_SUBOFFSET|5.027003||Viu RXp_ZERO_LEN|5.027003||Viu RX_REFCNT|5.010001||Viu rxres_free|5.004000||Viu rxres_restore|5.004000||Viu rxres_save|5.004000||Viu RX_SAVED_COPY|5.011000||Viu RX_SUBBEG|5.010001||Viu RX_SUBCOFFSET|5.017004||Viu RX_SUBLEN|5.010001||Viu RX_SUBOFFSET|5.017004||Viu RX_TAINT_on|5.017006||Viu RX_UTF8|5.010001||Viu RX_WRAPLEN|5.010001||Viu RX_WRAPPED|5.010001||Viu RX_WRAPPED_const|5.011000||Viu RX_ZERO_LEN|5.019003||Viu safecalloc|5.003007||Viu Safefree|5.003007|5.003007| safefree|5.003007||Viu safemalloc|5.003007||Viu saferealloc|5.003007||Viu safesyscalloc|5.006000|5.006000|n safesysfree|5.006000|5.006000|n safesysmalloc|5.006000|5.006000|n safesysrealloc|5.006000|5.006000|n SAFE_TRIE_NODENUM|5.009002||Viu same_dirent|5.003007||Viu SANE_ERRSV|5.031003|5.031003| SANY|5.003007||Viu SANY_t8_p8|5.033003||Viu SANY_t8_pb|5.033003||Viu SANY_tb_p8|5.033003||Viu SANY_tb_pb|5.033003||Viu save_adelete|5.011000|5.011000|u SAVEADELETE|5.011000||Viu save_aelem|5.004005|5.004005|u save_aelem_flags|5.011000|5.011000|u save_alloc|5.006000|5.006000|u save_aptr|5.003007|5.003007| save_ary|5.003007|5.003007| SAVEBOOL|5.008001|5.008001| save_bool|5.008001||cVu save_clearsv|5.003007||cVu SAVECLEARSV|5.003007||Vi SAVECOMPILEWARNINGS|5.009004||Viu SAVECOMPPAD|5.006000||Vi SAVECOPFILE|5.006000||Viu SAVECOPFILE_FREE|5.006001||Viu SAVECOPLINE|5.006000||Viu SAVECOPSTASH_FREE|5.006001||Viu SAVE_DEFSV|5.004005|5.003007|p SAVEDELETE|5.003007|5.003007| save_delete|5.003007||cVu save_destructor|5.003007||cVu SAVEDESTRUCTOR|5.006000|5.006000| SAVEDESTRUCTOR_X|5.006000|5.006000| save_destructor_x|5.006000||cVu SAVE_ERRNO|5.010001||Vi SAVEFEATUREBITS|5.031006||Viu SAVEf_KEEPOLDELEM|5.011000||Viu SAVEFREECOPHH|5.013007||Viu SAVEFREEOP|5.010001|5.010001| save_freeop|5.010001||cVu SAVEFREEPADNAME|5.021007||Viu SAVEFREEPV|5.003007|5.003007| save_freepv|5.010001||cVu SAVEFREESV|5.003007|5.003007| save_freesv|5.010001||cVu SAVEf_SETMAGIC|5.011000||Viu SAVEGENERICPV|5.006001||Viu save_generic_pvref|5.006001|5.006001|u SAVEGENERICSV|5.005003||Viu save_generic_svref|5.005003|5.005003|u save_gp|5.004000|5.004000| save_hash|5.003007|5.003007| save_hdelete|5.011000|5.011000|u SAVEHDELETE|5.011000||Viu save_hek_flags|5.008000||Vniu save_helem|5.004005|5.004005|u save_helem_flags|5.011000|5.011000|u SAVEHINTS|5.005000||Viu save_hints|5.010001|5.010001|u save_hptr|5.003007|5.003007| SAVEI16|5.004000|5.004000| save_I16|5.004000||cVu SAVEI32|5.003007|5.003007| save_I32|5.003007||cVu SAVEI8|5.006000|5.006000| save_I8|5.006000||cVu SAVEINT|5.003007|5.003007| save_int|5.003007||cVu save_item|5.003007|5.003007| SAVEIV|5.003007|5.003007| save_iv|5.004000||cVu save_lines|5.005000||Viu save_list|5.003007|5.003007|d SAVELONG|5.003007|5.003007| save_long|5.003007||dcVu save_magic_flags|5.019002||Viu SAVE_MASK|5.013001||Viu SAVEMORTALIZESV|5.007001|5.007001| save_mortalizesv|5.010001||cVu save_nogv|5.003007|5.003007|du SAVEOP|5.005000||Viu save_op|5.010001|5.010001|u save_padsv_and_mortalize|5.010001|5.010001|u SAVEPADSVANDMORTALIZE|5.010001||Viu SAVEPADSV|||i SAVEPARSER|5.009005||Viu SAVEPPTR|5.003007|5.003007| save_pptr|5.003007||cVu save_pushi32ptr|5.010001|5.010001|u save_pushptr|5.010001|5.010001|u save_pushptri32ptr|5.010001||Viu save_pushptrptr|5.010001|5.010001|u savepv|5.003007|5.003007| savepvn|5.003007|5.003007| savepvs|5.009003|5.009003| save_re_context|5.006000||cVu save_scalar|5.003007|5.003007| save_scalar_at|5.005000||Viu save_set_svflags|5.009000|5.009000|u SAVESETSVFLAGS|5.009000||Viu savesharedpv|5.007003|5.007003| SAVESHAREDPV|5.007003||Viu savesharedpvn|5.009005|5.009005| save_shared_pvref|5.007003|5.007003|u savesharedpvs|5.013006|5.013006| savesharedsvpv|5.013006|5.013006| SAVESPTR|5.003007|5.003007| save_sptr|5.003007||cVu savestack_grow|5.003007|5.003007|u savestack_grow_cnt|5.008001|5.008001|u SAVESTACK_POS|5.004000|5.004000| save_strlen|5.019004||cViu savesvpv|5.009002|5.009002| save_svref|5.003007|5.003007| SAVESWITCHSTACK|5.009002||Viu SAVEt_ADELETE|5.011000||Viu SAVEt_AELEM|5.004005||Viu SAVEt_ALLOC|5.006000||Viu SAVEt_APTR|5.003007||Viu SAVEt_AV|5.003007||Viu SAVEt_BOOL|5.008001||Viu SAVEt_CLEARPADRANGE|5.017006||Viu SAVEt_CLEARSV|5.003007||Viu SAVEt_COMPILE_WARNINGS|5.009004||Viu SAVEt_COMPPAD|5.006000||Viu SAVEt_DELETE|5.003007||Viu SAVEt_DESTRUCTOR|5.003007||Viu SAVEt_DESTRUCTOR_X|5.006000||Viu SAVEt_FREECOPHH|5.013007||Viu SAVEt_FREEOP|5.003007||Viu SAVEt_FREEPADNAME|5.021007||Viu SAVEt_FREEPV|5.003007||Viu SAVEt_FREESV|5.003007||Viu SAVEt_GENERIC_PVREF|5.006001||Viu SAVEt_GENERIC_SVREF|5.005003||Viu SAVEt_GP|5.003007||Viu SAVEt_GVSLOT|5.017007||Viu SAVEt_GVSV|5.013005||Viu SAVEt_HELEM|5.004005||Viu SAVEt_HINTS|5.005000||Viu SAVEt_HINTS_HH|5.033001||Viu SAVEt_HPTR|5.003007||Viu SAVEt_HV|5.003007||Viu SAVEt_I16|5.004000||Viu SAVEt_I32|5.003007||Viu SAVEt_I32_SMALL|5.013001||Viu SAVEt_I8|5.006000||Viu SAVE_TIGHT_SHIFT|5.013001||Viu SAVEt_INT|5.003007||Viu SAVEt_INT_SMALL|5.013001||Viu SAVEt_ITEM|5.003007||Viu SAVEt_IV|5.003007||Viu SAVEt_LONG|5.003007||Viu SAVEt_MORTALIZESV|5.007001||Viu SAVETMPS|5.003007|5.003007| savetmps|5.023008|5.023008|xu SAVEt_NSTAB|5.003007||Viu save_to_buffer|5.027004||Vniu SAVEt_OP|5.005000||Viu SAVEt_PADSV_AND_MORTALIZE|5.010001||Viu SAVEt_PARSER|5.009005||Viu SAVEt_PPTR|5.003007||Viu SAVEt_READONLY_OFF|5.019002||Viu SAVEt_REGCONTEXT|5.003007||Viu SAVEt_SAVESWITCHSTACK|5.009002||Viu SAVEt_SET_SVFLAGS|5.009000||Viu SAVEt_SHARED_PVREF|5.007003||Viu SAVEt_SPTR|5.003007||Viu SAVEt_STACK_POS|5.004000||Viu SAVEt_STRLEN|5.019004||Viu SAVEt_STRLEN_SMALL|5.033005||Viu SAVEt_SV|5.003007||Viu SAVEt_SVREF|5.003007||Viu SAVEt_TMPSFLOOR|5.023008||Viu SAVEt_VPTR|5.006000||Viu save_vptr|5.006000|5.006000|u SAVEVPTR|5.006000||Viu SAWAMPERSAND_LEFT|5.017004||Viu SAWAMPERSAND_MIDDLE|5.017004||Viu SAWAMPERSAND_RIGHT|5.017004||Viu sawparens|5.003007||Viu sb_dstr|5.003007||Viu sb_iters|5.003007||Viu sb_m|5.003007||Viu sb_maxiters|5.003007||Viu SBOL|5.003007||Viu SBOL_t8_p8|5.033003||Viu SBOL_t8_pb|5.033003||Viu SBOL_tb_p8|5.033003||Viu SBOL_tb_pb|5.033003||Viu sb_orig|5.003007||Viu SBOX32_CHURN_ROUNDS|5.027001||Viu SBOX32_MAX_LEN|5.027001||Viu SBOX32_MIX3|5.027001||Viu SBOX32_MIX4|5.027001||Viu SBOX32_SCRAMBLE32|5.027001||Viu SBOX32_SKIP_MASK|5.027001||Viu SBOX32_STATE_BITS|5.027001||Viu SBOX32_STATE_BYTES|5.027001||Viu SBOX32_STATE_WORDS|5.027001||Viu SBOX32_STATIC_INLINE|5.027001||Viu SBOX32_WARN2|5.027001||Viu SBOX32_WARN3|5.027001||Viu SBOX32_WARN4|5.027001||Viu SBOX32_WARN5|5.027001||Viu SBOX32_WARN6|5.027001||Viu sb_rflags|5.006000||Viu sb_rx|5.003007||Viu sb_rxres|5.004000||Viu sb_rxtainted|5.004000||Viu sb_s|5.003007||Viu sb_strend|5.003007||Viu sb_targ|5.003007||Viu scalar|5.003007||Viu scalarboolean|5.005000||Viu scalarkids|5.003007||Viu scalar_mod_type|5.006000||Vniu scalarvoid|5.003007||Viu scan_bin|5.006000|5.006000| scan_commit|5.005000||Viu scan_const|5.003007||Viu SCAN_DEF|5.003007||Viu scan_formline|5.003007||Viu scan_heredoc|5.003007||Viu scan_hex|5.006000|5.003007| scan_ident|5.003007||Viu scan_inputsymbol|5.003007||Viu scan_num|5.003007||cVu scan_oct|5.006000|5.003007| scan_pat|5.003007||Viu SCAN_REPL|5.003007||Viu scan_str|5.003007||xcViu scan_subst|5.003007||Viu SCAN_TR|5.003007||Viu scan_trans|5.003007||Viu scan_version|5.009001|5.009001| SCAN_VERSION|5.019008||Viu scan_vstring|5.009005|5.009005|u scan_word|5.003007||xcViu SCHED_YIELD|5.006000|5.006000|Vn SCOPE_SAVES_SIGNAL_MASK|5.007001||Viu search_const|5.010001||Viu seed|5.008001|5.008001|u seedDrand01|5.006000|5.006000| SEEK_CUR|5.003007||Viu seekdir|5.005000||Viu SEEK_END|5.003007||Viu SEEK_SET|5.003007||Viu select|5.005000||Viu Select_fd_set_t|5.003007|5.003007|Vn SELECT_MIN_BITS|5.005003|5.005003|Vn Semctl|5.004005||Viu semun|5.006000||Viu send|5.005000||Viu sendto|5.005000||Viu SEOL|5.003007||Viu SEOL_t8_p8|5.033003||Viu SEOL_t8_pb|5.033003||Viu SEOL_tb_p8|5.033003||Viu SEOL_tb_pb|5.033003||Viu sequence_num|5.009003||Viu set_ANYOF_arg|5.019005||Viu set_ANYOF_SYNTHETIC|5.019009||Viu setbuf|5.003007||Viu set_caret_X|5.019006||Viu set_context|5.006000|5.006000|nu setdefout|5.003007|5.003007| SETERRNO|5.003007||Vi setfd_cloexec|5.027008||Vniu setfd_cloexec_for_nonsysfd|5.027008||Viu setfd_cloexec_or_inhexec_by_sysfdness|5.027008||Viu setfd_inhexec|5.027008||Vniu setfd_inhexec_for_sysfd|5.027008||Viu setgid|5.005000||Viu setgrent|5.009000||Viu SETGRENT_R_HAS_FPTR|5.008000||Viu SETGRENT_R_PROTO|5.008000|5.008000|Vn sethostent|5.005000||Viu SETHOSTENT_R_PROTO|5.008000|5.008000|Vn SETi|5.003007||Viu setjmp|5.005000||Viu setlinebuf|5.005000||Viu setlocale|5.009000||Viu setlocale_debug_string|5.027002||Vniu SETLOCALE_LOCK|5.033005||Viu SETLOCALE_R_PROTO|5.008000|5.008000|Vn SETLOCALE_UNLOCK|5.033005||Viu SET_MARK_OFFSET|5.006000||Viu setmode|5.005000||Viu SETn|5.003007||Viu setnetent|5.005000||Viu SETNETENT_R_PROTO|5.008000|5.008000|Vn set_numeric_radix|5.006000||Viu SET_NUMERIC_STANDARD|5.004000||Viu set_numeric_standard|5.006000||cViu SET_NUMERIC_UNDERLYING|5.021010||Viu set_numeric_underlying|5.027006||cViu SETp|5.003007||Viu set_padlist|5.021006||cVniu setprotoent|5.005000||Viu SETPROTOENT_R_PROTO|5.008000|5.008000|Vn setpwent|5.009000||Viu SETPWENT_R_HAS_FPTR|5.008000||Viu SETPWENT_R_PROTO|5.008000|5.008000|Vn set_regex_pv|5.029004||Viu setregid|5.003007||Viu setreuid|5.003007||Viu SETs|5.003007||Viu setservent|5.005000||Viu SETSERVENT_R_PROTO|5.008000|5.008000|Vn setsockopt|5.005000||Viu setSTR_LEN|5.031005||Viu SET_SVANY_FOR_BODYLESS_IV|5.023008||Viu SET_SVANY_FOR_BODYLESS_NV|5.023008||Viu SETTARG|5.003007||Viu SET_THR|5.005000||Viu SET_THREAD_SELF|5.005003||Viu SETu|5.004000||Viu setuid|5.005000||Viu _setup_canned_invlist|5.019008||cViu setvbuf|5.003007||Viu share_hek|5.004000|5.004000|u share_hek_flags|5.008000||Viu share_hek_hek|5.009003||Viu sharepvn|5.005000||Viu SHARP_S_SKIP|5.007003||Viu Shmat_t|5.003007|5.003007|Vn SHORTSIZE|5.004000|5.004000|Vn should_warn_nl|5.021001||Vniu should_we_output_Debug_r|5.031011||Viu SH_PATH|5.003007|5.003007|Vn shutdown|5.005000||Viu si_dup|5.007003|5.007003|u S_IEXEC|5.006000||Viu S_IFIFO|5.011000||Viu S_IFMT|5.003007||Viu SIGABRT|5.003007||Viu sighandler1|5.031007||Vniu sighandler3|5.031007||Vniu sighandler|5.003007||Vniu SIGILL|5.003007||Viu Sigjmp_buf|5.003007|5.003007|Vn Siglongjmp|5.003007|5.003007| signal|5.005000||Viu Signal_t|5.003007|5.003007|Vn SIG_NAME|5.003007|5.003007|Vn SIG_NUM|5.003007|5.003007|Vn Sigsetjmp|5.003007|5.003007| SIG_SIZE|5.007001|5.007001|Vn simplify_sort|5.006000||Viu SINGLE_PAT_MOD|5.009005||Viu SIPHASH_SEED_STATE|5.027001||Viu SIPROUND|5.017006||Viu S_IREAD|5.006000||Viu S_IRGRP|5.003007||Viu S_IROTH|5.003007||Viu S_IRUSR|5.003007||Viu S_IRWXG|5.006000||Viu S_IRWXO|5.006000||Viu S_IRWXU|5.006000||Viu S_ISBLK|5.003007||Viu S_ISCHR|5.003007||Viu S_ISDIR|5.003007||Viu S_ISFIFO|5.003007||Viu S_ISGID|5.003007||Viu S_ISLNK|5.003007||Viu S_ISREG|5.003007||Viu S_ISSOCK|5.003007||Viu S_ISUID|5.003007||Viu SITEARCH|5.003007|5.003007|Vn SITEARCH_EXP|5.003007|5.003007|Vn SITELIB|5.003007|5.003007|Vn SITELIB_EXP|5.003007|5.003007|Vn SITELIB_STEM|5.006000|5.006000|Vn S_IWGRP|5.003007||Viu S_IWOTH|5.003007||Viu S_IWRITE|5.006000||Viu S_IWUSR|5.003007||Viu S_IXGRP|5.003007||Viu S_IXOTH|5.003007||Viu S_IXUSR|5.003007||Viu SIZE_ALIGN|5.005000||Viu Size_t|5.003007|5.003007|Vn Size_t_MAX|5.021003||Viu Size_t_size|5.006000|5.006000|Vn SKIP|5.009005||Viu SKIP_next|5.009005||Viu SKIP_next_fail|5.009005||Viu SKIP_next_fail_t8_p8|5.033003||Viu SKIP_next_fail_t8_pb|5.033003||Viu SKIP_next_fail_tb_p8|5.033003||Viu SKIP_next_fail_tb_pb|5.033003||Viu SKIP_next_t8_p8|5.033003||Viu SKIP_next_t8_pb|5.033003||Viu SKIP_next_tb_p8|5.033003||Viu SKIP_next_tb_pb|5.033003||Viu skipspace_flags|5.019002||xcViu SKIP_t8_p8|5.033003||Viu SKIP_t8_pb|5.033003||Viu SKIP_tb_p8|5.033003||Viu SKIP_tb_pb|5.033003||Viu skip_to_be_ignored_text|5.023004||Viu Slab_Alloc|5.006000||cViu Slab_Free|5.007003||cViu Slab_to_ro|5.017002||Viu Slab_to_rw|5.009005||Viu sleep|5.005000||Viu SLOPPYDIVIDE|5.003007||Viu socket|5.005000||Viu SOCKET_OPEN_MODE|5.008002||Viu socketpair|5.005000||Viu Sock_size_t|5.006000|5.006000|Vn softref2xv|||iu sortcv|5.009003||Viu sortcv_stacked|5.009003||Viu sortcv_xsub|5.009003||Viu sortsv|5.007003|5.007003| sortsv_flags|5.009003|5.009003| sortsv_flags_impl|5.031011||Viu SP|5.003007|5.003007| space_join_names_mortal|5.009004||Viu SPAGAIN|5.003007|5.003007| S_PAT_MODS|5.009005||Viu specialWARN|5.006000||Viu SRAND48_R_PROTO|5.008000|5.008000|Vn SRANDOM_R_PROTO|5.008000|5.008000|Vn SRCLOSE|5.027008||Viu SRCLOSE_t8_p8|5.033003||Viu SRCLOSE_t8_pb|5.033003||Viu SRCLOSE_tb_p8|5.033003||Viu SRCLOSE_tb_pb|5.033003||Viu SROPEN|5.027008||Viu SROPEN_t8_p8|5.033003||Viu SROPEN_t8_pb|5.033003||Viu SROPEN_tb_p8|5.033003||Viu SROPEN_tb_pb|5.033003||Viu SS_ACCVIO|5.008001||Viu SS_ADD_BOOL|5.017007||Viu SS_ADD_DPTR|5.017007||Viu SS_ADD_DXPTR|5.017007||Viu SS_ADD_END|5.017007||Viu SS_ADD_INT|5.017007||Viu SS_ADD_IV|5.017007||Viu SS_ADD_LONG|5.017007||Viu SS_ADD_PTR|5.017007||Viu SS_ADD_UV|5.017007||Viu SS_BUFFEROVF|5.021009||Viu ssc_add_range|5.019005||Viu ssc_and|5.019005||Viu ssc_anything|5.019005||Viu ssc_clear_locale|5.019005||Vniu ssc_cp_and|5.019005||Viu ssc_finalize|5.019005||Viu SSCHECK|5.003007||Viu ssc_init|5.019005||Viu ssc_intersection|5.019005||Viu ssc_is_anything|5.019005||Vniu ssc_is_cp_posixl_init|5.019005||Vniu SSC_MATCHES_EMPTY_STRING|5.021004||Viu ssc_or|5.019005||Viu ssc_union|5.019005||Viu SS_DEVOFFLINE|5.008001||Viu ss_dup|5.007003|5.007003|u SSGROW|5.008001||Viu SS_IVCHAN|5.008001||Viu SSize_t|5.003007|5.003007|Vn SSize_t_MAX|5.019004||Viu SS_MAXPUSH|5.017007||Viu SSNEW|5.006000||Viu SSNEWa|5.006000||Viu SSNEWat|5.007001||Viu SSNEWt|5.007001||Viu SS_NOPRIV|5.021001||Viu SS_NORMAL|5.008001||Viu SSPOPBOOL|5.008001||Viu SSPOPDPTR|5.003007||Viu SSPOPDXPTR|5.006000||Viu SSPOPINT|5.003007||Viu SSPOPIV|5.003007||Viu SSPOPLONG|5.003007||Viu SSPOPPTR|5.003007||Viu SSPOPUV|5.013001||Viu SSPTR|5.006000||Viu SSPTRt|5.007001||Viu SSPUSHBOOL|5.008001||Viu SSPUSHDPTR|5.003007||Viu SSPUSHDXPTR|5.006000||Viu SSPUSHINT|5.003007||Viu SSPUSHIV|5.003007||Viu SSPUSHLONG|5.003007||Viu SSPUSHPTR|5.003007||Viu SSPUSHUV|5.013001||Viu ST|5.003007|5.003007| stack_grow|5.003007||cVu STANDARD_C|5.003007||Viu STAR|5.003007||Viu STAR_t8_p8|5.033003||Viu STAR_t8_pb|5.033003||Viu STAR_tb_p8|5.033003||Viu STAR_tb_pb|5.033003||Viu START_EXTERN_C|5.005000|5.003007|pV start_glob|||xi START_MY_CXT|5.010000|5.010000|p STARTPERL|5.003007|5.003007|Vn start_subparse|5.004000|5.003007|pu StashHANDLER|5.007001||Viu Stat|5.003007||Viu stat|5.005000||Viu STATIC|5.005000||Viu STATIC_ASSERT_1|5.021007||Viu STATIC_ASSERT_2|5.021007||Viu STATIC_ASSERT_DECL|5.027001||Viu STATIC_ASSERT_STMT|5.021007||Viu Stat_t|5.004005||Viu STATUS_ALL_FAILURE|5.004000||Viu STATUS_ALL_SUCCESS|5.004000||Viu STATUS_CURRENT|5.004000||Viu STATUS_EXIT|5.009003||Viu STATUS_EXIT_SET|5.009003||Viu STATUS_NATIVE|5.004000||Viu STATUS_NATIVE_CHILD_SET|5.009003||Viu STATUS_UNIX|5.009003||Viu STATUS_UNIX_EXIT_SET|5.009003||Viu STATUS_UNIX_SET|5.009003||Viu STDCHAR|5.003007|5.003007|Vn stderr|5.003007||Viu stdin|5.003007||Viu STDIO_PTR_LVAL_SETS_CNT|5.007001|5.007001|Vn STDIO_PTR_LVALUE|5.006000|5.006000|Vn STDIO_STREAM_ARRAY|5.006000|5.006000|Vn stdize_locale|5.007001||Viu stdout|5.003007||Viu stdoutf|5.005000||Viu STD_PAT_MODS|5.009005||Viu STD_PMMOD_FLAGS_CLEAR|5.013006||Viu ST_INO_SIGN|5.015002|5.015002|Vn ST_INO_SIZE|5.015002|5.015002|Vn STMT_END|5.003007|5.003007|pV STMT_START|5.003007|5.003007|pV STOREFEATUREBITSHH|5.031006||Viu STORE_LC_NUMERIC_FORCE_TO_UNDERLYING|5.021010|5.021010| STORE_LC_NUMERIC_SET_STANDARD|5.027009||pVu STORE_LC_NUMERIC_SET_TO_NEEDED|5.021010|5.021010| STORE_LC_NUMERIC_SET_TO_NEEDED_IN|5.031003|5.031003| STORE_NUMERIC_SET_STANDARD|||piu strBEGINs|5.027006||Viu strEQ|5.003007|5.003007| Strerror|5.003007||Viu strerror|5.009000||Viu STRERROR_R_PROTO|5.008000|5.008000|Vn strGE|5.003007|5.003007| strGT|5.003007|5.003007| STRING|5.006000||Viu STRINGIFY|5.003007|5.003007|Vn STRINGl|5.031005||Viu STRINGs|5.031005||Viu strip_return|5.009003||Viu strLE|5.003007|5.003007| STR_LEN|5.006000||Viu STRLEN|5.027001||Viu STR_LENl|5.031005||Viu STR_LENs|5.031005||Viu strLT|5.003007|5.003007| strNE|5.003007|5.003007| strnEQ|5.003007|5.003007| strnNE|5.003007|5.003007| STR_SZ|5.006000||Viu Strtod|5.029010|5.029010|n Strtol|5.006000|5.006000|n strtoll|5.006000||Viu Strtoul|5.006000|5.006000|n strtoull|5.006000||Viu str_to_version|5.006000||cVu StructCopy|5.003007|5.003007|V STRUCT_OFFSET|5.004000||Viu STRUCT_SV|5.007001||Viu STR_WITH_LEN|5.009003|5.003007|pV study_chunk|5.005000||Viu sub_crush_depth|5.004000||Viu sublex_done|5.005000||Viu sublex_push|5.005000||Viu sublex_start|5.005000||Viu SUBST_TAINT_BOOLRET|5.013010||Viu SUBST_TAINT_PAT|5.013010||Viu SUBST_TAINT_REPL|5.013010||Viu SUBST_TAINT_RETAINT|5.013010||Viu SUBST_TAINT_STR|5.013010||Viu SUBVERSION|5.003007||Viu SUCCEED|5.003007||Viu SUCCEED_t8_p8|5.033003||Viu SUCCEED_t8_pb|5.033003||Viu SUCCEED_tb_p8|5.033003||Viu SUCCEED_tb_pb|5.033003||Viu SUSPEND|5.005000||Viu SUSPEND_t8_p8|5.033003||Viu SUSPEND_t8_pb|5.033003||Viu SUSPEND_tb_p8|5.033003||Viu SUSPEND_tb_pb|5.033003||Viu sv_2bool|5.013006||cV sv_2bool_flags|5.013006||cV sv_2bool_nomg|5.017002||Viu sv_2cv|5.003007|5.003007| sv_2io|5.003007|5.003007| sv_2iuv_common|5.009004||Viu sv_2iuv_non_preserve|5.007001||Viu sv_2iv|5.009001||cVu sv_2iv_flags|5.009001|5.009001| sv_2mortal|5.003007|5.003007| sv_2num|5.010000||xVi sv_2nv|5.013001||Viu sv_2nv_flags|5.013001|5.013001| sv_2pv|5.005000||cVu sv_2pvbyte|5.006000|5.003007|p sv_2pvbyte_flags|5.031004|5.031004|u sv_2pvbyte_nolen|5.009003||pcV sv_2pv_flags|5.007002||pcV sv_2pv_nolen|5.009003||pcV sv_2pv_nomg|5.007002||Viu sv_2pvutf8|5.006000|5.006000| sv_2pvutf8_flags|5.031004|5.031004|u sv_2pvutf8_nolen|5.009003||cV sv_2uv|5.009001||pcVu sv_2uv_flags|5.009001|5.009001| sv_add_arena|5.003007||Vi sv_add_backref|||iu SvAMAGIC|5.003007||Viu SvAMAGIC_off|5.031004|5.031004|nu SvAMAGIC_on|5.031004|5.031004|nu SvANY|5.003007||Viu sv_backoff|5.003007|5.003007|n sv_bless|5.003007|5.003007| sv_buf_to_ro|5.019008||Viu sv_buf_to_rw|5.019008||Viu SvCANCOW|5.017007||Viu SvCANEXISTDELETE|5.011000||Viu SV_CATBYTES|5.021005|5.021005| sv_cat_decode|5.008001|5.008001| sv_cathek|5.021004||Viu sv_catpv|5.003007|5.003007| sv_catpvf|5.006000|5.004000|v sv_catpv_flags|5.013006|5.013006| sv_catpvf_mg|5.006000|5.004000|pv sv_catpvf_mg_nocontext|5.006000||pvVn sv_catpvf_nocontext|5.006000||vVn sv_catpv_mg|5.004005|5.003007|p sv_catpvn|5.003007|5.003007| sv_catpvn_flags|5.007002|5.007002| sv_catpvn_mg|5.004005|5.003007|p sv_catpvn_nomg|5.007002|5.003007|p sv_catpvn_nomg_maybeutf8|5.017005||Viu sv_catpvn_nomg_utf8_upgrade|5.017002||Viu sv_catpv_nomg|5.013006|5.013006| sv_catpvs|5.009003|5.003007|p sv_catpvs_flags|5.013006|5.013006| sv_catpvs_mg|5.013006|5.013006| sv_catpvs_nomg|5.013006|5.013006| sv_catsv|5.003007|5.003007| sv_catsv_flags|5.007002|5.007002| sv_catsv_mg|5.004005|5.003007|p sv_catsv_nomg|5.007002|5.003007|p SV_CATUTF8|5.021005|5.021005| sv_catxmlpvs|5.013006||Viu SV_CHECK_THINKFIRST|5.008001||Viu SV_CHECK_THINKFIRST_COW_DROP|5.009000||Viu sv_chop|5.003007|5.003007| sv_clean_all|5.003007||Vi sv_clean_objs|5.003007||Vi sv_clear|5.003007|5.003007| sv_cmp|5.003007|5.003007| sv_cmp_flags|5.013006|5.013006| sv_cmp_locale|5.004000|5.004000| sv_cmp_locale_flags|5.013006|5.013006| sv_collxfrm|5.013006||V sv_collxfrm_flags|5.013006|5.013006| SvCOMPILED|5.003007||Viu SvCOMPILED_off|5.003007||Viu SvCOMPILED_on|5.003007||Viu SV_CONST|5.019002||Viu SV_CONST_BINMODE|5.019002||Viu SV_CONST_CLEAR|5.019002||Viu SV_CONST_CLOSE|5.019002||Viu SV_CONST_DELETE|5.019002||Viu SV_CONST_DESTROY|5.019002||Viu SV_CONST_EOF|5.019002||Viu SV_CONST_EXISTS|5.019002||Viu SV_CONST_EXTEND|5.019002||Viu SV_CONST_FETCH|5.019002||Viu SV_CONST_FETCHSIZE|5.019002||Viu SV_CONST_FILENO|5.019002||Viu SV_CONST_FIRSTKEY|5.019002||Viu SV_CONST_GETC|5.019002||Viu SV_CONST_NEXTKEY|5.019002||Viu SV_CONST_OPEN|5.019002||Viu SV_CONST_POP|5.019002||Viu SV_CONST_PRINT|5.019002||Viu SV_CONST_PRINTF|5.019002||Viu SV_CONST_PUSH|5.019002||Viu SV_CONST_READ|5.019002||Viu SV_CONST_READLINE|5.019002||Viu SV_CONST_RETURN|5.009003|5.003007|poVnu SV_CONST_SCALAR|5.019002||Viu SV_CONSTS_COUNT|5.019002||Viu SV_CONST_SEEK|5.019002||Viu SV_CONST_SHIFT|5.019002||Viu SV_CONST_SPLICE|5.019002||Viu SV_CONST_STORE|5.019002||Viu SV_CONST_STORESIZE|5.019002||Viu SV_CONST_TELL|5.019002||Viu SV_CONST_TIEARRAY|5.019002||Viu SV_CONST_TIEHANDLE|5.019002||Viu SV_CONST_TIEHASH|5.019002||Viu SV_CONST_TIESCALAR|5.019002||Viu SV_CONST_UNSHIFT|5.019002||Viu SV_CONST_UNTIE|5.019002||Viu SV_CONST_WRITE|5.019002||Viu sv_copypv|5.007003|5.007003| sv_copypv_flags|5.017002|5.017002| sv_copypv_nomg|5.017002|5.017002| SV_COW_DROP_PV|5.008001|5.003007|p SV_COW_OTHER_PVS|5.009005||Viu SV_COW_REFCNT_MAX|5.017007||Viu SV_COW_SHARED_HASH_KEYS|5.009005|5.003007|poVnu SvCUR|5.003007|5.003007| SvCUR_set|5.003007|5.003007| sv_dec|5.003007|5.003007| sv_dec_nomg|5.013002|5.013002| sv_del_backref|5.006000||cViu sv_derived_from|5.004000|5.004000| sv_derived_from_pv|5.015004|5.015004| sv_derived_from_pvn|5.015004|5.015004| sv_derived_from_sv|5.015004|5.015004| sv_derived_from_svpvn|5.031006||Viu sv_destroyable|5.010000|5.010000| SvDESTROYABLE|5.010000||Viu sv_display|5.021002||Viu SV_DO_COW_SVSETSV|5.009005||Viu sv_does|5.009004|5.009004| sv_does_pv|5.015004|5.015004| sv_does_pvn|5.015004|5.015004| sv_does_sv|5.015004|5.015004| sv_dump|5.003007|5.003007| sv_dup|5.007003|5.007003|u sv_dup_common|5.013002||Viu sv_dup_inc|5.013002|5.013002|u sv_dup_inc_multiple|5.011000||Viu SvEND|5.003007|5.003007| SvEND_set|5.003007||Viu SvENDx|5.003007||Viu sv_eq|5.003007|5.003007| sv_eq_flags|5.013006|5.013006| sv_exp_grow|5.009003||Viu SVf256|5.008001||Viu SVf32|5.009002||Viu SVf|5.006000|5.003007|p SvFAKE|5.003007||Viu SvFAKE_off|5.003007||Viu SvFAKE_on|5.003007||Viu SVf_AMAGIC|5.003007||Viu SVfARG|5.009005|5.003007|p SVf_BREAK|5.003007||Viu SVf_FAKE|5.003007||Viu SVf_IOK|5.003007||Viu SVf_IsCOW|5.017006||Viu SVf_IVisUV|5.006000||Viu SvFLAGS|5.003007||Viu SVf_NOK|5.003007||Viu SVf_OK|5.003007||Viu SVf_OOK|5.003007||Viu sv_force_normal|5.006000|5.006000| sv_force_normal_flags|5.007001|5.007001| SV_FORCE_UTF8_UPGRADE|5.011000|5.011000| SVf_POK|5.003007||Viu SVf_PROTECT|5.021005||Viu SVf_READONLY|5.003007||Viu sv_free2|||xciu sv_free|5.003007|5.003007| sv_free_arenas|5.003007||Vi SVf_ROK|5.003007||Viu SVf_THINKFIRST|5.003007||Viu SVf_UTF8|5.006000|5.003007|p SvGAMAGIC|5.006001|5.006001| sv_get_backrefs|5.021008|5.021008|xn SvGETMAGIC|5.004005|5.003007|p sv_gets|5.003007|5.003007| SvGID|5.019001||Viu SV_GMAGIC|5.007002|5.003007|p SvGMAGICAL|5.003007||Viu SvGMAGICAL_off|5.003007||Viu SvGMAGICAL_on|5.003007||Viu SvGROW|5.003007|5.003007| sv_grow|5.003007||cV Sv_Grow|5.003007||Viu SvGROW_mutable|5.009003||Viu SV_HAS_TRAILING_NUL|5.009004|5.003007|p SV_IMMEDIATE_UNREF|5.007001|5.003007|p SvIMMORTAL|5.004000||Viu SvIMMORTAL_INTERP|5.027003||Viu SvIMMORTAL_TRUE|5.027003||Viu sv_inc|5.003007|5.003007| sv_i_ncmp|5.009003||Viu sv_i_ncmp_desc|5.031011||Viu sv_inc_nomg|5.013002|5.013002| sv_insert|5.003007|5.003007| sv_insert_flags|5.010001|5.010001| SvIOK|5.003007|5.003007| SvIOK_nog|5.017002||Viu SvIOK_nogthink|5.017002||Viu SvIOK_notUV|5.006000|5.006000| SvIOK_off|5.003007|5.003007| SvIOK_on|5.003007|5.003007| SvIOK_only|5.003007|5.003007| SvIOK_only_UV|5.006000|5.006000| SvIOKp|5.003007|5.003007| SvIOKp_on|5.003007||Viu SvIOK_UV|5.006000|5.006000| sv_isa|5.003007|5.003007| sv_isa_sv|5.031007|5.031007|x SvIsCOW|5.008003|5.008003| SvIsCOW_shared_hash|5.008003|5.008003| SvIS_FREED|5.009003||Viu sv_isobject|5.003007|5.003007| SvIV|5.003007|5.003007| sv_iv|5.005000||dcV SvIV_nomg|5.009001|5.003007|p SvIV_please|5.007001||Viu SvIV_please_nomg|5.013002||Viu SvIV_set|5.003007|5.003007| SvIVX|5.003007|5.003007| SvIVx|5.003007|5.003007| SvIVXx|5.003007||Viu sv_kill_backrefs|||xiu sv_len|5.003007|5.003007| SvLEN|5.003007|5.003007| SvLEN_set|5.003007|5.003007| sv_len_utf8|5.006000|5.006000|p sv_len_utf8_nomg|5.017004||pViu SvLENx|5.003007||Viu SvLOCK|5.007003|5.007003| sv_magic|5.003007|5.003007| SvMAGIC|5.003007||Viu SvMAGICAL|5.003007||Viu SvMAGICAL_off|5.003007||Viu SvMAGICAL_on|5.003007||Viu sv_magicext|5.007003|5.007003| sv_magicext_mglob|5.019002||cViu sv_magic_portable||5.004000|pou SvMAGIC_set|5.009003|5.003007|p sv_mortalcopy|5.003007|5.003007| sv_mortalcopy_flags|5.017005|5.003007|p SV_MUTABLE_RETURN|5.009003|5.003007|poVnu sv_ncmp|5.009003||Viu sv_ncmp_desc|5.031011||Viu sv_newmortal|5.003007|5.003007| sv_newref|5.003007||cV SvNIOK|5.003007|5.003007| SvNIOK_nog|5.017002||Viu SvNIOK_nogthink|5.017002||Viu SvNIOK_off|5.003007|5.003007| SvNIOKp|5.003007|5.003007| SvNOK|5.003007|5.003007| SvNOK_nog|5.017002||Viu SvNOK_nogthink|5.017002||Viu SvNOK_off|5.003007|5.003007| SvNOK_on|5.003007|5.003007| SvNOK_only|5.003007|5.003007| SvNOKp|5.003007|5.003007| SvNOKp_on|5.003007||Viu sv_nolocking|5.007003|5.007003|d sv_nosharing|5.007003|5.007003| SV_NOSTEAL|5.009002|5.003007|p sv_nounlocking|5.007003|5.007003|d sv_nv|5.005000||dcV SvNV|5.006000|5.003007| SvNV_nomg|5.013002|5.003007|p SvNV_set|5.006000|5.003007| SvNVX|5.006000|5.003007| SvNVx|5.006000|5.003007| SvNVXx|5.003007||Viu SvOBJECT|5.003007||Viu SvOBJECT_off|5.003007||Viu SvOBJECT_on|5.003007||Viu SvOK|5.003007|5.003007| SvOK_off|5.003007||Viu SvOK_off_exc_UV|5.006000||Viu SvOKp|5.003007||Viu sv_only_taint_gmagic|5.021010||Vniu SvOOK|5.003007|5.003007| SvOOK_off|5.003007|5.003007| SvOOK_offset|5.011000|5.011000| SvOOK_on|5.003007||Viu sv_or_pv_len_utf8|5.017005||Viu sv_or_pv_pos_u2b|5.019004||Viu SvOURSTASH|5.009005||Viu SvOURSTASH_set|5.009005||Viu SvPADMY|5.003007||Viu SvPADMY_on|5.003007||Viu SVpad_OUR|5.006000||Viu SvPAD_OUR|5.009004||Viu SvPAD_OUR_on|5.009004||Viu SvPADSTALE|5.009000||Viu SvPADSTALE_off|5.009000||Viu SvPADSTALE_on|5.009000||Viu SVpad_STATE|5.009004||Viu SvPAD_STATE|5.009004||Viu SvPAD_STATE_on|5.009004||Viu SvPADTMP|5.003007||Viu SvPADTMP_off|5.003007||Viu SvPADTMP_on|5.003007||Viu SVpad_TYPED|5.007002||Viu SvPAD_TYPED|5.009004||Viu SvPAD_TYPED_on|5.009004||Viu SVpav_REAL|5.009003||Viu SVpav_REIFY|5.009003||Viu SvPCS_IMPORTED|5.009005||Viu SvPCS_IMPORTED_off|5.009005||Viu SvPCS_IMPORTED_on|5.009005||Viu SvPEEK|5.003007||Viu sv_peek|5.005000|5.005000|u SVpgv_GP|5.009005||Viu SVphv_CLONEABLE|5.009003||Viu SVphv_HASKFLAGS|5.008000||Viu SVphv_LAZYDEL|5.003007||Viu SVphv_SHAREKEYS|5.003007||Viu SVp_IOK|5.003007||Viu SVp_NOK|5.003007||Viu SvPOK|5.003007|5.003007| SvPOK_byte_nog|5.017002||Viu SvPOK_byte_nogthink|5.017002||Viu SvPOK_byte_pure_nogthink|5.017003||Viu SvPOK_nog|5.017002||Viu SvPOK_nogthink|5.017002||Viu SvPOK_off|5.003007|5.003007| SvPOK_on|5.003007|5.003007| SvPOK_only|5.003007|5.003007| SvPOK_only_UTF8|5.006000|5.006000| SvPOKp|5.003007|5.003007| SvPOKp_on|5.003007||Viu SvPOK_pure_nogthink|5.017003||Viu SvPOK_utf8_nog|5.017002||Viu SvPOK_utf8_nogthink|5.017002||Viu SvPOK_utf8_pure_nogthink|5.017003||Viu sv_pos_b2u|5.006000|5.006000| sv_pos_b2u_flags|5.019003|5.019003| sv_pos_b2u_midway|5.009004||Viu sv_pos_u2b|5.006000|5.006000| sv_pos_u2b_cached|5.009004||Viu sv_pos_u2b_flags|5.011005|5.011005| sv_pos_u2b_forwards|5.009004||Vniu sv_pos_u2b_midway|5.009004||Vniu SVp_POK|5.003007||Viu SVprv_PCS_IMPORTED|5.009005||Viu SVprv_WEAKREF|5.006000||Viu SVp_SCREAM|5.003007||Viu SvPV|5.003007|5.003007| sv_pv|5.008000||cV SvPVbyte|5.006000|5.003007|p sv_pvbyte|5.008000||cV SvPVbyte_force|5.009002|5.009002| sv_pvbyten|5.006000||dcV sv_pvbyten_force|5.006000||cV SvPVbyte_nolen|5.006000|5.006000| SvPVbyte_nomg|5.031004|5.031004| SvPVbyte_or_null|5.031004|5.031004| SvPVbyte_or_null_nomg|5.031004|5.031004| SvPVbytex|5.006000|5.006000| SvPVbytex_force|5.006000|5.006000| SvPVbytex_nolen|5.009003|5.009003| SvPVCLEAR|5.025006|5.025006|p SvPV_const|5.009003|5.003007|p SvPV_flags|5.007002|5.003007|p SvPV_flags_const|5.009003|5.003007|p SvPV_flags_const_nolen|5.009003||pVu SvPV_flags_mutable|5.009003|5.003007|p SvPV_force|5.003007|5.003007|p SvPV_force_flags|5.007002|5.003007|p SvPV_force_flags_mutable|5.009003|5.003007|p SvPV_force_flags_nolen|5.009003|5.003007|p SvPV_force_mutable|5.009003|5.003007|p SvPV_force_nolen|5.009003|5.003007|p SvPV_force_nomg|5.007002|5.003007|p SvPV_force_nomg_nolen|5.009003|5.003007|p SvPV_free|5.009003|5.009003| SvPV_mutable|5.009003|5.003007|p sv_pvn|5.004000||dcV sv_pvn_force|5.005000||cV sv_pvn_force_flags|5.007002|5.003007|p sv_pvn_force_nomg|5.007002||Viu sv_pvn_nomg|5.007003|5.005000|pdu SvPV_nolen|5.006000|5.003007|p SvPV_nolen_const|5.009003|5.003007|p SvPV_nomg|5.007002|5.003007|p SvPV_nomg_const|5.009003|5.003007|p SvPV_nomg_const_nolen|5.009003|5.003007|p SvPV_nomg_nolen|5.013007|5.003007|p SvPV_renew|5.009003|5.003007|p SvPV_set|5.003007|5.003007| SvPV_shrink_to_cur|5.009003||Viu SvPVutf8|5.006000|5.006000| sv_pvutf8|5.008000||cV SvPVutf8_force|5.006000|5.006000| sv_pvutf8n|5.006000||dcV sv_pvutf8n_force|5.006000||cV SvPVutf8_nolen|5.006000|5.006000| SvPVutf8_nomg|5.031004|5.031004| SvPVutf8_or_null|5.031004|5.031004| SvPVutf8_or_null_nomg|5.031004|5.031004| SvPVutf8x|5.006000|5.006000| SvPVutf8x_force|5.006000|5.006000| SvPVX|5.003007|5.003007| SvPVx|5.003007|5.003007| SvPVX_const|5.009003|5.003007|p SvPVx_const|5.009003|5.009003| SvPVx_force|5.005000|5.005000| SvPVX_mutable|5.009003|5.003007|p SvPVx_nolen|5.009003|5.009003| SvPVx_nolen_const|5.009003|5.003007|p SvPVXtrue|5.017002||Viu SvPVXx|5.003007|5.003007| SvREADONLY|5.003007|5.003007| SvREADONLY_off|5.003007|5.003007| SvREADONLY_on|5.003007|5.003007| sv_recode_to_utf8|5.007003|5.007003| sv_ref|5.015004|5.015004| SvREFCNT|5.003007|5.003007| SvREFCNT_dec|5.003007|5.003007| SvREFCNT_dec_NN|5.017007|5.017007| SvREFCNT_IMMORTAL|5.017008||Viu SvREFCNT_inc|5.003007|5.003007|pn SvREFCNT_inc_NN|5.009004|5.003007|pn SvREFCNT_inc_simple|5.009004|5.003007|pn SvREFCNT_inc_simple_NN|5.009004|5.003007|pn SvREFCNT_inc_simple_void|5.009004|5.003007|pn SvREFCNT_inc_simple_void_NN|5.009004|5.003007|pn SvREFCNT_inc_void|5.009004|5.003007|pn SvREFCNT_inc_void_NN|5.009004|5.003007|pn sv_reftype|5.003007|5.003007| sv_replace|5.003007|5.003007| sv_report_used|5.003007|5.003007| sv_reset|5.003007|5.003007| sv_resetpvn|5.017005||Viu SvRMAGICAL|5.003007||Viu SvRMAGICAL_off|5.003007||Viu SvRMAGICAL_on|5.003007||Viu SvROK|5.003007|5.003007| SvROK_off|5.003007|5.003007| SvROK_on|5.003007|5.003007| SvRV|5.003007|5.003007| SvRV_const|5.010001||Viu SvRV_set|5.009003|5.003007|p sv_rvunweaken|5.027004|5.027004| sv_rvweaken|5.006000|5.006000| SvRVx|5.003007||Viu SvRX|5.009005|5.003007|p SvRXOK|5.009005|5.003007|p SV_SAVED_COPY|5.009005||Viu SvSCREAM|5.003007||Viu SvSCREAM_off|5.003007||Viu SvSCREAM_on|5.003007||Viu sv_setgid|5.019001||Viu sv_sethek|5.015004||cViu sv_setiv|5.003007|5.003007| sv_setiv_mg|5.004005|5.003007|p SvSETMAGIC|5.003007|5.003007| SvSetMagicSV|5.004000|5.004000| SvSetMagicSV_nosteal|5.004000|5.004000| sv_setnv|5.006000|5.003007| sv_setnv_mg|5.006000|5.003007|p sv_setpv|5.003007|5.003007| sv_setpv_bufsize|5.025006|5.025006| sv_setpvf|5.006000|5.004000|v sv_setpvf_mg|5.006000|5.004000|pv sv_setpvf_mg_nocontext|5.006000||pvVn sv_setpvf_nocontext|5.006000||vVn sv_setpviv|5.008001|5.008001|d sv_setpviv_mg|5.008001|5.008001|d sv_setpv_mg|5.004005|5.003007|p sv_setpvn|5.003007|5.003007| sv_setpvn_mg|5.004005|5.003007|p sv_setpvs|5.009004|5.003007|p sv_setpvs_mg|5.013006|5.013006| sv_setref_iv|5.003007|5.003007| sv_setref_nv|5.006000|5.003007| sv_setref_pv|5.003007|5.003007| sv_setref_pvn|5.003007|5.003007| sv_setref_pvs|5.013006|5.013006| sv_setref_uv|5.007001|5.007001| sv_setsv|5.003007|5.003007| SvSetSV|5.003007|5.003007| sv_setsv_cow|5.009000||xcViu sv_setsv_flags|5.007002|5.003007|p sv_setsv_mg|5.004005|5.003007|p sv_setsv_nomg|5.007002|5.003007|p SvSetSV_nosteal|5.004000|5.004000| sv_setuid|5.019001||Viu sv_set_undef|5.025008|5.025008| sv_setuv|5.004000|5.003007|p sv_setuv_mg|5.004005|5.003007|p SVs_GMG|5.003007||Viu SvSHARE|5.007003|5.007003| SvSHARED_HASH|5.009003|5.003007|p SvSHARED_HEK_FROM_PV|5.009003||Viu SV_SKIP_OVERLOAD|5.013001||Viu SV_SMAGIC|5.009003|5.003007|p SvSMAGICAL|5.003007||Viu SvSMAGICAL_off|5.003007||Viu SvSMAGICAL_on|5.003007||Viu SVs_OBJECT|5.003007||Viu SVs_PADMY|5.003007||Viu SVs_PADSTALE|5.009000|5.009000| SVs_PADTMP|5.003007||Viu SVs_RMG|5.003007||Viu SVs_SMG|5.003007||Viu SvSTASH|5.003007|5.003007| SvSTASH_set|5.009003|5.003007|p SVs_TEMP|5.003007|5.003007| sv_string_from_errnum|5.027003|5.027003| SvTAIL|5.003007||Viu SvTAINT|5.003007|5.003007| sv_taint|5.009003||cV SvTAINTED|5.004000|5.004000| sv_tainted|5.004000||cV SvTAINTED_off|5.004000|5.004000| SvTAINTED_on|5.004000|5.004000| SvTEMP|5.003007||Viu SvTEMP_off|5.003007||Viu SvTEMP_on|5.003007||Viu SVt_FIRST|5.021005||Viu SvTHINKFIRST|5.003007||Vi SvTIED_mg|5.005003||Viu SvTIED_obj|5.005003|5.005003| SVt_INVLIST|||c SVt_IV|5.003007|5.003007| SVt_MASK|5.015001||Viu SVt_NULL|5.003007|5.003007| SVt_NV|5.003007|5.003007| SVt_PV|5.003007|5.003007| SVt_PVAV|5.003007|5.003007| SVt_PVBM|5.009005||Viu SVt_PVCV|5.003007|5.003007| SVt_PVFM|5.003007|5.003007| SVt_PVGV|5.003007|5.003007| SVt_PVHV|5.003007|5.003007| SVt_PVIO|5.003007|5.003007| SVt_PVIV|5.003007|5.003007| SVt_PVLV|5.003007|5.003007| SVt_PVMG|5.003007|5.003007| SVt_PVNV|5.003007|5.003007| SVt_REGEXP|5.011000|5.011000| SvTRUE|5.003007|5.003007| sv_true|5.005000||cV SvTRUE_common|5.033005||cVu SvTRUE_NN|5.017007|5.017007| SvTRUE_nomg|5.013006|5.003007|p SvTRUE_nomg_NN|5.017007|5.017007| SvTRUEx|5.003007|5.003007| SvTRUEx_nomg|5.017002||Viu SVt_RV|5.011000||Viu SvTYPE|5.003007|5.003007| SVTYPEMASK|5.003007||Viu SvUID|5.019001||Viu SV_UNDEF_RETURNS_NULL|5.011000||Viu sv_unglob|5.005000||Viu sv_uni_display|5.007003|5.007003| SvUNLOCK|5.007003|5.007003| sv_unmagic|5.003007|5.003007| sv_unmagicext|5.013008|5.003007|p sv_unref|5.003007|5.003007| sv_unref_flags|5.007001|5.007001| sv_untaint|5.004000||cV SvUOK|5.007001|5.006000|p SvUOK_nog|5.017002||Viu SvUOK_nogthink|5.017002||Viu sv_upgrade|5.003007|5.003007| SvUPGRADE|5.003007|5.003007| sv_usepvn|5.003007|5.003007| sv_usepvn_flags|5.009004|5.009004| sv_usepvn_mg|5.004005|5.003007|p SvUTF8|5.006000|5.003007|p sv_utf8_decode|5.006000|5.006000| sv_utf8_downgrade|5.006000|5.006000| sv_utf8_downgrade_flags|5.031004|5.031004| sv_utf8_downgrade_nomg|5.031004|5.031004| sv_utf8_encode|5.006000|5.006000| SV_UTF8_NO_ENCODING|5.008001|5.003007|pd SvUTF8_off|5.006000|5.006000| SvUTF8_on|5.006000|5.006000| sv_utf8_upgrade|5.007001|5.007001| sv_utf8_upgrade_flags|5.007002|5.007002| sv_utf8_upgrade_flags_grow|5.011000|5.011000| sv_utf8_upgrade_nomg|5.007002|5.007002| SvUV|5.004000|5.003007|p sv_uv|5.005000||pdcV SvUV_nomg|5.009001|5.003007|p SvUV_set|5.009003|5.003007|p SvUVX|5.004000|5.003007|p SvUVx|5.004000|5.003007|p SvUVXx|5.004000|5.003007|pd SvVALID|5.003007||Viu sv_vcatpvf|5.006000|5.004000|p sv_vcatpvf_mg|5.006000|5.004000|p sv_vcatpvfn|5.004000|5.004000| sv_vcatpvfn_flags|5.017002|5.017002| SvVOK|5.008001|5.008001| sv_vsetpvf|5.006000|5.004000|p sv_vsetpvf_mg|5.006000|5.004000|p sv_vsetpvfn|5.004000|5.004000| SvVSTRING_mg|5.009004|5.003007|p SvWEAKREF|5.006000||Viu SvWEAKREF_off|5.006000||Viu SvWEAKREF_on|5.006000||Viu swallow_bom|5.006001||Viu switch_category_locale_to_template|5.027009||Viu SWITCHSTACK|5.003007||Viu switch_to_global_locale|5.027009|5.003007|pn sync_locale|5.027009|5.003007|pn sys_init3|||cnu sys_init|||cnu sys_intern_clear|5.006001||Vu sys_intern_dup|5.006000||Vu sys_intern_init|5.006001||Vu SYSTEM_GMTIME_MAX|5.011000||Viu SYSTEM_GMTIME_MIN|5.011000||Viu SYSTEM_LOCALTIME_MAX|5.011000||Viu SYSTEM_LOCALTIME_MIN|5.011000||Viu sys_term|||cnu TAIL|5.005000||Viu TAIL_t8_p8|5.033003||Viu TAIL_t8_pb|5.033003||Viu TAIL_tb_p8|5.033003||Viu TAIL_tb_pb|5.033003||Viu TAINT|5.004000||Viu taint_env|5.003007|5.003007|u TAINT_ENV|5.003007||Viu TAINT_get|5.017006||Viu TAINT_IF|5.003007||Viu TAINTING_get|5.017006||Viu TAINTING_set|5.017006||Viu TAINT_NOT|5.003007||Viu taint_proper|5.003007|5.003007|u TAINT_PROPER|5.003007||Viu TAINT_set|5.017006||Viu TAINT_WARN_get|5.017006||Viu TAINT_WARN_set|5.017006||Viu TARG|5.003007|5.003007| TARGi|5.023005||Viu TARGn|5.023005||Viu TARGu|5.023005||Viu telldir|5.005000||Viu T_FMT|5.027010||Viu T_FMT_AMPM|5.027010||Viu THIS|5.003007|5.003007|V THOUSEP|5.027010||Viu THR|5.005000||Viu THREAD_CREATE_NEEDS_STACK|5.007002||Viu thread_locale_init|5.027009|5.027009|xnu thread_locale_term|5.027009|5.027009|xnu THREAD_RET_TYPE|5.005000||Viu tied_method|5.013009||vViu TIED_METHOD_ARGUMENTS_ON_STACK|5.013009||Viu TIED_METHOD_MORTALIZE_NOT_NEEDED|5.013009||Viu TIED_METHOD_SAY|5.013009||Viu times|5.005000||Viu Time_t|5.003007|5.003007|Vn Timeval|5.004000|5.004000|Vn TM|5.011000||Viu tmpfile|5.003007||Viu tmpnam|5.005000||Viu TMPNAM_R_PROTO|5.008000|5.008000|Vn tmps_grow_p|5.021005||cViu to_byte_substr|5.008000||Viu toCTRL|5.004000||Viu toFOLD|5.019001|5.019001| toFOLD_A|5.019001||Viu _to_fold_latin1|5.015005||cVniu toFOLD_LC|5.019001||Viu toFOLD_uni|5.007003||Viu toFOLD_utf8|5.031005|5.031005| toFOLD_utf8_safe|5.025009|5.006000|p toFOLD_uvchr|5.023009|5.006000|p TO_INTERNAL_SIZE|5.023002||Viu tokenize_use|5.009003||Viu tokeq|5.005000||Viu tokereport|5.007001||Viu toLOWER|5.003007|5.003007| toLOWER_A|5.019001|5.019001| toLOWER_L1|5.019001|5.019001| toLOWER_LATIN1|5.013006|5.011002| to_lower_latin1|5.015005||Vniu toLOWER_LC|5.004000|5.004000| toLOWER_uni|5.006000||Viu toLOWER_utf8|5.031005|5.031005| toLOWER_utf8_safe|5.025009|5.006000|p toLOWER_uvchr|5.023009|5.006000|p too_few_arguments_pv|5.016000||Viu TOO_LATE_FOR|5.008001||Viu too_many_arguments_pv|5.016000||Viu TOPi|5.003007||Viu TOPl|5.003007||Viu TOPm1s|5.007001||Viu TOPMARK|5.003007||cViu TOPn|5.003007||Viu TOPp1s|5.007001||Viu TOPp|5.003007||Viu TOPpx|5.005003||Viu TOPs|5.003007||Viu TOPu|5.004000||Viu TOPul|5.006000||Viu toTITLE|5.019001|5.019001| toTITLE_A|5.019001||Viu toTITLE_uni|5.006000||Viu toTITLE_utf8|5.031005|5.031005| toTITLE_utf8_safe|5.025009|5.006000|p toTITLE_uvchr|5.023009|5.006000|p to_uni_fold|5.014000||cVu _to_uni_fold_flags|5.014000||cVu to_uni_lower|5.006000||cVu to_uni_title|5.006000||cVu to_uni_upper|5.006000||cVu toUPPER|5.003007|5.003007| toUPPER_A|5.019001||Viu toUPPER_LATIN1_MOD|5.011002||Viu toUPPER_LC|5.004000||Viu _to_upper_title_latin1|5.015005||Viu toUPPER_uni|5.006000||Viu toUPPER_utf8|5.031005|5.031005| toUPPER_utf8_safe|5.025009|5.006000|p toUPPER_uvchr|5.023009|5.006000|p _to_utf8_case|5.023006||Viu _to_utf8_fold_flags|5.014000||cVu _to_utf8_lower_flags|5.015006||cVu to_utf8_substr|5.008000||Viu _to_utf8_title_flags|5.015006||cVu _to_utf8_upper_flags|5.015006||cVu translate_substr_offsets|5.015006||Vniu traverse_op_tree|5.029008||Vi TR_DELETE|5.031006||Viu TRIE|5.009002||Viu TRIE_BITMAP|5.009004||Viu TRIE_BITMAP_BYTE|5.009004||Viu TRIE_BITMAP_CLEAR|5.009004||Viu TRIE_BITMAP_SET|5.009004||Viu TRIE_BITMAP_TEST|5.009004||Viu TRIEC|5.009004||Viu TRIE_CHARCOUNT|5.009004||Viu TRIEC_t8_p8|5.033003||Viu TRIEC_t8_pb|5.033003||Viu TRIEC_tb_p8|5.033003||Viu TRIEC_tb_pb|5.033003||Viu TRIE_next|5.009005||Viu TRIE_next_fail|5.009005||Viu TRIE_next_fail_t8_p8|5.033003||Viu TRIE_next_fail_t8_pb|5.033003||Viu TRIE_next_fail_tb_p8|5.033003||Viu TRIE_next_fail_tb_pb|5.033003||Viu TRIE_next_t8_p8|5.033003||Viu TRIE_next_t8_pb|5.033003||Viu TRIE_next_tb_p8|5.033003||Viu TRIE_next_tb_pb|5.033003||Viu TRIE_NODEIDX|5.009002||Viu TRIE_NODENUM|5.009002||Viu TRIE_t8_p8|5.033003||Viu TRIE_t8_pb|5.033003||Viu TRIE_tb_p8|5.033003||Viu TRIE_tb_pb|5.033003||Viu TRIE_WORDS_OFFSET|5.009005||Viu TR_OOB|5.031006||Viu TR_R_EMPTY|5.031006||Viu TR_SPECIAL_HANDLING|5.031006||Viu TRUE|5.003007||Viu truncate|5.006000||Viu TR_UNLISTED|5.031006||Viu TR_UNMAPPED|5.031006||Viu try_amagic_bin|||ciu tryAMAGICbin_MG|5.013002||Viu try_amagic_un|||ciu tryAMAGICunDEREF|5.006000||Viu tryAMAGICun_MG|5.013002||Viu tryAMAGICunTARGETlist|5.017002||Viu TS_W32_BROKEN_LOCALECONV|5.027010||Viu tTHX|5.009003||Viu ttyname|5.009000||Viu TTYNAME_R_PROTO|5.008000|5.008000|Vn turkic_fc|5.029008||Viu turkic_lc|5.029008||Viu turkic_uc|5.029008||Viu TWO_BYTE_UTF8_TO_NATIVE|5.019004||Viu TWO_BYTE_UTF8_TO_UNI|5.013008||Viu TYPE_CHARS|5.004000||Viu TYPE_DIGITS|5.004000||Viu U16|5.027001||Viu U16_MAX|5.003007||Viu U16_MIN|5.003007||Viu U16SIZE|5.006000|5.006000|Vn U16TYPE|5.006000|5.006000|Vn U_32|5.007002|5.007002| U32|5.027001||Viu U32_ALIGNMENT_REQUIRED|5.007001|5.007001|Vn U32_MAX|5.003007||Viu U32_MAX_P1|5.007002||Viu U32_MAX_P1_HALF|5.007002||Viu U32_MIN|5.003007||Viu U32SIZE|5.006000|5.006000|Vn U32TYPE|5.006000|5.006000|Vn U64|5.023002||Viu U64SIZE|5.006000|5.006000|Vn U64TYPE|5.006000|5.006000|Vn U8|5.027001||Viu U8_MAX|5.003007||Viu U8_MIN|5.003007||Viu U8SIZE|5.006000|5.006000|Vn U8TO16_LE|5.017010||Viu U8TO32_LE|5.017010||Viu U8TO64_LE|5.017006||Viu U8TYPE|5.006000|5.006000|Vn UCHARAT|5.003007||Viu U_I|5.003007||Viu Uid_t|5.003007|5.003007|Vn Uid_t_f|5.006000|5.006000|Vn Uid_t_sign|5.006000|5.006000|Vn Uid_t_size|5.006000|5.006000|Vn UINT16_C|5.003007|5.003007| UINT32_C|5.003007|5.003007| UINT32_MIN|5.006000||Viu UINT64_C|5.023002|5.023002| UINT64_MIN|5.006000||Viu UINTMAX_C|5.003007|5.003007| uiv_2buf|5.009003||Vniu U_L|5.003007||Viu umask|5.005000||Viu uname|5.005004||Viu UNDERBAR|5.009002|5.003007|p unexpected_non_continuation_text|5.025006||Viu ungetc|5.003007||Viu UNI_age_values_index|5.029009||Viu UNI_AHEX|5.029002||Viu UNI_ahex_values_index|5.029009||Viu UNI_ALNUM|5.029002||Viu UNI_ALPHA|5.029002||Viu UNI_ALPHABETIC|5.029002||Viu UNI_alpha_values_index|5.029009||Viu UNI_ASCIIHEXDIGIT|5.029002||Viu UNI_BASICLATIN|5.029002||Viu UNI_bc_values_index|5.029009||Viu UNI_bidic_values_index|5.029009||Viu UNI_bidim_values_index|5.029009||Viu UNI_BLANK|5.029002||Viu UNI_blk_values_index|5.029009||Viu UNI_bpt_values_index|5.029009||Viu UNI_cased_values_index|5.029009||Viu UNI_CC|5.029002||Viu UNI_ccc_values_index|5.029009||Viu UNI_ce_values_index|5.029009||Viu UNI_ci_values_index|5.029009||Viu UNI_CNTRL|5.029002||Viu UNICODE_ALLOW_ABOVE_IV_MAX|5.031006||Viu UNICODE_ALLOW_ANY|5.007003||Viu UNICODE_ALLOW_SUPER|5.007003||Viu UNICODE_ALLOW_SURROGATE|5.007003||Viu UNICODE_BYTE_ORDER_MARK|5.008000||Viu UNICODE_DISALLOW_ABOVE_31_BIT|5.023006|5.023006| UNICODE_DISALLOW_ILLEGAL_C9_INTERCHANGE|5.025005|5.025005| UNICODE_DISALLOW_ILLEGAL_INTERCHANGE|5.013009|5.013009| UNICODE_DISALLOW_NONCHAR|5.013009|5.013009| UNICODE_DISALLOW_PERL_EXTENDED|5.027002|5.027002| UNICODE_DISALLOW_SUPER|5.013009|5.013009| UNICODE_DISALLOW_SURROGATE|5.013009|5.013009| UNICODE_DOT_DOT_VERSION|5.023002||Viu UNICODE_DOT_VERSION|5.023002||Viu UNICODE_GOT_NONCHAR|5.027009||Viu UNICODE_GOT_PERL_EXTENDED|5.027009||Viu UNICODE_GOT_SUPER|5.027009||Viu UNICODE_GOT_SURROGATE|5.027009||Viu UNICODE_GREEK_CAPITAL_LETTER_SIGMA|5.007003||Viu UNICODE_GREEK_SMALL_LETTER_FINAL_SIGMA|5.007003||Viu UNICODE_GREEK_SMALL_LETTER_SIGMA|5.007003||Viu UNICODE_IS_32_CONTIGUOUS_NONCHARS|5.023006||Viu UNICODE_IS_BYTE_ORDER_MARK|5.007001||Viu UNICODE_IS_END_PLANE_NONCHAR_GIVEN_NOT_SUPER|5.023006||Viu UNICODE_IS_NONCHAR|5.013009||Viu UNICODE_IS_PERL_EXTENDED|5.027002||Viu UNICODE_IS_REPLACEMENT|5.007001||Viu UNICODE_IS_SUPER|5.013009||Viu UNICODE_IS_SURROGATE|5.007001||Viu UNICODE_MAJOR_VERSION|5.023002||Viu UNICODE_PAT_MOD|5.013006||Viu UNICODE_PAT_MODS|5.013006||Viu UNICODE_REPLACEMENT|5.007001|5.003007|p UNICODE_SURROGATE_FIRST|5.007001||Viu UNICODE_SURROGATE_LAST|5.007001||Viu UNICODE_WARN_ABOVE_31_BIT|5.023006|5.023006| UNICODE_WARN_ILLEGAL_C9_INTERCHANGE|5.025005|5.025005| UNICODE_WARN_ILLEGAL_INTERCHANGE|5.013009|5.013009| UNICODE_WARN_NONCHAR|5.013009|5.013009| UNICODE_WARN_PERL_EXTENDED|5.027002|5.027002| UNICODE_WARN_SUPER|5.013009|5.013009| UNICODE_WARN_SURROGATE|5.013009|5.013009| UNI_compex_values_index|5.029009||Viu UNI_CONTROL|5.029002||Viu UNI_cwcf_values_index|5.029009||Viu UNI_cwcm_values_index|5.029009||Viu UNI_cwkcf_values_index|5.029009||Viu UNI_cwl_values_index|5.029009||Viu UNI_cwt_values_index|5.029009||Viu UNI_cwu_values_index|5.029009||Viu UNI_dash_values_index|5.029009||Viu UNI_DECIMALNUMBER|5.029002||Viu UNI_dep_values_index|5.029009||Viu UNI_dia_values_index|5.029009||Viu UNI_DIGIT|5.029002||Viu UNI_DISPLAY_BACKSLASH|5.007003|5.007003| UNI_DISPLAY_BACKSPACE|5.031009|5.031009| UNI_DISPLAY_ISPRINT|5.007003|5.007003| UNI_DISPLAY_QQ|5.007003|5.007003| UNI_DISPLAY_REGEX|5.007003|5.007003| UNI_di_values_index|5.029009||Viu UNI_dt_values_index|5.029009||Viu UNI_ea_values_index|5.029009||Viu UNI_ebase_values_index|5.031010||Viu UNI_ecomp_values_index|5.031010||Viu UNI_emod_values_index|5.031010||Viu UNI_emoji_values_index|5.031010||Viu UNI_epres_values_index|5.031010||Viu UNI_extpict_values_index|5.031010||Viu UNI_ext_values_index|5.029009||Viu UNI_gcb_values_index|5.029009||Viu UNI_gc_values_index|5.029009||Viu UNI_GRAPH|5.029002||Viu UNI_grbase_values_index|5.029009||Viu UNI_grext_values_index|5.029009||Viu UNI_HEX|5.029002||Viu UNI_HEXDIGIT|5.029002||Viu UNI_hex_values_index|5.029009||Viu UNI_HORIZSPACE|5.029002||Viu UNI_hst_values_index|5.029009||Viu UNI_HYPHEN|5.029002||Viu UNI_hyphen_values_index|5.029009||Viu UNI_idc_values_index|5.029009||Viu UNI_identifierstatus_values_index|5.031010||Viu UNI_identifiertype_values_index|5.031010||Viu UNI_ideo_values_index|5.029009||Viu UNI_idsb_values_index|5.029009||Viu UNI_idst_values_index|5.029009||Viu UNI_ids_values_index|5.029009||Viu UNI_inpc_values_index|5.029009||Viu UNI_insc_values_index|5.029009||Viu UNI_in_values_index|5.029009||Viu UNI_IS_INVARIANT|5.007001||Viu UNI_jg_values_index|5.029009||Viu UNI_joinc_values_index|5.029009||Viu UNI_jt_values_index|5.029009||Viu UNI_L|5.029002||Viu UNI_L_AMP|5.029002||Viu UNI_LB__SG|5.029002||Viu UNI_lb_values_index|5.029009||Viu UNI_LC|5.029002||Viu UNI_LL|5.029002||Viu UNI_loe_values_index|5.029009||Viu UNI_LOWER|5.029002||Viu UNI_LOWERCASE|5.029002||Viu UNI_lower_values_index|5.029009||Viu UNI_LT|5.029002||Viu UNI_LU|5.029002||Viu UNI_math_values_index|5.029009||Viu UNI_nchar_values_index|5.029009||Viu UNI_ND|5.029002||Viu UNI_nfcqc_values_index|5.029009||Viu UNI_nfdqc_values_index|5.029009||Viu UNI_nfkcqc_values_index|5.029009||Viu UNI_nfkdqc_values_index|5.029009||Viu UNI_nt_values_index|5.029009||Viu UNI_nv_values_index|5.029009||Viu UNI_patsyn_values_index|5.029009||Viu UNI_patws_values_index|5.029009||Viu UNI_pcm_values_index|5.029009||Viu UNI_PERLSPACE|5.029002||Viu UNI_PERLWORD|5.029002||Viu UNI_PRINT|5.029002||Viu UNI_qmark_values_index|5.029009||Viu UNI_radical_values_index|5.029009||Viu UNI_ri_values_index|5.029009||Viu UNI_sb_values_index|5.029009||Viu UNI_sc_values_index|5.029009||Viu UNI_scx_values_index|5.029009||Viu UNI_sd_values_index|5.029009||Viu UNISKIP|5.007001||Viu UNI_SPACE|5.029002||Viu UNI_SPACEPERL|5.029002||Viu UNI_sterm_values_index|5.029009||Viu UNI_term_values_index|5.029009||Viu UNI_TITLECASE|5.029002||Viu UNI_TITLECASELETTER|5.029002||Viu UNI_TO_NATIVE|5.007001|5.003007|p UNI_uideo_values_index|5.029009||Viu UNI_UPPER|5.029002||Viu UNI_UPPERCASE|5.029002||Viu UNI_upper_values_index|5.029009||Viu UNI_vo_values_index|5.029009||Viu UNI_vs_values_index|5.029009||Viu UNI_wb_values_index|5.029009||Viu UNI_WHITESPACE|5.029002||Viu UNI_WORD|5.029002||Viu UNI_WSPACE|5.029002||Viu UNI_wspace_values_index|5.029009||Viu UNI_XDIGIT|5.029002||Viu UNI_xidc_values_index|5.029009||Viu UNI_xids_values_index|5.029009||Viu UNI_XPERLSPACE|5.029002||Viu UNKNOWN_ERRNO_MSG|5.019007||Viu UNLESSM|5.003007||Viu UNLESSM_t8_p8|5.033003||Viu UNLESSM_t8_pb|5.033003||Viu UNLESSM_tb_p8|5.033003||Viu UNLESSM_tb_pb|5.033003||Viu UNLIKELY|5.009004|5.003007|p UNLINK|5.003007||Viu unlink|5.005000||Viu unlnk|5.003007||cVu UNLOCK_DOLLARZERO_MUTEX|5.008001||Viu UNLOCK_LC_NUMERIC_STANDARD|5.021010||poVnu UNLOCK_NUMERIC_STANDARD|||piu UNOP_AUX_item_sv|5.021007||Viu unpack_rec|5.008001||Viu unpack_str|5.007003|5.007003|d unpackstring|5.008001|5.008001| unpackWARN1|5.007003||Viu unpackWARN2|5.007003||Viu unpackWARN3|5.007003||Viu unpackWARN4|5.007003||Viu unreferenced_to_tmp_stack|5.013002||Viu unshare_hek|5.004000||Viu unshare_hek_or_pvn|5.008000||Viu unsharepvn|5.003007|5.003007|u unwind_handler_stack|5.009003||Viu update_debugger_info|5.009005||Viu upg_version|5.009005|5.009005| UPG_VERSION|5.019008||Viu Uquad_t|5.006000|5.006000|Vn U_S|5.003007||Viu usage|5.005000||Viu USE_64_BIT_ALL|5.006000|5.006000|Vn USE_64_BIT_INT|5.006000|5.006000|Vn USE_64_BIT_RAWIO|5.006000||Viu USE_64_BIT_STDIO|5.006000||Viu USE_BSDPGRP|5.003007||Viu USE_C_BACKTRACE|5.035001|5.035001|Vn USE_DYNAMIC_LOADING|5.003007|5.003007|Vn USE_ENVIRON_ARRAY|5.007001||Viu USE_GRENT_BUFFER|5.008000||Viu USE_GRENT_FPTR|5.008000||Viu USE_GRENT_PTR|5.008000||Viu USE_HASH_SEED|5.008001||Viu USE_HOSTENT_BUFFER|5.008000||Viu USE_HOSTENT_ERRNO|5.008000||Viu USE_HOSTENT_PTR|5.008000||Viu USE_ITHREADS|5.010000|5.010000|Vn USE_LARGE_FILES|5.006000|5.006000|Vn USE_LEFT|5.004000||Viu USE_LOCALE|5.004000||Viu USE_LOCALE_ADDRESS|5.027009||Viu USE_LOCALE_COLLATE|5.004000||Viu USE_LOCALE_CTYPE|5.004000||Viu USE_LOCALE_IDENTIFICATION|5.027009||Viu USE_LOCALE_MEASUREMENT|5.027009||Viu USE_LOCALE_MESSAGES|5.019002||Viu USE_LOCALE_MONETARY|5.019002||Viu USE_LOCALE_NUMERIC|5.004000||Viu USE_LOCALE_PAPER|5.027009||Viu USE_LOCALE_SYNTAX|5.033001||Viu USE_LOCALE_TELEPHONE|5.027009||Viu USE_LOCALE_TIME|5.021002||Viu USE_LOCALE_TOD|5.033001||Viu USEMYBINMODE|5.006000||Viu USE_NETENT_BUFFER|5.008000||Viu USE_NETENT_ERRNO|5.008000||Viu USE_NETENT_PTR|5.008000||Viu USE_PERL_ATOF|5.008000||Viu USE_PERLIO|5.007001|5.007001|Vn USE_PERL_PERTURB_KEYS|5.018000||Viu USE_POSIX_2008_LOCALE|5.027003||Viu USE_PROTOENT_BUFFER|5.008000||Viu USE_PROTOENT_PTR|5.008000||Viu USE_PWENT_BUFFER|5.008000||Viu USE_PWENT_FPTR|5.008000||Viu USE_PWENT_PTR|5.008000||Viu USE_REENTRANT_API|5.007003||Viu USER_PROP_MUTEX_INIT|5.029008||Viu USER_PROP_MUTEX_LOCK|5.029008||Viu USER_PROP_MUTEX_TERM|5.029008||Viu USER_PROP_MUTEX_UNLOCK|5.029008||Viu USE_SEMCTL_SEMID_DS|5.004005|5.004005|Vn USE_SEMCTL_SEMUN|5.004005|5.004005|Vn USE_SERVENT_BUFFER|5.008000||Viu USE_SERVENT_PTR|5.008000||Viu USE_SPENT_BUFFER|5.031011||Viu USE_SPENT_PTR|5.008000||Viu USE_STAT_BLOCKS|5.005003|5.005003|Vn USE_STAT_RDEV|5.003007||Viu USE_STDIO|5.003007||Viu USE_STDIO_BASE|5.006000|5.006000|Vn USE_STDIO_PTR|5.006000|5.006000|Vn USE_SYSTEM_GMTIME|5.011000||Viu USE_SYSTEM_LOCALTIME|5.011000||Viu USE_THREADS|5.006000|5.006000|Vn USE_THREAD_SAFE_LOCALE|5.025004||Viu USE_TM64|5.011000||Viu USE_UTF8_IN_NAMES|5.007003||Viu utf16_textfilter|5.011001||Viu utf16_to_utf8|5.006000||cViu utf16_to_utf8_reversed|5.006000||cViu UTF8_ACCUMULATE|5.007001||Viu UTF8_ALLOW_ANY|5.007001||Viu UTF8_ALLOW_ANYUV|5.007001||Viu UTF8_ALLOW_CONTINUATION|5.007001||Viu UTF8_ALLOW_DEFAULT|5.009004||Viu UTF8_ALLOW_EMPTY|5.007001||Viu UTF8_ALLOW_FE_FF|5.027009||Viu UTF8_ALLOW_FFFF|5.007001||Viu UTF8_ALLOW_LONG|5.007001||Viu UTF8_ALLOW_LONG_AND_ITS_VALUE|5.025009||Viu UTF8_ALLOW_NON_CONTINUATION|5.007001||Viu UTF8_ALLOW_OVERFLOW|5.025009||Viu UTF8_ALLOW_SHORT|5.007001||Viu UTF8_ALLOW_SURROGATE|5.007001||Viu UTF8_CHECK_ONLY|5.007001|5.007001| UTF8_CHK_SKIP|5.031006|5.006000|p UTF8_DISALLOW_ABOVE_31_BIT|5.023006||Viu UTF8_DISALLOW_FE_FF|5.013009||Viu UTF8_DISALLOW_ILLEGAL_C9_INTERCHANGE|5.025005|5.025005| UTF8_DISALLOW_ILLEGAL_INTERCHANGE|5.013009|5.013009| UTF8_DISALLOW_NONCHAR|5.013009|5.013009| UTF8_DISALLOW_PERL_EXTENDED|5.027002|5.027002| UTF8_DISALLOW_SUPER|5.013009|5.013009| UTF8_DISALLOW_SURROGATE|5.013009|5.013009| utf8_distance|5.006000|5.006000| UTF8_EIGHT_BIT_HI|5.007001||Viu UTF8_EIGHT_BIT_LO|5.007001||Viu UTF8f|5.019001|5.003007|p UTF8fARG|5.019002|5.003007|p UTF8_GOT_ABOVE_31_BIT|5.025006||Viu UTF8_GOT_CONTINUATION|5.025006|5.025006| UTF8_GOT_EMPTY|5.025006|5.025006| UTF8_GOT_LONG|5.025006|5.025006| UTF8_GOT_NONCHAR|5.025006|5.025006| UTF8_GOT_NON_CONTINUATION|5.025006|5.025006| UTF8_GOT_OVERFLOW|5.025006|5.025006| UTF8_GOT_PERL_EXTENDED|5.027002|5.027002| UTF8_GOT_SHORT|5.025006|5.025006| UTF8_GOT_SUPER|5.025006|5.025006| UTF8_GOT_SURROGATE|5.025006|5.025006| utf8_hop|5.006000|5.006000|n utf8_hop_back|5.025007|5.025007|n utf8_hop_forward|5.025007|5.025007|n utf8_hop_safe|5.025007|5.025007|n UTF8_IS_ABOVE_LATIN1|5.017004||Viu UTF8_IS_ABOVE_LATIN1_START|5.023003||Viu UTF8_IS_CONTINUATION|5.007001||Viu UTF8_IS_CONTINUED|5.007001||Viu UTF8_IS_DOWNGRADEABLE_START|5.007001||Viu UTF8_IS_INVARIANT|5.007001|5.003007|p UTF8_IS_NEXT_CHAR_DOWNGRADEABLE|5.017006||Viu UTF8_IS_NONCHAR|5.023002|5.023002| UTF8_IS_NONCHAR_GIVEN_THAT_NON_SUPER_AND_GE_PROBLEMATIC|5.013009||Viu UTF8_IS_REPLACEMENT|5.017000||Viu UTF8_IS_START|5.007001||Viu UTF8_IS_START_base|5.031007||Viu UTF8_IS_SUPER|5.023002|5.023002| UTF8_IS_SURROGATE|5.023002|5.023002| utf8_length|5.007001|5.007001| UTF8_MAXBYTES|5.009002|5.006000|p UTF8_MAXBYTES_CASE|5.009002|5.003007|p UTF8_MAX_FOLD_CHAR_EXPAND|5.013009||Viu UTF8_MAXLEN|5.006000||Viu utf8_mg_len_cache_update|5.013003||Viu utf8_mg_pos_cache_update|5.009004||Viu utf8n_to_uvchr|5.007001|5.007001|n utf8n_to_uvchr_error|5.025006|5.025006|n utf8n_to_uvchr_msgs|5.027009|5.027009|n _utf8n_to_uvchr_msgs_helper|5.029001||cVnu utf8n_to_uvuni|5.007001||dcV UTF8_SAFE_SKIP|5.029009|5.006000|p UTF8SKIP|5.006000|5.006000| UTF8_SKIP|5.023002|5.006000|p utf8_to_bytes|5.006001|5.006001|x utf8_to_uvchr|5.007001|5.006001|pd utf8_to_uvchr_buf|5.015009|5.006001|p utf8_to_uvchr_buf_helper|5.031004||cVu utf8_to_uvuni|5.007001||dcV utf8_to_uvuni_buf|5.015009||dcV UTF8_TWO_BYTE_HI|5.011002||Viu UTF8_TWO_BYTE_HI_nocast|5.011002||Viu UTF8_TWO_BYTE_LO|5.011002||Viu UTF8_TWO_BYTE_LO_nocast|5.011002||Viu UTF8_WARN_ABOVE_31_BIT|5.023006||Viu UTF8_WARN_FE_FF|5.013009||Viu UTF8_WARN_ILLEGAL_C9_INTERCHANGE|5.025005|5.025005| UTF8_WARN_ILLEGAL_INTERCHANGE|5.013009|5.013009| UTF8_WARN_NONCHAR|5.013009|5.013009| UTF8_WARN_PERL_EXTENDED|5.027002|5.027002| UTF8_WARN_SUPER|5.013009|5.013009| UTF8_WARN_SURROGATE|5.013009|5.013009| UTF_ACCUMULATION_SHIFT|5.007001||Viu UTF_CONTINUATION_MARK|5.007001||Viu UTF_CONTINUATION_MASK|5.007001||Viu UTF_IS_CONTINUATION_MASK|5.023006||Viu UTF_MIN_ABOVE_LATIN1_BYTE|5.031006||Viu UTF_MIN_START_BYTE|5.031006||Viu UTF_START_MARK|5.007001||Viu UTF_START_MASK|5.007001||Viu UTF_TO_NATIVE|5.007001||Viu utilize|5.003007||Viu utime|5.005000||Viu U_V|5.006000|5.003007| UVCHR_IS_INVARIANT|5.019004|5.003007|p UVCHR_SKIP|5.022000|5.003007|p uvchr_to_utf8|5.007001|5.007001| uvchr_to_utf8_flags|5.007003|5.007003| uvchr_to_utf8_flags_msgs|5.027009|5.027009| UV_DIG|5.006000||Viu UVf|5.010000|5.010000|d UV_IS_QUAD|5.006000||Viu UV_MAX|5.003007|5.003007| UV_MAX_P1|5.007002||Viu UV_MAX_P1_HALF|5.007002||Viu UV_MIN|5.003007|5.003007| UVof|5.006000|5.003007|poVn uvoffuni_to_utf8_flags|5.027009||cV uvoffuni_to_utf8_flags_msgs|5.027009||cVu UVSIZE|5.006000|5.003007|poVn UVTYPE|5.006000|5.003007|poVn UVuf|5.006000|5.003007|poVn uvuni_to_utf8|5.019004||cVu uvuni_to_utf8_flags|5.007003||dcV UVxf|5.006000|5.003007|poVn UVXf|5.007001|5.007001|poVn VAL_EAGAIN|5.003007|5.003007|Vn validate_proto|5.019002||xcVi validate_suid|||iu valid_utf8_to_uvchr|5.015009||cVn valid_utf8_to_uvuni|5.015009||dcVu VAL_O_NONBLOCK|5.003007|5.003007|Vn variant_byte_number|5.031004||cVnu variant_under_utf8_count|5.027007||Vni varname|5.009003||Viu vcmp|5.009000|5.009000| VCMP|5.019008||Viu vcroak|5.006000|5.006000| vdeb|5.007003|5.007003|u VERB|5.009005||Viu VERB_t8_p8|5.033003||Viu VERB_t8_pb|5.033003||Viu VERB_tb_p8|5.033003||Viu VERB_tb_pb|5.033003||Viu vform|5.006000|5.006000| vfprintf|5.003007||Viu visit|5.005000||Viu vivify_defelem|5.004000||cViu vivify_ref|5.004000||Viu vload_module|5.006000|5.003007|p vmess|5.006000|5.004000|p vnewSVpvf|5.006000|5.004000|p vnormal|5.009002|5.009002| VNORMAL|5.019008||Viu vnumify|5.009000|5.009000| VNUMIFY|5.019008||Viu voidnonfinal|||iu VOL|5.003007||Viu vstringify|5.009000|5.009000| VSTRINGIFY|5.019008||Viu VTBL_amagic|5.005003||Viu VTBL_amagicelem|5.005003||Viu VTBL_arylen|5.005003||Viu VTBL_bm|5.005003||Viu VTBL_collxfrm|5.005003||Viu VTBL_dbline|5.005003||Viu VTBL_defelem|5.005003||Viu VTBL_env|5.005003||Viu VTBL_envelem|5.005003||Viu VTBL_fm|5.005003||Viu VTBL_glob|5.005003||Viu VTBL_isa|5.005003||Viu VTBL_isaelem|5.005003||Viu VTBL_mglob|5.005003||Viu VTBL_nkeys|5.005003||Viu VTBL_pack|5.005003||Viu VTBL_packelem|5.005003||Viu VTBL_pos|5.005003||Viu VTBL_regdata|5.006000||Viu VTBL_regdatum|5.006000||Viu VTBL_regexp|5.005003||Viu VTBL_sigelem|5.005003||Viu VTBL_substr|5.005003||Viu VTBL_sv|5.005003||Viu VTBL_taint|5.005003||Viu VTBL_uvar|5.005003||Viu VTBL_vec|5.005003||Viu vTHX|5.006000||Viu VT_NATIVE|5.021004||Viu vtohl|5.003007||Viu vtohs|5.003007||Viu VUTIL_REPLACE_CORE|5.019008||Viu vverify|5.009003|5.009003| VVERIFY|5.019008||Viu vwarn|5.006000|5.006000| vwarner|5.006000|5.004000|p wait4pid|5.003007||Viu wait|5.005000||Viu want_vtbl_bm|5.015000||Viu want_vtbl_fm|5.015000||Viu warn|5.006000|5.003007|v WARN_ALL|5.006000|5.003007|p WARN_ALLstring|5.006000||Viu WARN_AMBIGUOUS|5.006000|5.003007|p WARN_ASSERTIONS||5.003007|ponu WARN_BAREWORD|5.006000|5.003007|p WARN_CLOSED|5.006000|5.003007|p WARN_CLOSURE|5.006000|5.003007|p WARN_DEBUGGING|5.006000|5.003007|p WARN_DEPRECATED|5.006000|5.003007|p WARN_DIGIT|5.006000|5.003007|p warner|5.006000|5.004000|pv warner_nocontext|5.006000||vVn WARN_EXEC|5.006000|5.003007|p WARN_EXITING|5.006000|5.003007|p WARN_EXPERIMENTAL|5.017004|5.017004| WARN_EXPERIMENTAL__ALPHA_ASSERTIONS|5.027009|5.027009| WARN_EXPERIMENTAL__BITWISE|5.021009|5.021009| WARN_EXPERIMENTAL__CONST_ATTR|5.021008|5.021008| WARN_EXPERIMENTAL__DECLARED_REFS|5.025003|5.025003| WARN_EXPERIMENTAL__ISA|5.031007|5.031007| WARN_EXPERIMENTAL__LEXICAL_SUBS|5.017005|5.017005| WARN_EXPERIMENTAL__POSTDEREF|5.019005|5.019005| WARN_EXPERIMENTAL__PRIVATE_USE|5.029009|5.029009| WARN_EXPERIMENTAL__REFALIASING|5.021005|5.021005| WARN_EXPERIMENTAL__REGEX_SETS|5.017008|5.017008| WARN_EXPERIMENTAL__RE_STRICT|5.021008|5.021008| WARN_EXPERIMENTAL__SCRIPT_RUN|5.027008|5.027008| WARN_EXPERIMENTAL__SIGNATURES|5.019009|5.019009| WARN_EXPERIMENTAL__SMARTMATCH|5.017011|5.017011| WARN_EXPERIMENTAL__TRY|5.033007|5.033007| WARN_EXPERIMENTAL__UNIPROP_WILDCARDS|5.029009|5.029009| WARN_EXPERIMENTAL__VLB|5.029009|5.029009| WARN_EXPERIMENTAL__WIN32_PERLIO|5.021001|5.021001| WARN_GLOB|5.006000|5.003007|p WARN_ILLEGALPROTO|5.011004|5.011004| WARN_IMPRECISION|5.011000|5.011000| WARN_INPLACE|5.006000|5.003007|p WARN_INTERNAL|5.006000|5.003007|p WARN_IO|5.006000|5.003007|p WARN_LAYER|5.008000|5.003007|p WARN_LOCALE|5.021006|5.021006| WARN_MALLOC|5.006000|5.003007|p WARN_MISC|5.006000|5.003007|p WARN_MISSING|5.021002|5.021002| WARN_NEWLINE|5.006000|5.003007|p warn_nocontext|5.006000||pvVn WARN_NONCHAR|5.013010|5.013010| WARN_NONEstring|5.006000||Viu WARN_NON_UNICODE|5.013010|5.013010| WARN_NUMERIC|5.006000|5.003007|p WARN_ONCE|5.006000|5.003007|p warn_on_first_deprecated_use|5.025009||Viu WARN_OVERFLOW|5.006000|5.003007|p WARN_PACK|5.006000|5.003007|p WARN_PARENTHESIS|5.006000|5.003007|p WARN_PIPE|5.006000|5.003007|p WARN_PORTABLE|5.006000|5.003007|p WARN_PRECEDENCE|5.006000|5.003007|p WARN_PRINTF|5.006000|5.003007|p _warn_problematic_locale|5.021008||cVniu WARN_PROTOTYPE|5.006000|5.003007|p WARN_QW|5.006000|5.003007|p WARN_RECURSION|5.006000|5.003007|p WARN_REDEFINE|5.006000|5.003007|p WARN_REDUNDANT|5.021002|5.021002| WARN_REGEXP|5.006000|5.003007|p WARN_RESERVED|5.006000|5.003007|p WARN_SEMICOLON|5.006000|5.003007|p WARN_SEVERE|5.006000|5.003007|p WARN_SHADOW|5.027007|5.027007| WARNshift|5.011001||Viu WARN_SIGNAL|5.006000|5.003007|p WARNsize|5.006000||Viu WARN_SUBSTR|5.006000|5.003007|p WARN_SURROGATE|5.013010|5.013010| warn_sv|5.013001|5.003007|p WARN_SYNTAX|5.006000|5.003007|p WARN_SYSCALLS|5.019004|5.019004| WARN_TAINT|5.006000|5.003007|p WARN_THREADS|5.008000|5.003007|p WARN_UNINITIALIZED|5.006000|5.003007|p WARN_UNOPENED|5.006000|5.003007|p WARN_UNPACK|5.006000|5.003007|p WARN_UNTIE|5.006000|5.003007|p WARN_UTF8|5.006000|5.003007|p WARN_VOID|5.006000|5.003007|p was_lvalue_sub|||ciu watch|5.003007||Viu WB_BREAKABLE|5.023008||Viu WB_DQ_then_HL|5.023008||Viu WB_Ex_or_FO_or_ZWJ_then_foo|5.025003||Viu WB_HL_then_DQ|5.023008||Viu WB_hs_then_hs|5.023008||Viu WB_LE_or_HL_then_MB_or_ML_or_SQ|5.023008||Viu WB_MB_or_ML_or_SQ_then_LE_or_HL|5.023008||Viu WB_MB_or_MN_or_SQ_then_NU|5.023008||Viu WB_NOBREAK|5.023008||Viu WB_NU_then_MB_or_MN_or_SQ|5.023008||Viu WB_RI_then_RI|5.025003||Viu WCTOMB_LOCK|5.033005||Viu WCTOMB_UNLOCK|5.033005||Viu WEXITSTATUS|5.008001||Viu what_MULTI_CHAR_FOLD_latin1_safe|5.033005||Viu what_MULTI_CHAR_FOLD_utf8_safe|5.033005||Viu what_MULTI_CHAR_FOLD_utf8_safe_part0|5.033005||Viu what_MULTI_CHAR_FOLD_utf8_safe_part1|5.033005||Viu what_MULTI_CHAR_FOLD_utf8_safe_part2|5.033005||Viu what_MULTI_CHAR_FOLD_utf8_safe_part3|5.033005||Viu what_MULTI_CHAR_FOLD_utf8_safe_part4|5.033005||Viu what_MULTI_CHAR_FOLD_utf8_safe_part5|5.033005||Viu what_MULTI_CHAR_FOLD_utf8_safe_part6|5.033005||Viu what_MULTI_CHAR_FOLD_utf8_safe_part7|5.033005||Viu whichsig|5.003007|5.003007| whichsig_pv|5.015004|5.015004| whichsig_pvn|5.015004|5.015004| whichsig_sv|5.015004|5.015004| WHILEM|5.003007||Viu WHILEM_A_max|5.009005||Viu WHILEM_A_max_fail|5.009005||Viu WHILEM_A_max_fail_t8_p8|5.033003||Viu WHILEM_A_max_fail_t8_pb|5.033003||Viu WHILEM_A_max_fail_tb_p8|5.033003||Viu WHILEM_A_max_fail_tb_pb|5.033003||Viu WHILEM_A_max_t8_p8|5.033003||Viu WHILEM_A_max_t8_pb|5.033003||Viu WHILEM_A_max_tb_p8|5.033003||Viu WHILEM_A_max_tb_pb|5.033003||Viu WHILEM_A_min|5.009005||Viu WHILEM_A_min_fail|5.009005||Viu WHILEM_A_min_fail_t8_p8|5.033003||Viu WHILEM_A_min_fail_t8_pb|5.033003||Viu WHILEM_A_min_fail_tb_p8|5.033003||Viu WHILEM_A_min_fail_tb_pb|5.033003||Viu WHILEM_A_min_t8_p8|5.033003||Viu WHILEM_A_min_t8_pb|5.033003||Viu WHILEM_A_min_tb_p8|5.033003||Viu WHILEM_A_min_tb_pb|5.033003||Viu WHILEM_A_pre|5.009005||Viu WHILEM_A_pre_fail|5.009005||Viu WHILEM_A_pre_fail_t8_p8|5.033003||Viu WHILEM_A_pre_fail_t8_pb|5.033003||Viu WHILEM_A_pre_fail_tb_p8|5.033003||Viu WHILEM_A_pre_fail_tb_pb|5.033003||Viu WHILEM_A_pre_t8_p8|5.033003||Viu WHILEM_A_pre_t8_pb|5.033003||Viu WHILEM_A_pre_tb_p8|5.033003||Viu WHILEM_A_pre_tb_pb|5.033003||Viu WHILEM_B_max|5.009005||Viu WHILEM_B_max_fail|5.009005||Viu WHILEM_B_max_fail_t8_p8|5.033003||Viu WHILEM_B_max_fail_t8_pb|5.033003||Viu WHILEM_B_max_fail_tb_p8|5.033003||Viu WHILEM_B_max_fail_tb_pb|5.033003||Viu WHILEM_B_max_t8_p8|5.033003||Viu WHILEM_B_max_t8_pb|5.033003||Viu WHILEM_B_max_tb_p8|5.033003||Viu WHILEM_B_max_tb_pb|5.033003||Viu WHILEM_B_min|5.009005||Viu WHILEM_B_min_fail|5.009005||Viu WHILEM_B_min_fail_t8_p8|5.033003||Viu WHILEM_B_min_fail_t8_pb|5.033003||Viu WHILEM_B_min_fail_tb_p8|5.033003||Viu WHILEM_B_min_fail_tb_pb|5.033003||Viu WHILEM_B_min_t8_p8|5.033003||Viu WHILEM_B_min_t8_pb|5.033003||Viu WHILEM_B_min_tb_p8|5.033003||Viu WHILEM_B_min_tb_pb|5.033003||Viu WHILEM_t8_p8|5.033003||Viu WHILEM_t8_pb|5.033003||Viu WHILEM_tb_p8|5.033003||Viu WHILEM_tb_pb|5.033003||Viu WIDEST_UTYPE|5.015004|5.003007|poVnu WIFEXITED|5.008001||Viu WIFSIGNALED|5.008001||Viu WIFSTOPPED|5.008001||Viu win32_croak_not_implemented|5.017006||Vniu WIN32SCK_IS_STDSCK|5.007001||Viu win32_setlocale|5.027006||Viu withinCOUNT|5.031004||Viu withinCOUNT_KNOWN_VALID|5.033005||Viu WITH_LC_NUMERIC_SET_TO_NEEDED|5.031003|5.031003| WITH_LC_NUMERIC_SET_TO_NEEDED_IN|5.031003|5.031003| with_queued_errors|5.013001||Viu with_tp_UTF8ness|5.033003||Viu WNOHANG|5.008001||Viu wrap_keyword_plugin|5.027006|5.027006|x wrap_op_checker|5.015008|5.015008| write|5.005000||Viu write_to_stderr|5.008001||Viu WSTOPSIG|5.008001||Viu WTERMSIG|5.008001||Viu WUNTRACED|5.008001||Viu XCPT_CATCH|5.009002|5.003007|p XCPT_RETHROW|5.009002|5.003007|p XCPT_TRY_END|5.009002|5.003007|p XCPT_TRY_START|5.009002|5.003007|p XDIGIT_VALUE|5.019008||Viu XHvTOTALKEYS|5.007003||Viu xio_any|5.006001||Viu xio_dirp|5.006001||Viu xiv_iv|5.009003||Viu xlv_targoff|5.019004||Viu XopDISABLE|5.013007|5.013007|V XOPd_xop_class|5.013007||Viu XOPd_xop_desc|5.013007||Viu XOPd_xop_name|5.013007||Viu XOPd_xop_peep|5.013007||Viu XopENABLE|5.013007|5.013007|V XopENTRY|5.013007|5.013007|V XopENTRYCUSTOM|5.019006|5.013007|V XopENTRY_set|5.013007|5.013007|V XopFLAGS|5.013007|5.013007| XOPf_xop_class|5.013007||Viu XOPf_xop_desc|5.013007||Viu XOPf_xop_name|5.013007||Viu XOPf_xop_peep|5.013007||Viu XORSHIFT128_set|5.027001||Viu XORSHIFT96_set|5.027001||Viu XPUSHi|5.003007|5.003007| XPUSHmortal|5.009002|5.003007|p XPUSHn|5.006000|5.003007| XPUSHp|5.003007|5.003007| XPUSHs|5.003007|5.003007| XPUSHTARG|5.003007||Viu XPUSHu|5.004000|5.003007|p XPUSHundef|5.006000||Viu xpv_len|5.017006||Viu XS|5.003007|5.003007|Vu XSANY|5.003007||Viu XS_APIVERSION_BOOTCHECK|5.013004|5.013004| XS_APIVERSION_POPMARK_BOOTCHECK|5.021006||Viu XS_APIVERSION_SETXSUBFN_POPMARK_BOOTCHECK|5.021006||Viu xs_boot_epilog|5.021006||cViu XS_BOTHVERSION_BOOTCHECK|5.021006||Viu XS_BOTHVERSION_POPMARK_BOOTCHECK|5.021006||Viu XS_BOTHVERSION_SETXSUBFN_POPMARK_BOOTCHECK|5.021006||Viu XS_DYNAMIC_FILENAME|5.009004||Viu XS_EXTERNAL|5.015002|5.015002|Vu xs_handshake|||vcniu XSINTERFACE_CVT|5.005000||Viu XSINTERFACE_CVT_ANON|5.010000||Viu XSINTERFACE_FUNC|5.005000||Viu XSINTERFACE_FUNC_SET|5.005000||Viu XS_INTERNAL|5.015002|5.015002|Vu XSprePUSH|5.006000|5.003007|poVnu XSPROTO|5.010000|5.003007|pVu XSRETURN|5.003007|5.003007|p XSRETURN_EMPTY|5.003007|5.003007| XSRETURN_IV|5.003007|5.003007| XSRETURN_NO|5.003007|5.003007| XSRETURN_NV|5.006000|5.003007| XSRETURN_PV|5.003007|5.003007| XSRETURN_PVN|5.006000||Viu XSRETURN_UNDEF|5.003007|5.003007| XSRETURN_UV|5.008001|5.003007|p XSRETURN_YES|5.003007|5.003007| XS_SETXSUBFN_POPMARK|5.021006||Viu XST_mIV|5.003007|5.003007| XST_mNO|5.003007|5.003007| XST_mNV|5.006000|5.003007| XST_mPV|5.003007|5.003007| XST_mPVN|5.006000||Viu XST_mUNDEF|5.003007|5.003007| XST_mUV|5.008001|5.003007|p XST_mYES|5.003007|5.003007| XS_VERSION|5.003007|5.003007| XS_VERSION_BOOTCHECK|5.003007|5.003007| xs_version_bootcheck|||iu XTENDED_PAT_MOD|5.009005||Viu xuv_uv|5.009003||Viu YESEXPR|5.027010||Viu YESSTR|5.027010||Viu YIELD|5.005000||Viu YYDEBUG|5.025006||Viu YYEMPTY|5.009005||Viu yyerror|5.003007||Viu yyerror_pv|5.016000||Viu yyerror_pvn|5.016000||Viu yylex|5.003007||cViu yyparse|5.003007||Viu yyquit|5.025010||Viu YYSTYPE_IS_DECLARED|5.009001||Viu YYSTYPE_IS_TRIVIAL|5.009001||Viu YYTOKENTYPE|5.009001||Viu yyunlex|5.013005||Viu yywarn|5.003007||Viu ZAPHOD32_FINALIZE|5.027001||Viu ZAPHOD32_MIX|5.027001||Viu ZAPHOD32_SCRAMBLE32|5.027001||Viu ZAPHOD32_STATIC_INLINE|5.027001||Viu ZAPHOD32_WARN2|5.027001||Viu ZAPHOD32_WARN3|5.027001||Viu ZAPHOD32_WARN4|5.027001||Viu ZAPHOD32_WARN5|5.027001||Viu ZAPHOD32_WARN6|5.027001||Viu Zero|5.003007|5.003007| ZeroD|5.009002|5.003007|p ); if (exists $opt{'list-unsupported'}) { my $f; for $f (sort dictionary_order keys %API) { next if $API{$f}{core_only}; next if $API{$f}{beyond_depr}; next if $API{$f}{inaccessible}; next if $API{$f}{experimental}; next unless $API{$f}{todo}; next if int_parse_version($API{$f}{todo}) <= $int_min_perl; my $repeat = 40 - length($f); $repeat = 0 if $repeat < 0; print "$f ", '.'x $repeat, " ", format_version($API{$f}{todo}), "\n"; } exit 0; } # Scan for hints, possible replacement candidates, etc. my(%replace, %need, %hints, %warnings, %depends); my $replace = 0; my($hint, $define, $function); sub find_api { BEGIN { 'warnings'->unimport('uninitialized') if "$]" > '5.006' } my $code = shift; $code =~ s{ / (?: \*[^*]*\*+(?:[^$ccs][^*]*\*+)* / | /[^\r\n]*) | "[^"\\]*(?:\\.[^"\\]*)*" | '[^'\\]*(?:\\.[^'\\]*)*' }{}egsx; grep { exists $API{$_} } $code =~ /(\w+)/mg; } while () { if ($hint) { # Here, we are in the middle of accumulating a hint or warning. my $end_of_hint = 0; # A line containing a comment end marker closes the hint. Remove that # marker for processing below. if (s/\s*$rcce(.*?)\s*$//) { die "Nothing can follow the end of comment in '$_'\n" if length $1 > 0; $end_of_hint = 1; } # Set $h to the hash of which type. my $h = $hint->[0] eq 'Hint' ? \%hints : \%warnings; # Ignore any leading and trailing white space, and an optional star comment # continuation marker, then place the meat of the line into $1 m/^\s*(?:\*\s*)?(.*?)\s*$/; # Add the meat of this line to the hash value of each API element it # applies to for (@{$hint->[1]}) { $h->{$_} ||= ''; # avoid the warning older perls generate $h->{$_} .= "$1\n"; } # If the line had a comment close, we are through with this hint undef $hint if $end_of_hint; next; } # Set up $hint if this is the beginning of a Hint: or Warning: # These are from a multi-line C comment in the file, with the first line # looking like (a space has been inserted because this file can't have C # comment markers in it): # / * Warning: PL_expect, PL_copline, PL_rsfp # # $hint becomes # [ # 'Warning', # [ # 'PL_expect', # 'PL_copline', # 'PL_rsfp', # ], # ] if (m{^\s*$rccs\s+(Hint|Warning):\s+(\w+(?:,?\s+\w+)*)\s*$}) { $hint = [$1, [split /,?\s+/, $2]]; next; } if ($define) { # If in the middle of a definition... # append a continuation line ending with backslash. if ($define->[1] =~ /\\$/) { $define->[1] .= $_; } else { # Otherwise this line ends the definition, make foo depend on bar # (and what bar depends on) if its not one of ppp's own constructs if (exists $API{$define->[0]} && $define->[1] !~ /^DPPP_\(/) { my @n = find_api($define->[1]); push @{$depends{$define->[0]}}, @n if @n } undef $define; } } # For '#define foo bar' or '#define foo(a,b,c) bar', $define becomes a # reference to [ foo, bar ] $define = [$1, $2] if m{^\s*#\s*define\s+(\w+)(?:\([^)]*\))?\s+(.*)}; if ($function) { if (/^}/) { if (exists $API{$function->[0]}) { my @n = find_api($function->[1]); push @{$depends{$function->[0]}}, @n if @n } undef $function; } else { $function->[1] .= $_; } } $function = [$1, ''] if m{^DPPP_\(my_(\w+)\)}; # Set $replace to the number given for lines that look like # / * Replace: \d+ * / # Thus setting it to 1 starts a region where replacements are automatically # done, and setting it to 0 ends that region. $replace = $1 if m{^\s*$rccs\s+Replace:\s+(\d+)\s+$rcce\s*$}; # Add bar => foo to %replace for lines like '#define foo bar in a region # where $replace is non-zero $replace{$2} = $1 if $replace and m{^\s*#\s*define\s+(\w+)(?:\([^)]*\))?\s+(\w+)}; # Add bar => foo to %replace for lines like '#define foo bar / * Replace * / $replace{$2} = $1 if m{^\s*#\s*define\s+(\w+)(?:\([^)]*\))?\s+(\w+).*$rccs\s+Replace\s+$rcce}; # Add foo => bar to %replace for lines like / * Replace foo with bar * / $replace{$1} = $2 if m{^\s*$rccs\s+Replace (\w+) with (\w+.*?)\s+$rcce\s*$}; # For lines like / * foo, bar depends on baz, bat * / # create a list of the elements on the rhs, and make that list apply to each # element in the lhs, which becomes a key in \%depends. if (m{^\s*$rccs\s+(\w+(\s*,\s*\w+)*)\s+depends\s+on\s+(\w+(\s*,\s*\w+)*)\s+$rcce\s*$}) { my @deps = map { s/\s+//g; $_ } split /,/, $3; my $d; for $d (map { s/\s+//g; $_ } split /,/, $1) { push @{$depends{$d}}, @deps; } } $need{$1} = 1 if m{^#if\s+defined\(NEED_(\w+)(?:_GLOBAL)?\)}; } for (values %depends) { my %seen; $_ = [sort dictionary_order grep !$seen{$_}++, @$_]; } if (exists $opt{'api-info'}) { my $f; my $count = 0; my $match = $opt{'api-info'} =~ m!^/(.*)/$! ? $1 : "^\Q$opt{'api-info'}\E\$"; # Sort the names, and split into two classes; one for things that are part of # the API; a second for things that aren't. my @ok_to_use; my @shouldnt_use; for $f (sort dictionary_order keys %API) { next unless $f =~ /$match/; my $base = int_parse_version($API{$f}{base}) if $API{$f}{base}; if ($base && ! $API{$f}{inaccessible} && ! $API{$f}{core_only}) { push @ok_to_use, $f; } else { push @shouldnt_use, $f; } } # We normally suppress non-API items. But if the search matched no API # items, output the non-ones. This allows someone to get the info for an # item if they ask for it specifically enough, but doesn't normally clutter # the output with irrelevant results. @ok_to_use = @shouldnt_use unless @ok_to_use; for $f (@ok_to_use) { print "\n=== $f ===\n"; my $info = 0; my $base; $base = int_parse_version($API{$f}{base}) if $API{$f}{base}; my $todo; $todo = int_parse_version($API{$f}{todo}) if $API{$f}{todo}; # Output information if ($base) { my $with_or= ""; if ( $base <= $int_min_perl || ( (! $API{$f}{provided} && ! $todo) || ($todo && $todo >= $base))) { $with_or= " with or"; } my $Supported = ($API{$f}{undocumented}) ? 'Available' : 'Supported'; print "\n$Supported at least since perl-", format_version($base), ",$with_or without $ppport."; if ($API{$f}{unverified}) { print "\nThis information is based on inspection of the source code", " and has not been\n", "verified by successful compilation."; } print "\n"; $info++; } if ($API{$f}{provided} || $todo) { print "\nThis is only supported by $ppport, and NOT by perl versions going forward.\n" unless $base; if ($todo) { if (! $base || $todo < $base) { my $additionally = ""; $additionally .= " additionally" if $base; print "$ppport$additionally provides support at least back to perl-", format_version($todo), ".\n"; } } elsif (! $base || $base > $int_min_perl) { if (exists $depends{$f}) { my $max = 0; for (@{$depends{$f}}) { $max = int_parse_version($API{$_}{todo}) if $API{$_}{todo} && $API{$_}{todo} > $max; # XXX What to assume unspecified values are? This effectively makes them MIN_PERL } $todo = $max if $max; } print "\n$ppport provides support for this, but ironically, does not", " currently know,\n", "for this report, the minimum version it supports for this"; if ($API{$f}{undocumented}) { print " and many things\n", "it provides that are implemented as macros and aren't", " documented. You can\n", "help by submitting a documentation patch"; } print ".\n"; if ($todo) { if ($todo <= $int_min_perl) { print "It may very well be supported all the way back to ", format_version(5.003_07), ".\n"; } else { print "But given the things $f depends on, it's a good", " guess that it isn't\n", "supported prior to ", format_version($todo), ".\n"; } } } } if ($API{$f}{provided}) { print "Support needs to be explicitly requested by #define NEED_$f\n", "(or #define NEED_${f}_GLOBAL).\n" if exists $need{$f}; $info++; } if ($base || ! $API{$f}{ppport_fnc}) { my $email = "Send email to perl5-porters\@perl.org if you need to have this functionality.\n"; if ($API{$f}{inaccessible}) { print "\nThis is not part of the public API, and may not even be accessible to XS code.\n"; $info++; } elsif ($API{$f}{core_only}) { print "\nThis is not part of the public API, and should not be used by XS code.\n"; $info++; } elsif ($API{$f}{deprecated}) { print "\nThis is deprecated and should not be used. Convert existing uses.\n"; $info++; } elsif ($API{$f}{experimental}) { print "\nThe API for this is unstable and should not be used by XS code.\n", $email; $info++; } elsif ($API{$f}{undocumented}) { print "\nSince this is undocumented, the API should be considered unstable.\n"; if ($API{$f}{provided}) { print "Consider bringing this up on the list: perl5-porters\@perl.org.\n"; } else { print "It may be that this is not intended for XS use, or it may just be\n", "that no one has gotten around to documenting it.\n", $email; } $info++; } unless ($info) { print "No portability information available. Check your spelling; or", " this could be\na bug in Devel::PPPort. To report an issue:\n", "https://github.com/Dual-Life/Devel-PPPort/issues/new\n"; } } print "\nDepends on: ", join(', ', @{$depends{$f}}), ".\n" if exists $depends{$f}; if (exists $hints{$f} || exists $warnings{$f}) { print "\n$hints{$f}" if exists $hints{$f}; print "\nWARNING:\n$warnings{$f}" if exists $warnings{$f}; $info++; } $count++; } $count or print "\nFound no API matching '$opt{'api-info'}'."; print "\n"; exit 0; } if (exists $opt{'list-provided'}) { my $f; for $f (sort dictionary_order keys %API) { next unless $API{$f}{provided}; my @flags; push @flags, 'explicit' if exists $need{$f}; push @flags, 'depend' if exists $depends{$f}; push @flags, 'hint' if exists $hints{$f}; push @flags, 'warning' if exists $warnings{$f}; my $flags = @flags ? ' ['.join(', ', @flags).']' : ''; print "$f$flags\n"; } exit 0; } my @files; my @srcext = qw( .xs .c .h .cc .cpp -c.inc -xs.inc ); my $srcext = join '|', map { quotemeta $_ } @srcext; if (@ARGV) { my %seen; for (@ARGV) { if (-e) { if (-f) { push @files, $_ unless $seen{$_}++; } else { warn "'$_' is not a file.\n" } } else { my @new = grep { -f } glob $_ or warn "'$_' does not exist.\n"; push @files, grep { !$seen{$_}++ } @new; } } } else { eval { require File::Find; File::Find::find(sub { $File::Find::name =~ /($srcext)$/i and push @files, $File::Find::name; }, '.'); }; if ($@) { @files = map { glob "*$_" } @srcext; } } if (!@ARGV || $opt{filter}) { my(@in, @out); my %xsc = map { /(.*)\.xs$/ ? ("$1.c" => 1, "$1.cc" => 1) : () } @files; for (@files) { my $out = exists $xsc{$_} || /\b\Q$ppport\E$/i || !/($srcext)$/i; push @{ $out ? \@out : \@in }, $_; } if (@ARGV && @out) { warning("Skipping the following files (use --nofilter to avoid this):\n| ", join "\n| ", @out); } @files = @in; } die "No input files given!\n" unless @files; my(%files, %global, %revreplace); %revreplace = reverse %replace; my $filename; my $patch_opened = 0; for $filename (@files) { unless (open IN, "<$filename") { warn "Unable to read from $filename: $!\n"; next; } info("Scanning $filename ..."); my $c = do { local $/; }; close IN; my %file = (orig => $c, changes => 0); # Temporarily remove C/XS comments and strings from the code my @ccom; $c =~ s{ ( ^$HS*\#$HS*include\b[^\r\n]+\b(?:\Q$ppport\E|XSUB\.h)\b[^\r\n]* | ^$HS*\#$HS*(?:define|elif|if(?:def)?)\b[^\r\n]* ) | ( ^$HS*\#[^\r\n]* | "[^"\\]*(?:\\.[^"\\]*)*" | '[^'\\]*(?:\\.[^'\\]*)*' | / (?: \*[^*]*\*+(?:[^$ccs][^*]*\*+)* / | /[^\r\n]* ) ) }{ defined $2 and push @ccom, $2; defined $1 ? $1 : "$ccs$#ccom$cce" }mgsex; $file{ccom} = \@ccom; $file{code} = $c; $file{has_inc_ppport} = $c =~ /^$HS*#$HS*include[^\r\n]+\b\Q$ppport\E\b/m; my $func; for $func (keys %API) { my $match = $func; $match .= "|$revreplace{$func}" if exists $revreplace{$func}; if ($c =~ /\b(?:Perl_)?($match)\b/) { $file{uses_replace}{$1}++ if exists $revreplace{$func} && $1 eq $revreplace{$func}; $file{uses_Perl}{$func}++ if $c =~ /\bPerl_$func\b/; if (exists $API{$func}{provided}) { $file{uses_provided}{$func}++; if ( ! exists $API{$func}{base} || int_parse_version($API{$func}{base}) > $opt{'compat-version'}) { $file{uses}{$func}++; my @deps = rec_depend($func); if (@deps) { $file{uses_deps}{$func} = \@deps; for (@deps) { $file{uses}{$_} = 0 unless exists $file{uses}{$_}; } } for ($func, @deps) { $file{needs}{$_} = 'static' if exists $need{$_}; } } } if ( exists $API{$func}{todo} && int_parse_version($API{$func}{todo}) > $opt{'compat-version'}) { if ($c =~ /\b$func\b/) { $file{uses_todo}{$func}++; } } } } while ($c =~ /^$HS*#$HS*define$HS+(NEED_(\w+?)(_GLOBAL)?)\b/mg) { if (exists $need{$2}) { $file{defined $3 ? 'needed_global' : 'needed_static'}{$2}++; } else { warning("Possibly wrong #define $1 in $filename") } } for (qw(uses needs uses_todo needed_global needed_static)) { for $func (keys %{$file{$_}}) { push @{$global{$_}{$func}}, $filename; } } $files{$filename} = \%file; } # Globally resolve NEED_'s my $need; for $need (keys %{$global{needs}}) { if (@{$global{needs}{$need}} > 1) { my @targets = @{$global{needs}{$need}}; my @t = grep $files{$_}{needed_global}{$need}, @targets; @targets = @t if @t; @t = grep /\.xs$/i, @targets; @targets = @t if @t; my $target = shift @targets; $files{$target}{needs}{$need} = 'global'; for (@{$global{needs}{$need}}) { $files{$_}{needs}{$need} = 'extern' if $_ ne $target; } } } for $filename (@files) { exists $files{$filename} or next; info("=== Analyzing $filename ==="); my %file = %{$files{$filename}}; my $func; my $c = $file{code}; my $warnings = 0; for $func (sort dictionary_order keys %{$file{uses_Perl}}) { if ($API{$func}{varargs}) { unless ($API{$func}{noTHXarg}) { my $changes = ($c =~ s{\b(Perl_$func\s*\(\s*)(?!aTHX_?)(\)|[^\s)]*\))} { $1 . ($2 eq ')' ? 'aTHX' : 'aTHX_ ') . $2 }ge); if ($changes) { warning("Doesn't pass interpreter argument aTHX to Perl_$func"); $file{changes} += $changes; } } } else { warning("Uses Perl_$func instead of $func"); $file{changes} += ($c =~ s{\bPerl_$func(\s*)\((\s*aTHX_?)?\s*} {$func$1(}g); } } for $func (sort dictionary_order keys %{$file{uses_replace}}) { warning("Uses $func instead of $replace{$func}"); $file{changes} += ($c =~ s/\b$func\b/$replace{$func}/g); } for $func (sort dictionary_order keys %{$file{uses_provided}}) { if ($file{uses}{$func}) { if (exists $file{uses_deps}{$func}) { diag("Uses $func, which depends on ", join(', ', @{$file{uses_deps}{$func}})); } else { diag("Uses $func"); } } $warnings += (hint($func) || 0); } unless ($opt{quiet}) { for $func (sort dictionary_order keys %{$file{uses_todo}}) { next if int_parse_version($API{$func}{todo}) <= $int_min_perl; print "*** WARNING: Uses $func, which may not be portable below perl ", format_version($API{$func}{todo}), ", even with '$ppport'\n"; $warnings++; } } for $func (sort dictionary_order keys %{$file{needed_static}}) { my $message = ''; if (not exists $file{uses}{$func}) { $message = "No need to define NEED_$func if $func is never used"; } elsif (exists $file{needs}{$func} && $file{needs}{$func} ne 'static') { $message = "No need to define NEED_$func when already needed globally"; } if ($message) { diag($message); $file{changes} += ($c =~ s/^$HS*#$HS*define$HS+NEED_$func\b.*$LF//mg); } } for $func (sort dictionary_order keys %{$file{needed_global}}) { my $message = ''; if (not exists $global{uses}{$func}) { $message = "No need to define NEED_${func}_GLOBAL if $func is never used"; } elsif (exists $file{needs}{$func}) { if ($file{needs}{$func} eq 'extern') { $message = "No need to define NEED_${func}_GLOBAL when already needed globally"; } elsif ($file{needs}{$func} eq 'static') { $message = "No need to define NEED_${func}_GLOBAL when only used in this file"; } } if ($message) { diag($message); $file{changes} += ($c =~ s/^$HS*#$HS*define$HS+NEED_${func}_GLOBAL\b.*$LF//mg); } } $file{needs_inc_ppport} = keys %{$file{uses}}; if ($file{needs_inc_ppport}) { my $pp = ''; for $func (sort dictionary_order keys %{$file{needs}}) { my $type = $file{needs}{$func}; next if $type eq 'extern'; my $suffix = $type eq 'global' ? '_GLOBAL' : ''; unless (exists $file{"needed_$type"}{$func}) { if ($type eq 'global') { diag("Files [@{$global{needs}{$func}}] need $func, adding global request"); } else { diag("File needs $func, adding static request"); } $pp .= "#define NEED_$func$suffix\n"; } } if ($pp && ($c =~ s/^(?=$HS*#$HS*define$HS+NEED_\w+)/$pp/m)) { $pp = ''; $file{changes}++; } unless ($file{has_inc_ppport}) { diag("Needs to include '$ppport'"); $pp .= qq(#include "$ppport"\n) } if ($pp) { $file{changes} += ($c =~ s/^($HS*#$HS*define$HS+NEED_\w+.*?)^/$1$pp/ms) || ($c =~ s/^(?=$HS*#$HS*include.*\Q$ppport\E)/$pp/m) || ($c =~ s/^($HS*#$HS*include.*XSUB.*\s*?)^/$1$pp/m) || ($c =~ s/^/$pp/); } } else { if ($file{has_inc_ppport}) { diag("No need to include '$ppport'"); $file{changes} += ($c =~ s/^$HS*?#$HS*include.*\Q$ppport\E.*?$LF//m); } } # put back in our C comments my $ix; my $cppc = 0; my @ccom = @{$file{ccom}}; for $ix (0 .. $#ccom) { if (!$opt{cplusplus} && $ccom[$ix] =~ s!^//!!) { $cppc++; $file{changes} += $c =~ s/$rccs$ix$rcce/$ccs$ccom[$ix] $cce/; } else { $c =~ s/$rccs$ix$rcce/$ccom[$ix]/; } } if ($cppc) { my $s = $cppc != 1 ? 's' : ''; warning("Uses $cppc C++ style comment$s, which is not portable"); } my $s = $warnings != 1 ? 's' : ''; my $warn = $warnings ? " ($warnings warning$s)" : ''; info("Analysis completed$warn"); if ($file{changes}) { if (exists $opt{copy}) { my $newfile = "$filename$opt{copy}"; if (-e $newfile) { error("'$newfile' already exists, refusing to write copy of '$filename'"); } else { local *F; if (open F, ">$newfile") { info("Writing copy of '$filename' with changes to '$newfile'"); print F $c; close F; } else { error("Cannot open '$newfile' for writing: $!"); } } } elsif (exists $opt{patch} || $opt{changes}) { if (exists $opt{patch}) { unless ($patch_opened) { if (open PATCH, ">$opt{patch}") { $patch_opened = 1; } else { error("Cannot open '$opt{patch}' for writing: $!"); delete $opt{patch}; $opt{changes} = 1; goto fallback; } } mydiff(\*PATCH, $filename, $c); } else { fallback: info("Suggested changes:"); mydiff(\*STDOUT, $filename, $c); } } else { my $s = $file{changes} == 1 ? '' : 's'; info("$file{changes} potentially required change$s detected"); } } else { info("Looks good"); } } close PATCH if $patch_opened; exit 0; sub try_use { eval "use @_;"; return $@ eq '' } sub mydiff { local *F = shift; my($file, $str) = @_; my $diff; if (exists $opt{diff}) { $diff = run_diff($opt{diff}, $file, $str); } if (!defined $diff and try_use('Text::Diff')) { $diff = Text::Diff::diff($file, \$str, { STYLE => 'Unified' }); $diff = <
$tmp") { print F $str; close F; if (open F, "$prog $file $tmp |") { while () { s/\Q$tmp\E/$file.patched/; $diff .= $_; } close F; unlink $tmp; return $diff; } unlink $tmp; } else { error("Cannot open '$tmp' for writing: $!"); } return undef; } sub rec_depend { my($func, $seen) = @_; return () unless exists $depends{$func}; $seen = {%{$seen||{}}}; return () if $seen->{$func}++; my %s; grep !$s{$_}++, map { ($_, rec_depend($_, $seen)) } @{$depends{$func}}; } sub info { $opt{quiet} and return; print @_, "\n"; } sub diag { $opt{quiet} and return; $opt{diag} and print @_, "\n"; } sub warning { $opt{quiet} and return; print "*** ", @_, "\n"; } sub error { print "*** ERROR: ", @_, "\n"; } my %given_hints; my %given_warnings; sub hint { $opt{quiet} and return; my $func = shift; my $rv = 0; if (exists $warnings{$func} && !$given_warnings{$func}++) { my $warn = $warnings{$func}; $warn =~ s!^!*** !mg; print "*** WARNING: $func\n", $warn; $rv++; } if ($opt{hints} && exists $hints{$func} && !$given_hints{$func}++) { my $hint = $hints{$func}; $hint =~ s/^/ /mg; print " --- hint for $func ---\n", $hint; } $rv || 0; } sub usage { my($usage) = do { local(@ARGV,$/)=($0); <> } =~ /^=head\d$HS+SYNOPSIS\s*^(.*?)\s*^=/ms; my %M = ( 'I' => '*' ); $usage =~ s/^\s*perl\s+\S+/$^X $0/; $usage =~ s/([A-Z])<([^>]+)>/$M{$1}$2$M{$1}/g; print < }; my($copy) = $self =~ /^=head\d\s+COPYRIGHT\s*^(.*?)^=\w+/ms; $copy =~ s/^(?=\S+)/ /gms; $self =~ s/^$HS+Do NOT edit.*?(?=^-)/$copy/ms; $self =~ s/^SKIP.*(?=^__DATA__)/SKIP if (\@ARGV && \$ARGV[0] eq '--unstrip') { eval { require Devel::PPPort }; \$@ and die "Cannot require Devel::PPPort, please install.\\n"; if (eval \$Devel::PPPort::VERSION < $VERSION) { die "$0 was originally generated with Devel::PPPort $VERSION.\\n" . "Your Devel::PPPort is only version \$Devel::PPPort::VERSION.\\n" . "Please install a newer version, or --unstrip will not work.\\n"; } Devel::PPPort::WriteFile(\$0); exit 0; } print <$0" or die "cannot strip $0: $!\n"; print OUT "$pl$c\n"; exit 0; } __DATA__ */ #ifndef _P_P_PORTABILITY_H_ #define _P_P_PORTABILITY_H_ #ifndef DPPP_NAMESPACE # define DPPP_NAMESPACE DPPP_ #endif #define DPPP_CAT2(x,y) CAT2(x,y) #define DPPP_(name) DPPP_CAT2(DPPP_NAMESPACE, name) #define D_PPP_RELEASE_DATE 1625616000 /* 2021-07-07 */ #if ! defined(PERL_REVISION) && ! defined(PERL_VERSION_MAJOR) # if ! defined(__PATCHLEVEL_H_INCLUDED__) \ && ! ( defined(PATCHLEVEL) && defined(SUBVERSION)) # define PERL_PATCHLEVEL_H_IMPLICIT # include # endif # if ! defined(PERL_VERSION) \ && ! defined(PERL_VERSION_MAJOR) \ && ( ! defined(SUBVERSION) || ! defined(PATCHLEVEL) ) # include # endif #endif #ifdef PERL_VERSION_MAJOR # define D_PPP_MAJOR PERL_VERSION_MAJOR #elif defined(PERL_REVISION) # define D_PPP_MAJOR PERL_REVISION #else # define D_PPP_MAJOR 5 #endif #ifdef PERL_VERSION_MINOR # define D_PPP_MINOR PERL_VERSION_MINOR #elif defined(PERL_VERSION) # define D_PPP_MINOR PERL_VERSION #elif defined(PATCHLEVEL) # define D_PPP_MINOR PATCHLEVEL # define PERL_VERSION PATCHLEVEL /* back-compat */ #else # error Could not find a source for PERL_VERSION_MINOR #endif #ifdef PERL_VERSION_PATCH # define D_PPP_PATCH PERL_VERSION_PATCH #elif defined(PERL_SUBVERSION) # define D_PPP_PATCH PERL_SUBVERSION #elif defined(SUBVERSION) # define D_PPP_PATCH SUBVERSION # define PERL_SUBVERSION SUBVERSION /* back-compat */ #else # error Could not find a source for PERL_VERSION_PATCH #endif #if D_PPP_MAJOR < 5 || D_PPP_MAJOR == 6 # error Devel::PPPort works only on Perl 5, Perl 7, ... #elif D_PPP_MAJOR != 5 /* Perl 7 and above: the old forms are deprecated, set up so that they * assume Perl 5, and will make this look like 5.201.201. * * 201 is used so will be well above anything that would come from a 5 * series if we unexpectedly have to continue it, but still gives plenty of * room, up to 255, of numbers that will fit into a byte in case there is * something else unforeseen */ # undef PERL_REVISION # undef PERL_VERSION # undef PERL_SUBVERSION # define D_PPP_REVISION 5 # define D_PPP_VERSION 201 # define D_PPP_SUBVERSION 201 # if (defined(__clang__) /* _Pragma here doesn't work with gcc */ \ && ( (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) \ || defined(_STDC_C99) \ || defined(__c99))) # define D_PPP_STRINGIFY(x) #x # define D_PPP_deprecate(xyz) _Pragma(D_PPP_STRINGIFY(GCC warning(D_PPP_STRINGIFY(xyz) " is deprecated"))) # define PERL_REVISION (D_PPP_REVISION D_PPP_deprecate(PERL_REVISION)) # define PERL_VERSION (D_PPP_REVISION D_PPP_deprecate(PERL_VERSION)) # define PERL_SUBVERSION (D_PPP_SUBVERSION D_PPP_deprecate(PERL_SUBVERSION)) # else # define PERL_REVISION D_PPP_REVISION # define PERL_VERSION D_PPP_REVISION # define PERL_SUBVERSION D_PPP_SUBVERSION # endif #endif /* Warning: PERL_PATCHLEVEL PATCHLEVEL SUBVERSION PERL_REVISION PERL_VERSION * PERL_SUBVERSION PERL_BCDVERSION * * You should be using PERL_VERSION_xy(maj,min,ptch) instead of this, where xy * is one of EQ, NE, LE, GT, LT, GE */ /* Replace PERL_PATCHLEVEL with PERL_VERSION_xy(5,a,b) (where xy is EQ,LT,GT...) */ /* Replace PATCHLEVEL with PERL_VERSION_xy(5,a,b) (where xy is EQ,LT,GT...) */ /* Replace SUBVERSION with PERL_VERSION_xy(5,a,b) (where xy is EQ,LT,GT...) */ /* Replace PERL_REVISION with PERL_VERSION_xy(a,b,c) (where xy is EQ,LT,GT...) */ /* Replace PERL_VERSION with PERL_VERSION_xy(5,a,b) (where xy is EQ,LT,GT...) */ /* Replace PERL_SUBVERSION with PERL_VERSION_xy(5,a,b) (where xy is EQ,LT,GT...) */ /* Replace PERL_BCDVERSION with PERL_VERSION_xy(5,a,b) (where xy is EQ,LT,GT...) */ #define D_PPP_DEC2BCD(dec) ((((dec)/100)<<8)|((((dec)%100)/10)<<4)|((dec)%10)) #define D_PPP_JNP_TO_BCD(j,n,p) ((D_PPP_DEC2BCD(j)<<24)|(D_PPP_DEC2BCD(n)<<12)|D_PPP_DEC2BCD(p)) #define PERL_BCDVERSION D_PPP_JNP_TO_BCD(D_PPP_MAJOR, \ D_PPP_MINOR, \ D_PPP_PATCH) /* These differ from the versions outside D:P in using PERL_BCDVERSION instead * of PERL_DECIMAL_VERSION. The formats printing in this module assume BCD, so * always use it */ #undef PERL_VERSION_EQ #undef PERL_VERSION_NE #undef PERL_VERSION_LT #undef PERL_VERSION_GE #undef PERL_VERSION_LE #undef PERL_VERSION_GT /* N.B. These don't work if the patch number is 42 or 92, as those are what '*' * is in ASCII and EBCDIC respectively */ #ifndef PERL_VERSION_EQ # define PERL_VERSION_EQ(j,n,p) \ (((p) == '*') ? ( (j) == D_PPP_VERSION_MAJOR \ && (n) == D_PPP_VERSION_MINOR) \ : (PERL_BCDVERSION == D_PPP_JNP_TO_BCD(j,n,p))) #endif #ifndef PERL_VERSION_NE # define PERL_VERSION_NE(j,n,p) (! PERL_VERSION_EQ(j,n,p)) #endif #ifndef PERL_VERSION_LT # define PERL_VERSION_LT(j,n,p) /* p=='*' means _LT(j,n,0) */ \ (PERL_BCDVERSION < D_PPP_JNP_TO_BCD( (j), \ (n), \ (((p) == '*') ? 0 : (p)))) #endif #ifndef PERL_VERSION_GE # define PERL_VERSION_GE(j,n,p) (! PERL_VERSION_LT(j,n,p)) #endif #ifndef PERL_VERSION_LE # define PERL_VERSION_LE(j,n,p) /* p=='*' means _LT(j,n+1,0) */ \ (PERL_BCDVERSION < D_PPP_JNP_TO_BCD( (j), \ (((p) == '*') ? ((n)+1) : (n)), \ (((p) == '*') ? 0 : (p)))) #endif #ifndef PERL_VERSION_GT # define PERL_VERSION_GT(j,n,p) (! PERL_VERSION_LE(j,n,p)) #endif #ifndef dTHR # define dTHR dNOOP #endif #ifndef dTHX # define dTHX dNOOP #endif /* Hint: dTHX For pre-5.6.0 thread compatibility, instead use dTHXR, available only through ppport.h */ #ifndef dTHXa # define dTHXa(x) dNOOP #endif #ifndef pTHX # define pTHX void #endif #ifndef pTHX_ # define pTHX_ #endif #ifndef aTHX # define aTHX #endif /* Hint: aTHX For pre-5.6.0 thread compatibility, instead use aTHXR, available only through ppport.h */ #ifndef aTHX_ # define aTHX_ #endif /* Hint: aTHX_ For pre-5.6.0 thread compatibility, instead use aTHXR_, available only through ppport.h */ #if (PERL_BCDVERSION < 0x5006000) # ifdef USE_THREADS # define aTHXR thr # define aTHXR_ thr, # else # define aTHXR # define aTHXR_ # endif # define dTHXR dTHR #else # define aTHXR aTHX # define aTHXR_ aTHX_ # define dTHXR dTHX #endif #ifndef dTHXoa # define dTHXoa(x) dTHXa(x) #endif #ifdef I_LIMITS # include #endif #ifndef PERL_UCHAR_MIN # define PERL_UCHAR_MIN ((unsigned char)0) #endif #ifndef PERL_UCHAR_MAX # ifdef UCHAR_MAX # define PERL_UCHAR_MAX ((unsigned char)UCHAR_MAX) # else # ifdef MAXUCHAR # define PERL_UCHAR_MAX ((unsigned char)MAXUCHAR) # else # define PERL_UCHAR_MAX ((unsigned char)~(unsigned)0) # endif # endif #endif #ifndef PERL_USHORT_MIN # define PERL_USHORT_MIN ((unsigned short)0) #endif #ifndef PERL_USHORT_MAX # ifdef USHORT_MAX # define PERL_USHORT_MAX ((unsigned short)USHORT_MAX) # else # ifdef MAXUSHORT # define PERL_USHORT_MAX ((unsigned short)MAXUSHORT) # else # ifdef USHRT_MAX # define PERL_USHORT_MAX ((unsigned short)USHRT_MAX) # else # define PERL_USHORT_MAX ((unsigned short)~(unsigned)0) # endif # endif # endif #endif #ifndef PERL_SHORT_MAX # ifdef SHORT_MAX # define PERL_SHORT_MAX ((short)SHORT_MAX) # else # ifdef MAXSHORT /* Often used in */ # define PERL_SHORT_MAX ((short)MAXSHORT) # else # ifdef SHRT_MAX # define PERL_SHORT_MAX ((short)SHRT_MAX) # else # define PERL_SHORT_MAX ((short) (PERL_USHORT_MAX >> 1)) # endif # endif # endif #endif #ifndef PERL_SHORT_MIN # ifdef SHORT_MIN # define PERL_SHORT_MIN ((short)SHORT_MIN) # else # ifdef MINSHORT # define PERL_SHORT_MIN ((short)MINSHORT) # else # ifdef SHRT_MIN # define PERL_SHORT_MIN ((short)SHRT_MIN) # else # define PERL_SHORT_MIN (-PERL_SHORT_MAX - ((3 & -1) == 3)) # endif # endif # endif #endif #ifndef PERL_UINT_MAX # ifdef UINT_MAX # define PERL_UINT_MAX ((unsigned int)UINT_MAX) # else # ifdef MAXUINT # define PERL_UINT_MAX ((unsigned int)MAXUINT) # else # define PERL_UINT_MAX (~(unsigned int)0) # endif # endif #endif #ifndef PERL_UINT_MIN # define PERL_UINT_MIN ((unsigned int)0) #endif #ifndef PERL_INT_MAX # ifdef INT_MAX # define PERL_INT_MAX ((int)INT_MAX) # else # ifdef MAXINT /* Often used in */ # define PERL_INT_MAX ((int)MAXINT) # else # define PERL_INT_MAX ((int)(PERL_UINT_MAX >> 1)) # endif # endif #endif #ifndef PERL_INT_MIN # ifdef INT_MIN # define PERL_INT_MIN ((int)INT_MIN) # else # ifdef MININT # define PERL_INT_MIN ((int)MININT) # else # define PERL_INT_MIN (-PERL_INT_MAX - ((3 & -1) == 3)) # endif # endif #endif #ifndef PERL_ULONG_MAX # ifdef ULONG_MAX # define PERL_ULONG_MAX ((unsigned long)ULONG_MAX) # else # ifdef MAXULONG # define PERL_ULONG_MAX ((unsigned long)MAXULONG) # else # define PERL_ULONG_MAX (~(unsigned long)0) # endif # endif #endif #ifndef PERL_ULONG_MIN # define PERL_ULONG_MIN ((unsigned long)0L) #endif #ifndef PERL_LONG_MAX # ifdef LONG_MAX # define PERL_LONG_MAX ((long)LONG_MAX) # else # ifdef MAXLONG # define PERL_LONG_MAX ((long)MAXLONG) # else # define PERL_LONG_MAX ((long) (PERL_ULONG_MAX >> 1)) # endif # endif #endif #ifndef PERL_LONG_MIN # ifdef LONG_MIN # define PERL_LONG_MIN ((long)LONG_MIN) # else # ifdef MINLONG # define PERL_LONG_MIN ((long)MINLONG) # else # define PERL_LONG_MIN (-PERL_LONG_MAX - ((3 & -1) == 3)) # endif # endif #endif #if defined(HAS_QUAD) && (defined(convex) || defined(uts)) # ifndef PERL_UQUAD_MAX # ifdef ULONGLONG_MAX # define PERL_UQUAD_MAX ((unsigned long long)ULONGLONG_MAX) # else # ifdef MAXULONGLONG # define PERL_UQUAD_MAX ((unsigned long long)MAXULONGLONG) # else # define PERL_UQUAD_MAX (~(unsigned long long)0) # endif # endif # endif # ifndef PERL_UQUAD_MIN # define PERL_UQUAD_MIN ((unsigned long long)0L) # endif # ifndef PERL_QUAD_MAX # ifdef LONGLONG_MAX # define PERL_QUAD_MAX ((long long)LONGLONG_MAX) # else # ifdef MAXLONGLONG # define PERL_QUAD_MAX ((long long)MAXLONGLONG) # else # define PERL_QUAD_MAX ((long long) (PERL_UQUAD_MAX >> 1)) # endif # endif # endif # ifndef PERL_QUAD_MIN # ifdef LONGLONG_MIN # define PERL_QUAD_MIN ((long long)LONGLONG_MIN) # else # ifdef MINLONGLONG # define PERL_QUAD_MIN ((long long)MINLONGLONG) # else # define PERL_QUAD_MIN (-PERL_QUAD_MAX - ((3 & -1) == 3)) # endif # endif # endif #endif /* This is based on code from 5.003 perl.h */ #ifdef HAS_QUAD # ifdef cray #ifndef IVTYPE # define IVTYPE int #endif #ifndef IV_MIN # define IV_MIN PERL_INT_MIN #endif #ifndef IV_MAX # define IV_MAX PERL_INT_MAX #endif #ifndef UV_MIN # define UV_MIN PERL_UINT_MIN #endif #ifndef UV_MAX # define UV_MAX PERL_UINT_MAX #endif # ifdef INTSIZE #ifndef IVSIZE # define IVSIZE INTSIZE #endif # endif # else # if defined(convex) || defined(uts) #ifndef IVTYPE # define IVTYPE long long #endif #ifndef IV_MIN # define IV_MIN PERL_QUAD_MIN #endif #ifndef IV_MAX # define IV_MAX PERL_QUAD_MAX #endif #ifndef UV_MIN # define UV_MIN PERL_UQUAD_MIN #endif #ifndef UV_MAX # define UV_MAX PERL_UQUAD_MAX #endif # ifdef LONGLONGSIZE #ifndef IVSIZE # define IVSIZE LONGLONGSIZE #endif # endif # else #ifndef IVTYPE # define IVTYPE long #endif #ifndef IV_MIN # define IV_MIN PERL_LONG_MIN #endif #ifndef IV_MAX # define IV_MAX PERL_LONG_MAX #endif #ifndef UV_MIN # define UV_MIN PERL_ULONG_MIN #endif #ifndef UV_MAX # define UV_MAX PERL_ULONG_MAX #endif # ifdef LONGSIZE #ifndef IVSIZE # define IVSIZE LONGSIZE #endif # endif # endif # endif #ifndef IVSIZE # define IVSIZE 8 #endif #ifndef LONGSIZE # define LONGSIZE 8 #endif #ifndef PERL_QUAD_MIN # define PERL_QUAD_MIN IV_MIN #endif #ifndef PERL_QUAD_MAX # define PERL_QUAD_MAX IV_MAX #endif #ifndef PERL_UQUAD_MIN # define PERL_UQUAD_MIN UV_MIN #endif #ifndef PERL_UQUAD_MAX # define PERL_UQUAD_MAX UV_MAX #endif #else #ifndef IVTYPE # define IVTYPE long #endif #ifndef LONGSIZE # define LONGSIZE 4 #endif #ifndef IV_MIN # define IV_MIN PERL_LONG_MIN #endif #ifndef IV_MAX # define IV_MAX PERL_LONG_MAX #endif #ifndef UV_MIN # define UV_MIN PERL_ULONG_MIN #endif #ifndef UV_MAX # define UV_MAX PERL_ULONG_MAX #endif #endif #ifndef IVSIZE # ifdef LONGSIZE # define IVSIZE LONGSIZE # else # define IVSIZE 4 /* A bold guess, but the best we can make. */ # endif #endif #ifndef UVTYPE # define UVTYPE unsigned IVTYPE #endif #ifndef UVSIZE # define UVSIZE IVSIZE #endif #ifndef PERL_SIGNALS_UNSAFE_FLAG #define PERL_SIGNALS_UNSAFE_FLAG 0x0001 #if (PERL_BCDVERSION < 0x5008000) # define D_PPP_PERL_SIGNALS_INIT PERL_SIGNALS_UNSAFE_FLAG #else # define D_PPP_PERL_SIGNALS_INIT 0 #endif #if defined(NEED_PL_signals) static U32 DPPP_(my_PL_signals) = D_PPP_PERL_SIGNALS_INIT; #elif defined(NEED_PL_signals_GLOBAL) U32 DPPP_(my_PL_signals) = D_PPP_PERL_SIGNALS_INIT; #else extern U32 DPPP_(my_PL_signals); #endif #define PL_signals DPPP_(my_PL_signals) #endif /* Hint: PL_ppaddr * Calling an op via PL_ppaddr requires passing a context argument * for threaded builds. Since the context argument is different for * 5.005 perls, you can use aTHXR (supplied by ppport.h), which will * automatically be defined as the correct argument. */ #if (PERL_BCDVERSION <= 0x5005005) /* Replace: 1 */ # define PL_ppaddr ppaddr # define PL_no_modify no_modify /* Replace: 0 */ #endif #if (PERL_BCDVERSION <= 0x5004005) /* Replace: 1 */ # define PL_DBsignal DBsignal # define PL_DBsingle DBsingle # define PL_DBsub DBsub # define PL_DBtrace DBtrace # define PL_Sv Sv # define PL_Xpv Xpv # define PL_bufend bufend # define PL_bufptr bufptr # define PL_compiling compiling # define PL_copline copline # define PL_curcop curcop # define PL_curstash curstash # define PL_debstash debstash # define PL_defgv defgv # define PL_diehook diehook # define PL_dirty dirty # define PL_dowarn dowarn # define PL_errgv errgv # define PL_error_count error_count # define PL_expect expect # define PL_hexdigit hexdigit # define PL_hints hints # define PL_in_my in_my # define PL_laststatval laststatval # define PL_lex_state lex_state # define PL_lex_stuff lex_stuff # define PL_linestr linestr # define PL_na na # define PL_perl_destruct_level perl_destruct_level # define PL_perldb perldb # define PL_rsfp_filters rsfp_filters # define PL_rsfp rsfp # define PL_stack_base stack_base # define PL_stack_sp stack_sp # define PL_statcache statcache # define PL_stdingv stdingv # define PL_sv_arenaroot sv_arenaroot # define PL_sv_no sv_no # define PL_sv_undef sv_undef # define PL_sv_yes sv_yes # define PL_tainted tainted # define PL_tainting tainting # define PL_tokenbuf tokenbuf # define PL_mess_sv mess_sv /* Replace: 0 */ #endif /* Warning: PL_parser * For perl versions earlier than 5.9.5, this is an always * non-NULL dummy. Also, it cannot be dereferenced. Don't * use it if you can avoid it, and unless you absolutely know * what you're doing. * If you always check that PL_parser is non-NULL, you can * define DPPP_PL_parser_NO_DUMMY to avoid the creation of * a dummy parser structure. */ #if (PERL_BCDVERSION >= 0x5009005) # ifdef DPPP_PL_parser_NO_DUMMY # define D_PPP_my_PL_parser_var(var) ((PL_parser ? PL_parser : \ (croak("panic: PL_parser == NULL in %s:%d", \ __FILE__, __LINE__), (yy_parser *) NULL))->var) # else # ifdef DPPP_PL_parser_NO_DUMMY_WARNING # define D_PPP_parser_dummy_warning(var) # else # define D_PPP_parser_dummy_warning(var) \ warn("warning: dummy PL_" #var " used in %s:%d", __FILE__, __LINE__), # endif # define D_PPP_my_PL_parser_var(var) ((PL_parser ? PL_parser : \ (D_PPP_parser_dummy_warning(var) &DPPP_(dummy_PL_parser)))->var) #if defined(NEED_PL_parser) static yy_parser DPPP_(dummy_PL_parser); #elif defined(NEED_PL_parser_GLOBAL) yy_parser DPPP_(dummy_PL_parser); #else extern yy_parser DPPP_(dummy_PL_parser); #endif # endif /* PL_expect, PL_copline, PL_rsfp, PL_rsfp_filters, PL_linestr, PL_bufptr, PL_bufend, PL_lex_state, PL_lex_stuff, PL_tokenbuf depends on PL_parser */ /* Warning: PL_expect, PL_copline, PL_rsfp, PL_rsfp_filters, PL_linestr, PL_bufptr, PL_bufend, PL_lex_state, PL_lex_stuff, PL_tokenbuf * Do not use this variable unless you know exactly what you're * doing. It is internal to the perl parser and may change or even * be removed in the future. As of perl 5.9.5, you have to check * for (PL_parser != NULL) for this variable to have any effect. * An always non-NULL PL_parser dummy is provided for earlier * perl versions. * If PL_parser is NULL when you try to access this variable, a * dummy is being accessed instead and a warning is issued unless * you define DPPP_PL_parser_NO_DUMMY_WARNING. * If DPPP_PL_parser_NO_DUMMY is defined, the code trying to access * this variable will croak with a panic message. */ # define PL_expect D_PPP_my_PL_parser_var(expect) # define PL_copline D_PPP_my_PL_parser_var(copline) # define PL_rsfp D_PPP_my_PL_parser_var(rsfp) # define PL_rsfp_filters D_PPP_my_PL_parser_var(rsfp_filters) # define PL_linestr D_PPP_my_PL_parser_var(linestr) # define PL_bufptr D_PPP_my_PL_parser_var(bufptr) # define PL_bufend D_PPP_my_PL_parser_var(bufend) # define PL_lex_state D_PPP_my_PL_parser_var(lex_state) # define PL_lex_stuff D_PPP_my_PL_parser_var(lex_stuff) # define PL_tokenbuf D_PPP_my_PL_parser_var(tokenbuf) # define PL_in_my D_PPP_my_PL_parser_var(in_my) # define PL_in_my_stash D_PPP_my_PL_parser_var(in_my_stash) # define PL_error_count D_PPP_my_PL_parser_var(error_count) #else /* ensure that PL_parser != NULL and cannot be dereferenced */ # define PL_parser ((void *) 1) #endif #if (PERL_BCDVERSION <= 0x5003022) # undef start_subparse # if (PERL_BCDVERSION < 0x5003022) #ifndef start_subparse # define start_subparse(a, b) Perl_start_subparse() #endif # else #ifndef start_subparse # define start_subparse(a, b) Perl_start_subparse(b) #endif # endif #if (PERL_BCDVERSION < 0x5003007) foo #endif #endif /* newCONSTSUB from IO.xs is in the core starting with 5.004_63 */ #if (PERL_BCDVERSION < 0x5004063) && (PERL_BCDVERSION != 0x5004005) /* And before that, we need to make sure this gets compiled for the functions * that rely on it */ #define NEED_newCONSTSUB #if defined(NEED_newCONSTSUB) static CV * DPPP_(my_newCONSTSUB)(HV * stash, const char * name, SV * sv); static #else extern CV * DPPP_(my_newCONSTSUB)(HV * stash, const char * name, SV * sv); #endif #if defined(NEED_newCONSTSUB) || defined(NEED_newCONSTSUB_GLOBAL) #ifdef newCONSTSUB # undef newCONSTSUB #endif #define newCONSTSUB(a,b,c) DPPP_(my_newCONSTSUB)(aTHX_ a,b,c) #define Perl_newCONSTSUB DPPP_(my_newCONSTSUB) /* This is just a trick to avoid a dependency of newCONSTSUB on PL_parser */ /* (There's no PL_parser in perl < 5.005, so this is completely safe) */ #define D_PPP_PL_copline PL_copline CV * DPPP_(my_newCONSTSUB)(HV *stash, const char *name, SV *sv) { CV *cv; U32 oldhints = PL_hints; HV *old_cop_stash = PL_curcop->cop_stash; HV *old_curstash = PL_curstash; line_t oldline = PL_curcop->cop_line; PL_curcop->cop_line = D_PPP_PL_copline; PL_hints &= ~HINT_BLOCK_SCOPE; if (stash) PL_curstash = PL_curcop->cop_stash = stash; cv = newSUB( start_subparse(FALSE, 0), newSVOP(OP_CONST, 0, newSVpv((char *) name, 0)), newSVOP(OP_CONST, 0, &PL_sv_no), /* SvPV(&PL_sv_no) == "" -- GMB */ newSTATEOP(0, Nullch, newSVOP(OP_CONST, 0, sv)) ); PL_hints = oldhints; PL_curcop->cop_stash = old_cop_stash; PL_curstash = old_curstash; PL_curcop->cop_line = oldline; return cv; } #endif #endif #ifndef PERL_MAGIC_sv # define PERL_MAGIC_sv '\0' #endif #ifndef PERL_MAGIC_overload # define PERL_MAGIC_overload 'A' #endif #ifndef PERL_MAGIC_overload_elem # define PERL_MAGIC_overload_elem 'a' #endif #ifndef PERL_MAGIC_overload_table # define PERL_MAGIC_overload_table 'c' #endif #ifndef PERL_MAGIC_bm # define PERL_MAGIC_bm 'B' #endif #ifndef PERL_MAGIC_regdata # define PERL_MAGIC_regdata 'D' #endif #ifndef PERL_MAGIC_regdatum # define PERL_MAGIC_regdatum 'd' #endif #ifndef PERL_MAGIC_env # define PERL_MAGIC_env 'E' #endif #ifndef PERL_MAGIC_envelem # define PERL_MAGIC_envelem 'e' #endif #ifndef PERL_MAGIC_fm # define PERL_MAGIC_fm 'f' #endif #ifndef PERL_MAGIC_regex_global # define PERL_MAGIC_regex_global 'g' #endif #ifndef PERL_MAGIC_isa # define PERL_MAGIC_isa 'I' #endif #ifndef PERL_MAGIC_isaelem # define PERL_MAGIC_isaelem 'i' #endif #ifndef PERL_MAGIC_nkeys # define PERL_MAGIC_nkeys 'k' #endif #ifndef PERL_MAGIC_dbfile # define PERL_MAGIC_dbfile 'L' #endif #ifndef PERL_MAGIC_dbline # define PERL_MAGIC_dbline 'l' #endif #ifndef PERL_MAGIC_mutex # define PERL_MAGIC_mutex 'm' #endif #ifndef PERL_MAGIC_shared # define PERL_MAGIC_shared 'N' #endif #ifndef PERL_MAGIC_shared_scalar # define PERL_MAGIC_shared_scalar 'n' #endif #ifndef PERL_MAGIC_collxfrm # define PERL_MAGIC_collxfrm 'o' #endif #ifndef PERL_MAGIC_tied # define PERL_MAGIC_tied 'P' #endif #ifndef PERL_MAGIC_tiedelem # define PERL_MAGIC_tiedelem 'p' #endif #ifndef PERL_MAGIC_tiedscalar # define PERL_MAGIC_tiedscalar 'q' #endif #ifndef PERL_MAGIC_qr # define PERL_MAGIC_qr 'r' #endif #ifndef PERL_MAGIC_sig # define PERL_MAGIC_sig 'S' #endif #ifndef PERL_MAGIC_sigelem # define PERL_MAGIC_sigelem 's' #endif #ifndef PERL_MAGIC_taint # define PERL_MAGIC_taint 't' #endif #ifndef PERL_MAGIC_uvar # define PERL_MAGIC_uvar 'U' #endif #ifndef PERL_MAGIC_uvar_elem # define PERL_MAGIC_uvar_elem 'u' #endif #ifndef PERL_MAGIC_vstring # define PERL_MAGIC_vstring 'V' #endif #ifndef PERL_MAGIC_vec # define PERL_MAGIC_vec 'v' #endif #ifndef PERL_MAGIC_utf8 # define PERL_MAGIC_utf8 'w' #endif #ifndef PERL_MAGIC_substr # define PERL_MAGIC_substr 'x' #endif #ifndef PERL_MAGIC_defelem # define PERL_MAGIC_defelem 'y' #endif #ifndef PERL_MAGIC_glob # define PERL_MAGIC_glob '*' #endif #ifndef PERL_MAGIC_arylen # define PERL_MAGIC_arylen '#' #endif #ifndef PERL_MAGIC_pos # define PERL_MAGIC_pos '.' #endif #ifndef PERL_MAGIC_backref # define PERL_MAGIC_backref '<' #endif #ifndef PERL_MAGIC_ext # define PERL_MAGIC_ext '~' #endif #ifndef cBOOL # define cBOOL(cbool) ((cbool) ? (bool)1 : (bool)0) #endif #ifndef OpHAS_SIBLING # define OpHAS_SIBLING(o) (cBOOL((o)->op_sibling)) #endif #ifndef OpSIBLING # define OpSIBLING(o) (0 + (o)->op_sibling) #endif #ifndef OpMORESIB_set # define OpMORESIB_set(o, sib) ((o)->op_sibling = (sib)) #endif #ifndef OpLASTSIB_set # define OpLASTSIB_set(o, parent) ((o)->op_sibling = NULL) #endif #ifndef OpMAYBESIB_set # define OpMAYBESIB_set(o, sib, parent) ((o)->op_sibling = (sib)) #endif #ifndef HEf_SVKEY # define HEf_SVKEY -2 #endif #if defined(DEBUGGING) && !defined(__COVERITY__) #ifndef __ASSERT_ # define __ASSERT_(statement) assert(statement), #endif #else #ifndef __ASSERT_ # define __ASSERT_(statement) #endif #endif #ifndef __has_builtin # define __has_builtin(x) 0 #endif #if __has_builtin(__builtin_unreachable) # define D_PPP_HAS_BUILTIN_UNREACHABLE #elif (defined(__GNUC__) && ( __GNUC__ > 4 \ || __GNUC__ == 4 && __GNUC_MINOR__ >= 5)) # define D_PPP_HAS_BUILTIN_UNREACHABLE #endif #ifndef ASSUME # ifdef DEBUGGING # define ASSUME(x) assert(x) # elif defined(_MSC_VER) # define ASSUME(x) __assume(x) # elif defined(__ARMCC_VERSION) # define ASSUME(x) __promise(x) # elif defined(D_PPP_HAS_BUILTIN_UNREACHABLE) # define ASSUME(x) ((x) ? (void) 0 : __builtin_unreachable()) # else # define ASSUME(x) assert(x) # endif #endif #ifndef NOT_REACHED # ifdef D_PPP_HAS_BUILTIN_UNREACHABLE # define NOT_REACHED \ STMT_START { \ ASSUME(!"UNREACHABLE"); __builtin_unreachable(); \ } STMT_END # elif ! defined(__GNUC__) && (defined(__sun) || defined(__hpux)) # define NOT_REACHED # else # define NOT_REACHED ASSUME(!"UNREACHABLE") # endif #endif #ifndef WIDEST_UTYPE # ifdef QUADKIND # ifdef U64TYPE # define WIDEST_UTYPE U64TYPE # else # define WIDEST_UTYPE unsigned Quad_t # endif # else # define WIDEST_UTYPE U32 # endif #endif /* These could become provided if/when they become part of the public API */ #ifndef withinCOUNT # define withinCOUNT(c, l, n) \ (((WIDEST_UTYPE) (((c)) - ((l) | 0))) <= (((WIDEST_UTYPE) ((n) | 0)))) #endif #ifndef inRANGE # define inRANGE(c, l, u) \ ( (sizeof(c) == sizeof(U8)) ? withinCOUNT(((U8) (c)), (l), ((u) - (l))) \ : (sizeof(c) == sizeof(U32)) ? withinCOUNT(((U32) (c)), (l), ((u) - (l))) \ : (withinCOUNT(((WIDEST_UTYPE) (c)), (l), ((u) - (l))))) #endif /* The '| 0' part ensures a compiler error if c is not integer (like e.g., a * pointer) */ #undef FITS_IN_8_BITS /* handy.h version uses a core-only constant */ #ifndef FITS_IN_8_BITS # define FITS_IN_8_BITS(c) ( (sizeof(c) == 1) \ || !(((WIDEST_UTYPE)((c) | 0)) & ~0xFF)) #endif /* Create the macro for "is'macro'_utf8_safe(s, e)". For code points below * 256, it calls the equivalent _L1 macro by converting the UTF-8 to code * point. That is so that it can automatically get the bug fixes done in this * file. */ #define D_PPP_IS_GENERIC_UTF8_SAFE(s, e, macro) \ (((e) - (s)) <= 0 \ ? 0 \ : UTF8_IS_INVARIANT((s)[0]) \ ? is ## macro ## _L1((s)[0]) \ : (((e) - (s)) < UTF8SKIP(s)) \ ? 0 \ : UTF8_IS_DOWNGRADEABLE_START((s)[0]) \ /* The cast in the line below is only to silence warnings */ \ ? is ## macro ## _L1((WIDEST_UTYPE) LATIN1_TO_NATIVE( \ UTF8_ACCUMULATE(NATIVE_UTF8_TO_I8((s)[0]) \ & UTF_START_MASK(2), \ (s)[1]))) \ : is ## macro ## _utf8(s)) /* Create the macro for "is'macro'_LC_utf8_safe(s, e)". For code points below * 256, it calls the equivalent _L1 macro by converting the UTF-8 to code * point. That is so that it can automatically get the bug fixes done in this * file. */ #define D_PPP_IS_GENERIC_LC_UTF8_SAFE(s, e, macro) \ (((e) - (s)) <= 0 \ ? 0 \ : UTF8_IS_INVARIANT((s)[0]) \ ? is ## macro ## _LC((s)[0]) \ : (((e) - (s)) < UTF8SKIP(s)) \ ? 0 \ : UTF8_IS_DOWNGRADEABLE_START((s)[0]) \ /* The cast in the line below is only to silence warnings */ \ ? is ## macro ## _LC((WIDEST_UTYPE) LATIN1_TO_NATIVE( \ UTF8_ACCUMULATE(NATIVE_UTF8_TO_I8((s)[0]) \ & UTF_START_MASK(2), \ (s)[1]))) \ : is ## macro ## _utf8(s)) /* A few of the early functions are broken. For these and the non-LC case, * machine generated code is substituted. But that code doesn't work for * locales. This is just like the above macro, but at the end, we call the * macro we've generated for the above 255 case, which is correct since locale * isn't involved. This will generate extra code to handle the 0-255 inputs, * but hopefully it will be optimized out by the C compiler. But just in case * it isn't, this macro is only used on the few versions that are broken */ #define D_PPP_IS_GENERIC_LC_UTF8_SAFE_BROKEN(s, e, macro) \ (((e) - (s)) <= 0 \ ? 0 \ : UTF8_IS_INVARIANT((s)[0]) \ ? is ## macro ## _LC((s)[0]) \ : (((e) - (s)) < UTF8SKIP(s)) \ ? 0 \ : UTF8_IS_DOWNGRADEABLE_START((s)[0]) \ /* The cast in the line below is only to silence warnings */ \ ? is ## macro ## _LC((WIDEST_UTYPE) LATIN1_TO_NATIVE( \ UTF8_ACCUMULATE(NATIVE_UTF8_TO_I8((s)[0]) \ & UTF_START_MASK(2), \ (s)[1]))) \ : is ## macro ## _utf8_safe(s, e)) #ifndef SvRX # define SvRX(rv) (SvROK((rv)) ? (SvMAGICAL(SvRV((rv))) ? (mg_find(SvRV((rv)), PERL_MAGIC_qr) ? mg_find(SvRV((rv)), PERL_MAGIC_qr)->mg_obj : NULL) : NULL) : NULL) #endif #ifndef SvRXOK # define SvRXOK(sv) (!!SvRX(sv)) #endif #ifndef PERL_UNUSED_DECL # ifdef HASATTRIBUTE # if (defined(__GNUC__) && defined(__cplusplus)) || defined(__INTEL_COMPILER) # define PERL_UNUSED_DECL # else # define PERL_UNUSED_DECL __attribute__((unused)) # endif # else # define PERL_UNUSED_DECL # endif #endif #ifndef PERL_UNUSED_ARG # if defined(lint) && defined(S_SPLINT_S) /* www.splint.org */ # include # define PERL_UNUSED_ARG(x) NOTE(ARGUNUSED(x)) # else # define PERL_UNUSED_ARG(x) ((void)x) # endif #endif #ifndef PERL_UNUSED_VAR # define PERL_UNUSED_VAR(x) ((void)x) #endif #ifndef PERL_UNUSED_CONTEXT # ifdef USE_ITHREADS # define PERL_UNUSED_CONTEXT PERL_UNUSED_ARG(my_perl) # else # define PERL_UNUSED_CONTEXT # endif #endif #ifndef PERL_UNUSED_RESULT # if defined(__GNUC__) && defined(HASATTRIBUTE_WARN_UNUSED_RESULT) # define PERL_UNUSED_RESULT(v) STMT_START { __typeof__(v) z = (v); (void)sizeof(z); } STMT_END # else # define PERL_UNUSED_RESULT(v) ((void)(v)) # endif #endif #ifndef NOOP # define NOOP /*EMPTY*/(void)0 #endif #ifndef dNOOP # define dNOOP extern int /*@unused@*/ Perl___notused PERL_UNUSED_DECL #endif #ifndef NVTYPE # if defined(USE_LONG_DOUBLE) && defined(HAS_LONG_DOUBLE) # define NVTYPE long double # else # define NVTYPE double # endif typedef NVTYPE NV; #endif #ifndef INT2PTR # if (IVSIZE == PTRSIZE) && (UVSIZE == PTRSIZE) # define PTRV UV # define INT2PTR(any,d) (any)(d) # else # if PTRSIZE == LONGSIZE # define PTRV unsigned long # else # define PTRV unsigned # endif # define INT2PTR(any,d) (any)(PTRV)(d) # endif #endif #ifndef PTR2ul # if PTRSIZE == LONGSIZE # define PTR2ul(p) (unsigned long)(p) # else # define PTR2ul(p) INT2PTR(unsigned long,p) # endif #endif #ifndef PTR2nat # define PTR2nat(p) (PTRV)(p) #endif #ifndef NUM2PTR # define NUM2PTR(any,d) (any)PTR2nat(d) #endif #ifndef PTR2IV # define PTR2IV(p) INT2PTR(IV,p) #endif #ifndef PTR2UV # define PTR2UV(p) INT2PTR(UV,p) #endif #ifndef PTR2NV # define PTR2NV(p) NUM2PTR(NV,p) #endif #undef START_EXTERN_C #undef END_EXTERN_C #undef EXTERN_C #ifdef __cplusplus # define START_EXTERN_C extern "C" { # define END_EXTERN_C } # define EXTERN_C extern "C" #else # define START_EXTERN_C # define END_EXTERN_C # define EXTERN_C extern #endif #if (PERL_BCDVERSION < 0x5004000) || defined(PERL_GCC_PEDANTIC) # ifndef PERL_GCC_BRACE_GROUPS_FORBIDDEN #ifndef PERL_GCC_BRACE_GROUPS_FORBIDDEN # define PERL_GCC_BRACE_GROUPS_FORBIDDEN #endif # endif #endif #if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN) && !defined(__cplusplus) # ifndef PERL_USE_GCC_BRACE_GROUPS # define PERL_USE_GCC_BRACE_GROUPS # endif #endif #undef STMT_START #undef STMT_END #if defined(VOIDFLAGS) && defined(PERL_USE_GCC_BRACE_GROUPS) # define STMT_START (void)( /* gcc supports ``({ STATEMENTS; })'' */ # define STMT_END ) #else # if defined(VOIDFLAGS) && (VOIDFLAGS) && (defined(sun) || defined(__sun__)) && !defined(__GNUC__) # define STMT_START if (1) # define STMT_END else (void)0 # else # define STMT_START do # define STMT_END while (0) # endif #endif #ifndef boolSV # define boolSV(b) ((b) ? &PL_sv_yes : &PL_sv_no) #endif /* DEFSV appears first in 5.004_56 */ #ifndef DEFSV # define DEFSV GvSV(PL_defgv) #endif #ifndef SAVE_DEFSV # define SAVE_DEFSV SAVESPTR(GvSV(PL_defgv)) #endif #ifndef DEFSV_set # define DEFSV_set(sv) (DEFSV = (sv)) #endif /* Older perls (<=5.003) lack AvFILLp */ #ifndef AvFILLp # define AvFILLp AvFILL #endif #ifndef av_tindex # define av_tindex AvFILL #endif #ifndef av_top_index # define av_top_index AvFILL #endif #ifndef av_count # define av_count(av) (AvFILL(av)+1) #endif #ifndef ERRSV # define ERRSV get_sv("@",FALSE) #endif /* Hint: gv_stashpvn * This function's backport doesn't support the length parameter, but * rather ignores it. Portability can only be ensured if the length * parameter is used for speed reasons, but the length can always be * correctly computed from the string argument. */ #ifndef gv_stashpvn # define gv_stashpvn(str,len,create) gv_stashpv(str,create) #endif /* Replace: 1 */ #ifndef get_cv # define get_cv perl_get_cv #endif #ifndef get_sv # define get_sv perl_get_sv #endif #ifndef get_av # define get_av perl_get_av #endif #ifndef get_hv # define get_hv perl_get_hv #endif /* Replace: 0 */ #ifndef dUNDERBAR # define dUNDERBAR dNOOP #endif #ifndef UNDERBAR # define UNDERBAR DEFSV #endif #ifndef dAX # define dAX I32 ax = MARK - PL_stack_base + 1 #endif #ifndef dITEMS # define dITEMS I32 items = SP - MARK #endif #ifndef dXSTARG # define dXSTARG SV * targ = sv_newmortal() #endif #ifndef dAXMARK # define dAXMARK I32 ax = POPMARK; \ SV ** const mark = PL_stack_base + ax++ #endif #ifndef XSprePUSH # define XSprePUSH (sp = PL_stack_base + ax - 1) #endif #if (PERL_BCDVERSION < 0x5005000) # undef XSRETURN # define XSRETURN(off) \ STMT_START { \ PL_stack_sp = PL_stack_base + ax + ((off) - 1); \ return; \ } STMT_END #endif #ifndef XSPROTO # define XSPROTO(name) void name(pTHX_ CV* cv) #endif #ifndef SVfARG # define SVfARG(p) ((void*)(p)) #endif #ifndef PERL_ABS # define PERL_ABS(x) ((x) < 0 ? -(x) : (x)) #endif #ifndef dVAR # define dVAR dNOOP #endif #ifndef SVf # define SVf "_" #endif #ifndef CPERLscope # define CPERLscope(x) x #endif #ifndef PERL_HASH # define PERL_HASH(hash,str,len) \ STMT_START { \ const char *s_PeRlHaSh = str; \ I32 i_PeRlHaSh = len; \ U32 hash_PeRlHaSh = 0; \ while (i_PeRlHaSh--) \ hash_PeRlHaSh = hash_PeRlHaSh * 33 + *s_PeRlHaSh++; \ (hash) = hash_PeRlHaSh; \ } STMT_END #endif #ifndef PERLIO_FUNCS_DECL # ifdef PERLIO_FUNCS_CONST # define PERLIO_FUNCS_DECL(funcs) const PerlIO_funcs funcs # define PERLIO_FUNCS_CAST(funcs) (PerlIO_funcs*)(funcs) # else # define PERLIO_FUNCS_DECL(funcs) PerlIO_funcs funcs # define PERLIO_FUNCS_CAST(funcs) (funcs) # endif #endif /* provide these typedefs for older perls */ #if (PERL_BCDVERSION < 0x5009003) # ifdef ARGSproto typedef OP* (CPERLscope(*Perl_ppaddr_t))(ARGSproto); # else typedef OP* (CPERLscope(*Perl_ppaddr_t))(pTHX); # endif typedef OP* (CPERLscope(*Perl_check_t)) (pTHX_ OP*); #endif /* On versions without NATIVE_TO_ASCII, only ASCII is supported */ #if defined(EBCDIC) && defined(NATIVE_TO_ASCI) #ifndef NATIVE_TO_LATIN1 # define NATIVE_TO_LATIN1(c) NATIVE_TO_ASCII(c) #endif #ifndef LATIN1_TO_NATIVE # define LATIN1_TO_NATIVE(c) ASCII_TO_NATIVE(c) #endif #ifndef NATIVE_TO_UNI # define NATIVE_TO_UNI(c) ((c) > 255 ? (c) : NATIVE_TO_LATIN1(c)) #endif #ifndef UNI_TO_NATIVE # define UNI_TO_NATIVE(c) ((c) > 255 ? (c) : LATIN1_TO_NATIVE(c)) #endif #else #ifndef NATIVE_TO_LATIN1 # define NATIVE_TO_LATIN1(c) (c) #endif #ifndef LATIN1_TO_NATIVE # define LATIN1_TO_NATIVE(c) (c) #endif #ifndef NATIVE_TO_UNI # define NATIVE_TO_UNI(c) (c) #endif #ifndef UNI_TO_NATIVE # define UNI_TO_NATIVE(c) (c) #endif #endif /* Warning: LATIN1_TO_NATIVE, NATIVE_TO_LATIN1 NATIVE_TO_UNI UNI_TO_NATIVE EBCDIC is not supported on versions earlier than 5.7.1 */ /* The meaning of this changed; use the modern version */ #undef isPSXSPC #undef isPSXSPC_A #undef isPSXSPC_L1 /* Hint: isPSXSPC, isPSXSPC_A, isPSXSPC_L1, isPSXSPC_utf8_safe This is equivalent to the corresponding isSPACE-type macro. On perls before 5.18, this matched a vertical tab and SPACE didn't. But the ppport.h SPACE version does match VT in all perl releases. Since VT's are extremely rarely found in real-life files, this difference effectively doesn't matter */ /* Hint: isSPACE, isSPACE_A, isSPACE_L1, isSPACE_utf8_safe Until Perl 5.18, this did not match the vertical tab (VT). The ppport.h version does match it in all perl releases. Since VT's are extremely rarely found in real-life files, this difference effectively doesn't matter */ #ifdef EBCDIC /* This is the first version where these macros are fully correct on EBCDIC * platforms. Relying on the C library functions, as earlier releases did, * causes problems with locales */ # if (PERL_BCDVERSION < 0x5022000) # undef isALNUM # undef isALNUM_A # undef isALNUM_L1 # undef isALNUMC # undef isALNUMC_A # undef isALNUMC_L1 # undef isALPHA # undef isALPHA_A # undef isALPHA_L1 # undef isALPHANUMERIC # undef isALPHANUMERIC_A # undef isALPHANUMERIC_L1 # undef isASCII # undef isASCII_A # undef isASCII_L1 # undef isBLANK # undef isBLANK_A # undef isBLANK_L1 # undef isCNTRL # undef isCNTRL_A # undef isCNTRL_L1 # undef isDIGIT # undef isDIGIT_A # undef isDIGIT_L1 # undef isGRAPH # undef isGRAPH_A # undef isGRAPH_L1 # undef isIDCONT # undef isIDCONT_A # undef isIDCONT_L1 # undef isIDFIRST # undef isIDFIRST_A # undef isIDFIRST_L1 # undef isLOWER # undef isLOWER_A # undef isLOWER_L1 # undef isOCTAL # undef isOCTAL_A # undef isOCTAL_L1 # undef isPRINT # undef isPRINT_A # undef isPRINT_L1 # undef isPUNCT # undef isPUNCT_A # undef isPUNCT_L1 # undef isSPACE # undef isSPACE_A # undef isSPACE_L1 # undef isUPPER # undef isUPPER_A # undef isUPPER_L1 # undef isWORDCHAR # undef isWORDCHAR_A # undef isWORDCHAR_L1 # undef isXDIGIT # undef isXDIGIT_A # undef isXDIGIT_L1 # endif #ifndef isASCII # define isASCII(c) (isCNTRL(c) || isPRINT(c)) #endif /* The below is accurate for all EBCDIC code pages supported by * all the versions of Perl overridden by this */ #ifndef isCNTRL # define isCNTRL(c) ( (c) == '\0' || (c) == '\a' || (c) == '\b' \ || (c) == '\f' || (c) == '\n' || (c) == '\r' \ || (c) == '\t' || (c) == '\v' \ || ((c) <= 3 && (c) >= 1) /* SOH, STX, ETX */ \ || (c) == 7 /* U+7F DEL */ \ || ((c) <= 0x13 && (c) >= 0x0E) /* SO, SI */ \ /* DLE, DC[1-3] */ \ || (c) == 0x18 /* U+18 CAN */ \ || (c) == 0x19 /* U+19 EOM */ \ || ((c) <= 0x1F && (c) >= 0x1C) /* [FGRU]S */ \ || (c) == 0x26 /* U+17 ETB */ \ || (c) == 0x27 /* U+1B ESC */ \ || (c) == 0x2D /* U+05 ENQ */ \ || (c) == 0x2E /* U+06 ACK */ \ || (c) == 0x32 /* U+16 SYN */ \ || (c) == 0x37 /* U+04 EOT */ \ || (c) == 0x3C /* U+14 DC4 */ \ || (c) == 0x3D /* U+15 NAK */ \ || (c) == 0x3F /* U+1A SUB */ \ ) #endif #if '^' == 106 /* EBCDIC POSIX-BC */ # define D_PPP_OUTLIER_CONTROL 0x5F #else /* EBCDIC 1047 037 */ # define D_PPP_OUTLIER_CONTROL 0xFF #endif /* The controls are everything below blank, plus one outlier */ #ifndef isCNTRL_L1 # define isCNTRL_L1(c) ((WIDEST_UTYPE) (c) < ' ' \ || (WIDEST_UTYPE) (c) == D_PPP_OUTLIER_CONTROL) #endif /* The ordering of the tests in this and isUPPER are to exclude most characters * early */ #ifndef isLOWER # define isLOWER(c) ( (c) >= 'a' && (c) <= 'z' \ && ( (c) <= 'i' \ || ((c) >= 'j' && (c) <= 'r') \ || (c) >= 's')) #endif #ifndef isUPPER # define isUPPER(c) ( (c) >= 'A' && (c) <= 'Z' \ && ( (c) <= 'I' \ || ((c) >= 'J' && (c) <= 'R') \ || (c) >= 'S')) #endif #else /* Above is EBCDIC; below is ASCII */ # if (PERL_BCDVERSION < 0x5004000) /* The implementation of these in older perl versions can give wrong results if * the C program locale is set to other than the C locale */ # undef isALNUM # undef isALNUM_A # undef isALPHA # undef isALPHA_A # undef isDIGIT # undef isDIGIT_A # undef isIDFIRST # undef isIDFIRST_A # undef isLOWER # undef isLOWER_A # undef isUPPER # undef isUPPER_A # endif # if (PERL_BCDVERSION == 0x5007000) /* this perl made space GRAPH */ # undef isGRAPH # endif # if (PERL_BCDVERSION < 0x5008000) /* earlier perls omitted DEL */ # undef isCNTRL # endif # if (PERL_BCDVERSION < 0x5010000) /* earlier perls included all of the isSPACE() characters, which is wrong. The * version provided by Devel::PPPort always overrides an existing buggy * version. */ # undef isPRINT # undef isPRINT_A # endif # if (PERL_BCDVERSION < 0x5014000) /* earlier perls always returned true if the parameter was a signed char */ # undef isASCII # undef isASCII_A # endif # if (PERL_BCDVERSION < 0x5017008) /* earlier perls didn't include PILCROW, SECTION SIGN */ # undef isPUNCT_L1 # endif # if (PERL_BCDVERSION < 0x5013007) /* khw didn't investigate why this failed */ # undef isALNUMC_L1 #endif # if (PERL_BCDVERSION < 0x5020000) /* earlier perls didn't include \v */ # undef isSPACE # undef isSPACE_A # undef isSPACE_L1 # endif #ifndef isASCII # define isASCII(c) ((WIDEST_UTYPE) (c) <= 127) #endif #ifndef isCNTRL # define isCNTRL(c) ((WIDEST_UTYPE) (c) < ' ' || (c) == 127) #endif #ifndef isCNTRL_L1 # define isCNTRL_L1(c) ( (WIDEST_UTYPE) (c) < ' ' \ || inRANGE((c), 0x7F, 0x9F)) #endif #ifndef isLOWER # define isLOWER(c) inRANGE((c), 'a', 'z') #endif #ifndef isUPPER # define isUPPER(c) inRANGE((c), 'A', 'Z') #endif #endif /* Below are definitions common to EBCDIC and ASCII */ #ifndef isASCII_L1 # define isASCII_L1(c) isASCII(c) #endif #ifndef isASCII_LC # define isASCII_LC(c) isASCII(c) #endif #ifndef isALNUM # define isALNUM(c) isWORDCHAR(c) #endif #ifndef isALNUMC # define isALNUMC(c) isALPHANUMERIC(c) #endif #ifndef isALNUMC_L1 # define isALNUMC_L1(c) isALPHANUMERIC_L1(c) #endif #ifndef isALPHA # define isALPHA(c) (isUPPER(c) || isLOWER(c)) #endif #ifndef isALPHA_L1 # define isALPHA_L1(c) (isUPPER_L1(c) || isLOWER_L1(c)) #endif #ifndef isALPHANUMERIC # define isALPHANUMERIC(c) (isALPHA(c) || isDIGIT(c)) #endif #ifndef isALPHANUMERIC_L1 # define isALPHANUMERIC_L1(c) (isALPHA_L1(c) || isDIGIT(c)) #endif #ifndef isALPHANUMERIC_LC # define isALPHANUMERIC_LC(c) (isALPHA_LC(c) || isDIGIT_LC(c)) #endif #ifndef isBLANK # define isBLANK(c) ((c) == ' ' || (c) == '\t') #endif #ifndef isBLANK_L1 # define isBLANK_L1(c) ( isBLANK(c) \ || ( FITS_IN_8_BITS(c) \ && NATIVE_TO_LATIN1((U8) c) == 0xA0)) #endif #ifndef isBLANK_LC # define isBLANK_LC(c) isBLANK(c) #endif #ifndef isDIGIT # define isDIGIT(c) inRANGE(c, '0', '9') #endif #ifndef isDIGIT_L1 # define isDIGIT_L1(c) isDIGIT(c) #endif #ifndef isGRAPH # define isGRAPH(c) (isWORDCHAR(c) || isPUNCT(c)) #endif #ifndef isGRAPH_L1 # define isGRAPH_L1(c) ( isPRINT_L1(c) \ && (c) != ' ' \ && NATIVE_TO_LATIN1((U8) c) != 0xA0) #endif #ifndef isIDCONT # define isIDCONT(c) isWORDCHAR(c) #endif #ifndef isIDCONT_L1 # define isIDCONT_L1(c) isWORDCHAR_L1(c) #endif #ifndef isIDCONT_LC # define isIDCONT_LC(c) isWORDCHAR_LC(c) #endif #ifndef isIDFIRST # define isIDFIRST(c) (isALPHA(c) || (c) == '_') #endif #ifndef isIDFIRST_L1 # define isIDFIRST_L1(c) (isALPHA_L1(c) || (U8) (c) == '_') #endif #ifndef isIDFIRST_LC # define isIDFIRST_LC(c) (isALPHA_LC(c) || (U8) (c) == '_') #endif #ifndef isLOWER_L1 # define isLOWER_L1(c) ( isLOWER(c) \ || ( FITS_IN_8_BITS(c) \ && ( ( NATIVE_TO_LATIN1((U8) c) >= 0xDF \ && NATIVE_TO_LATIN1((U8) c) != 0xF7) \ || NATIVE_TO_LATIN1((U8) c) == 0xAA \ || NATIVE_TO_LATIN1((U8) c) == 0xBA \ || NATIVE_TO_LATIN1((U8) c) == 0xB5))) #endif #ifndef isOCTAL # define isOCTAL(c) (((WIDEST_UTYPE)((c)) & ~7) == '0') #endif #ifndef isOCTAL_L1 # define isOCTAL_L1(c) isOCTAL(c) #endif #ifndef isPRINT # define isPRINT(c) (isGRAPH(c) || (c) == ' ') #endif #ifndef isPRINT_L1 # define isPRINT_L1(c) (FITS_IN_8_BITS(c) && ! isCNTRL_L1(c)) #endif #ifndef isPSXSPC # define isPSXSPC(c) isSPACE(c) #endif #ifndef isPSXSPC_L1 # define isPSXSPC_L1(c) isSPACE_L1(c) #endif #ifndef isPUNCT # define isPUNCT(c) ( (c) == '-' || (c) == '!' || (c) == '"' \ || (c) == '#' || (c) == '$' || (c) == '%' \ || (c) == '&' || (c) == '\'' || (c) == '(' \ || (c) == ')' || (c) == '*' || (c) == '+' \ || (c) == ',' || (c) == '.' || (c) == '/' \ || (c) == ':' || (c) == ';' || (c) == '<' \ || (c) == '=' || (c) == '>' || (c) == '?' \ || (c) == '@' || (c) == '[' || (c) == '\\' \ || (c) == ']' || (c) == '^' || (c) == '_' \ || (c) == '`' || (c) == '{' || (c) == '|' \ || (c) == '}' || (c) == '~') #endif #ifndef isPUNCT_L1 # define isPUNCT_L1(c) ( isPUNCT(c) \ || ( FITS_IN_8_BITS(c) \ && ( NATIVE_TO_LATIN1((U8) c) == 0xA1 \ || NATIVE_TO_LATIN1((U8) c) == 0xA7 \ || NATIVE_TO_LATIN1((U8) c) == 0xAB \ || NATIVE_TO_LATIN1((U8) c) == 0xB6 \ || NATIVE_TO_LATIN1((U8) c) == 0xB7 \ || NATIVE_TO_LATIN1((U8) c) == 0xBB \ || NATIVE_TO_LATIN1((U8) c) == 0xBF))) #endif #ifndef isSPACE # define isSPACE(c) ( isBLANK(c) || (c) == '\n' || (c) == '\r' \ || (c) == '\v' || (c) == '\f') #endif #ifndef isSPACE_L1 # define isSPACE_L1(c) ( isSPACE(c) \ || (FITS_IN_8_BITS(c) \ && ( NATIVE_TO_LATIN1((U8) c) == 0x85 \ || NATIVE_TO_LATIN1((U8) c) == 0xA0))) #endif #ifndef isUPPER_L1 # define isUPPER_L1(c) ( isUPPER(c) \ || (FITS_IN_8_BITS(c) \ && ( NATIVE_TO_LATIN1((U8) c) >= 0xC0 \ && NATIVE_TO_LATIN1((U8) c) <= 0xDE \ && NATIVE_TO_LATIN1((U8) c) != 0xD7))) #endif #ifndef isWORDCHAR # define isWORDCHAR(c) (isALPHANUMERIC(c) || (c) == '_') #endif #ifndef isWORDCHAR_L1 # define isWORDCHAR_L1(c) (isIDFIRST_L1(c) || isDIGIT(c)) #endif #ifndef isWORDCHAR_LC # define isWORDCHAR_LC(c) (isIDFIRST_LC(c) || isDIGIT_LC(c)) #endif #ifndef isXDIGIT # define isXDIGIT(c) ( isDIGIT(c) \ || inRANGE((c), 'a', 'f') \ || inRANGE((c), 'A', 'F')) #endif #ifndef isXDIGIT_L1 # define isXDIGIT_L1(c) isXDIGIT(c) #endif #ifndef isXDIGIT_LC # define isXDIGIT_LC(c) isxdigit(c) #endif #ifndef isALNUM_A # define isALNUM_A(c) isALNUM(c) #endif #ifndef isALNUMC_A # define isALNUMC_A(c) isALNUMC(c) #endif #ifndef isALPHA_A # define isALPHA_A(c) isALPHA(c) #endif #ifndef isALPHANUMERIC_A # define isALPHANUMERIC_A(c) isALPHANUMERIC(c) #endif #ifndef isASCII_A # define isASCII_A(c) isASCII(c) #endif #ifndef isBLANK_A # define isBLANK_A(c) isBLANK(c) #endif #ifndef isCNTRL_A # define isCNTRL_A(c) isCNTRL(c) #endif #ifndef isDIGIT_A # define isDIGIT_A(c) isDIGIT(c) #endif #ifndef isGRAPH_A # define isGRAPH_A(c) isGRAPH(c) #endif #ifndef isIDCONT_A # define isIDCONT_A(c) isIDCONT(c) #endif #ifndef isIDFIRST_A # define isIDFIRST_A(c) isIDFIRST(c) #endif #ifndef isLOWER_A # define isLOWER_A(c) isLOWER(c) #endif #ifndef isOCTAL_A # define isOCTAL_A(c) isOCTAL(c) #endif #ifndef isPRINT_A # define isPRINT_A(c) isPRINT(c) #endif #ifndef isPSXSPC_A # define isPSXSPC_A(c) isPSXSPC(c) #endif #ifndef isPUNCT_A # define isPUNCT_A(c) isPUNCT(c) #endif #ifndef isSPACE_A # define isSPACE_A(c) isSPACE(c) #endif #ifndef isUPPER_A # define isUPPER_A(c) isUPPER(c) #endif #ifndef isWORDCHAR_A # define isWORDCHAR_A(c) isWORDCHAR(c) #endif #ifndef isXDIGIT_A # define isXDIGIT_A(c) isXDIGIT(c) #endif #ifndef isASCII_utf8_safe # define isASCII_utf8_safe(s,e) (((e) - (s)) <= 0 ? 0 : isASCII(*(s))) #endif #ifndef isASCII_uvchr # define isASCII_uvchr(c) (FITS_IN_8_BITS(c) ? isASCII_L1(c) : 0) #endif #if (PERL_BCDVERSION >= 0x5006000) # ifdef isALPHA_uni /* If one defined, all are; this is just an exemplar */ # define D_PPP_is_ctype(upper, lower, c) \ (FITS_IN_8_BITS(c) \ ? is ## upper ## _L1(c) \ : is ## upper ## _uni((UV) (c))) /* _uni is old synonym */ # else # define D_PPP_is_ctype(upper, lower, c) \ (FITS_IN_8_BITS(c) \ ? is ## upper ## _L1(c) \ : is_uni_ ## lower((UV) (c))) /* is_uni_ is even older */ # endif #ifndef isALPHA_uvchr # define isALPHA_uvchr(c) D_PPP_is_ctype(ALPHA, alpha, c) #endif #ifndef isALPHANUMERIC_uvchr # define isALPHANUMERIC_uvchr(c) (isALPHA_uvchr(c) || isDIGIT_uvchr(c)) #endif # ifdef is_uni_blank #ifndef isBLANK_uvchr # define isBLANK_uvchr(c) D_PPP_is_ctype(BLANK, blank, c) #endif # else #ifndef isBLANK_uvchr # define isBLANK_uvchr(c) (FITS_IN_8_BITS(c) \ ? isBLANK_L1(c) \ : ( (UV) (c) == 0x1680 /* Unicode 3.0 */ \ || inRANGE((UV) (c), 0x2000, 0x200A) \ || (UV) (c) == 0x202F /* Unicode 3.0 */\ || (UV) (c) == 0x205F /* Unicode 3.2 */\ || (UV) (c) == 0x3000)) #endif # endif #ifndef isCNTRL_uvchr # define isCNTRL_uvchr(c) D_PPP_is_ctype(CNTRL, cntrl, c) #endif #ifndef isDIGIT_uvchr # define isDIGIT_uvchr(c) D_PPP_is_ctype(DIGIT, digit, c) #endif #ifndef isGRAPH_uvchr # define isGRAPH_uvchr(c) D_PPP_is_ctype(GRAPH, graph, c) #endif #ifndef isIDCONT_uvchr # define isIDCONT_uvchr(c) isWORDCHAR_uvchr(c) #endif #ifndef isIDFIRST_uvchr # define isIDFIRST_uvchr(c) D_PPP_is_ctype(IDFIRST, idfirst, c) #endif #ifndef isLOWER_uvchr # define isLOWER_uvchr(c) D_PPP_is_ctype(LOWER, lower, c) #endif #ifndef isPRINT_uvchr # define isPRINT_uvchr(c) D_PPP_is_ctype(PRINT, print, c) #endif #ifndef isPSXSPC_uvchr # define isPSXSPC_uvchr(c) isSPACE_uvchr(c) #endif #ifndef isPUNCT_uvchr # define isPUNCT_uvchr(c) D_PPP_is_ctype(PUNCT, punct, c) #endif #ifndef isSPACE_uvchr # define isSPACE_uvchr(c) D_PPP_is_ctype(SPACE, space, c) #endif #ifndef isUPPER_uvchr # define isUPPER_uvchr(c) D_PPP_is_ctype(UPPER, upper, c) #endif #ifndef isXDIGIT_uvchr # define isXDIGIT_uvchr(c) D_PPP_is_ctype(XDIGIT, xdigit, c) #endif #ifndef isWORDCHAR_uvchr # define isWORDCHAR_uvchr(c) (FITS_IN_8_BITS(c) \ ? isWORDCHAR_L1(c) : isALPHANUMERIC_uvchr(c)) #endif #ifndef isALPHA_utf8_safe # define isALPHA_utf8_safe(s,e) D_PPP_IS_GENERIC_UTF8_SAFE(s, e, ALPHA) #endif # ifdef isALPHANUMERIC_utf8 #ifndef isALPHANUMERIC_utf8_safe # define isALPHANUMERIC_utf8_safe(s,e) \ D_PPP_IS_GENERIC_UTF8_SAFE(s, e, ALPHANUMERIC) #endif # else #ifndef isALPHANUMERIC_utf8_safe # define isALPHANUMERIC_utf8_safe(s,e) \ (isALPHA_utf8_safe(s,e) || isDIGIT_utf8_safe(s,e)) #endif # endif /* This was broken before 5.18, and just use this instead of worrying about * which releases the official works on */ # if 'A' == 65 #ifndef isBLANK_utf8_safe # define isBLANK_utf8_safe(s,e) \ ( ( LIKELY((e) > (s)) ) ? /* Machine generated */ \ ( ( 0x09 == ((const U8*)s)[0] || 0x20 == ((const U8*)s)[0] ) ? 1 \ : ( LIKELY(((e) - (s)) >= UTF8SKIP(s)) ) ? \ ( ( 0xC2 == ((const U8*)s)[0] ) ? \ ( ( 0xA0 == ((const U8*)s)[1] ) ? 2 : 0 ) \ : ( 0xE1 == ((const U8*)s)[0] ) ? \ ( ( ( 0x9A == ((const U8*)s)[1] ) && ( 0x80 == ((const U8*)s)[2] ) ) ? 3 : 0 )\ : ( 0xE2 == ((const U8*)s)[0] ) ? \ ( ( 0x80 == ((const U8*)s)[1] ) ? \ ( ( inRANGE(((const U8*)s)[2], 0x80, 0x8A ) || 0xAF == ((const U8*)s)[2] ) ? 3 : 0 )\ : ( ( 0x81 == ((const U8*)s)[1] ) && ( 0x9F == ((const U8*)s)[2] ) ) ? 3 : 0 )\ : ( ( ( 0xE3 == ((const U8*)s)[0] ) && ( 0x80 == ((const U8*)s)[1] ) ) && ( 0x80 == ((const U8*)s)[2] ) ) ? 3 : 0 )\ : 0 ) \ : 0 ) #endif # elif 'A' == 193 && '^' == 95 /* EBCDIC 1047 */ #ifndef isBLANK_utf8_safe # define isBLANK_utf8_safe(s,e) \ ( ( LIKELY((e) > (s)) ) ? \ ( ( 0x05 == ((const U8*)s)[0] || 0x40 == ((const U8*)s)[0] ) ? 1 \ : ( LIKELY(((e) - (s)) >= UTF8SKIP(s)) ) ? \ ( ( 0x80 == ((const U8*)s)[0] ) ? \ ( ( 0x41 == ((const U8*)s)[1] ) ? 2 : 0 ) \ : ( 0xBC == ((const U8*)s)[0] ) ? \ ( ( ( 0x63 == ((const U8*)s)[1] ) && ( 0x41 == ((const U8*)s)[2] ) ) ? 3 : 0 )\ : ( 0xCA == ((const U8*)s)[0] ) ? \ ( ( 0x41 == ((const U8*)s)[1] ) ? \ ( ( inRANGE(((const U8*)s)[2], 0x41, 0x4A ) || 0x51 == ((const U8*)s)[2] ) ? 3 : 0 )\ : ( 0x42 == ((const U8*)s)[1] ) ? \ ( ( 0x56 == ((const U8*)s)[2] ) ? 3 : 0 ) \ : ( ( 0x43 == ((const U8*)s)[1] ) && ( 0x73 == ((const U8*)s)[2] ) ) ? 3 : 0 )\ : ( ( ( 0xCE == ((const U8*)s)[0] ) && ( 0x41 == ((const U8*)s)[1] ) ) && ( 0x41 == ((const U8*)s)[2] ) ) ? 3 : 0 )\ : 0 ) \ : 0 ) #endif # elif 'A' == 193 && '^' == 176 /* EBCDIC 037 */ #ifndef isBLANK_utf8_safe # define isBLANK_utf8_safe(s,e) \ ( ( LIKELY((e) > (s)) ) ? \ ( ( 0x05 == ((const U8*)s)[0] || 0x40 == ((const U8*)s)[0] ) ? 1 \ : ( LIKELY(((e) - (s)) >= UTF8SKIP(s)) ) ? \ ( ( 0x78 == ((const U8*)s)[0] ) ? \ ( ( 0x41 == ((const U8*)s)[1] ) ? 2 : 0 ) \ : ( 0xBD == ((const U8*)s)[0] ) ? \ ( ( ( 0x62 == ((const U8*)s)[1] ) && ( 0x41 == ((const U8*)s)[2] ) ) ? 3 : 0 )\ : ( 0xCA == ((const U8*)s)[0] ) ? \ ( ( 0x41 == ((const U8*)s)[1] ) ? \ ( ( inRANGE(((const U8*)s)[2], 0x41, 0x4A ) || 0x51 == ((const U8*)s)[2] ) ? 3 : 0 )\ : ( 0x42 == ((const U8*)s)[1] ) ? \ ( ( 0x56 == ((const U8*)s)[2] ) ? 3 : 0 ) \ : ( ( 0x43 == ((const U8*)s)[1] ) && ( 0x72 == ((const U8*)s)[2] ) ) ? 3 : 0 )\ : ( ( ( 0xCE == ((const U8*)s)[0] ) && ( 0x41 == ((const U8*)s)[1] ) ) && ( 0x41 == ((const U8*)s)[2] ) ) ? 3 : 0 )\ : 0 ) \ : 0 ) #endif # else # error Unknown character set # endif #ifndef isCNTRL_utf8_safe # define isCNTRL_utf8_safe(s,e) D_PPP_IS_GENERIC_UTF8_SAFE(s, e, CNTRL) #endif #ifndef isDIGIT_utf8_safe # define isDIGIT_utf8_safe(s,e) D_PPP_IS_GENERIC_UTF8_SAFE(s, e, DIGIT) #endif #ifndef isGRAPH_utf8_safe # define isGRAPH_utf8_safe(s,e) D_PPP_IS_GENERIC_UTF8_SAFE(s, e, GRAPH) #endif # ifdef isIDCONT_utf8 #ifndef isIDCONT_utf8_safe # define isIDCONT_utf8_safe(s,e) D_PPP_IS_GENERIC_UTF8_SAFE(s, e, IDCONT) #endif # else #ifndef isIDCONT_utf8_safe # define isIDCONT_utf8_safe(s,e) isWORDCHAR_utf8_safe(s,e) #endif # endif #ifndef isIDFIRST_utf8_safe # define isIDFIRST_utf8_safe(s,e) D_PPP_IS_GENERIC_UTF8_SAFE(s, e, IDFIRST) #endif #ifndef isLOWER_utf8_safe # define isLOWER_utf8_safe(s,e) D_PPP_IS_GENERIC_UTF8_SAFE(s, e, LOWER) #endif #ifndef isPRINT_utf8_safe # define isPRINT_utf8_safe(s,e) D_PPP_IS_GENERIC_UTF8_SAFE(s, e, PRINT) #endif # undef isPSXSPC_utf8_safe /* Use the modern definition */ #ifndef isPSXSPC_utf8_safe # define isPSXSPC_utf8_safe(s,e) isSPACE_utf8_safe(s,e) #endif #ifndef isPUNCT_utf8_safe # define isPUNCT_utf8_safe(s,e) D_PPP_IS_GENERIC_UTF8_SAFE(s, e, PUNCT) #endif #ifndef isSPACE_utf8_safe # define isSPACE_utf8_safe(s,e) D_PPP_IS_GENERIC_UTF8_SAFE(s, e, SPACE) #endif #ifndef isUPPER_utf8_safe # define isUPPER_utf8_safe(s,e) D_PPP_IS_GENERIC_UTF8_SAFE(s, e, UPPER) #endif # ifdef isWORDCHAR_utf8 #ifndef isWORDCHAR_utf8_safe # define isWORDCHAR_utf8_safe(s,e) D_PPP_IS_GENERIC_UTF8_SAFE(s, e, WORDCHAR) #endif # else #ifndef isWORDCHAR_utf8_safe # define isWORDCHAR_utf8_safe(s,e) \ (isALPHANUMERIC_utf8_safe(s,e) || (*(s)) == '_') #endif # endif /* This was broken before 5.12, and just use this instead of worrying about * which releases the official works on */ # if 'A' == 65 #ifndef isXDIGIT_utf8_safe # define isXDIGIT_utf8_safe(s,e) \ ( ( LIKELY((e) > (s)) ) ? \ ( ( inRANGE(((const U8*)s)[0], 0x30, 0x39 ) || inRANGE(((const U8*)s)[0], 0x41, 0x46 ) || inRANGE(((const U8*)s)[0], 0x61, 0x66 ) ) ? 1\ : ( ( LIKELY(((e) - (s)) >= UTF8SKIP(s)) ) && ( 0xEF == ((const U8*)s)[0] ) ) ? ( ( 0xBC == ((const U8*)s)[1] ) ?\ ( ( inRANGE(((const U8*)s)[2], 0x90, 0x99 ) || inRANGE(((const U8*)s)[2], 0xA1, 0xA6 ) ) ? 3 : 0 )\ : ( ( 0xBD == ((const U8*)s)[1] ) && ( inRANGE(((const U8*)s)[2], 0x81, 0x86 ) ) ) ? 3 : 0 ) : 0 )\ : 0 ) #endif # elif 'A' == 193 && '^' == 95 /* EBCDIC 1047 */ #ifndef isXDIGIT_utf8_safe # define isXDIGIT_utf8_safe(s,e) \ ( ( LIKELY((e) > (s)) ) ? \ ( ( inRANGE(((const U8*)s)[0], 0x81, 0x86 ) || inRANGE(((const U8*)s)[0], 0xC1, 0xC6 ) || inRANGE(((const U8*)s)[0], 0xF0, 0xF9 ) ) ? 1\ : ( ( ( LIKELY(((e) - (s)) >= UTF8SKIP(s)) ) && ( 0xDD == ((const U8*)s)[0] ) ) && ( 0x73 == ((const U8*)s)[1] ) ) ? ( ( 0x67 == ((const U8*)s)[2] ) ?\ ( ( inRANGE(((const U8*)s)[3], 0x57, 0x59 ) || inRANGE(((const U8*)s)[3], 0x62, 0x68 ) ) ? 4 : 0 )\ : ( ( inRANGE(((const U8*)s)[2], 0x68, 0x69 ) ) && ( inRANGE(((const U8*)s)[3], 0x42, 0x47 ) ) ) ? 4 : 0 ) : 0 )\ : 0 ) #endif # elif 'A' == 193 && '^' == 176 /* EBCDIC 037 */ #ifndef isXDIGIT_utf8_safe # define isXDIGIT_utf8_safe(s,e) \ ( ( LIKELY((e) > (s)) ) ? \ ( ( inRANGE(((const U8*)s)[0], 0x81, 0x86 ) || inRANGE(((const U8*)s)[0], 0xC1, 0xC6 ) || inRANGE(((const U8*)s)[0], 0xF0, 0xF9 ) ) ? 1\ : ( ( ( LIKELY(((e) - (s)) >= UTF8SKIP(s)) ) && ( 0xDD == ((const U8*)s)[0] ) ) && ( 0x72 == ((const U8*)s)[1] ) ) ? ( ( 0x66 == ((const U8*)s)[2] ) ?\ ( ( inRANGE(((const U8*)s)[3], 0x57, 0x59 ) || 0x5F == ((const U8*)s)[3] || inRANGE(((const U8*)s)[3], 0x62, 0x67 ) ) ? 4 : 0 )\ : ( ( inRANGE(((const U8*)s)[2], 0x67, 0x68 ) ) && ( inRANGE(((const U8*)s)[3], 0x42, 0x47 ) ) ) ? 4 : 0 ) : 0 )\ : 0 ) #endif # else # error Unknown character set # endif #ifndef isALPHA_LC_utf8_safe # define isALPHA_LC_utf8_safe(s,e) D_PPP_IS_GENERIC_LC_UTF8_SAFE(s, e, ALPHA) #endif # ifdef isALPHANUMERIC_utf8 #ifndef isALPHANUMERIC_LC_utf8_safe # define isALPHANUMERIC_LC_utf8_safe(s,e) \ D_PPP_IS_GENERIC_LC_UTF8_SAFE(s, e, ALPHANUMERIC) #endif # else #ifndef isALPHANUMERIC_LC_utf8_safe # define isALPHANUMERIC_LC_utf8_safe(s,e) \ (isALPHA_LC_utf8_safe(s,e) || isDIGIT_LC_utf8_safe(s,e)) #endif # endif #ifndef isBLANK_LC_utf8_safe # define isBLANK_LC_utf8_safe(s,e) \ D_PPP_IS_GENERIC_LC_UTF8_SAFE_BROKEN(s, e, BLANK) #endif #ifndef isCNTRL_LC_utf8_safe # define isCNTRL_LC_utf8_safe(s,e) D_PPP_IS_GENERIC_LC_UTF8_SAFE(s, e, CNTRL) #endif #ifndef isDIGIT_LC_utf8_safe # define isDIGIT_LC_utf8_safe(s,e) D_PPP_IS_GENERIC_LC_UTF8_SAFE(s, e, DIGIT) #endif #ifndef isGRAPH_LC_utf8_safe # define isGRAPH_LC_utf8_safe(s,e) D_PPP_IS_GENERIC_LC_UTF8_SAFE(s, e, GRAPH) #endif # ifdef isIDCONT_utf8 #ifndef isIDCONT_LC_utf8_safe # define isIDCONT_LC_utf8_safe(s,e) D_PPP_IS_GENERIC_LC_UTF8_SAFE(s, e, IDCONT) #endif # else #ifndef isIDCONT_LC_utf8_safe # define isIDCONT_LC_utf8_safe(s,e) isWORDCHAR_LC_utf8_safe(s,e) #endif # endif #ifndef isIDFIRST_LC_utf8_safe # define isIDFIRST_LC_utf8_safe(s,e) D_PPP_IS_GENERIC_LC_UTF8_SAFE(s, e, IDFIRST) #endif #ifndef isLOWER_LC_utf8_safe # define isLOWER_LC_utf8_safe(s,e) D_PPP_IS_GENERIC_LC_UTF8_SAFE(s, e, LOWER) #endif #ifndef isPRINT_LC_utf8_safe # define isPRINT_LC_utf8_safe(s,e) D_PPP_IS_GENERIC_LC_UTF8_SAFE(s, e, PRINT) #endif # undef isPSXSPC_LC_utf8_safe /* Use the modern definition */ #ifndef isPSXSPC_LC_utf8_safe # define isPSXSPC_LC_utf8_safe(s,e) isSPACE_LC_utf8_safe(s,e) #endif #ifndef isPUNCT_LC_utf8_safe # define isPUNCT_LC_utf8_safe(s,e) D_PPP_IS_GENERIC_LC_UTF8_SAFE(s, e, PUNCT) #endif #ifndef isSPACE_LC_utf8_safe # define isSPACE_LC_utf8_safe(s,e) D_PPP_IS_GENERIC_LC_UTF8_SAFE(s, e, SPACE) #endif #ifndef isUPPER_LC_utf8_safe # define isUPPER_LC_utf8_safe(s,e) D_PPP_IS_GENERIC_LC_UTF8_SAFE(s, e, UPPER) #endif # ifdef isWORDCHAR_utf8 #ifndef isWORDCHAR_LC_utf8_safe # define isWORDCHAR_LC_utf8_safe(s,e) D_PPP_IS_GENERIC_LC_UTF8_SAFE(s, e, WORDCHAR) #endif # else #ifndef isWORDCHAR_LC_utf8_safe # define isWORDCHAR_LC_utf8_safe(s,e) \ (isALPHANUMERIC_LC_utf8_safe(s,e) || (*(s)) == '_') #endif # endif #ifndef isXDIGIT_LC_utf8_safe # define isXDIGIT_LC_utf8_safe(s,e) \ D_PPP_IS_GENERIC_LC_UTF8_SAFE_BROKEN(s, e, XDIGIT) #endif /* Warning: isALPHANUMERIC_utf8_safe, isALPHA_utf8_safe, isASCII_utf8_safe, * isBLANK_utf8_safe, isCNTRL_utf8_safe, isDIGIT_utf8_safe, isGRAPH_utf8_safe, * isIDCONT_utf8_safe, isIDFIRST_utf8_safe, isLOWER_utf8_safe, * isPRINT_utf8_safe, isPSXSPC_utf8_safe, isPUNCT_utf8_safe, isSPACE_utf8_safe, * isUPPER_utf8_safe, isWORDCHAR_utf8_safe, isWORDCHAR_utf8_safe, * isXDIGIT_utf8_safe, * isALPHANUMERIC_LC_utf8_safe, isALPHA_LC_utf8_safe, isASCII_LC_utf8_safe, * isBLANK_LC_utf8_safe, isCNTRL_LC_utf8_safe, isDIGIT_LC_utf8_safe, * isGRAPH_LC_utf8_safe, isIDCONT_LC_utf8_safe, isIDFIRST_LC_utf8_safe, * isLOWER_LC_utf8_safe, isPRINT_LC_utf8_safe, isPSXSPC_LC_utf8_safe, * isPUNCT_LC_utf8_safe, isSPACE_LC_utf8_safe, isUPPER_LC_utf8_safe, * isWORDCHAR_LC_utf8_safe, isWORDCHAR_LC_utf8_safe, isXDIGIT_LC_utf8_safe, * isALPHANUMERIC_uvchr, isALPHA_uvchr, isASCII_uvchr, isBLANK_uvchr, * isCNTRL_uvchr, isDIGIT_uvchr, isGRAPH_uvchr, isIDCONT_uvchr, * isIDFIRST_uvchr, isLOWER_uvchr, isPRINT_uvchr, isPSXSPC_uvchr, * isPUNCT_uvchr, isSPACE_uvchr, isUPPER_uvchr, isWORDCHAR_uvchr, * isWORDCHAR_uvchr, isXDIGIT_uvchr * * The UTF-8 handling is buggy in early Perls, and this can give inaccurate * results for code points above 0xFF, until the implementation started * settling down in 5.12 and 5.14 */ #endif #define D_PPP_TOO_SHORT_MSG "Malformed UTF-8 character starting with:" \ " \\x%02x (too short; %d bytes available, need" \ " %d)\n" /* Perls starting here had a new API which handled multi-character results */ #if (PERL_BCDVERSION >= 0x5007003) #ifndef toLOWER_uvchr # define toLOWER_uvchr(c, s, l) UNI_TO_NATIVE(to_uni_lower(NATIVE_TO_UNI(c), s, l)) #endif #ifndef toUPPER_uvchr # define toUPPER_uvchr(c, s, l) UNI_TO_NATIVE(to_uni_upper(NATIVE_TO_UNI(c), s, l)) #endif #ifndef toTITLE_uvchr # define toTITLE_uvchr(c, s, l) UNI_TO_NATIVE(to_uni_title(NATIVE_TO_UNI(c), s, l)) #endif #ifndef toFOLD_uvchr # define toFOLD_uvchr(c, s, l) UNI_TO_NATIVE(to_uni_fold( NATIVE_TO_UNI(c), s, l)) #endif # if (PERL_BCDVERSION != 0x5015006) /* Just this version is broken */ /* Prefer the macro to the function */ # if defined toLOWER_utf8 # define D_PPP_TO_LOWER_CALLEE(s,r,l) toLOWER_utf8(s,r,l) # else # define D_PPP_TO_LOWER_CALLEE(s,r,l) to_utf8_lower(s,r,l) # endif # if defined toTITLE_utf8 # define D_PPP_TO_TITLE_CALLEE(s,r,l) toTITLE_utf8(s,r,l) # else # define D_PPP_TO_TITLE_CALLEE(s,r,l) to_utf8_title(s,r,l) # endif # if defined toUPPER_utf8 # define D_PPP_TO_UPPER_CALLEE(s,r,l) toUPPER_utf8(s,r,l) # else # define D_PPP_TO_UPPER_CALLEE(s,r,l) to_utf8_upper(s,r,l) # endif # if defined toFOLD_utf8 # define D_PPP_TO_FOLD_CALLEE(s,r,l) toFOLD_utf8(s,r,l) # else # define D_PPP_TO_FOLD_CALLEE(s,r,l) to_utf8_fold(s,r,l) # endif # else /* Below is 5.15.6, which failed to make the macros available # outside of core, so we have to use the 'Perl_' form. khw # decided it was easier to just handle this case than have to # document the exception, and make an exception in the tests below # */ # define D_PPP_TO_LOWER_CALLEE(s,r,l) \ Perl__to_utf8_lower_flags(aTHX_ s, r, l, 0, NULL) # define D_PPP_TO_TITLE_CALLEE(s,r,l) \ Perl__to_utf8_title_flags(aTHX_ s, r, l, 0, NULL) # define D_PPP_TO_UPPER_CALLEE(s,r,l) \ Perl__to_utf8_upper_flags(aTHX_ s, r, l, 0, NULL) # define D_PPP_TO_FOLD_CALLEE(s,r,l) \ Perl__to_utf8_fold_flags(aTHX_ s, r, l, FOLD_FLAGS_FULL, NULL) # endif /* The actual implementation of the backported macros. If too short, croak, * otherwise call the original that doesn't have an upper limit parameter */ # define D_PPP_GENERIC_MULTI_ARG_TO(name, s, e,r,l) \ (((((e) - (s)) <= 0) \ /* We could just do nothing, but modern perls croak */ \ ? (croak("Attempting case change on zero length string"), \ 0) /* So looks like it returns something, and will compile */ \ : ((e) - (s)) < UTF8SKIP(s)) \ ? (croak(D_PPP_TOO_SHORT_MSG, \ s[0], (int) ((e) - (s)), (int) UTF8SKIP(s)), \ 0) \ : D_PPP_TO_ ## name ## _CALLEE(s,r,l)) #ifndef toUPPER_utf8_safe # define toUPPER_utf8_safe(s,e,r,l) \ D_PPP_GENERIC_MULTI_ARG_TO(UPPER,s,e,r,l) #endif #ifndef toLOWER_utf8_safe # define toLOWER_utf8_safe(s,e,r,l) \ D_PPP_GENERIC_MULTI_ARG_TO(LOWER,s,e,r,l) #endif #ifndef toTITLE_utf8_safe # define toTITLE_utf8_safe(s,e,r,l) \ D_PPP_GENERIC_MULTI_ARG_TO(TITLE,s,e,r,l) #endif #ifndef toFOLD_utf8_safe # define toFOLD_utf8_safe(s,e,r,l) \ D_PPP_GENERIC_MULTI_ARG_TO(FOLD,s,e,r,l) #endif #elif (PERL_BCDVERSION >= 0x5006000) /* Here we have UTF-8 support, but using the original API where the case * changing functions merely returned the changed code point; hence they * couldn't handle multi-character results. */ # ifdef uvchr_to_utf8 # define D_PPP_UV_TO_UTF8 uvchr_to_utf8 # else # define D_PPP_UV_TO_UTF8 uv_to_utf8 # endif /* Get the utf8 of the case changed value, and store its length; then have * to re-calculate the changed case value in order to return it */ # define D_PPP_GENERIC_SINGLE_ARG_TO_UVCHR(name, c, s, l) \ (*(l) = (D_PPP_UV_TO_UTF8(s, \ UNI_TO_NATIVE(to_uni_ ## name(NATIVE_TO_UNI(c)))) - (s)), \ UNI_TO_NATIVE(to_uni_ ## name(NATIVE_TO_UNI(c)))) #ifndef toLOWER_uvchr # define toLOWER_uvchr(c, s, l) \ D_PPP_GENERIC_SINGLE_ARG_TO_UVCHR(lower, c, s, l) #endif #ifndef toUPPER_uvchr # define toUPPER_uvchr(c, s, l) \ D_PPP_GENERIC_SINGLE_ARG_TO_UVCHR(upper, c, s, l) #endif #ifndef toTITLE_uvchr # define toTITLE_uvchr(c, s, l) \ D_PPP_GENERIC_SINGLE_ARG_TO_UVCHR(title, c, s, l) #endif #ifndef toFOLD_uvchr # define toFOLD_uvchr(c, s, l) toLOWER_uvchr(c, s, l) #endif # define D_PPP_GENERIC_SINGLE_ARG_TO_UTF8(name, s, e, r, l) \ (((((e) - (s)) <= 0) \ ? (croak("Attempting case change on zero length string"), \ 0) /* So looks like it returns something, and will compile */ \ : ((e) - (s)) < UTF8SKIP(s)) \ ? (croak(D_PPP_TOO_SHORT_MSG, \ s[0], (int) ((e) - (s)), (int) UTF8SKIP(s)), \ 0) \ /* Get the changed code point and store its UTF-8 */ \ : D_PPP_UV_TO_UTF8(r, to_utf8_ ## name(s)), \ /* Then store its length, and re-get code point for return */ \ *(l) = UTF8SKIP(r), to_utf8_ ## name(r)) /* Warning: toUPPER_utf8_safe, toLOWER_utf8_safe, toTITLE_utf8_safe, * toUPPER_uvchr, toLOWER_uvchr, toTITLE_uvchr The UTF-8 case changing operations had bugs before around 5.12 or 5.14; this backport does not correct them. In perls before 7.3, multi-character case changing is not implemented; this backport uses the simple case changes available in those perls. */ #ifndef toUPPER_utf8_safe # define toUPPER_utf8_safe(s,e,r,l) \ D_PPP_GENERIC_SINGLE_ARG_TO_UTF8(upper, s, e, r, l) #endif #ifndef toLOWER_utf8_safe # define toLOWER_utf8_safe(s,e,r,l) \ D_PPP_GENERIC_SINGLE_ARG_TO_UTF8(lower, s, e, r, l) #endif #ifndef toTITLE_utf8_safe # define toTITLE_utf8_safe(s,e,r,l) \ D_PPP_GENERIC_SINGLE_ARG_TO_UTF8(title, s, e, r, l) #endif /* Warning: toFOLD_utf8_safe, toFOLD_uvchr The UTF-8 case changing operations had bugs before around 5.12 or 5.14; this backport does not correct them. In perls before 7.3, case folding is not implemented; instead, this backport substitutes simple (not multi-character, which isn't available) lowercasing. This gives the correct result in most, but not all, instances */ #ifndef toFOLD_utf8_safe # define toFOLD_utf8_safe(s,e,r,l) toLOWER_utf8_safe(s,e,r,l) #endif #endif /* Until we figure out how to support this in older perls... */ #if (PERL_BCDVERSION >= 0x5008000) #ifndef HeUTF8 # define HeUTF8(he) ((HeKLEN(he) == HEf_SVKEY) ? \ SvUTF8(HeKEY_sv(he)) : \ (U32)HeKUTF8(he)) #endif #endif #ifndef C_ARRAY_LENGTH # define C_ARRAY_LENGTH(a) (sizeof(a)/sizeof((a)[0])) #endif #ifndef C_ARRAY_END # define C_ARRAY_END(a) ((a) + C_ARRAY_LENGTH(a)) #endif #ifndef LIKELY # define LIKELY(x) (x) #endif #ifndef UNLIKELY # define UNLIKELY(x) (x) #endif #ifndef MUTABLE_PTR #if defined(PERL_USE_GCC_BRACE_GROUPS) # define MUTABLE_PTR(p) ({ void *_p = (p); _p; }) #else # define MUTABLE_PTR(p) ((void *) (p)) #endif #endif #ifndef MUTABLE_AV # define MUTABLE_AV(p) ((AV *)MUTABLE_PTR(p)) #endif #ifndef MUTABLE_CV # define MUTABLE_CV(p) ((CV *)MUTABLE_PTR(p)) #endif #ifndef MUTABLE_GV # define MUTABLE_GV(p) ((GV *)MUTABLE_PTR(p)) #endif #ifndef MUTABLE_HV # define MUTABLE_HV(p) ((HV *)MUTABLE_PTR(p)) #endif #ifndef MUTABLE_IO # define MUTABLE_IO(p) ((IO *)MUTABLE_PTR(p)) #endif #ifndef MUTABLE_SV # define MUTABLE_SV(p) ((SV *)MUTABLE_PTR(p)) #endif #if (PERL_BCDVERSION >= 0x5004000) && !defined(vnewSVpvf) #if defined(PERL_USE_GCC_BRACE_GROUPS) # define vnewSVpvf(pat, args) ({ SV *_sv = newSV(0); sv_vsetpvfn(_sv, (pat), strlen((pat)), (args), Null(SV**), 0, Null(bool*)); _sv; }) #else # define vnewSVpvf(pat, args) ((PL_Sv = newSV(0)), sv_vsetpvfn(PL_Sv, (pat), strlen((pat)), (args), Null(SV**), 0, Null(bool*)), PL_Sv) #endif #endif #if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_vcatpvf) # define sv_vcatpvf(sv, pat, args) sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*)) #endif #if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_vsetpvf) # define sv_vsetpvf(sv, pat, args) sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*)) #endif #if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_catpvf_mg) #if defined(NEED_sv_catpvf_mg) static void DPPP_(my_sv_catpvf_mg)(pTHX_ SV * const sv, const char * const pat, ...); static #else extern void DPPP_(my_sv_catpvf_mg)(pTHX_ SV * const sv, const char * const pat, ...); #endif #if defined(NEED_sv_catpvf_mg) || defined(NEED_sv_catpvf_mg_GLOBAL) #define Perl_sv_catpvf_mg DPPP_(my_sv_catpvf_mg) void DPPP_(my_sv_catpvf_mg)(pTHX_ SV * const sv, const char * const pat, ...) { va_list args; va_start(args, pat); sv_vcatpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*)); SvSETMAGIC(sv); va_end(args); } #endif #endif #ifdef PERL_IMPLICIT_CONTEXT #if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_catpvf_mg_nocontext) #if defined(NEED_sv_catpvf_mg_nocontext) static void DPPP_(my_sv_catpvf_mg_nocontext)(SV * const sv, const char * const pat, ...); static #else extern void DPPP_(my_sv_catpvf_mg_nocontext)(SV * const sv, const char * const pat, ...); #endif #if defined(NEED_sv_catpvf_mg_nocontext) || defined(NEED_sv_catpvf_mg_nocontext_GLOBAL) #define sv_catpvf_mg_nocontext DPPP_(my_sv_catpvf_mg_nocontext) #define Perl_sv_catpvf_mg_nocontext DPPP_(my_sv_catpvf_mg_nocontext) void DPPP_(my_sv_catpvf_mg_nocontext)(SV * const sv, const char * const pat, ...) { dTHX; va_list args; va_start(args, pat); sv_vcatpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*)); SvSETMAGIC(sv); va_end(args); } #endif #endif #endif /* sv_catpvf_mg depends on sv_catpvf_mg_nocontext */ #ifndef sv_catpvf_mg # ifdef PERL_IMPLICIT_CONTEXT # define sv_catpvf_mg Perl_sv_catpvf_mg_nocontext # else # define sv_catpvf_mg Perl_sv_catpvf_mg # endif #endif #if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_vcatpvf_mg) # define sv_vcatpvf_mg(sv, pat, args) \ STMT_START { \ sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*)); \ SvSETMAGIC(sv); \ } STMT_END #endif #if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_setpvf_mg) #if defined(NEED_sv_setpvf_mg) static void DPPP_(my_sv_setpvf_mg)(pTHX_ SV * const sv, const char * const pat, ...); static #else extern void DPPP_(my_sv_setpvf_mg)(pTHX_ SV * const sv, const char * const pat, ...); #endif #if defined(NEED_sv_setpvf_mg) || defined(NEED_sv_setpvf_mg_GLOBAL) #define Perl_sv_setpvf_mg DPPP_(my_sv_setpvf_mg) void DPPP_(my_sv_setpvf_mg)(pTHX_ SV * const sv, const char * const pat, ...) { va_list args; va_start(args, pat); sv_vsetpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*)); SvSETMAGIC(sv); va_end(args); } #endif #endif #ifdef PERL_IMPLICIT_CONTEXT #if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_setpvf_mg_nocontext) #if defined(NEED_sv_setpvf_mg_nocontext) static void DPPP_(my_sv_setpvf_mg_nocontext)(SV * const sv, const char * const pat, ...); static #else extern void DPPP_(my_sv_setpvf_mg_nocontext)(SV * const sv, const char * const pat, ...); #endif #if defined(NEED_sv_setpvf_mg_nocontext) || defined(NEED_sv_setpvf_mg_nocontext_GLOBAL) #define sv_setpvf_mg_nocontext DPPP_(my_sv_setpvf_mg_nocontext) #define Perl_sv_setpvf_mg_nocontext DPPP_(my_sv_setpvf_mg_nocontext) void DPPP_(my_sv_setpvf_mg_nocontext)(SV * const sv, const char * const pat, ...) { dTHX; va_list args; va_start(args, pat); sv_vsetpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*)); SvSETMAGIC(sv); va_end(args); } #endif #endif #endif /* sv_setpvf_mg depends on sv_setpvf_mg_nocontext */ #ifndef sv_setpvf_mg # ifdef PERL_IMPLICIT_CONTEXT # define sv_setpvf_mg Perl_sv_setpvf_mg_nocontext # else # define sv_setpvf_mg Perl_sv_setpvf_mg # endif #endif #if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_vsetpvf_mg) # define sv_vsetpvf_mg(sv, pat, args) \ STMT_START { \ sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*)); \ SvSETMAGIC(sv); \ } STMT_END #endif /* Hint: sv_2pv_nolen * Use the SvPV_nolen() or SvPV_nolen_const() macros instead of sv_2pv_nolen(). */ #ifndef sv_2pv_nolen # define sv_2pv_nolen(sv) SvPV_nolen(sv) #endif #ifdef SvPVbyte /* Hint: SvPVbyte * Does not work in perl-5.6.1, ppport.h implements a version * borrowed from perl-5.7.3. */ #if (PERL_BCDVERSION < 0x5007000) #ifndef sv_2pvbyte # define sv_2pvbyte(sv, lp) (sv_utf8_downgrade((sv), 0), SvPV((sv), *(lp))) #endif /* Hint: sv_2pvbyte * Use the SvPVbyte() macro instead of sv_2pvbyte(). */ /* Replace sv_2pvbyte with SvPVbyte */ #undef SvPVbyte #define SvPVbyte(sv, lp) \ ((SvFLAGS(sv) & (SVf_POK|SVf_UTF8)) == (SVf_POK) \ ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_2pvbyte(sv, &lp)) #endif #else # define SvPVbyte SvPV # define sv_2pvbyte sv_2pv #endif #ifndef sv_2pvbyte_nolen # define sv_2pvbyte_nolen(sv) sv_2pv_nolen(sv) #endif /* Hint: sv_pvn * Always use the SvPV() macro instead of sv_pvn(). */ /* Replace sv_pvn with SvPV */ /* Hint: sv_pvn_force * Always use the SvPV_force() macro instead of sv_pvn_force(). */ /* Replace sv_pvn_force with SvPV_force */ /* If these are undefined, they're not handled by the core anyway */ #ifndef SV_IMMEDIATE_UNREF # define SV_IMMEDIATE_UNREF 0 #endif #ifndef SV_GMAGIC # define SV_GMAGIC 0 #endif #ifndef SV_COW_DROP_PV # define SV_COW_DROP_PV 0 #endif #ifndef SV_UTF8_NO_ENCODING # define SV_UTF8_NO_ENCODING 0 #endif #ifndef SV_CONST_RETURN # define SV_CONST_RETURN 0 #endif #ifndef SV_MUTABLE_RETURN # define SV_MUTABLE_RETURN 0 #endif #ifndef SV_SMAGIC # define SV_SMAGIC 0 #endif #ifndef SV_HAS_TRAILING_NUL # define SV_HAS_TRAILING_NUL 0 #endif #ifndef SV_COW_SHARED_HASH_KEYS # define SV_COW_SHARED_HASH_KEYS 0 #endif #if defined(PERL_USE_GCC_BRACE_GROUPS) #ifndef sv_2pv_flags # define sv_2pv_flags(sv, lp, flags) ({ SV *_sv = (sv); const I32 _flags = (flags); STRLEN *_lp = lp; _lp = _lp ? : &PL_na; (!(_flags & SV_GMAGIC) && SvGMAGICAL(_sv)) ? ({ char *_pv; SvGMAGICAL_off(_sv); _pv = sv_2pv(_sv, _lp); SvGMAGICAL_on(_sv); _pv; }) : sv_2pv(_sv, _lp); }) #endif #ifndef sv_pvn_force_flags # define sv_pvn_force_flags(sv, lp, flags) ({ SV *_sv = (sv); const I32 _flags = (flags); STRLEN *_lp = lp; _lp = _lp ? : &PL_na; (!(_flags & SV_GMAGIC) && SvGMAGICAL(_sv)) ? ({ char *_pv; SvGMAGICAL_off(_sv); _pv = sv_pvn_force(_sv, _lp); SvGMAGICAL_on(_sv); _pv; }) : sv_pvn_force(_sv, _lp); }) #endif #else #ifndef sv_2pv_flags # define sv_2pv_flags(sv, lp, flags) ((PL_Sv = (sv)), (!((flags) & SV_GMAGIC) && SvGMAGICAL(PL_Sv)) ? (SvGMAGICAL_off(PL_Sv), (PL_Xpv = (XPV *)sv_2pv(PL_Sv, (lp) ? (lp) : &PL_na)), SvGMAGICAL_on(PL_Sv), (char *)PL_Xpv) : sv_2pv(PL_Sv, (lp) ? (lp) : &PL_na)) #endif #ifndef sv_pvn_force_flags # define sv_pvn_force_flags(sv, lp, flags) ((PL_Sv = (sv)), (!((flags) & SV_GMAGIC) && SvGMAGICAL(PL_Sv)) ? (SvGMAGICAL_off(PL_Sv), (PL_Xpv = (XPV *)sv_pvn_force(PL_Sv, (lp) ? (lp) : &PL_na)), SvGMAGICAL_on(PL_Sv), (char *)PL_Xpv) : sv_pvn_force(PL_Sv, (lp) ? (lp) : &PL_na)) #endif #endif #if (PERL_BCDVERSION < 0x5008008) || ( (PERL_BCDVERSION >= 0x5009000) && (PERL_BCDVERSION < 0x5009003) ) # define D_PPP_SVPV_NOLEN_LP_ARG &PL_na #else # define D_PPP_SVPV_NOLEN_LP_ARG 0 #endif #ifndef SvPV_const # define SvPV_const(sv, lp) SvPV_flags_const(sv, lp, SV_GMAGIC) #endif #ifndef SvPV_mutable # define SvPV_mutable(sv, lp) SvPV_flags_mutable(sv, lp, SV_GMAGIC) #endif #ifndef SvPV_flags # define SvPV_flags(sv, lp, flags) \ ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \ ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_2pv_flags(sv, &lp, flags)) #endif #ifndef SvPV_flags_const # define SvPV_flags_const(sv, lp, flags) \ ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \ ? ((lp = SvCUR(sv)), SvPVX_const(sv)) : \ (const char*) sv_2pv_flags(sv, &lp, flags|SV_CONST_RETURN)) #endif #ifndef SvPV_flags_const_nolen # define SvPV_flags_const_nolen(sv, flags) \ ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \ ? SvPVX_const(sv) : \ (const char*) sv_2pv_flags(sv, D_PPP_SVPV_NOLEN_LP_ARG, flags|SV_CONST_RETURN)) #endif #ifndef SvPV_flags_mutable # define SvPV_flags_mutable(sv, lp, flags) \ ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \ ? ((lp = SvCUR(sv)), SvPVX_mutable(sv)) : \ sv_2pv_flags(sv, &lp, flags|SV_MUTABLE_RETURN)) #endif #ifndef SvPV_force # define SvPV_force(sv, lp) SvPV_force_flags(sv, lp, SV_GMAGIC) #endif #ifndef SvPV_force_nolen # define SvPV_force_nolen(sv) SvPV_force_flags_nolen(sv, SV_GMAGIC) #endif #ifndef SvPV_force_mutable # define SvPV_force_mutable(sv, lp) SvPV_force_flags_mutable(sv, lp, SV_GMAGIC) #endif #ifndef SvPV_force_nomg # define SvPV_force_nomg(sv, lp) SvPV_force_flags(sv, lp, 0) #endif #ifndef SvPV_force_nomg_nolen # define SvPV_force_nomg_nolen(sv) SvPV_force_flags_nolen(sv, 0) #endif #ifndef SvPV_force_flags # define SvPV_force_flags(sv, lp, flags) \ ((SvFLAGS(sv) & (SVf_POK|SVf_THINKFIRST)) == SVf_POK \ ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_pvn_force_flags(sv, &lp, flags)) #endif #ifndef SvPV_force_flags_nolen # define SvPV_force_flags_nolen(sv, flags) \ ((SvFLAGS(sv) & (SVf_POK|SVf_THINKFIRST)) == SVf_POK \ ? SvPVX(sv) : sv_pvn_force_flags(sv, D_PPP_SVPV_NOLEN_LP_ARG, flags)) #endif #ifndef SvPV_force_flags_mutable # define SvPV_force_flags_mutable(sv, lp, flags) \ ((SvFLAGS(sv) & (SVf_POK|SVf_THINKFIRST)) == SVf_POK \ ? ((lp = SvCUR(sv)), SvPVX_mutable(sv)) \ : sv_pvn_force_flags(sv, &lp, flags|SV_MUTABLE_RETURN)) #endif #ifndef SvPV_nolen # define SvPV_nolen(sv) \ ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \ ? SvPVX(sv) : sv_2pv_flags(sv, D_PPP_SVPV_NOLEN_LP_ARG, SV_GMAGIC)) #endif #ifndef SvPV_nolen_const # define SvPV_nolen_const(sv) \ ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \ ? SvPVX_const(sv) : sv_2pv_flags(sv, D_PPP_SVPV_NOLEN_LP_ARG, SV_GMAGIC|SV_CONST_RETURN)) #endif # if defined(PERL_USE_GCC_BRACE_GROUPS) #ifndef SvPVx_nolen_const # define SvPVx_nolen_const(sv) ({SV *sV_ = (sv); SvPV_nolen_const(sV_); }) #endif # else #ifndef SvPVx_nolen_const # define SvPVx_nolen_const(sv) (PL_Sv = sv, SvPV_nolen_const(PL_Sv)) #endif # endif #ifndef SvPV_nomg # define SvPV_nomg(sv, lp) SvPV_flags(sv, lp, 0) #endif #ifndef SvPV_nomg_const # define SvPV_nomg_const(sv, lp) SvPV_flags_const(sv, lp, 0) #endif #ifndef SvPV_nomg_const_nolen # define SvPV_nomg_const_nolen(sv) SvPV_flags_const_nolen(sv, 0) #endif #ifndef SvPV_nomg_nolen # define SvPV_nomg_nolen(sv) ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \ ? SvPVX(sv) : sv_2pv_flags(sv, D_PPP_SVPV_NOLEN_LP_ARG, 0)) #endif #ifndef SvPV_renew # define SvPV_renew(sv,n) STMT_START { SvLEN_set(sv, n); \ SvPV_set((sv), (char *) saferealloc( \ (Malloc_t)SvPVX(sv), (MEM_SIZE)((n)))); \ } STMT_END #endif #ifndef SvPVCLEAR # define SvPVCLEAR(sv) sv_setpvs((sv), "") #endif #ifndef WARN_ALL # define WARN_ALL 0 #endif #ifndef WARN_CLOSURE # define WARN_CLOSURE 1 #endif #ifndef WARN_DEPRECATED # define WARN_DEPRECATED 2 #endif #ifndef WARN_EXITING # define WARN_EXITING 3 #endif #ifndef WARN_GLOB # define WARN_GLOB 4 #endif #ifndef WARN_IO # define WARN_IO 5 #endif #ifndef WARN_CLOSED # define WARN_CLOSED 6 #endif #ifndef WARN_EXEC # define WARN_EXEC 7 #endif #ifndef WARN_LAYER # define WARN_LAYER 8 #endif #ifndef WARN_NEWLINE # define WARN_NEWLINE 9 #endif #ifndef WARN_PIPE # define WARN_PIPE 10 #endif #ifndef WARN_UNOPENED # define WARN_UNOPENED 11 #endif #ifndef WARN_MISC # define WARN_MISC 12 #endif #ifndef WARN_NUMERIC # define WARN_NUMERIC 13 #endif #ifndef WARN_ONCE # define WARN_ONCE 14 #endif #ifndef WARN_OVERFLOW # define WARN_OVERFLOW 15 #endif #ifndef WARN_PACK # define WARN_PACK 16 #endif #ifndef WARN_PORTABLE # define WARN_PORTABLE 17 #endif #ifndef WARN_RECURSION # define WARN_RECURSION 18 #endif #ifndef WARN_REDEFINE # define WARN_REDEFINE 19 #endif #ifndef WARN_REGEXP # define WARN_REGEXP 20 #endif #ifndef WARN_SEVERE # define WARN_SEVERE 21 #endif #ifndef WARN_DEBUGGING # define WARN_DEBUGGING 22 #endif #ifndef WARN_INPLACE # define WARN_INPLACE 23 #endif #ifndef WARN_INTERNAL # define WARN_INTERNAL 24 #endif #ifndef WARN_MALLOC # define WARN_MALLOC 25 #endif #ifndef WARN_SIGNAL # define WARN_SIGNAL 26 #endif #ifndef WARN_SUBSTR # define WARN_SUBSTR 27 #endif #ifndef WARN_SYNTAX # define WARN_SYNTAX 28 #endif #ifndef WARN_AMBIGUOUS # define WARN_AMBIGUOUS 29 #endif #ifndef WARN_BAREWORD # define WARN_BAREWORD 30 #endif #ifndef WARN_DIGIT # define WARN_DIGIT 31 #endif #ifndef WARN_PARENTHESIS # define WARN_PARENTHESIS 32 #endif #ifndef WARN_PRECEDENCE # define WARN_PRECEDENCE 33 #endif #ifndef WARN_PRINTF # define WARN_PRINTF 34 #endif #ifndef WARN_PROTOTYPE # define WARN_PROTOTYPE 35 #endif #ifndef WARN_QW # define WARN_QW 36 #endif #ifndef WARN_RESERVED # define WARN_RESERVED 37 #endif #ifndef WARN_SEMICOLON # define WARN_SEMICOLON 38 #endif #ifndef WARN_TAINT # define WARN_TAINT 39 #endif #ifndef WARN_THREADS # define WARN_THREADS 40 #endif #ifndef WARN_UNINITIALIZED # define WARN_UNINITIALIZED 41 #endif #ifndef WARN_UNPACK # define WARN_UNPACK 42 #endif #ifndef WARN_UNTIE # define WARN_UNTIE 43 #endif #ifndef WARN_UTF8 # define WARN_UTF8 44 #endif #ifndef WARN_VOID # define WARN_VOID 45 #endif #ifndef WARN_ASSERTIONS # define WARN_ASSERTIONS 46 #endif #ifndef packWARN # define packWARN(a) (a) #endif #ifndef packWARN2 # define packWARN2(a,b) (packWARN(a) << 8 | (b)) #endif #ifndef packWARN3 # define packWARN3(a,b,c) (packWARN2(a,b) << 8 | (c)) #endif #ifndef packWARN4 # define packWARN4(a,b,c,d) (packWARN3(a,b,c) << 8 | (d)) #endif #ifndef ckWARN # ifdef G_WARN_ON # define ckWARN(a) (PL_dowarn & G_WARN_ON) # else # define ckWARN(a) PL_dowarn # endif #endif #ifndef ckWARN2 # define ckWARN2(a,b) (ckWARN(a) || ckWARN(b)) #endif #ifndef ckWARN3 # define ckWARN3(a,b,c) (ckWARN(c) || ckWARN2(a,b)) #endif #ifndef ckWARN4 # define ckWARN4(a,b,c,d) (ckWARN(d) || ckWARN3(a,b,c)) #endif #ifndef ckWARN_d # ifdef isLEXWARN_off # define ckWARN_d(a) (isLEXWARN_off || ckWARN(a)) # else # define ckWARN_d(a) 1 # endif #endif #ifndef ckWARN2_d # define ckWARN2_d(a,b) (ckWARN_d(a) || ckWARN_d(b)) #endif #ifndef ckWARN3_d # define ckWARN3_d(a,b,c) (ckWARN_d(c) || ckWARN2_d(a,b)) #endif #ifndef ckWARN4_d # define ckWARN4_d(a,b,c,d) (ckWARN_d(d) || ckWARN3_d(a,b,c)) #endif #ifndef vwarner # define vwarner(err, pat, argsp) \ STMT_START { SV *sv; \ PERL_UNUSED_ARG(err); \ sv = vnewSVpvf(pat, argsp); \ sv_2mortal(sv); \ warn("%s", SvPV_nolen(sv)); \ } STMT_END #endif #if (PERL_BCDVERSION >= 0x5004000) && !defined(warner) # if defined(NEED_warner) static void DPPP_(my_warner)(U32 err, const char * pat, ...); static #else extern void DPPP_(my_warner)(U32 err, const char * pat, ...); #endif #if defined(NEED_warner) || defined(NEED_warner_GLOBAL) #define Perl_warner DPPP_(my_warner) void DPPP_(my_warner)(U32 err, const char *pat, ...) { va_list args; va_start(args, pat); vwarner(err, pat, &args); va_end(args); } # define warner Perl_warner # define Perl_warner_nocontext Perl_warner # endif #endif #if (PERL_BCDVERSION >= 0x5004000) && !defined(ck_warner) # if defined(NEED_ck_warner) static void DPPP_(my_ck_warner)(pTHX_ U32 err, const char * pat, ...); static #else extern void DPPP_(my_ck_warner)(pTHX_ U32 err, const char * pat, ...); #endif #if defined(NEED_ck_warner) || defined(NEED_ck_warner_GLOBAL) #define Perl_ck_warner DPPP_(my_ck_warner) void DPPP_(my_ck_warner)(pTHX_ U32 err, const char *pat, ...) { va_list args; if ( ! ckWARN((err ) & 0xFF) && ! ckWARN((err >> 8) & 0xFF) && ! ckWARN((err >> 16) & 0xFF) && ! ckWARN((err >> 24) & 0xFF)) { return; } va_start(args, pat); vwarner(err, pat, &args); va_end(args); } # define ck_warner Perl_ck_warner # endif #endif #if (PERL_BCDVERSION >= 0x5004000) && !defined(ck_warner_d) # if defined(NEED_ck_warner_d) static void DPPP_(my_ck_warner_d)(pTHX_ U32 err, const char * pat, ...); static #else extern void DPPP_(my_ck_warner_d)(pTHX_ U32 err, const char * pat, ...); #endif #if defined(NEED_ck_warner_d) || defined(NEED_ck_warner_d_GLOBAL) #define Perl_ck_warner_d DPPP_(my_ck_warner_d) void DPPP_(my_ck_warner_d)(pTHX_ U32 err, const char *pat, ...) { va_list args; if ( ! ckWARN_d((err ) & 0xFF) && ! ckWARN_d((err >> 8) & 0xFF) && ! ckWARN_d((err >> 16) & 0xFF) && ! ckWARN_d((err >> 24) & 0xFF)) { return; } va_start(args, pat); vwarner(err, pat, &args); va_end(args); } # define ck_warner_d Perl_ck_warner_d # endif #endif #ifndef IVdf # if IVSIZE == LONGSIZE # define IVdf "ld" # define UVuf "lu" # define UVof "lo" # define UVxf "lx" # define UVXf "lX" # elif IVSIZE == INTSIZE # define IVdf "d" # define UVuf "u" # define UVof "o" # define UVxf "x" # define UVXf "X" # else # error "cannot define IV/UV formats" # endif #endif #ifndef NVef # if defined(USE_LONG_DOUBLE) && defined(HAS_LONG_DOUBLE) && \ defined(PERL_PRIfldbl) && (PERL_BCDVERSION != 0x5006000) /* Not very likely, but let's try anyway. */ # define NVef PERL_PRIeldbl # define NVff PERL_PRIfldbl # define NVgf PERL_PRIgldbl # else # define NVef "e" # define NVff "f" # define NVgf "g" # endif #endif #ifndef sv_setuv # define sv_setuv(sv, uv) \ STMT_START { \ UV TeMpUv = uv; \ if (TeMpUv <= IV_MAX) \ sv_setiv(sv, TeMpUv); \ else \ sv_setnv(sv, (double)TeMpUv); \ } STMT_END #endif #ifndef newSVuv # define newSVuv(uv) ((uv) <= IV_MAX ? newSViv((IV)uv) : newSVnv((NV)uv)) #endif #if defined(PERL_USE_GCC_BRACE_GROUPS) #ifndef sv_2uv # define sv_2uv(sv) ({ SV *_sv = (sv); (UV) (SvNOK(_sv) ? SvNV(_sv) : sv_2nv(_sv)); }) #endif #else #ifndef sv_2uv # define sv_2uv(sv) ((PL_Sv = (sv)), (UV) (SvNOK(PL_Sv) ? SvNV(PL_Sv) : sv_2nv(PL_Sv))) #endif #endif #ifndef SvUVX # define SvUVX(sv) ((UV)SvIVX(sv)) #endif #ifndef SvUVXx # define SvUVXx(sv) SvUVX(sv) #endif #ifndef SvUV # define SvUV(sv) (SvIOK(sv) ? SvUVX(sv) : sv_2uv(sv)) #endif #if defined(PERL_USE_GCC_BRACE_GROUPS) #ifndef SvUVx # define SvUVx(sv) ({ SV *_sv = (sv)); SvUV(_sv); }) #endif #else #ifndef SvUVx # define SvUVx(sv) ((PL_Sv = (sv)), SvUV(PL_Sv)) #endif #endif /* Hint: sv_uv * Always use the SvUVx() macro instead of sv_uv(). */ /* Replace sv_uv with SvUVx */ #ifndef sv_uv # define sv_uv(sv) SvUVx(sv) #endif #if !defined(SvUOK) && defined(SvIOK_UV) # define SvUOK(sv) SvIOK_UV(sv) #endif #ifndef XST_mUV # define XST_mUV(i,v) (ST(i) = sv_2mortal(newSVuv(v)) ) #endif #ifndef XSRETURN_UV # define XSRETURN_UV(v) STMT_START { XST_mUV(0,v); XSRETURN(1); } STMT_END #endif #ifndef PUSHu # define PUSHu(u) STMT_START { sv_setuv(TARG, (UV)(u)); PUSHTARG; } STMT_END #endif #ifndef XPUSHu # define XPUSHu(u) STMT_START { sv_setuv(TARG, (UV)(u)); XPUSHTARG; } STMT_END #endif #if !defined(my_strnlen) #if defined(NEED_my_strnlen) static Size_t DPPP_(my_my_strnlen)(const char * str, Size_t maxlen); static #else extern Size_t DPPP_(my_my_strnlen)(const char * str, Size_t maxlen); #endif #if defined(NEED_my_strnlen) || defined(NEED_my_strnlen_GLOBAL) #define my_strnlen DPPP_(my_my_strnlen) #define Perl_my_strnlen DPPP_(my_my_strnlen) Size_t DPPP_(my_my_strnlen)(const char *str, Size_t maxlen) { const char *p = str; while(maxlen-- && *p) p++; return p - str; } #endif #endif #ifdef HAS_MEMCMP #ifndef memNE # define memNE(s1,s2,l) (memcmp(s1,s2,l)) #endif #ifndef memEQ # define memEQ(s1,s2,l) (!memcmp(s1,s2,l)) #endif #else #ifndef memNE # define memNE(s1,s2,l) (bcmp(s1,s2,l)) #endif #ifndef memEQ # define memEQ(s1,s2,l) (!bcmp(s1,s2,l)) #endif #endif #ifndef memEQs # define memEQs(s1, l, s2) \ (sizeof(s2)-1 == l && memEQ(s1, (s2 ""), (sizeof(s2)-1))) #endif #ifndef memNEs # define memNEs(s1, l, s2) !memEQs(s1, l, s2) #endif #ifndef memCHRs # define memCHRs(s, c) ((const char *) memchr("" s "" , c, sizeof(s)-1)) #endif #ifndef MoveD # define MoveD(s,d,n,t) memmove((char*)(d),(char*)(s), (n) * sizeof(t)) #endif #ifndef CopyD # define CopyD(s,d,n,t) memcpy((char*)(d),(char*)(s), (n) * sizeof(t)) #endif #ifdef HAS_MEMSET #ifndef ZeroD # define ZeroD(d,n,t) memzero((char*)(d), (n) * sizeof(t)) #endif #else #ifndef ZeroD # define ZeroD(d,n,t) ((void)memzero((char*)(d), (n) * sizeof(t)), d) #endif #endif #ifndef PoisonWith # define PoisonWith(d,n,t,b) (void)memset((char*)(d), (U8)(b), (n) * sizeof(t)) #endif #ifndef PoisonNew # define PoisonNew(d,n,t) PoisonWith(d,n,t,0xAB) #endif #ifndef PoisonFree # define PoisonFree(d,n,t) PoisonWith(d,n,t,0xEF) #endif #ifndef Poison # define Poison(d,n,t) PoisonFree(d,n,t) #endif #ifndef Newx # define Newx(v,n,t) New(0,v,n,t) #endif #ifndef Newxc # define Newxc(v,n,t,c) Newc(0,v,n,t,c) #endif #ifndef Newxz # define Newxz(v,n,t) Newz(0,v,n,t) #endif #ifdef NEED_mess_sv #define NEED_mess #endif #ifdef NEED_mess #define NEED_mess_nocontext #define NEED_vmess #endif #ifndef croak_sv #if (PERL_BCDVERSION >= 0x5007003) || ( (PERL_BCDVERSION >= 0x5006001) && (PERL_BCDVERSION < 0x5007000) ) # if ( (PERL_BCDVERSION >= 0x5008000) && (PERL_BCDVERSION < 0x5008009) ) || ( (PERL_BCDVERSION >= 0x5009000) && (PERL_BCDVERSION < 0x5010001) ) # define D_PPP_FIX_UTF8_ERRSV_FOR_SV(sv) \ STMT_START { \ SV *_errsv = ERRSV; \ SvFLAGS(_errsv) = (SvFLAGS(_errsv) & ~SVf_UTF8) | \ (SvFLAGS(sv) & SVf_UTF8); \ } STMT_END # else # define D_PPP_FIX_UTF8_ERRSV_FOR_SV(sv) STMT_START {} STMT_END # endif # define croak_sv(sv) \ STMT_START { \ SV *_sv = (sv); \ if (SvROK(_sv)) { \ sv_setsv(ERRSV, _sv); \ croak(NULL); \ } else { \ D_PPP_FIX_UTF8_ERRSV_FOR_SV(_sv); \ croak("%" SVf, SVfARG(_sv)); \ } \ } STMT_END #elif (PERL_BCDVERSION >= 0x5004000) # define croak_sv(sv) croak("%" SVf, SVfARG(sv)) #else # define croak_sv(sv) croak("%s", SvPV_nolen(sv)) #endif #endif #ifndef die_sv #if defined(NEED_die_sv) static OP * DPPP_(my_die_sv)(pTHX_ SV * baseex); static #else extern OP * DPPP_(my_die_sv)(pTHX_ SV * baseex); #endif #if defined(NEED_die_sv) || defined(NEED_die_sv_GLOBAL) #ifdef die_sv # undef die_sv #endif #define die_sv(a) DPPP_(my_die_sv)(aTHX_ a) #define Perl_die_sv DPPP_(my_die_sv) OP * DPPP_(my_die_sv)(pTHX_ SV *baseex) { croak_sv(baseex); return (OP *)NULL; } #endif #endif #ifndef warn_sv #if (PERL_BCDVERSION >= 0x5004000) # define warn_sv(sv) warn("%" SVf, SVfARG(sv)) #else # define warn_sv(sv) warn("%s", SvPV_nolen(sv)) #endif #endif #if ! defined vmess && (PERL_BCDVERSION >= 0x5004000) # if defined(NEED_vmess) static SV * DPPP_(my_vmess)(pTHX_ const char * pat, va_list * args); static #else extern SV * DPPP_(my_vmess)(pTHX_ const char * pat, va_list * args); #endif #if defined(NEED_vmess) || defined(NEED_vmess_GLOBAL) #ifdef vmess # undef vmess #endif #define vmess(a,b) DPPP_(my_vmess)(aTHX_ a,b) #define Perl_vmess DPPP_(my_vmess) SV* DPPP_(my_vmess)(pTHX_ const char* pat, va_list* args) { mess(pat, args); return PL_mess_sv; } # endif #endif #if (PERL_BCDVERSION < 0x5006000) && (PERL_BCDVERSION >= 0x5004000) #undef mess #endif #if !defined(mess_nocontext) && !defined(Perl_mess_nocontext) && (PERL_BCDVERSION >= 0x5004000) #if defined(NEED_mess_nocontext) static SV * DPPP_(my_mess_nocontext)(const char * pat, ...); static #else extern SV * DPPP_(my_mess_nocontext)(const char * pat, ...); #endif #if defined(NEED_mess_nocontext) || defined(NEED_mess_nocontext_GLOBAL) #define mess_nocontext DPPP_(my_mess_nocontext) #define Perl_mess_nocontext DPPP_(my_mess_nocontext) SV* DPPP_(my_mess_nocontext)(const char* pat, ...) { dTHX; SV *sv; va_list args; va_start(args, pat); sv = vmess(pat, &args); va_end(args); return sv; } #endif #endif #ifndef mess #if defined(NEED_mess) static SV * DPPP_(my_mess)(pTHX_ const char * pat, ...); static #else extern SV * DPPP_(my_mess)(pTHX_ const char * pat, ...); #endif #if defined(NEED_mess) || defined(NEED_mess_GLOBAL) #define Perl_mess DPPP_(my_mess) SV* DPPP_(my_mess)(pTHX_ const char* pat, ...) { SV *sv; va_list args; va_start(args, pat); sv = vmess(pat, &args); va_end(args); return sv; } #ifdef mess_nocontext #define mess mess_nocontext #else #define mess Perl_mess_nocontext #endif #endif #endif #if ! defined mess_sv && (PERL_BCDVERSION >= 0x5004000) #if defined(NEED_mess_sv) static SV * DPPP_(my_mess_sv)(pTHX_ SV * basemsg, bool consume); static #else extern SV * DPPP_(my_mess_sv)(pTHX_ SV * basemsg, bool consume); #endif #if defined(NEED_mess_sv) || defined(NEED_mess_sv_GLOBAL) #ifdef mess_sv # undef mess_sv #endif #define mess_sv(a,b) DPPP_(my_mess_sv)(aTHX_ a,b) #define Perl_mess_sv DPPP_(my_mess_sv) SV * DPPP_(my_mess_sv)(pTHX_ SV *basemsg, bool consume) { SV *tmp; SV *ret; if (SvPOK(basemsg) && SvCUR(basemsg) && *(SvEND(basemsg)-1) == '\n') { if (consume) return basemsg; ret = mess(""); SvSetSV_nosteal(ret, basemsg); return ret; } if (consume) { sv_catsv(basemsg, mess("")); return basemsg; } ret = mess(""); tmp = newSVsv(ret); SvSetSV_nosteal(ret, basemsg); sv_catsv(ret, tmp); sv_dec(tmp); return ret; } #endif #endif #ifndef warn_nocontext #define warn_nocontext warn #endif #ifndef croak_nocontext #define croak_nocontext croak #endif #ifndef croak_no_modify #define croak_no_modify() croak_nocontext("%s", PL_no_modify) #define Perl_croak_no_modify() croak_no_modify() #endif #ifndef croak_memory_wrap #if (PERL_BCDVERSION >= 0x5009002) || ( (PERL_BCDVERSION >= 0x5008006) && (PERL_BCDVERSION < 0x5009000) ) # define croak_memory_wrap() croak_nocontext("%s", PL_memory_wrap) #else # define croak_memory_wrap() croak_nocontext("panic: memory wrap") #endif #endif #ifndef croak_xs_usage #if defined(NEED_croak_xs_usage) static void DPPP_(my_croak_xs_usage)(const CV * const cv, const char * const params); static #else extern void DPPP_(my_croak_xs_usage)(const CV * const cv, const char * const params); #endif #if defined(NEED_croak_xs_usage) || defined(NEED_croak_xs_usage_GLOBAL) #define croak_xs_usage DPPP_(my_croak_xs_usage) #define Perl_croak_xs_usage DPPP_(my_croak_xs_usage) #ifndef PERL_ARGS_ASSERT_CROAK_XS_USAGE #define PERL_ARGS_ASSERT_CROAK_XS_USAGE assert(cv); assert(params) void DPPP_(my_croak_xs_usage)(const CV *const cv, const char *const params) { dTHX; const GV *const gv = CvGV(cv); PERL_ARGS_ASSERT_CROAK_XS_USAGE; if (gv) { const char *const gvname = GvNAME(gv); const HV *const stash = GvSTASH(gv); const char *const hvname = stash ? HvNAME(stash) : NULL; if (hvname) croak("Usage: %s::%s(%s)", hvname, gvname, params); else croak("Usage: %s(%s)", gvname, params); } else { /* Pants. I don't think that it should be possible to get here. */ croak("Usage: CODE(0x%" UVxf ")(%s)", PTR2UV(cv), params); } } #endif #endif #endif #ifndef mPUSHs # define mPUSHs(s) PUSHs(sv_2mortal(s)) #endif #ifndef PUSHmortal # define PUSHmortal PUSHs(sv_newmortal()) #endif #ifndef mPUSHp # define mPUSHp(p,l) sv_setpvn(PUSHmortal, (p), (l)) #endif #ifndef mPUSHn # define mPUSHn(n) sv_setnv(PUSHmortal, (NV)(n)) #endif #ifndef mPUSHi # define mPUSHi(i) sv_setiv(PUSHmortal, (IV)(i)) #endif #ifndef mPUSHu # define mPUSHu(u) sv_setuv(PUSHmortal, (UV)(u)) #endif #ifndef mXPUSHs # define mXPUSHs(s) XPUSHs(sv_2mortal(s)) #endif #ifndef XPUSHmortal # define XPUSHmortal XPUSHs(sv_newmortal()) #endif #ifndef mXPUSHp # define mXPUSHp(p,l) STMT_START { EXTEND(sp,1); sv_setpvn(PUSHmortal, (p), (l)); } STMT_END #endif #ifndef mXPUSHn # define mXPUSHn(n) STMT_START { EXTEND(sp,1); sv_setnv(PUSHmortal, (NV)(n)); } STMT_END #endif #ifndef mXPUSHi # define mXPUSHi(i) STMT_START { EXTEND(sp,1); sv_setiv(PUSHmortal, (IV)(i)); } STMT_END #endif #ifndef mXPUSHu # define mXPUSHu(u) STMT_START { EXTEND(sp,1); sv_setuv(PUSHmortal, (UV)(u)); } STMT_END #endif /* Replace: 1 */ #ifndef call_sv # define call_sv perl_call_sv #endif #ifndef call_pv # define call_pv perl_call_pv #endif #ifndef call_argv # define call_argv perl_call_argv #endif #ifndef call_method # define call_method perl_call_method #endif #ifndef eval_sv # define eval_sv perl_eval_sv #endif #if (PERL_BCDVERSION >= 0x5003098) && (PERL_BCDVERSION < 0x5006000) #ifndef eval_pv # define eval_pv perl_eval_pv #endif #endif /* Replace: 0 */ #if (PERL_BCDVERSION < 0x5006000) #ifndef Perl_eval_sv # define Perl_eval_sv perl_eval_sv #endif #if (PERL_BCDVERSION >= 0x5003098) #ifndef Perl_eval_pv # define Perl_eval_pv perl_eval_pv #endif #endif #endif #ifndef G_LIST # define G_LIST G_ARRAY /* Replace */ #endif #ifndef PERL_LOADMOD_DENY # define PERL_LOADMOD_DENY 0x1 #endif #ifndef PERL_LOADMOD_NOIMPORT # define PERL_LOADMOD_NOIMPORT 0x2 #endif #ifndef PERL_LOADMOD_IMPORT_OPS # define PERL_LOADMOD_IMPORT_OPS 0x4 #endif #if defined(PERL_USE_GCC_BRACE_GROUPS) # define D_PPP_CROAK_IF_ERROR(cond) ({ SV *_errsv; ((cond) && (_errsv = ERRSV) && (SvROK(_errsv) || SvTRUE(_errsv)) && (croak_sv(_errsv), 1)); }) #else # define D_PPP_CROAK_IF_ERROR(cond) ((cond) && (SvROK(ERRSV) || SvTRUE(ERRSV)) && (croak_sv(ERRSV), 1)) #endif #ifndef G_METHOD # define G_METHOD 64 # ifdef call_sv # undef call_sv # endif # if (PERL_BCDVERSION < 0x5006000) # define call_sv(sv, flags) ((flags) & G_METHOD ? perl_call_method((char *) SvPV_nolen_const(sv), \ (flags) & ~G_METHOD) : perl_call_sv(sv, flags)) # else # define call_sv(sv, flags) ((flags) & G_METHOD ? Perl_call_method(aTHX_ (char *) SvPV_nolen_const(sv), \ (flags) & ~G_METHOD) : Perl_call_sv(aTHX_ sv, flags)) # endif #endif #ifndef G_RETHROW # define G_RETHROW 8192 # ifdef eval_sv # undef eval_sv # endif # if defined(PERL_USE_GCC_BRACE_GROUPS) # define eval_sv(sv, flags) ({ I32 _flags = (flags); I32 _ret = Perl_eval_sv(aTHX_ sv, (_flags & ~G_RETHROW)); D_PPP_CROAK_IF_ERROR(_flags & G_RETHROW); _ret; }) # else # define eval_sv(sv, flags) ((PL_na = Perl_eval_sv(aTHX_ sv, ((flags) & ~G_RETHROW))), D_PPP_CROAK_IF_ERROR((flags) & G_RETHROW), (I32)PL_na) # endif #endif /* Older Perl versions have broken croak_on_error=1 */ #if (PERL_BCDVERSION < 0x5031002) # ifdef eval_pv # undef eval_pv # if defined(PERL_USE_GCC_BRACE_GROUPS) # define eval_pv(p, croak_on_error) ({ SV *_sv = Perl_eval_pv(aTHX_ p, 0); D_PPP_CROAK_IF_ERROR(croak_on_error); _sv; }) # else # define eval_pv(p, croak_on_error) ((PL_Sv = Perl_eval_pv(aTHX_ p, 0)), D_PPP_CROAK_IF_ERROR(croak_on_error), PL_Sv) # endif # endif #endif /* This is backport for Perl 5.3.97d and older which do not provide perl_eval_pv */ #ifndef eval_pv #if defined(NEED_eval_pv) static SV * DPPP_(my_eval_pv)(const char * p, I32 croak_on_error); static #else extern SV * DPPP_(my_eval_pv)(const char * p, I32 croak_on_error); #endif #if defined(NEED_eval_pv) || defined(NEED_eval_pv_GLOBAL) #ifdef eval_pv # undef eval_pv #endif #define eval_pv(a,b) DPPP_(my_eval_pv)(aTHX_ a,b) #define Perl_eval_pv DPPP_(my_eval_pv) SV* DPPP_(my_eval_pv)(const char *p, I32 croak_on_error) { dSP; SV* sv = newSVpv(p, 0); PUSHMARK(sp); eval_sv(sv, G_SCALAR); SvREFCNT_dec(sv); SPAGAIN; sv = POPs; PUTBACK; D_PPP_CROAK_IF_ERROR(croak_on_error); return sv; } #endif #endif #if ! defined(vload_module) && defined(start_subparse) #if defined(NEED_vload_module) static void DPPP_(my_vload_module)(U32 flags, SV * name, SV * ver, va_list * args); static #else extern void DPPP_(my_vload_module)(U32 flags, SV * name, SV * ver, va_list * args); #endif #if defined(NEED_vload_module) || defined(NEED_vload_module_GLOBAL) #ifdef vload_module # undef vload_module #endif #define vload_module(a,b,c,d) DPPP_(my_vload_module)(aTHX_ a,b,c,d) #define Perl_vload_module DPPP_(my_vload_module) void DPPP_(my_vload_module)(U32 flags, SV *name, SV *ver, va_list *args) { dTHR; dVAR; OP *veop, *imop; OP * const modname = newSVOP(OP_CONST, 0, name); /* 5.005 has a somewhat hacky force_normal that doesn't croak on SvREADONLY() if PL_compiling is true. Current perls take care in ck_require() to correctly turn off SvREADONLY before calling force_normal_flags(). This seems a better fix than fudging PL_compiling */ SvREADONLY_off(((SVOP*)modname)->op_sv); modname->op_private |= OPpCONST_BARE; if (ver) { veop = newSVOP(OP_CONST, 0, ver); } else veop = NULL; if (flags & PERL_LOADMOD_NOIMPORT) { imop = sawparens(newNULLLIST()); } else if (flags & PERL_LOADMOD_IMPORT_OPS) { imop = va_arg(*args, OP*); } else { SV *sv; imop = NULL; sv = va_arg(*args, SV*); while (sv) { imop = append_elem(OP_LIST, imop, newSVOP(OP_CONST, 0, sv)); sv = va_arg(*args, SV*); } } { const line_t ocopline = PL_copline; COP * const ocurcop = PL_curcop; const int oexpect = PL_expect; utilize(!(flags & PERL_LOADMOD_DENY), start_subparse(FALSE, 0), #if (PERL_BCDVERSION > 0x5003000) veop, #endif modname, imop); PL_expect = oexpect; PL_copline = ocopline; PL_curcop = ocurcop; } } #endif #endif #ifndef load_module #if defined(NEED_load_module) static void DPPP_(my_load_module)(U32 flags, SV * name, SV * ver, ...); static #else extern void DPPP_(my_load_module)(U32 flags, SV * name, SV * ver, ...); #endif #if defined(NEED_load_module) || defined(NEED_load_module_GLOBAL) #ifdef load_module # undef load_module #endif #define load_module DPPP_(my_load_module) #define Perl_load_module DPPP_(my_load_module) void DPPP_(my_load_module)(U32 flags, SV *name, SV *ver, ...) { va_list args; va_start(args, ver); vload_module(flags, name, ver, &args); va_end(args); } #endif #endif #ifndef newRV_inc # define newRV_inc(sv) newRV(sv) /* Replace */ #endif #ifndef newRV_noinc #if defined(PERL_USE_GCC_BRACE_GROUPS) # define newRV_noinc(sv) ({ SV *_sv = (SV *)newRV((sv)); SvREFCNT_dec((sv)); _sv; }) #else # define newRV_noinc(sv) ((PL_Sv = (SV *)newRV((sv))), SvREFCNT_dec((sv)), PL_Sv) #endif #endif /* * Boilerplate macros for initializing and accessing interpreter-local * data from C. All statics in extensions should be reworked to use * this, if you want to make the extension thread-safe. See ext/re/re.xs * for an example of the use of these macros. * * Code that uses these macros is responsible for the following: * 1. #define MY_CXT_KEY to a unique string, e.g. "DynaLoader_guts" * 2. Declare a typedef named my_cxt_t that is a structure that contains * all the data that needs to be interpreter-local. * 3. Use the START_MY_CXT macro after the declaration of my_cxt_t. * 4. Use the MY_CXT_INIT macro such that it is called exactly once * (typically put in the BOOT: section). * 5. Use the members of the my_cxt_t structure everywhere as * MY_CXT.member. * 6. Use the dMY_CXT macro (a declaration) in all the functions that * access MY_CXT. */ #if defined(MULTIPLICITY) || defined(PERL_OBJECT) || \ defined(PERL_CAPI) || defined(PERL_IMPLICIT_CONTEXT) #ifndef START_MY_CXT /* This must appear in all extensions that define a my_cxt_t structure, * right after the definition (i.e. at file scope). The non-threads * case below uses it to declare the data as static. */ #define START_MY_CXT #if (PERL_BCDVERSION < 0x5004068) /* Fetches the SV that keeps the per-interpreter data. */ #define dMY_CXT_SV \ SV *my_cxt_sv = get_sv(MY_CXT_KEY, FALSE) #else /* >= perl5.004_68 */ #define dMY_CXT_SV \ SV *my_cxt_sv = *hv_fetch(PL_modglobal, MY_CXT_KEY, \ sizeof(MY_CXT_KEY)-1, TRUE) #endif /* < perl5.004_68 */ /* This declaration should be used within all functions that use the * interpreter-local data. */ #define dMY_CXT \ dMY_CXT_SV; \ my_cxt_t *my_cxtp = INT2PTR(my_cxt_t*,SvUV(my_cxt_sv)) /* Creates and zeroes the per-interpreter data. * (We allocate my_cxtp in a Perl SV so that it will be released when * the interpreter goes away.) */ #define MY_CXT_INIT \ dMY_CXT_SV; \ /* newSV() allocates one more than needed */ \ my_cxt_t *my_cxtp = (my_cxt_t*)SvPVX(newSV(sizeof(my_cxt_t)-1));\ Zero(my_cxtp, 1, my_cxt_t); \ sv_setuv(my_cxt_sv, PTR2UV(my_cxtp)) /* This macro must be used to access members of the my_cxt_t structure. * e.g. MYCXT.some_data */ #define MY_CXT (*my_cxtp) /* Judicious use of these macros can reduce the number of times dMY_CXT * is used. Use is similar to pTHX, aTHX etc. */ #define pMY_CXT my_cxt_t *my_cxtp #define pMY_CXT_ pMY_CXT, #define _pMY_CXT ,pMY_CXT #define aMY_CXT my_cxtp #define aMY_CXT_ aMY_CXT, #define _aMY_CXT ,aMY_CXT #endif /* START_MY_CXT */ #ifndef MY_CXT_CLONE /* Clones the per-interpreter data. */ #define MY_CXT_CLONE \ dMY_CXT_SV; \ my_cxt_t *my_cxtp = (my_cxt_t*)SvPVX(newSV(sizeof(my_cxt_t)-1));\ Copy(INT2PTR(my_cxt_t*, SvUV(my_cxt_sv)), my_cxtp, 1, my_cxt_t);\ sv_setuv(my_cxt_sv, PTR2UV(my_cxtp)) #endif #else /* single interpreter */ #ifndef START_MY_CXT #define START_MY_CXT static my_cxt_t my_cxt; #define dMY_CXT_SV dNOOP #define dMY_CXT dNOOP #define MY_CXT_INIT NOOP #define MY_CXT my_cxt #define pMY_CXT void #define pMY_CXT_ #define _pMY_CXT #define aMY_CXT #define aMY_CXT_ #define _aMY_CXT #endif /* START_MY_CXT */ #ifndef MY_CXT_CLONE #define MY_CXT_CLONE NOOP #endif #endif #ifndef SvREFCNT_inc # ifdef PERL_USE_GCC_BRACE_GROUPS # define SvREFCNT_inc(sv) \ ({ \ SV * const _sv = (SV*)(sv); \ if (_sv) \ (SvREFCNT(_sv))++; \ _sv; \ }) # else # define SvREFCNT_inc(sv) \ ((PL_Sv=(SV*)(sv)) ? (++(SvREFCNT(PL_Sv)),PL_Sv) : NULL) # endif #endif #ifndef SvREFCNT_inc_simple # ifdef PERL_USE_GCC_BRACE_GROUPS # define SvREFCNT_inc_simple(sv) \ ({ \ if (sv) \ (SvREFCNT(sv))++; \ (SV *)(sv); \ }) # else # define SvREFCNT_inc_simple(sv) \ ((sv) ? (SvREFCNT(sv)++,(SV*)(sv)) : NULL) # endif #endif #ifndef SvREFCNT_inc_NN # ifdef PERL_USE_GCC_BRACE_GROUPS # define SvREFCNT_inc_NN(sv) \ ({ \ SV * const _sv = (SV*)(sv); \ SvREFCNT(_sv)++; \ _sv; \ }) # else # define SvREFCNT_inc_NN(sv) \ (PL_Sv=(SV*)(sv),++(SvREFCNT(PL_Sv)),PL_Sv) # endif #endif #ifndef SvREFCNT_inc_void # ifdef PERL_USE_GCC_BRACE_GROUPS # define SvREFCNT_inc_void(sv) \ ({ \ SV * const _sv = (SV*)(sv); \ if (_sv) \ (void)(SvREFCNT(_sv)++); \ }) # else # define SvREFCNT_inc_void(sv) \ (void)((PL_Sv=(SV*)(sv)) ? ++(SvREFCNT(PL_Sv)) : 0) # endif #endif #ifndef SvREFCNT_inc_simple_void # define SvREFCNT_inc_simple_void(sv) STMT_START { if (sv) SvREFCNT(sv)++; } STMT_END #endif #ifndef SvREFCNT_inc_simple_NN # define SvREFCNT_inc_simple_NN(sv) (++SvREFCNT(sv), (SV*)(sv)) #endif #ifndef SvREFCNT_inc_void_NN # define SvREFCNT_inc_void_NN(sv) (void)(++SvREFCNT((SV*)(sv))) #endif #ifndef SvREFCNT_inc_simple_void_NN # define SvREFCNT_inc_simple_void_NN(sv) (void)(++SvREFCNT((SV*)(sv))) #endif #ifndef newSV_type #if defined(PERL_USE_GCC_BRACE_GROUPS) # define newSV_type(t) ({ SV *_sv = newSV(0); sv_upgrade(_sv, (t)); _sv; }) #else # define newSV_type(t) ((PL_Sv = newSV(0)), sv_upgrade(PL_Sv, (t)), PL_Sv) #endif #endif #if (PERL_BCDVERSION < 0x5006000) # define D_PPP_CONSTPV_ARG(x) ((char *) (x)) #else # define D_PPP_CONSTPV_ARG(x) (x) #endif #ifndef newSVpvn # define newSVpvn(data,len) ((data) \ ? ((len) ? newSVpv((data), (len)) : newSVpv("", 0)) \ : newSV(0)) #endif #ifndef newSVpvn_utf8 # define newSVpvn_utf8(s, len, u) newSVpvn_flags((s), (len), (u) ? SVf_UTF8 : 0) #endif #ifndef SVf_UTF8 # define SVf_UTF8 0 #endif #ifndef newSVpvn_flags #if defined(PERL_USE_GCC_BRACE_GROUPS) # define newSVpvn_flags(s, len, flags) ({ SV *_sv = newSVpvn(D_PPP_CONSTPV_ARG((s)), (len)); SvFLAGS(_sv) |= ((flags) & SVf_UTF8); ((flags) & SVs_TEMP) ? sv_2mortal(_sv) : _sv; }) #else # define newSVpvn_flags(s, len, flags) ((PL_Sv = newSVpvn(D_PPP_CONSTPV_ARG((s)), (len))), SvFLAGS(PL_Sv) |= ((flags) & SVf_UTF8), (((flags) & SVs_TEMP) ? sv_2mortal(PL_Sv) : PL_Sv)) #endif #endif #ifndef SV_NOSTEAL # define SV_NOSTEAL 16 #endif #if ( (PERL_BCDVERSION >= 0x5007003) && (PERL_BCDVERSION < 0x5008007) ) || ( (PERL_BCDVERSION >= 0x5009000) && (PERL_BCDVERSION < 0x5009002) ) #undef sv_setsv_flags #if defined(PERL_USE_GCC_BRACE_GROUPS) #define sv_setsv_flags(dstr, sstr, flags) \ STMT_START { \ if (((flags) & SV_NOSTEAL) && (sstr) && (SvFLAGS((SV *)(sstr)) & SVs_TEMP)) { \ SvTEMP_off((SV *)(sstr)); \ Perl_sv_setsv_flags(aTHX_ (dstr), (sstr), (flags) & ~SV_NOSTEAL); \ SvTEMP_on((SV *)(sstr)); \ } else { \ Perl_sv_setsv_flags(aTHX_ (dstr), (sstr), (flags) & ~SV_NOSTEAL); \ } \ } STMT_END #else ( \ (((flags) & SV_NOSTEAL) && (sstr) && (SvFLAGS((SV *)(sstr)) & SVs_TEMP)) ? ( \ SvTEMP_off((SV *)(sstr)), \ Perl_sv_setsv_flags(aTHX_ (dstr), (sstr), (flags) & ~SV_NOSTEAL), \ SvTEMP_on((SV *)(sstr)), \ 1 \ ) : ( \ Perl_sv_setsv_flags(aTHX_ (dstr), (sstr), (flags) & ~SV_NOSTEAL), \ 1 \ ) \ ) #endif #endif #if defined(PERL_USE_GCC_BRACE_GROUPS) #ifndef sv_setsv_flags # define sv_setsv_flags(dstr, sstr, flags) \ STMT_START { \ if (((flags) & SV_NOSTEAL) && (sstr) && (SvFLAGS((SV *)(sstr)) & SVs_TEMP)) { \ SvTEMP_off((SV *)(sstr)); \ if (!((flags) & SV_GMAGIC) && (sstr) && SvGMAGICAL((SV *)(sstr))) { \ SvGMAGICAL_off((SV *)(sstr)); \ sv_setsv((dstr), (sstr)); \ SvGMAGICAL_on((SV *)(sstr)); \ } else { \ sv_setsv((dstr), (sstr)); \ } \ SvTEMP_on((SV *)(sstr)); \ } else { \ if (!((flags) & SV_GMAGIC) && (sstr) && SvGMAGICAL((SV *)(sstr))) { \ SvGMAGICAL_off((SV *)(sstr)); \ sv_setsv((dstr), (sstr)); \ SvGMAGICAL_on((SV *)(sstr)); \ } else { \ sv_setsv((dstr), (sstr)); \ } \ } \ } STMT_END #endif #else #ifndef sv_setsv_flags # define sv_setsv_flags(dstr, sstr, flags) \ ( \ (((flags) & SV_NOSTEAL) && (sstr) && (SvFLAGS((SV *)(sstr)) & SVs_TEMP)) ? ( \ SvTEMP_off((SV *)(sstr)), \ (!((flags) & SV_GMAGIC) && (sstr) && SvGMAGICAL((SV *)(sstr))) ? ( \ SvGMAGICAL_off((SV *)(sstr)), \ sv_setsv((dstr), (sstr)), \ SvGMAGICAL_on((SV *)(sstr)), \ 1 \ ) : ( \ sv_setsv((dstr), (sstr)), \ 1 \ ), \ SvTEMP_on((SV *)(sstr)), \ 1 \ ) : ( \ (!((flags) & SV_GMAGIC) && (sstr) && SvGMAGICAL((SV *)(sstr))) ? ( \ SvGMAGICAL_off((SV *)(sstr)), \ sv_setsv((dstr), (sstr)), \ SvGMAGICAL_on((SV *)(sstr)), \ 1 \ ) : ( \ sv_setsv((dstr), (sstr)), \ 1 \ ) \ ) \ ) #endif #endif #if defined(PERL_USE_GCC_BRACE_GROUPS) #ifndef newSVsv_flags # define newSVsv_flags(sv, flags) ({ SV *_sv = newSV(0); sv_setsv_flags(_sv, (sv), (flags)); _sv; }) #endif #else #ifndef newSVsv_flags # define newSVsv_flags(sv, flags) ((PL_Sv = newSV(0)), sv_setsv_flags(PL_Sv, (sv), (flags)), PL_Sv) #endif #endif #ifndef newSVsv_nomg # define newSVsv_nomg(sv) newSVsv_flags((sv), SV_NOSTEAL) #endif #if (PERL_BCDVERSION >= 0x5017005) #ifndef sv_mortalcopy_flags # define sv_mortalcopy_flags(sv, flags) Perl_sv_mortalcopy_flags(aTHX_ (sv), (flags)) #endif #else #ifndef sv_mortalcopy_flags # define sv_mortalcopy_flags(sv, flags) sv_2mortal(newSVsv_flags((sv), (flags))) #endif #endif #ifndef SvMAGIC_set # define SvMAGIC_set(sv, val) \ STMT_START { assert(SvTYPE(sv) >= SVt_PVMG); \ (((XPVMG*) SvANY(sv))->xmg_magic = (val)); } STMT_END #endif #if (PERL_BCDVERSION < 0x5009003) #ifndef SvPVX_const # define SvPVX_const(sv) ((const char*) (0 + SvPVX(sv))) #endif #ifndef SvPVX_mutable # define SvPVX_mutable(sv) (0 + SvPVX(sv)) #endif #ifndef SvRV_set # define SvRV_set(sv, val) \ STMT_START { assert(SvTYPE(sv) >= SVt_RV); \ (((XRV*) SvANY(sv))->xrv_rv = (val)); } STMT_END #endif #else #ifndef SvPVX_const # define SvPVX_const(sv) ((const char*)((sv)->sv_u.svu_pv)) #endif #ifndef SvPVX_mutable # define SvPVX_mutable(sv) ((sv)->sv_u.svu_pv) #endif #ifndef SvRV_set # define SvRV_set(sv, val) \ STMT_START { assert(SvTYPE(sv) >= SVt_RV); \ ((sv)->sv_u.svu_rv = (val)); } STMT_END #endif #endif #ifndef SvSTASH_set # define SvSTASH_set(sv, val) \ STMT_START { assert(SvTYPE(sv) >= SVt_PVMG); \ (((XPVMG*) SvANY(sv))->xmg_stash = (val)); } STMT_END #endif #if (PERL_BCDVERSION < 0x5004000) #ifndef SvUV_set # define SvUV_set(sv, val) \ STMT_START { assert(SvTYPE(sv) == SVt_IV || SvTYPE(sv) >= SVt_PVIV); \ (((XPVIV*) SvANY(sv))->xiv_iv = (IV) (val)); } STMT_END #endif #else #ifndef SvUV_set # define SvUV_set(sv, val) \ STMT_START { assert(SvTYPE(sv) == SVt_IV || SvTYPE(sv) >= SVt_PVIV); \ (((XPVUV*) SvANY(sv))->xuv_uv = (val)); } STMT_END #endif #endif /* Hint: newSVpvn_share * The SVs created by this function only mimic the behaviour of * shared PVs without really being shared. Only use if you know * what you're doing. */ #ifndef newSVpvn_share #if defined(NEED_newSVpvn_share) static SV * DPPP_(my_newSVpvn_share)(pTHX_ const char * s, I32 len, U32 hash); static #else extern SV * DPPP_(my_newSVpvn_share)(pTHX_ const char * s, I32 len, U32 hash); #endif #if defined(NEED_newSVpvn_share) || defined(NEED_newSVpvn_share_GLOBAL) #ifdef newSVpvn_share # undef newSVpvn_share #endif #define newSVpvn_share(a,b,c) DPPP_(my_newSVpvn_share)(aTHX_ a,b,c) #define Perl_newSVpvn_share DPPP_(my_newSVpvn_share) SV * DPPP_(my_newSVpvn_share)(pTHX_ const char *s, I32 len, U32 hash) { SV *sv; if (len < 0) len = -len; if (!hash) PERL_HASH(hash, (char*) s, len); sv = newSVpvn((char *) s, len); sv_upgrade(sv, SVt_PVIV); SvIVX(sv) = hash; SvREADONLY_on(sv); SvPOK_on(sv); return sv; } #endif #endif #ifndef SvSHARED_HASH # define SvSHARED_HASH(sv) (0 + SvUVX(sv)) #endif #ifndef HvNAME_get # define HvNAME_get(hv) HvNAME(hv) #endif #ifndef HvNAMELEN_get # define HvNAMELEN_get(hv) (HvNAME_get(hv) ? (I32)strlen(HvNAME_get(hv)) : 0) #endif #if (PERL_BCDVERSION >= 0x5009002) && (PERL_BCDVERSION <= 0x5009003) /* 5.9.2 and 5.9.3 ignore the length param */ #undef gv_fetchpvn_flags #endif #ifdef GV_NOADD_MASK # define D_PPP_GV_NOADD_MASK GV_NOADD_MASK #else # define D_PPP_GV_NOADD_MASK 0xE0 #endif #ifndef gv_fetchpvn_flags # define gv_fetchpvn_flags(name, len, flags, sv_type) gv_fetchpv(SvPVX(sv_2mortal(newSVpvn((name), (len)))), ((flags) & D_PPP_GV_NOADD_MASK) ? FALSE : TRUE, (I32)(sv_type)) #endif #ifndef GvSVn # define GvSVn(gv) GvSV(gv) #endif #ifndef isGV_with_GP # define isGV_with_GP(gv) isGV(gv) #endif #ifndef gv_fetchsv # define gv_fetchsv(name, flags, svt) gv_fetchpv(SvPV_nolen_const(name), flags, svt) #endif #ifndef get_cvn_flags # define get_cvn_flags(name, namelen, flags) get_cv(name, flags) #endif #ifndef gv_init_pvn # define gv_init_pvn(gv, stash, ptr, len, flags) gv_init(gv, stash, ptr, len, flags & GV_ADDMULTI ? TRUE : FALSE) #endif /* concatenating with "" ensures that only literal strings are accepted as argument * note that STR_WITH_LEN() can't be used as argument to macros or functions that * under some configurations might be macros */ #ifndef STR_WITH_LEN # define STR_WITH_LEN(s) (s ""), (sizeof(s)-1) #endif #ifndef newSVpvs # define newSVpvs(str) newSVpvn(str "", sizeof(str) - 1) #endif #ifndef newSVpvs_flags # define newSVpvs_flags(str, flags) newSVpvn_flags(str "", sizeof(str) - 1, flags) #endif #ifndef newSVpvs_share # define newSVpvs_share(str) newSVpvn_share(str "", sizeof(str) - 1, 0) #endif #ifndef sv_catpvs # define sv_catpvs(sv, str) sv_catpvn(sv, str "", sizeof(str) - 1) #endif #ifndef sv_setpvs # define sv_setpvs(sv, str) sv_setpvn(sv, str "", sizeof(str) - 1) #endif #ifndef hv_fetchs # define hv_fetchs(hv, key, lval) hv_fetch(hv, key "", sizeof(key) - 1, lval) #endif #ifndef hv_stores # define hv_stores(hv, key, val) hv_store(hv, key "", sizeof(key) - 1, val, 0) #endif #ifndef gv_fetchpvs # define gv_fetchpvs(name, flags, svt) gv_fetchpvn_flags(name "", sizeof(name) - 1, flags, svt) #endif #ifndef gv_stashpvs # define gv_stashpvs(name, flags) gv_stashpvn(name "", sizeof(name) - 1, flags) #endif #ifndef get_cvs # define get_cvs(name, flags) get_cvn_flags(name "", sizeof(name)-1, flags) #endif #ifndef SvGETMAGIC # define SvGETMAGIC(x) STMT_START { if (SvGMAGICAL(x)) mg_get(x); } STMT_END #endif /* That's the best we can do... */ #ifndef sv_catpvn_nomg # define sv_catpvn_nomg sv_catpvn #endif #ifndef sv_catsv_nomg # define sv_catsv_nomg sv_catsv #endif #ifndef sv_setsv_nomg # define sv_setsv_nomg sv_setsv #endif #ifndef sv_pvn_nomg # define sv_pvn_nomg sv_pvn #endif #ifdef SVf_IVisUV #if defined(PERL_USE_GCC_BRACE_GROUPS) #ifndef SvIV_nomg # define SvIV_nomg(sv) (!SvGMAGICAL((sv)) ? SvIV((sv)) : ({ SV *_sviv = sv_mortalcopy_flags((sv), SV_NOSTEAL); IV _iv = SvIV(_sviv); SvFLAGS((sv)) = (SvFLAGS((sv)) & ~SVf_IVisUV) | (SvFLAGS(_sviv) & SVf_IVisUV); _iv; })) #endif #ifndef SvUV_nomg # define SvUV_nomg(sv) (!SvGMAGICAL((sv)) ? SvUV((sv)) : ({ SV *_svuv = sv_mortalcopy_flags((sv), SV_NOSTEAL); UV _uv = SvUV(_svuv); SvFLAGS((sv)) = (SvFLAGS((sv)) & ~SVf_IVisUV) | (SvFLAGS(_svuv) & SVf_IVisUV); _uv; })) #endif #else #ifndef SvIV_nomg # define SvIV_nomg(sv) (!SvGMAGICAL((sv)) ? SvIV((sv)) : ((PL_Sv = sv_mortalcopy_flags((sv), SV_NOSTEAL)), sv_upgrade(PL_Sv, SVt_PVIV), (SvIVX(PL_Sv) = SvIV(PL_Sv)), (SvFLAGS((sv)) = (SvFLAGS((sv)) & ~SVf_IVisUV) | (SvFLAGS(PL_Sv) & SVf_IVisUV)), SvIVX(PL_Sv))) #endif #ifndef SvUV_nomg # define SvUV_nomg(sv) (!SvGMAGICAL((sv)) ? SvIV((sv)) : ((PL_Sv = sv_mortalcopy_flags((sv), SV_NOSTEAL)), sv_upgrade(PL_Sv, SVt_PVIV), (SvUVX(PL_Sv) = SvUV(PL_Sv)), (SvFLAGS((sv)) = (SvFLAGS((sv)) & ~SVf_IVisUV) | (SvFLAGS(PL_Sv) & SVf_IVisUV)), SvUVX(PL_Sv))) #endif #endif #else #ifndef SvIV_nomg # define SvIV_nomg(sv) (!SvGMAGICAL((sv)) ? SvIV((sv)) : SvIVx(sv_mortalcopy_flags((sv), SV_NOSTEAL))) #endif #ifndef SvUV_nomg # define SvUV_nomg(sv) (!SvGMAGICAL((sv)) ? SvUV((sv)) : SvUVx(sv_mortalcopy_flags((sv), SV_NOSTEAL))) #endif #endif #ifndef SvNV_nomg # define SvNV_nomg(sv) (!SvGMAGICAL((sv)) ? SvNV((sv)) : SvNVx(sv_mortalcopy_flags((sv), SV_NOSTEAL))) #endif #ifndef SvTRUE_nomg # define SvTRUE_nomg(sv) (!SvGMAGICAL((sv)) ? SvTRUE((sv)) : SvTRUEx(sv_mortalcopy_flags((sv), SV_NOSTEAL))) #endif #ifndef sv_catpv_mg # define sv_catpv_mg(sv, ptr) \ STMT_START { \ SV *TeMpSv = sv; \ sv_catpv(TeMpSv,ptr); \ SvSETMAGIC(TeMpSv); \ } STMT_END #endif #ifndef sv_catpvn_mg # define sv_catpvn_mg(sv, ptr, len) \ STMT_START { \ SV *TeMpSv = sv; \ sv_catpvn(TeMpSv,ptr,len); \ SvSETMAGIC(TeMpSv); \ } STMT_END #endif #ifndef sv_catsv_mg # define sv_catsv_mg(dsv, ssv) \ STMT_START { \ SV *TeMpSv = dsv; \ sv_catsv(TeMpSv,ssv); \ SvSETMAGIC(TeMpSv); \ } STMT_END #endif #ifndef sv_setiv_mg # define sv_setiv_mg(sv, i) \ STMT_START { \ SV *TeMpSv = sv; \ sv_setiv(TeMpSv,i); \ SvSETMAGIC(TeMpSv); \ } STMT_END #endif #ifndef sv_setnv_mg # define sv_setnv_mg(sv, num) \ STMT_START { \ SV *TeMpSv = sv; \ sv_setnv(TeMpSv,num); \ SvSETMAGIC(TeMpSv); \ } STMT_END #endif #ifndef sv_setpv_mg # define sv_setpv_mg(sv, ptr) \ STMT_START { \ SV *TeMpSv = sv; \ sv_setpv(TeMpSv,ptr); \ SvSETMAGIC(TeMpSv); \ } STMT_END #endif #ifndef sv_setpvn_mg # define sv_setpvn_mg(sv, ptr, len) \ STMT_START { \ SV *TeMpSv = sv; \ sv_setpvn(TeMpSv,ptr,len); \ SvSETMAGIC(TeMpSv); \ } STMT_END #endif #ifndef sv_setsv_mg # define sv_setsv_mg(dsv, ssv) \ STMT_START { \ SV *TeMpSv = dsv; \ sv_setsv(TeMpSv,ssv); \ SvSETMAGIC(TeMpSv); \ } STMT_END #endif #ifndef sv_setuv_mg # define sv_setuv_mg(sv, i) \ STMT_START { \ SV *TeMpSv = sv; \ sv_setuv(TeMpSv,i); \ SvSETMAGIC(TeMpSv); \ } STMT_END #endif #ifndef sv_usepvn_mg # define sv_usepvn_mg(sv, ptr, len) \ STMT_START { \ SV *TeMpSv = sv; \ sv_usepvn(TeMpSv,ptr,len); \ SvSETMAGIC(TeMpSv); \ } STMT_END #endif #ifndef SvVSTRING_mg # define SvVSTRING_mg(sv) (SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_vstring) : NULL) #endif /* Hint: sv_magic_portable * This is a compatibility function that is only available with * Devel::PPPort. It is NOT in the perl core. * Its purpose is to mimic the 5.8.0 behaviour of sv_magic() when * it is being passed a name pointer with namlen == 0. In that * case, perl 5.8.0 and later store the pointer, not a copy of it. * The compatibility can be provided back to perl 5.004. With * earlier versions, the code will not compile. */ #if (PERL_BCDVERSION < 0x5004000) /* code that uses sv_magic_portable will not compile */ #elif (PERL_BCDVERSION < 0x5008000) # define sv_magic_portable(sv, obj, how, name, namlen) \ STMT_START { \ SV *SvMp_sv = (sv); \ char *SvMp_name = (char *) (name); \ I32 SvMp_namlen = (namlen); \ if (SvMp_name && SvMp_namlen == 0) \ { \ MAGIC *mg; \ sv_magic(SvMp_sv, obj, how, 0, 0); \ mg = SvMAGIC(SvMp_sv); \ mg->mg_len = -42; /* XXX: this is the tricky part */ \ mg->mg_ptr = SvMp_name; \ } \ else \ { \ sv_magic(SvMp_sv, obj, how, SvMp_name, SvMp_namlen); \ } \ } STMT_END #else # define sv_magic_portable(a, b, c, d, e) sv_magic(a, b, c, d, e) #endif #if !defined(mg_findext) #if defined(NEED_mg_findext) static MAGIC * DPPP_(my_mg_findext)(const SV * sv, int type, const MGVTBL * vtbl); static #else extern MAGIC * DPPP_(my_mg_findext)(const SV * sv, int type, const MGVTBL * vtbl); #endif #if defined(NEED_mg_findext) || defined(NEED_mg_findext_GLOBAL) #define mg_findext DPPP_(my_mg_findext) #define Perl_mg_findext DPPP_(my_mg_findext) MAGIC * DPPP_(my_mg_findext)(const SV * sv, int type, const MGVTBL *vtbl) { if (sv) { MAGIC *mg; #ifdef AvPAD_NAMELIST assert(!(SvTYPE(sv) == SVt_PVAV && AvPAD_NAMELIST(sv))); #endif for (mg = SvMAGIC (sv); mg; mg = mg->mg_moremagic) { if (mg->mg_type == type && mg->mg_virtual == vtbl) return mg; } } return NULL; } #endif #endif #if !defined(sv_unmagicext) #if defined(NEED_sv_unmagicext) static int DPPP_(my_sv_unmagicext)(pTHX_ SV * const sv, const int type, MGVTBL * vtbl); static #else extern int DPPP_(my_sv_unmagicext)(pTHX_ SV * const sv, const int type, MGVTBL * vtbl); #endif #if defined(NEED_sv_unmagicext) || defined(NEED_sv_unmagicext_GLOBAL) #ifdef sv_unmagicext # undef sv_unmagicext #endif #define sv_unmagicext(a,b,c) DPPP_(my_sv_unmagicext)(aTHX_ a,b,c) #define Perl_sv_unmagicext DPPP_(my_sv_unmagicext) int DPPP_(my_sv_unmagicext)(pTHX_ SV *const sv, const int type, MGVTBL *vtbl) { MAGIC* mg; MAGIC** mgp; if (SvTYPE(sv) < SVt_PVMG || !SvMAGIC(sv)) return 0; mgp = &(SvMAGIC(sv)); for (mg = *mgp; mg; mg = *mgp) { const MGVTBL* const virt = mg->mg_virtual; if (mg->mg_type == type && virt == vtbl) { *mgp = mg->mg_moremagic; if (virt && virt->svt_free) virt->svt_free(aTHX_ sv, mg); if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) { if (mg->mg_len > 0) Safefree(mg->mg_ptr); else if (mg->mg_len == HEf_SVKEY) /* Questionable on older perls... */ SvREFCNT_dec(MUTABLE_SV(mg->mg_ptr)); else if (mg->mg_type == PERL_MAGIC_utf8) Safefree(mg->mg_ptr); } if (mg->mg_flags & MGf_REFCOUNTED) SvREFCNT_dec(mg->mg_obj); Safefree(mg); } else mgp = &mg->mg_moremagic; } if (SvMAGIC(sv)) { if (SvMAGICAL(sv)) /* if we're under save_magic, wait for restore_magic; */ mg_magical(sv); /* else fix the flags now */ } else { SvMAGICAL_off(sv); SvFLAGS(sv) |= (SvFLAGS(sv) & (SVp_IOK|SVp_NOK|SVp_POK)) >> PRIVSHIFT; } return 0; } #endif #endif #ifdef USE_ITHREADS #ifndef CopFILE # define CopFILE(c) ((c)->cop_file) #endif #ifndef CopFILEGV # define CopFILEGV(c) (CopFILE(c) ? gv_fetchfile(CopFILE(c)) : Nullgv) #endif #ifndef CopFILE_set # define CopFILE_set(c,pv) ((c)->cop_file = savepv(pv)) #endif #ifndef CopFILESV # define CopFILESV(c) (CopFILE(c) ? GvSV(gv_fetchfile(CopFILE(c))) : Nullsv) #endif #ifndef CopFILEAV # define CopFILEAV(c) (CopFILE(c) ? GvAV(gv_fetchfile(CopFILE(c))) : Nullav) #endif #ifndef CopSTASHPV # define CopSTASHPV(c) ((c)->cop_stashpv) #endif #ifndef CopSTASHPV_set # define CopSTASHPV_set(c,pv) ((c)->cop_stashpv = ((pv) ? savepv(pv) : Nullch)) #endif #ifndef CopSTASH # define CopSTASH(c) (CopSTASHPV(c) ? gv_stashpv(CopSTASHPV(c),GV_ADD) : Nullhv) #endif #ifndef CopSTASH_set # define CopSTASH_set(c,hv) CopSTASHPV_set(c, (hv) ? HvNAME(hv) : Nullch) #endif #ifndef CopSTASH_eq # define CopSTASH_eq(c,hv) ((hv) && (CopSTASHPV(c) == HvNAME(hv) \ || (CopSTASHPV(c) && HvNAME(hv) \ && strEQ(CopSTASHPV(c), HvNAME(hv))))) #endif #else #ifndef CopFILEGV # define CopFILEGV(c) ((c)->cop_filegv) #endif #ifndef CopFILEGV_set # define CopFILEGV_set(c,gv) ((c)->cop_filegv = (GV*)SvREFCNT_inc(gv)) #endif #ifndef CopFILE_set # define CopFILE_set(c,pv) CopFILEGV_set((c), gv_fetchfile(pv)) #endif #ifndef CopFILESV # define CopFILESV(c) (CopFILEGV(c) ? GvSV(CopFILEGV(c)) : Nullsv) #endif #ifndef CopFILEAV # define CopFILEAV(c) (CopFILEGV(c) ? GvAV(CopFILEGV(c)) : Nullav) #endif #ifndef CopFILE # define CopFILE(c) (CopFILESV(c) ? SvPVX(CopFILESV(c)) : Nullch) #endif #ifndef CopSTASH # define CopSTASH(c) ((c)->cop_stash) #endif #ifndef CopSTASH_set # define CopSTASH_set(c,hv) ((c)->cop_stash = (hv)) #endif #ifndef CopSTASHPV # define CopSTASHPV(c) (CopSTASH(c) ? HvNAME(CopSTASH(c)) : Nullch) #endif #ifndef CopSTASHPV_set # define CopSTASHPV_set(c,pv) CopSTASH_set((c), gv_stashpv(pv,GV_ADD)) #endif #ifndef CopSTASH_eq # define CopSTASH_eq(c,hv) (CopSTASH(c) == (hv)) #endif #endif /* USE_ITHREADS */ #if (PERL_BCDVERSION >= 0x5006000) #ifndef caller_cx # if defined(NEED_caller_cx) || defined(NEED_caller_cx_GLOBAL) static I32 DPPP_dopoptosub_at(const PERL_CONTEXT *cxstk, I32 startingblock) { I32 i; for (i = startingblock; i >= 0; i--) { const PERL_CONTEXT * const cx = &cxstk[i]; switch (CxTYPE(cx)) { default: continue; case CXt_EVAL: case CXt_SUB: case CXt_FORMAT: return i; } } return i; } # endif # if defined(NEED_caller_cx) static const PERL_CONTEXT * DPPP_(my_caller_cx)(pTHX_ I32 level, const PERL_CONTEXT * * dbcxp); static #else extern const PERL_CONTEXT * DPPP_(my_caller_cx)(pTHX_ I32 level, const PERL_CONTEXT * * dbcxp); #endif #if defined(NEED_caller_cx) || defined(NEED_caller_cx_GLOBAL) #ifdef caller_cx # undef caller_cx #endif #define caller_cx(a,b) DPPP_(my_caller_cx)(aTHX_ a,b) #define Perl_caller_cx DPPP_(my_caller_cx) const PERL_CONTEXT * DPPP_(my_caller_cx)(pTHX_ I32 level, const PERL_CONTEXT **dbcxp) { I32 cxix = DPPP_dopoptosub_at(cxstack, cxstack_ix); const PERL_CONTEXT *cx; const PERL_CONTEXT *ccstack = cxstack; const PERL_SI *top_si = PL_curstackinfo; for (;;) { /* we may be in a higher stacklevel, so dig down deeper */ while (cxix < 0 && top_si->si_type != PERLSI_MAIN) { top_si = top_si->si_prev; ccstack = top_si->si_cxstack; cxix = DPPP_dopoptosub_at(ccstack, top_si->si_cxix); } if (cxix < 0) return NULL; /* caller() should not report the automatic calls to &DB::sub */ if (PL_DBsub && GvCV(PL_DBsub) && cxix >= 0 && ccstack[cxix].blk_sub.cv == GvCV(PL_DBsub)) level++; if (!level--) break; cxix = DPPP_dopoptosub_at(ccstack, cxix - 1); } cx = &ccstack[cxix]; if (dbcxp) *dbcxp = cx; if (CxTYPE(cx) == CXt_SUB || CxTYPE(cx) == CXt_FORMAT) { const I32 dbcxix = DPPP_dopoptosub_at(ccstack, cxix - 1); /* We expect that ccstack[dbcxix] is CXt_SUB, anyway, the field below is defined for any cx. */ /* caller() should not report the automatic calls to &DB::sub */ if (PL_DBsub && GvCV(PL_DBsub) && dbcxix >= 0 && ccstack[dbcxix].blk_sub.cv == GvCV(PL_DBsub)) cx = &ccstack[dbcxix]; } return cx; } # endif #endif /* caller_cx */ #endif /* 5.6.0 */ #ifndef IN_PERL_COMPILETIME # define IN_PERL_COMPILETIME (PL_curcop == &PL_compiling) #endif #ifndef IN_LOCALE_RUNTIME # define IN_LOCALE_RUNTIME (PL_curcop->op_private & HINT_LOCALE) #endif #ifndef IN_LOCALE_COMPILETIME # define IN_LOCALE_COMPILETIME (PL_hints & HINT_LOCALE) #endif #ifndef IN_LOCALE # define IN_LOCALE (IN_PERL_COMPILETIME ? IN_LOCALE_COMPILETIME : IN_LOCALE_RUNTIME) #endif #ifndef IS_NUMBER_IN_UV # define IS_NUMBER_IN_UV 0x01 #endif #ifndef IS_NUMBER_GREATER_THAN_UV_MAX # define IS_NUMBER_GREATER_THAN_UV_MAX 0x02 #endif #ifndef IS_NUMBER_NOT_INT # define IS_NUMBER_NOT_INT 0x04 #endif #ifndef IS_NUMBER_NEG # define IS_NUMBER_NEG 0x08 #endif #ifndef IS_NUMBER_INFINITY # define IS_NUMBER_INFINITY 0x10 #endif #ifndef IS_NUMBER_NAN # define IS_NUMBER_NAN 0x20 #endif #ifndef GROK_NUMERIC_RADIX # define GROK_NUMERIC_RADIX(sp, send) grok_numeric_radix(sp, send) #endif #ifndef PERL_SCAN_GREATER_THAN_UV_MAX # define PERL_SCAN_GREATER_THAN_UV_MAX 0x02 #endif #ifndef PERL_SCAN_SILENT_ILLDIGIT # define PERL_SCAN_SILENT_ILLDIGIT 0x04 #endif #ifndef PERL_SCAN_ALLOW_UNDERSCORES # define PERL_SCAN_ALLOW_UNDERSCORES 0x01 #endif #ifndef PERL_SCAN_DISALLOW_PREFIX # define PERL_SCAN_DISALLOW_PREFIX 0x02 #endif #ifndef grok_numeric_radix #if defined(NEED_grok_numeric_radix) static bool DPPP_(my_grok_numeric_radix)(pTHX_ const char * * sp, const char * send); static #else extern bool DPPP_(my_grok_numeric_radix)(pTHX_ const char * * sp, const char * send); #endif #if defined(NEED_grok_numeric_radix) || defined(NEED_grok_numeric_radix_GLOBAL) #ifdef grok_numeric_radix # undef grok_numeric_radix #endif #define grok_numeric_radix(a,b) DPPP_(my_grok_numeric_radix)(aTHX_ a,b) #define Perl_grok_numeric_radix DPPP_(my_grok_numeric_radix) bool DPPP_(my_grok_numeric_radix)(pTHX_ const char **sp, const char *send) { #ifdef USE_LOCALE_NUMERIC #ifdef PL_numeric_radix_sv if (PL_numeric_radix_sv && IN_LOCALE) { STRLEN len; char* radix = SvPV(PL_numeric_radix_sv, len); if (*sp + len <= send && memEQ(*sp, radix, len)) { *sp += len; return TRUE; } } #else /* older perls don't have PL_numeric_radix_sv so the radix * must manually be requested from locale.h */ #include dTHR; /* needed for older threaded perls */ struct lconv *lc = localeconv(); char *radix = lc->decimal_point; if (radix && IN_LOCALE) { STRLEN len = strlen(radix); if (*sp + len <= send && memEQ(*sp, radix, len)) { *sp += len; return TRUE; } } #endif #endif /* USE_LOCALE_NUMERIC */ /* always try "." if numeric radix didn't match because * we may have data from different locales mixed */ if (*sp < send && **sp == '.') { ++*sp; return TRUE; } return FALSE; } #endif #endif #ifndef grok_number #if defined(NEED_grok_number) static int DPPP_(my_grok_number)(pTHX_ const char * pv, STRLEN len, UV * valuep); static #else extern int DPPP_(my_grok_number)(pTHX_ const char * pv, STRLEN len, UV * valuep); #endif #if defined(NEED_grok_number) || defined(NEED_grok_number_GLOBAL) #ifdef grok_number # undef grok_number #endif #define grok_number(a,b,c) DPPP_(my_grok_number)(aTHX_ a,b,c) #define Perl_grok_number DPPP_(my_grok_number) int DPPP_(my_grok_number)(pTHX_ const char *pv, STRLEN len, UV *valuep) { const char *s = pv; const char *send = pv + len; const UV max_div_10 = UV_MAX / 10; const char max_mod_10 = UV_MAX % 10; int numtype = 0; int sawinf = 0; int sawnan = 0; while (s < send && isSPACE(*s)) s++; if (s == send) { return 0; } else if (*s == '-') { s++; numtype = IS_NUMBER_NEG; } else if (*s == '+') s++; if (s == send) return 0; /* next must be digit or the radix separator or beginning of infinity */ if (isDIGIT(*s)) { /* UVs are at least 32 bits, so the first 9 decimal digits cannot overflow. */ UV value = *s - '0'; /* This construction seems to be more optimiser friendly. (without it gcc does the isDIGIT test and the *s - '0' separately) With it gcc on arm is managing 6 instructions (6 cycles) per digit. In theory the optimiser could deduce how far to unroll the loop before checking for overflow. */ if (++s < send) { int digit = *s - '0'; if (digit >= 0 && digit <= 9) { value = value * 10 + digit; if (++s < send) { digit = *s - '0'; if (digit >= 0 && digit <= 9) { value = value * 10 + digit; if (++s < send) { digit = *s - '0'; if (digit >= 0 && digit <= 9) { value = value * 10 + digit; if (++s < send) { digit = *s - '0'; if (digit >= 0 && digit <= 9) { value = value * 10 + digit; if (++s < send) { digit = *s - '0'; if (digit >= 0 && digit <= 9) { value = value * 10 + digit; if (++s < send) { digit = *s - '0'; if (digit >= 0 && digit <= 9) { value = value * 10 + digit; if (++s < send) { digit = *s - '0'; if (digit >= 0 && digit <= 9) { value = value * 10 + digit; if (++s < send) { digit = *s - '0'; if (digit >= 0 && digit <= 9) { value = value * 10 + digit; if (++s < send) { /* Now got 9 digits, so need to check each time for overflow. */ digit = *s - '0'; while (digit >= 0 && digit <= 9 && (value < max_div_10 || (value == max_div_10 && digit <= max_mod_10))) { value = value * 10 + digit; if (++s < send) digit = *s - '0'; else break; } if (digit >= 0 && digit <= 9 && (s < send)) { /* value overflowed. skip the remaining digits, don't worry about setting *valuep. */ do { s++; } while (s < send && isDIGIT(*s)); numtype |= IS_NUMBER_GREATER_THAN_UV_MAX; goto skip_value; } } } } } } } } } } } } } } } } } } numtype |= IS_NUMBER_IN_UV; if (valuep) *valuep = value; skip_value: if (GROK_NUMERIC_RADIX(&s, send)) { numtype |= IS_NUMBER_NOT_INT; while (s < send && isDIGIT(*s)) /* optional digits after the radix */ s++; } } else if (GROK_NUMERIC_RADIX(&s, send)) { numtype |= IS_NUMBER_NOT_INT | IS_NUMBER_IN_UV; /* valuep assigned below */ /* no digits before the radix means we need digits after it */ if (s < send && isDIGIT(*s)) { do { s++; } while (s < send && isDIGIT(*s)); if (valuep) { /* integer approximation is valid - it's 0. */ *valuep = 0; } } else return 0; } else if (*s == 'I' || *s == 'i') { s++; if (s == send || (*s != 'N' && *s != 'n')) return 0; s++; if (s == send || (*s != 'F' && *s != 'f')) return 0; s++; if (s < send && (*s == 'I' || *s == 'i')) { s++; if (s == send || (*s != 'N' && *s != 'n')) return 0; s++; if (s == send || (*s != 'I' && *s != 'i')) return 0; s++; if (s == send || (*s != 'T' && *s != 't')) return 0; s++; if (s == send || (*s != 'Y' && *s != 'y')) return 0; s++; } sawinf = 1; } else if (*s == 'N' || *s == 'n') { /* XXX TODO: There are signaling NaNs and quiet NaNs. */ s++; if (s == send || (*s != 'A' && *s != 'a')) return 0; s++; if (s == send || (*s != 'N' && *s != 'n')) return 0; s++; sawnan = 1; } else return 0; if (sawinf) { numtype &= IS_NUMBER_NEG; /* Keep track of sign */ numtype |= IS_NUMBER_INFINITY | IS_NUMBER_NOT_INT; } else if (sawnan) { numtype &= IS_NUMBER_NEG; /* Keep track of sign */ numtype |= IS_NUMBER_NAN | IS_NUMBER_NOT_INT; } else if (s < send) { /* we can have an optional exponent part */ if (*s == 'e' || *s == 'E') { /* The only flag we keep is sign. Blow away any "it's UV" */ numtype &= IS_NUMBER_NEG; numtype |= IS_NUMBER_NOT_INT; s++; if (s < send && (*s == '-' || *s == '+')) s++; if (s < send && isDIGIT(*s)) { do { s++; } while (s < send && isDIGIT(*s)); } else return 0; } } while (s < send && isSPACE(*s)) s++; if (s >= send) return numtype; if (len == 10 && memEQ(pv, "0 but true", 10)) { if (valuep) *valuep = 0; return IS_NUMBER_IN_UV; } return 0; } #endif #endif /* * The grok_* routines have been modified to use warn() instead of * Perl_warner(). Also, 'hexdigit' was the former name of PL_hexdigit, * which is why the stack variable has been renamed to 'xdigit'. */ #ifndef grok_bin #if defined(NEED_grok_bin) static UV DPPP_(my_grok_bin)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result); static #else extern UV DPPP_(my_grok_bin)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result); #endif #if defined(NEED_grok_bin) || defined(NEED_grok_bin_GLOBAL) #ifdef grok_bin # undef grok_bin #endif #define grok_bin(a,b,c,d) DPPP_(my_grok_bin)(aTHX_ a,b,c,d) #define Perl_grok_bin DPPP_(my_grok_bin) UV DPPP_(my_grok_bin)(pTHX_ const char *start, STRLEN *len_p, I32 *flags, NV *result) { const char *s = start; STRLEN len = *len_p; UV value = 0; NV value_nv = 0; const UV max_div_2 = UV_MAX / 2; bool allow_underscores = *flags & PERL_SCAN_ALLOW_UNDERSCORES; bool overflowed = FALSE; if (!(*flags & PERL_SCAN_DISALLOW_PREFIX)) { /* strip off leading b or 0b. for compatibility silently suffer "b" and "0b" as valid binary numbers. */ if (len >= 1) { if (s[0] == 'b') { s++; len--; } else if (len >= 2 && s[0] == '0' && s[1] == 'b') { s+=2; len-=2; } } } for (; len-- && *s; s++) { char bit = *s; if (bit == '0' || bit == '1') { /* Write it in this wonky order with a goto to attempt to get the compiler to make the common case integer-only loop pretty tight. With gcc seems to be much straighter code than old scan_bin. */ redo: if (!overflowed) { if (value <= max_div_2) { value = (value << 1) | (bit - '0'); continue; } /* Bah. We're just overflowed. */ warn("Integer overflow in binary number"); overflowed = TRUE; value_nv = (NV) value; } value_nv *= 2.0; /* If an NV has not enough bits in its mantissa to * represent a UV this summing of small low-order numbers * is a waste of time (because the NV cannot preserve * the low-order bits anyway): we could just remember when * did we overflow and in the end just multiply value_nv by the * right amount. */ value_nv += (NV)(bit - '0'); continue; } if (bit == '_' && len && allow_underscores && (bit = s[1]) && (bit == '0' || bit == '1')) { --len; ++s; goto redo; } if (!(*flags & PERL_SCAN_SILENT_ILLDIGIT)) warn("Illegal binary digit '%c' ignored", *s); break; } if ( ( overflowed && value_nv > 4294967295.0) #if UVSIZE > 4 || (!overflowed && value > 0xffffffff ) #endif ) { warn("Binary number > 0b11111111111111111111111111111111 non-portable"); } *len_p = s - start; if (!overflowed) { *flags = 0; return value; } *flags = PERL_SCAN_GREATER_THAN_UV_MAX; if (result) *result = value_nv; return UV_MAX; } #endif #endif #ifndef grok_hex #if defined(NEED_grok_hex) static UV DPPP_(my_grok_hex)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result); static #else extern UV DPPP_(my_grok_hex)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result); #endif #if defined(NEED_grok_hex) || defined(NEED_grok_hex_GLOBAL) #ifdef grok_hex # undef grok_hex #endif #define grok_hex(a,b,c,d) DPPP_(my_grok_hex)(aTHX_ a,b,c,d) #define Perl_grok_hex DPPP_(my_grok_hex) UV DPPP_(my_grok_hex)(pTHX_ const char *start, STRLEN *len_p, I32 *flags, NV *result) { const char *s = start; STRLEN len = *len_p; UV value = 0; NV value_nv = 0; const UV max_div_16 = UV_MAX / 16; bool allow_underscores = *flags & PERL_SCAN_ALLOW_UNDERSCORES; bool overflowed = FALSE; const char *xdigit; if (!(*flags & PERL_SCAN_DISALLOW_PREFIX)) { /* strip off leading x or 0x. for compatibility silently suffer "x" and "0x" as valid hex numbers. */ if (len >= 1) { if (s[0] == 'x') { s++; len--; } else if (len >= 2 && s[0] == '0' && s[1] == 'x') { s+=2; len-=2; } } } for (; len-- && *s; s++) { xdigit = strchr((char *) PL_hexdigit, *s); if (xdigit) { /* Write it in this wonky order with a goto to attempt to get the compiler to make the common case integer-only loop pretty tight. With gcc seems to be much straighter code than old scan_hex. */ redo: if (!overflowed) { if (value <= max_div_16) { value = (value << 4) | ((xdigit - PL_hexdigit) & 15); continue; } warn("Integer overflow in hexadecimal number"); overflowed = TRUE; value_nv = (NV) value; } value_nv *= 16.0; /* If an NV has not enough bits in its mantissa to * represent a UV this summing of small low-order numbers * is a waste of time (because the NV cannot preserve * the low-order bits anyway): we could just remember when * did we overflow and in the end just multiply value_nv by the * right amount of 16-tuples. */ value_nv += (NV)((xdigit - PL_hexdigit) & 15); continue; } if (*s == '_' && len && allow_underscores && s[1] && (xdigit = strchr((char *) PL_hexdigit, s[1]))) { --len; ++s; goto redo; } if (!(*flags & PERL_SCAN_SILENT_ILLDIGIT)) warn("Illegal hexadecimal digit '%c' ignored", *s); break; } if ( ( overflowed && value_nv > 4294967295.0) #if UVSIZE > 4 || (!overflowed && value > 0xffffffff ) #endif ) { warn("Hexadecimal number > 0xffffffff non-portable"); } *len_p = s - start; if (!overflowed) { *flags = 0; return value; } *flags = PERL_SCAN_GREATER_THAN_UV_MAX; if (result) *result = value_nv; return UV_MAX; } #endif #endif #ifndef grok_oct #if defined(NEED_grok_oct) static UV DPPP_(my_grok_oct)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result); static #else extern UV DPPP_(my_grok_oct)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result); #endif #if defined(NEED_grok_oct) || defined(NEED_grok_oct_GLOBAL) #ifdef grok_oct # undef grok_oct #endif #define grok_oct(a,b,c,d) DPPP_(my_grok_oct)(aTHX_ a,b,c,d) #define Perl_grok_oct DPPP_(my_grok_oct) UV DPPP_(my_grok_oct)(pTHX_ const char *start, STRLEN *len_p, I32 *flags, NV *result) { const char *s = start; STRLEN len = *len_p; UV value = 0; NV value_nv = 0; const UV max_div_8 = UV_MAX / 8; bool allow_underscores = *flags & PERL_SCAN_ALLOW_UNDERSCORES; bool overflowed = FALSE; for (; len-- && *s; s++) { /* gcc 2.95 optimiser not smart enough to figure that this subtraction out front allows slicker code. */ int digit = *s - '0'; if (digit >= 0 && digit <= 7) { /* Write it in this wonky order with a goto to attempt to get the compiler to make the common case integer-only loop pretty tight. */ redo: if (!overflowed) { if (value <= max_div_8) { value = (value << 3) | digit; continue; } /* Bah. We're just overflowed. */ warn("Integer overflow in octal number"); overflowed = TRUE; value_nv = (NV) value; } value_nv *= 8.0; /* If an NV has not enough bits in its mantissa to * represent a UV this summing of small low-order numbers * is a waste of time (because the NV cannot preserve * the low-order bits anyway): we could just remember when * did we overflow and in the end just multiply value_nv by the * right amount of 8-tuples. */ value_nv += (NV)digit; continue; } if (digit == ('_' - '0') && len && allow_underscores && (digit = s[1] - '0') && (digit >= 0 && digit <= 7)) { --len; ++s; goto redo; } /* Allow \octal to work the DWIM way (that is, stop scanning * as soon as non-octal characters are seen, complain only iff * someone seems to want to use the digits eight and nine). */ if (digit == 8 || digit == 9) { if (!(*flags & PERL_SCAN_SILENT_ILLDIGIT)) warn("Illegal octal digit '%c' ignored", *s); } break; } if ( ( overflowed && value_nv > 4294967295.0) #if UVSIZE > 4 || (!overflowed && value > 0xffffffff ) #endif ) { warn("Octal number > 037777777777 non-portable"); } *len_p = s - start; if (!overflowed) { *flags = 0; return value; } *flags = PERL_SCAN_GREATER_THAN_UV_MAX; if (result) *result = value_nv; return UV_MAX; } #endif #endif #if !defined(my_snprintf) #if defined(NEED_my_snprintf) static int DPPP_(my_my_snprintf)(char * buffer, const Size_t len, const char * format, ...); static #else extern int DPPP_(my_my_snprintf)(char * buffer, const Size_t len, const char * format, ...); #endif #if defined(NEED_my_snprintf) || defined(NEED_my_snprintf_GLOBAL) #define my_snprintf DPPP_(my_my_snprintf) #define Perl_my_snprintf DPPP_(my_my_snprintf) int DPPP_(my_my_snprintf)(char *buffer, const Size_t len, const char *format, ...) { dTHX; int retval; va_list ap; va_start(ap, format); #ifdef HAS_VSNPRINTF retval = vsnprintf(buffer, len, format, ap); #else retval = vsprintf(buffer, format, ap); #endif va_end(ap); if (retval < 0 || (len > 0 && (Size_t)retval >= len)) Perl_croak(aTHX_ "panic: my_snprintf buffer overflow"); return retval; } #endif #endif #if !defined(my_sprintf) #if defined(NEED_my_sprintf) static int DPPP_(my_my_sprintf)(char * buffer, const char * pat, ...); static #else extern int DPPP_(my_my_sprintf)(char * buffer, const char * pat, ...); #endif #if defined(NEED_my_sprintf) || defined(NEED_my_sprintf_GLOBAL) #define my_sprintf DPPP_(my_my_sprintf) /* Warning: my_sprintf It's safer to use my_snprintf instead */ /* Replace my_sprintf with my_snprintf */ int DPPP_(my_my_sprintf)(char *buffer, const char* pat, ...) { va_list args; va_start(args, pat); vsprintf(buffer, pat, args); va_end(args); return strlen(buffer); } #endif #endif #ifdef NO_XSLOCKS # ifdef dJMPENV # define dXCPT dJMPENV; int rEtV = 0 # define XCPT_TRY_START JMPENV_PUSH(rEtV); if (rEtV == 0) # define XCPT_TRY_END JMPENV_POP; # define XCPT_CATCH if (rEtV != 0) # define XCPT_RETHROW JMPENV_JUMP(rEtV) # else # define dXCPT Sigjmp_buf oldTOP; int rEtV = 0 # define XCPT_TRY_START Copy(top_env, oldTOP, 1, Sigjmp_buf); rEtV = Sigsetjmp(top_env, 1); if (rEtV == 0) # define XCPT_TRY_END Copy(oldTOP, top_env, 1, Sigjmp_buf); # define XCPT_CATCH if (rEtV != 0) # define XCPT_RETHROW Siglongjmp(top_env, rEtV) # endif #endif #if !defined(my_strlcat) #if defined(NEED_my_strlcat) static Size_t DPPP_(my_my_strlcat)(char * dst, const char * src, Size_t size); static #else extern Size_t DPPP_(my_my_strlcat)(char * dst, const char * src, Size_t size); #endif #if defined(NEED_my_strlcat) || defined(NEED_my_strlcat_GLOBAL) #define my_strlcat DPPP_(my_my_strlcat) #define Perl_my_strlcat DPPP_(my_my_strlcat) Size_t DPPP_(my_my_strlcat)(char *dst, const char *src, Size_t size) { Size_t used, length, copy; used = strlen(dst); length = strlen(src); if (size > 0 && used < size - 1) { copy = (length >= size - used) ? size - used - 1 : length; memcpy(dst + used, src, copy); dst[used + copy] = '\0'; } return used + length; } #endif #endif #if !defined(my_strlcpy) #if defined(NEED_my_strlcpy) static Size_t DPPP_(my_my_strlcpy)(char * dst, const char * src, Size_t size); static #else extern Size_t DPPP_(my_my_strlcpy)(char * dst, const char * src, Size_t size); #endif #if defined(NEED_my_strlcpy) || defined(NEED_my_strlcpy_GLOBAL) #define my_strlcpy DPPP_(my_my_strlcpy) #define Perl_my_strlcpy DPPP_(my_my_strlcpy) Size_t DPPP_(my_my_strlcpy)(char *dst, const char *src, Size_t size) { Size_t length, copy; length = strlen(src); if (size > 0) { copy = (length >= size) ? size - 1 : length; memcpy(dst, src, copy); dst[copy] = '\0'; } return length; } #endif #endif #ifdef SVf_UTF8 #ifndef SvUTF8 # define SvUTF8(sv) (SvFLAGS(sv) & SVf_UTF8) #endif #endif #if (PERL_BCDVERSION == 0x5019001) /* 5.19.1 does not have UTF8fARG, only broken UTF8f */ #undef UTF8f #endif #ifdef SVf_UTF8 #ifndef UTF8f # define UTF8f SVf #endif #ifndef UTF8fARG # define UTF8fARG(u,l,p) newSVpvn_flags((p), (l), ((u) ? SVf_UTF8 : 0) | SVs_TEMP) #endif #endif #define D_PPP_MIN(a,b) (((a) <= (b)) ? (a) : (b)) #ifndef UNICODE_REPLACEMENT # define UNICODE_REPLACEMENT 0xFFFD #endif #ifdef UTF8_MAXLEN #ifndef UTF8_MAXBYTES # define UTF8_MAXBYTES UTF8_MAXLEN #endif #endif #ifndef UTF_START_MARK # define UTF_START_MARK(len) \ (((len) > 7) ? 0xFF : (0xFF & (0xFE << (7-(len))))) #endif /* On non-EBCDIC was valid for some releases earlier than this, but easier to * just do one check */ #if (PERL_BCDVERSION < 0x5018000) # undef UTF8_MAXBYTES_CASE #endif #if 'A' == 65 # define D_PPP_BYTE_INFO_BITS 6 /* 6 bits meaningful in continuation bytes */ #ifndef UTF8_MAXBYTES_CASE # define UTF8_MAXBYTES_CASE 13 #endif #else # define D_PPP_BYTE_INFO_BITS 5 /* 5 bits meaningful in continuation bytes */ #ifndef UTF8_MAXBYTES_CASE # define UTF8_MAXBYTES_CASE 15 #endif #endif #ifndef UTF_ACCUMULATION_SHIFT # define UTF_ACCUMULATION_SHIFT D_PPP_BYTE_INFO_BITS #endif #ifdef NATIVE_TO_UTF #ifndef NATIVE_UTF8_TO_I8 # define NATIVE_UTF8_TO_I8(c) NATIVE_TO_UTF(c) #endif #else /* System doesn't support EBCDIC */ #ifndef NATIVE_UTF8_TO_I8 # define NATIVE_UTF8_TO_I8(c) (c) #endif #endif #ifdef UTF_TO_NATIVE #ifndef I8_TO_NATIVE_UTF8 # define I8_TO_NATIVE_UTF8(c) UTF_TO_NATIVE(c) #endif #else /* System doesn't support EBCDIC */ #ifndef I8_TO_NATIVE_UTF8 # define I8_TO_NATIVE_UTF8(c) (c) #endif #endif #ifndef UTF_START_MASK # define UTF_START_MASK(len) \ (((len) >= 7) ? 0x00 : (0x1F >> ((len)-2))) #endif #ifndef UTF_IS_CONTINUATION_MASK # define UTF_IS_CONTINUATION_MASK \ ((U8) (0xFF << UTF_ACCUMULATION_SHIFT)) #endif #ifndef UTF_CONTINUATION_MARK # define UTF_CONTINUATION_MARK \ (UTF_IS_CONTINUATION_MASK & 0xB0) #endif #ifndef UTF_MIN_START_BYTE # define UTF_MIN_START_BYTE \ ((UTF_CONTINUATION_MARK >> UTF_ACCUMULATION_SHIFT) | UTF_START_MARK(2)) #endif #ifndef UTF_MIN_ABOVE_LATIN1_BYTE # define UTF_MIN_ABOVE_LATIN1_BYTE \ ((0x100 >> UTF_ACCUMULATION_SHIFT) | UTF_START_MARK(2)) #endif #if (PERL_BCDVERSION < 0x5007000) /* Was the complement of what should have been */ # undef UTF8_IS_DOWNGRADEABLE_START #endif #ifndef UTF8_IS_DOWNGRADEABLE_START # define UTF8_IS_DOWNGRADEABLE_START(c) \ inRANGE(NATIVE_UTF8_TO_I8(c), \ UTF_MIN_START_BYTE, UTF_MIN_ABOVE_LATIN1_BYTE - 1) #endif #ifndef UTF_CONTINUATION_MASK # define UTF_CONTINUATION_MASK \ ((U8) ((1U << UTF_ACCUMULATION_SHIFT) - 1)) #endif #ifndef UTF8_ACCUMULATE # define UTF8_ACCUMULATE(base, added) \ (((base) << UTF_ACCUMULATION_SHIFT) \ | ((NATIVE_UTF8_TO_I8(added)) \ & UTF_CONTINUATION_MASK)) #endif #ifndef UTF8_ALLOW_ANYUV # define UTF8_ALLOW_ANYUV 0 #endif #ifndef UTF8_ALLOW_EMPTY # define UTF8_ALLOW_EMPTY 0x0001 #endif #ifndef UTF8_ALLOW_CONTINUATION # define UTF8_ALLOW_CONTINUATION 0x0002 #endif #ifndef UTF8_ALLOW_NON_CONTINUATION # define UTF8_ALLOW_NON_CONTINUATION 0x0004 #endif #ifndef UTF8_ALLOW_SHORT # define UTF8_ALLOW_SHORT 0x0008 #endif #ifndef UTF8_ALLOW_LONG # define UTF8_ALLOW_LONG 0x0010 #endif #ifndef UTF8_ALLOW_OVERFLOW # define UTF8_ALLOW_OVERFLOW 0x0080 #endif #ifndef UTF8_ALLOW_ANY # define UTF8_ALLOW_ANY ( UTF8_ALLOW_CONTINUATION \ |UTF8_ALLOW_NON_CONTINUATION \ |UTF8_ALLOW_SHORT \ |UTF8_ALLOW_LONG \ |UTF8_ALLOW_OVERFLOW) #endif #if defined UTF8SKIP /* Don't use official versions because they use MIN, which may not be available */ #undef UTF8_SAFE_SKIP #undef UTF8_CHK_SKIP #ifndef UTF8_SAFE_SKIP # define UTF8_SAFE_SKIP(s, e) ( \ ((((e) - (s)) <= 0) \ ? 0 \ : D_PPP_MIN(((e) - (s)), UTF8SKIP(s)))) #endif #ifndef UTF8_CHK_SKIP # define UTF8_CHK_SKIP(s) \ (s[0] == '\0' ? 1 : ((U8) D_PPP_MIN(my_strnlen((char *) (s), UTF8SKIP(s)), \ UTF8SKIP(s)))) #endif /* UTF8_CHK_SKIP depends on my_strnlen */ #ifndef UTF8_SKIP # define UTF8_SKIP(s) UTF8SKIP(s) #endif #endif #if 'A' == 65 #ifndef UTF8_IS_INVARIANT # define UTF8_IS_INVARIANT(c) isASCII(c) #endif #else #ifndef UTF8_IS_INVARIANT # define UTF8_IS_INVARIANT(c) (isASCII(c) || isCNTRL_L1(c)) #endif #endif #ifndef UVCHR_IS_INVARIANT # define UVCHR_IS_INVARIANT(c) UTF8_IS_INVARIANT(c) #endif #ifdef UVCHR_IS_INVARIANT # if 'A' != 65 || UVSIZE < 8 /* 32 bit platform, which includes UTF-EBCDIC on the releases this is * backported to */ # define D_PPP_UVCHR_SKIP_UPPER(c) 7 # else # define D_PPP_UVCHR_SKIP_UPPER(c) \ (((WIDEST_UTYPE) (c)) < \ (((WIDEST_UTYPE) 1) << (6 * D_PPP_BYTE_INFO_BITS)) ? 7 : 13) # endif #ifndef UVCHR_SKIP # define UVCHR_SKIP(c) \ UVCHR_IS_INVARIANT(c) ? 1 : \ (WIDEST_UTYPE) (c) < (32 * (1U << ( D_PPP_BYTE_INFO_BITS))) ? 2 : \ (WIDEST_UTYPE) (c) < (16 * (1U << (2 * D_PPP_BYTE_INFO_BITS))) ? 3 : \ (WIDEST_UTYPE) (c) < ( 8 * (1U << (3 * D_PPP_BYTE_INFO_BITS))) ? 4 : \ (WIDEST_UTYPE) (c) < ( 4 * (1U << (4 * D_PPP_BYTE_INFO_BITS))) ? 5 : \ (WIDEST_UTYPE) (c) < ( 2 * (1U << (5 * D_PPP_BYTE_INFO_BITS))) ? 6 : \ D_PPP_UVCHR_SKIP_UPPER(c) #endif #endif #ifdef is_ascii_string #ifndef is_invariant_string # define is_invariant_string(s,l) is_ascii_string(s,l) #endif #ifndef is_utf8_invariant_string # define is_utf8_invariant_string(s,l) is_ascii_string(s,l) #endif /* Hint: is_ascii_string, is_invariant_string is_utf8_invariant_string() does the same thing and is preferred because its name is more accurate as to what it does */ #endif #ifdef ibcmp_utf8 #ifndef foldEQ_utf8 # define foldEQ_utf8(s1,pe1,l1,u1,s2,pe2,l2,u2) \ cBOOL(! ibcmp_utf8(s1,pe1,l1,u1,s2,pe2,l2,u2)) #endif #endif #if defined(is_utf8_string) && defined(UTF8SKIP) #ifndef isUTF8_CHAR # define isUTF8_CHAR(s, e) ( \ (e) <= (s) || ! is_utf8_string(s, UTF8_SAFE_SKIP(s, e)) \ ? 0 \ : UTF8SKIP(s)) #endif #endif #if 'A' == 65 #ifndef BOM_UTF8 # define BOM_UTF8 "\xEF\xBB\xBF" #endif #ifndef REPLACEMENT_CHARACTER_UTF8 # define REPLACEMENT_CHARACTER_UTF8 "\xEF\xBF\xBD" #endif #elif '^' == 95 #ifndef BOM_UTF8 # define BOM_UTF8 "\xDD\x73\x66\x73" #endif #ifndef REPLACEMENT_CHARACTER_UTF8 # define REPLACEMENT_CHARACTER_UTF8 "\xDD\x73\x73\x71" #endif #elif '^' == 176 #ifndef BOM_UTF8 # define BOM_UTF8 "\xDD\x72\x65\x72" #endif #ifndef REPLACEMENT_CHARACTER_UTF8 # define REPLACEMENT_CHARACTER_UTF8 "\xDD\x72\x72\x70" #endif #else # error Unknown character set #endif #if (PERL_BCDVERSION < 0x5031004) /* Versions prior to this accepted things that are now considered * malformations, and didn't return -1 on error with warnings enabled * */ # undef utf8_to_uvchr_buf #endif /* This implementation brings modern, generally more restricted standards to * utf8_to_uvchr_buf. Some of these are security related, and clearly must * be done. But its arguable that the others need not, and hence should not. * The reason they're here is that a module that intends to play with the * latest perls should be able to work the same in all releases. An example is * that perl no longer accepts any UV for a code point, but limits them to * IV_MAX or below. This is for future internal use of the larger code points. * If it turns out that some of these changes are breaking code that isn't * intended to work with modern perls, the tighter restrictions could be * relaxed. khw thinks this is unlikely, but has been wrong in the past. */ /* 5.6.0 is the first release with UTF-8, and we don't implement this function * there due to its likely lack of still being in use, and the underlying * implementation is very different from later ones, without the later * safeguards, so would require extra work to deal with */ #if (PERL_BCDVERSION >= 0x5006001) && ! defined(utf8_to_uvchr_buf) /* Choose which underlying implementation to use. At least one must be * present or the perl is too early to handle this function */ # if defined(utf8n_to_uvchr) || defined(utf8_to_uvchr) || defined(utf8_to_uv) # if defined(utf8n_to_uvchr) /* This is the preferred implementation */ # define D_PPP_utf8_to_uvchr_buf_callee utf8n_to_uvchr # elif /* Must be at least 5.6.1 from #if above; \ If have both regular and _simple, regular has all args */ \ defined(utf8_to_uv) && defined(utf8_to_uv_simple) # define D_PPP_utf8_to_uvchr_buf_callee utf8_to_uv # elif defined(utf8_to_uvchr) /* The below won't work well on error input */ # define D_PPP_utf8_to_uvchr_buf_callee(s, curlen, retlen, flags) \ utf8_to_uvchr((U8 *)(s), (retlen)) # else # define D_PPP_utf8_to_uvchr_buf_callee(s, curlen, retlen, flags) \ utf8_to_uv((U8 *)(s), (retlen)) # endif # endif # if defined(NEED_utf8_to_uvchr_buf) static UV DPPP_(my_utf8_to_uvchr_buf)(pTHX_ const U8 * s, const U8 * send, STRLEN * retlen); static #else extern UV DPPP_(my_utf8_to_uvchr_buf)(pTHX_ const U8 * s, const U8 * send, STRLEN * retlen); #endif #if defined(NEED_utf8_to_uvchr_buf) || defined(NEED_utf8_to_uvchr_buf_GLOBAL) #ifdef utf8_to_uvchr_buf # undef utf8_to_uvchr_buf #endif #define utf8_to_uvchr_buf(a,b,c) DPPP_(my_utf8_to_uvchr_buf)(aTHX_ a,b,c) #define Perl_utf8_to_uvchr_buf DPPP_(my_utf8_to_uvchr_buf) UV DPPP_(my_utf8_to_uvchr_buf)(pTHX_ const U8 *s, const U8 *send, STRLEN *retlen) { UV ret; STRLEN curlen; bool overflows = 0; const U8 *cur_s = s; const bool do_warnings = ckWARN_d(WARN_UTF8); # if (PERL_BCDVERSION < 0x5026000) && ! defined(EBCDIC) STRLEN overflow_length = 0; # endif if (send > s) { curlen = send - s; } else { assert(0); /* Modern perls die under this circumstance */ curlen = 0; if (! do_warnings) { /* Handle empty here if no warnings needed */ if (retlen) *retlen = 0; return UNICODE_REPLACEMENT; } } # if (PERL_BCDVERSION < 0x5026000) && ! defined(EBCDIC) /* Perl did not properly detect overflow for much of its history on * non-EBCDIC platforms, often returning an overlong value which may or may * not have been tolerated in the call. Also, earlier versions, when they * did detect overflow, may have disallowed it completely. Modern ones can * replace it with the REPLACEMENT CHARACTER, depending on calling * parameters. Therefore detect it ourselves in releases it was * problematic in. */ if (curlen > 0 && UNLIKELY(*s >= 0xFE)) { /* First, on a 32-bit machine the first byte being at least \xFE * automatically is overflow, as it indicates something requiring more * than 31 bits */ if (sizeof(ret) < 8) { overflows = 1; overflow_length = (*s == 0xFE) ? 7 : 13; } else { const U8 highest[] = /* 2*63-1 */ "\xFF\x80\x87\xBF\xBF\xBF\xBF\xBF\xBF\xBF\xBF\xBF\xBF"; const U8 *cur_h = highest; for (cur_s = s; cur_s < send; cur_s++, cur_h++) { if (UNLIKELY(*cur_s == *cur_h)) { continue; } /* If this byte is larger than the corresponding highest UTF-8 * byte, the sequence overflows; otherwise the byte is less * than (as we handled the equality case above), and so the * sequence doesn't overflow */ overflows = *cur_s > *cur_h; break; } /* Here, either we set the bool and broke out of the loop, or got * to the end and all bytes are the same which indicates it doesn't * overflow. If it did overflow, it would be this number of bytes * */ overflow_length = 13; } } if (UNLIKELY(overflows)) { ret = 0; if (! do_warnings && retlen) { *retlen = overflow_length; } } else # endif /* < 5.26 */ /* Here, we are either in a release that properly detects overflow, or * we have checked for overflow and the next statement is executing as * part of the above conditional where we know we don't have overflow. * * The modern versions allow anything that evaluates to a legal UV, but * not overlongs nor an empty input */ ret = D_PPP_utf8_to_uvchr_buf_callee( (U8 *) /* Early perls: no const */ s, curlen, retlen, (UTF8_ALLOW_ANYUV & ~(UTF8_ALLOW_LONG|UTF8_ALLOW_EMPTY))); # if (PERL_BCDVERSION >= 0x5026000) && (PERL_BCDVERSION < 0x5028000) /* But actually, more modern versions restrict the UV to being no more than * what an IV can hold, so it could still have gotten it wrong about * overflowing. */ if (UNLIKELY(ret > IV_MAX)) { overflows = 1; } # endif if (UNLIKELY(overflows)) { if (! do_warnings) { if (retlen) { *retlen = D_PPP_MIN(*retlen, UTF8SKIP(s)); *retlen = D_PPP_MIN(*retlen, curlen); } return UNICODE_REPLACEMENT; } else { /* We use the error message in use from 5.8-5.26 */ Perl_warner(aTHX_ packWARN(WARN_UTF8), "Malformed UTF-8 character (overflow at 0x%" UVxf ", byte 0x%02x, after start byte 0x%02x)", ret, *cur_s, *s); if (retlen) { *retlen = (STRLEN) -1; } return 0; } } /* Here, did not overflow, but if it failed for some other reason, and * warnings are off, to emulate the behavior of the real utf8_to_uvchr(), * try again, allowing anything. (Note a return of 0 is ok if the input * was '\0') */ if (UNLIKELY(ret == 0 && (curlen == 0 || *s != '\0'))) { /* If curlen is 0, we already handled the case where warnings are * disabled, so this 'if' will be true, and so later on, we know that * 's' is dereferencible */ if (do_warnings) { if (retlen) { *retlen = (STRLEN) -1; } } else { ret = D_PPP_utf8_to_uvchr_buf_callee( (U8 *) /* Early perls: no const */ s, curlen, retlen, UTF8_ALLOW_ANY); /* Override with the REPLACEMENT character, as that is what the * modern version of this function returns */ ret = UNICODE_REPLACEMENT; # if (PERL_BCDVERSION < 0x5016000) /* Versions earlier than this don't necessarily return the proper * length. It should not extend past the end of string, nor past * what the first byte indicates the length is, nor past the * continuation characters */ if (retlen && (IV) *retlen >= 0) { unsigned int i = 1; *retlen = D_PPP_MIN(*retlen, curlen); *retlen = D_PPP_MIN(*retlen, UTF8SKIP(s)); do { # ifdef UTF8_IS_CONTINUATION if (! UTF8_IS_CONTINUATION(s[i])) # else /* Versions without the above don't support EBCDIC anyway */ if (s[i] < 0x80 || s[i] > 0xBF) # endif { *retlen = i; break; } } while (++i < *retlen); } # endif } } return ret; } # endif #endif #if defined(UTF8SKIP) && defined(utf8_to_uvchr_buf) #undef utf8_to_uvchr /* Always redefine this unsafe function so that it refuses to read past a NUL, making it much less likely to read off the end of the buffer. A NUL indicates the start of the next character anyway. If the input isn't NUL-terminated, the function remains unsafe, as it always has been. */ #ifndef utf8_to_uvchr # define utf8_to_uvchr(s, lp) \ ((*(s) == '\0') \ ? utf8_to_uvchr_buf(s,((s)+1), lp) /* Handle single NUL specially */ \ : utf8_to_uvchr_buf(s, (s) + UTF8_CHK_SKIP(s), (lp))) #endif #endif /* Hint: utf8_to_uvchr Use utf8_to_uvchr_buf() instead. But ONLY if you KNOW the upper bound of the input string (not resorting to using UTF8SKIP, etc., to infer it). The backported utf8_to_uvchr() will do a better job to prevent most cases of trying to read beyond the end of the buffer */ /* Replace utf8_to_uvchr with utf8_to_uvchr_buf */ #ifdef sv_len_utf8 /* Older Perl versions have broken sv_len_utf8() when passed sv does not have SVf_UTF8 flag set */ /* Also note that SvGETMAGIC() may change presence of SVf_UTF8 flag */ # if (PERL_BCDVERSION < 0x5017005) # undef sv_len_utf8 # if defined(PERL_USE_GCC_BRACE_GROUPS) # define sv_len_utf8_nomg(sv) ({ SV *_sv2 = (sv); (SvUTF8(_sv2) ? Perl_sv_len_utf8(aTHX_ (!SvGMAGICAL(_sv2) ? _sv2 : sv_mortalcopy_flags(_sv2, SV_NOSTEAL))) : ({ STRLEN _len; SvPV_nomg(_sv2, _len); _len; })); }) # define sv_len_utf8(sv) ({ SV *_sv1 = (sv); SvGETMAGIC(_sv1); sv_len_utf8_nomg(_sv1); }) # else # define sv_len_utf8_nomg(sv) (PL_Sv = (sv), (SvUTF8(PL_Sv) ? Perl_sv_len_utf8(aTHX_ (!SvGMAGICAL(PL_Sv) ? PL_Sv : sv_mortalcopy_flags(PL_Sv, SV_NOSTEAL))) : (SvPV_nomg(PL_Sv, PL_na), PL_na))) # define sv_len_utf8(sv) (PL_Sv = (sv), SvGETMAGIC(PL_Sv), sv_len_utf8_nomg(PL_Sv)) # endif # endif # if defined(PERL_USE_GCC_BRACE_GROUPS) #ifndef sv_len_utf8_nomg # define sv_len_utf8_nomg(sv) ({ SV *_sv = (sv); sv_len_utf8(!SvGMAGICAL(_sv) ? _sv : sv_mortalcopy_flags(_sv, SV_NOSTEAL)); }) #endif # else #ifndef sv_len_utf8_nomg # define sv_len_utf8_nomg(sv) ((PL_Sv = (sv)), sv_len_utf8(!SvGMAGICAL(PL_Sv) ? PL_Sv : sv_mortalcopy_flags(PL_Sv, SV_NOSTEAL))) #endif # endif #endif #ifndef PERL_PV_ESCAPE_QUOTE # define PERL_PV_ESCAPE_QUOTE 0x0001 #endif #ifndef PERL_PV_PRETTY_QUOTE # define PERL_PV_PRETTY_QUOTE PERL_PV_ESCAPE_QUOTE #endif #ifndef PERL_PV_PRETTY_ELLIPSES # define PERL_PV_PRETTY_ELLIPSES 0x0002 #endif #ifndef PERL_PV_PRETTY_LTGT # define PERL_PV_PRETTY_LTGT 0x0004 #endif #ifndef PERL_PV_ESCAPE_FIRSTCHAR # define PERL_PV_ESCAPE_FIRSTCHAR 0x0008 #endif #ifndef PERL_PV_ESCAPE_UNI # define PERL_PV_ESCAPE_UNI 0x0100 #endif #ifndef PERL_PV_ESCAPE_UNI_DETECT # define PERL_PV_ESCAPE_UNI_DETECT 0x0200 #endif #ifndef PERL_PV_ESCAPE_ALL # define PERL_PV_ESCAPE_ALL 0x1000 #endif #ifndef PERL_PV_ESCAPE_NOBACKSLASH # define PERL_PV_ESCAPE_NOBACKSLASH 0x2000 #endif #ifndef PERL_PV_ESCAPE_NOCLEAR # define PERL_PV_ESCAPE_NOCLEAR 0x4000 #endif #ifndef PERL_PV_ESCAPE_RE # define PERL_PV_ESCAPE_RE 0x8000 #endif #ifndef PERL_PV_PRETTY_NOCLEAR # define PERL_PV_PRETTY_NOCLEAR PERL_PV_ESCAPE_NOCLEAR #endif #ifndef PERL_PV_PRETTY_DUMP # define PERL_PV_PRETTY_DUMP PERL_PV_PRETTY_ELLIPSES|PERL_PV_PRETTY_QUOTE #endif #ifndef PERL_PV_PRETTY_REGPROP # define PERL_PV_PRETTY_REGPROP PERL_PV_PRETTY_ELLIPSES|PERL_PV_PRETTY_LTGT|PERL_PV_ESCAPE_RE #endif /* Hint: pv_escape * Note that unicode functionality is only backported to * those perl versions that support it. For older perl * versions, the implementation will fall back to bytes. */ #ifndef pv_escape #if defined(NEED_pv_escape) static char * DPPP_(my_pv_escape)(pTHX_ SV * dsv, char const * const str, const STRLEN count, const STRLEN max, STRLEN * const escaped, const U32 flags); static #else extern char * DPPP_(my_pv_escape)(pTHX_ SV * dsv, char const * const str, const STRLEN count, const STRLEN max, STRLEN * const escaped, const U32 flags); #endif #if defined(NEED_pv_escape) || defined(NEED_pv_escape_GLOBAL) #ifdef pv_escape # undef pv_escape #endif #define pv_escape(a,b,c,d,e,f) DPPP_(my_pv_escape)(aTHX_ a,b,c,d,e,f) #define Perl_pv_escape DPPP_(my_pv_escape) char * DPPP_(my_pv_escape)(pTHX_ SV *dsv, char const * const str, const STRLEN count, const STRLEN max, STRLEN * const escaped, const U32 flags) { const char esc = flags & PERL_PV_ESCAPE_RE ? '%' : '\\'; const char dq = flags & PERL_PV_ESCAPE_QUOTE ? '"' : esc; char octbuf[32] = "%123456789ABCDF"; STRLEN wrote = 0; STRLEN chsize = 0; STRLEN readsize = 1; #if defined(is_utf8_string) && defined(utf8_to_uvchr_buf) bool isuni = flags & PERL_PV_ESCAPE_UNI ? 1 : 0; #endif const char *pv = str; const char * const end = pv + count; octbuf[0] = esc; if (!(flags & PERL_PV_ESCAPE_NOCLEAR)) sv_setpvs(dsv, ""); #if defined(is_utf8_string) && defined(utf8_to_uvchr_buf) if ((flags & PERL_PV_ESCAPE_UNI_DETECT) && is_utf8_string((U8*)pv, count)) isuni = 1; #endif for (; pv < end && (!max || wrote < max) ; pv += readsize) { const UV u = #if defined(is_utf8_string) && defined(utf8_to_uvchr_buf) isuni ? utf8_to_uvchr_buf((U8*)pv, end, &readsize) : #endif (U8)*pv; const U8 c = (U8)u & 0xFF; if (u > 255 || (flags & PERL_PV_ESCAPE_ALL)) { if (flags & PERL_PV_ESCAPE_FIRSTCHAR) chsize = my_snprintf(octbuf, sizeof octbuf, "%" UVxf, u); else chsize = my_snprintf(octbuf, sizeof octbuf, "%cx{%" UVxf "}", esc, u); } else if (flags & PERL_PV_ESCAPE_NOBACKSLASH) { chsize = 1; } else { if (c == dq || c == esc || !isPRINT(c)) { chsize = 2; switch (c) { case '\\' : /* fallthrough */ case '%' : if (c == esc) octbuf[1] = esc; else chsize = 1; break; case '\v' : octbuf[1] = 'v'; break; case '\t' : octbuf[1] = 't'; break; case '\r' : octbuf[1] = 'r'; break; case '\n' : octbuf[1] = 'n'; break; case '\f' : octbuf[1] = 'f'; break; case '"' : if (dq == '"') octbuf[1] = '"'; else chsize = 1; break; default: chsize = my_snprintf(octbuf, sizeof octbuf, pv < end && isDIGIT((U8)*(pv+readsize)) ? "%c%03o" : "%c%o", esc, c); } } else { chsize = 1; } } if (max && wrote + chsize > max) { break; } else if (chsize > 1) { sv_catpvn(dsv, octbuf, chsize); wrote += chsize; } else { char tmp[2]; my_snprintf(tmp, sizeof tmp, "%c", c); sv_catpvn(dsv, tmp, 1); wrote++; } if (flags & PERL_PV_ESCAPE_FIRSTCHAR) break; } if (escaped != NULL) *escaped= pv - str; return SvPVX(dsv); } #endif #endif #ifndef pv_pretty #if defined(NEED_pv_pretty) static char * DPPP_(my_pv_pretty)(pTHX_ SV * dsv, char const * const str, const STRLEN count, const STRLEN max, char const * const start_color, char const * const end_color, const U32 flags); static #else extern char * DPPP_(my_pv_pretty)(pTHX_ SV * dsv, char const * const str, const STRLEN count, const STRLEN max, char const * const start_color, char const * const end_color, const U32 flags); #endif #if defined(NEED_pv_pretty) || defined(NEED_pv_pretty_GLOBAL) #ifdef pv_pretty # undef pv_pretty #endif #define pv_pretty(a,b,c,d,e,f,g) DPPP_(my_pv_pretty)(aTHX_ a,b,c,d,e,f,g) #define Perl_pv_pretty DPPP_(my_pv_pretty) char * DPPP_(my_pv_pretty)(pTHX_ SV *dsv, char const * const str, const STRLEN count, const STRLEN max, char const * const start_color, char const * const end_color, const U32 flags) { const U8 dq = (flags & PERL_PV_PRETTY_QUOTE) ? '"' : '%'; STRLEN escaped; if (!(flags & PERL_PV_PRETTY_NOCLEAR)) sv_setpvs(dsv, ""); if (dq == '"') sv_catpvs(dsv, "\""); else if (flags & PERL_PV_PRETTY_LTGT) sv_catpvs(dsv, "<"); if (start_color != NULL) sv_catpv(dsv, D_PPP_CONSTPV_ARG(start_color)); pv_escape(dsv, str, count, max, &escaped, flags | PERL_PV_ESCAPE_NOCLEAR); if (end_color != NULL) sv_catpv(dsv, D_PPP_CONSTPV_ARG(end_color)); if (dq == '"') sv_catpvs(dsv, "\""); else if (flags & PERL_PV_PRETTY_LTGT) sv_catpvs(dsv, ">"); if ((flags & PERL_PV_PRETTY_ELLIPSES) && escaped < count) sv_catpvs(dsv, "..."); return SvPVX(dsv); } #endif #endif #ifndef pv_display #if defined(NEED_pv_display) static char * DPPP_(my_pv_display)(pTHX_ SV * dsv, const char * pv, STRLEN cur, STRLEN len, STRLEN pvlim); static #else extern char * DPPP_(my_pv_display)(pTHX_ SV * dsv, const char * pv, STRLEN cur, STRLEN len, STRLEN pvlim); #endif #if defined(NEED_pv_display) || defined(NEED_pv_display_GLOBAL) #ifdef pv_display # undef pv_display #endif #define pv_display(a,b,c,d,e) DPPP_(my_pv_display)(aTHX_ a,b,c,d,e) #define Perl_pv_display DPPP_(my_pv_display) char * DPPP_(my_pv_display)(pTHX_ SV *dsv, const char *pv, STRLEN cur, STRLEN len, STRLEN pvlim) { pv_pretty(dsv, pv, cur, pvlim, NULL, NULL, PERL_PV_PRETTY_DUMP); if (len > cur && pv[cur] == '\0') sv_catpvs(dsv, "\\0"); return SvPVX(dsv); } #endif #endif #if PERL_VERSION_LT(5,27,9) #ifndef LC_NUMERIC_LOCK # define LC_NUMERIC_LOCK #endif #ifndef LC_NUMERIC_UNLOCK # define LC_NUMERIC_UNLOCK #endif # if PERL_VERSION_LT(5,19,0) # undef STORE_LC_NUMERIC_SET_STANDARD # undef RESTORE_LC_NUMERIC # undef DECLARATION_FOR_LC_NUMERIC_MANIPULATION # ifdef USE_LOCALE #ifndef DECLARATION_FOR_LC_NUMERIC_MANIPULATION # define DECLARATION_FOR_LC_NUMERIC_MANIPULATION char *LoC_ #endif #ifndef STORE_NUMERIC_SET_STANDARD # define STORE_NUMERIC_SET_STANDARD() \ LoC_ = savepv(setlocale(LC_NUMERIC, NULL)); \ SAVEFREEPV(LoC_); \ setlocale(LC_NUMERIC, "C"); #endif #ifndef RESTORE_LC_NUMERIC # define RESTORE_LC_NUMERIC() \ setlocale(LC_NUMERIC, LoC_); #endif # else #ifndef DECLARATION_FOR_LC_NUMERIC_MANIPULATION # define DECLARATION_FOR_LC_NUMERIC_MANIPULATION #endif #ifndef STORE_LC_NUMERIC_SET_STANDARD # define STORE_LC_NUMERIC_SET_STANDARD() #endif #ifndef RESTORE_LC_NUMERIC # define RESTORE_LC_NUMERIC() #endif # endif # endif #endif #ifndef LOCK_NUMERIC_STANDARD # define LOCK_NUMERIC_STANDARD() #endif #ifndef UNLOCK_NUMERIC_STANDARD # define UNLOCK_NUMERIC_STANDARD() #endif /* The names of these changed in 5.28 */ #ifndef LOCK_LC_NUMERIC_STANDARD # define LOCK_LC_NUMERIC_STANDARD LOCK_NUMERIC_STANDARD #endif #ifndef UNLOCK_LC_NUMERIC_STANDARD # define UNLOCK_LC_NUMERIC_STANDARD UNLOCK_NUMERIC_STANDARD #endif /* If this doesn't exist, it's not needed, so is void noop */ #ifndef switch_to_global_locale # define switch_to_global_locale() #endif /* Originally, this didn't return a value, but in perls like that, the value * should always be TRUE. Add a return to Perl_sync_locale() when it's * available. And actually do a sync when its not, if locales are available on * this system. */ #ifdef sync_locale # if (PERL_BCDVERSION < 0x5027009) # if (PERL_BCDVERSION >= 0x5021003) # undef sync_locale # define sync_locale() (Perl_sync_locale(aTHX), 1) # elif defined(sync_locale) /* These should only be the 5.20 maints*/ # undef sync_locale /* Just copy their defn and return 1 */ # define sync_locale() (new_ctype(setlocale(LC_CTYPE, NULL)), \ new_collate(setlocale(LC_COLLATE, NULL)), \ set_numeric_local(), \ new_numeric(setlocale(LC_NUMERIC, NULL)), \ 1) # elif defined(new_ctype) && defined(LC_CTYPE) # define sync_locale() (new_ctype(setlocale(LC_CTYPE, NULL)), 1) # endif # endif #endif #ifndef sync_locale # define sync_locale() 1 #endif #endif /* _P_P_PORTABILITY_H_ */ /* End of File ppport.h */ Moose-2.2200/t/000770 000766 000024 00000000000 14137574636 013414 5ustar00etherstaff000000 000000 Moose-2.2200/xt/000770 000766 000024 00000000000 14137574636 013604 5ustar00etherstaff000000 000000 Moose-2.2200/xs/000770 000766 000024 00000000000 14137574636 013603 5ustar00etherstaff000000 000000 Moose-2.2200/TODO000640 000766 000024 00000043446 14137574636 013653 0ustar00etherstaff000000 000000 # vim: set ft=markdown : ## Uncontroversial Items These items are reasonably well thought out, and can go in any major release. ### RT Tickets RT#59478/RT#63000 - 0+ overload causes NV conversion on == on perls before 5.14 - this causes comparisons to fail when the number can't fit in an NV without precision loss. I'd like to fix this in a more general way (forcing anyone else who might be using == on tc objects to do weird things isn't very good), although it's hard to test to see what actually works. ### Revise MetaRole API to reunify class/role metaroles: apply_metaroles( for => $meta, roles => { attribute => [...], class => [...], role_attribute => [ ... ], } ); If the $meta is a class, we apply the roles to the class. If it's a role, we hold onto them and apply them as part of applying the role to a class. To make this all work nicely, we'll probably want to track the original role where a method was defined, just like we do with attributes currently. We'll also need to store method modifiers with their original role, which may mean adding some sort of Moose::Meta::Role::MethodModifier class. For each role-specific thing (methods, attributes, etc.) we should allow a `role_attribute`, `role_method`, etc. key. The common case will be that the metaroles are intended for the consuming class, but we should allow for metaroles on the role's metaobjects as well. ### Deprecate old-style Moose extensions Moose extensions that work by calling `Moose->init_meta(metaclass => 'Some::Custom::Metaclass', ...)` during their own `init_meta` should be deprecated, so they can be removed later (this should fix the issues with `init_meta` generation in Moose::Exporter, see RT51561) This needs to wait until the previous fix gets in, since it will hopefully eliminate the need to write custom `init_meta` methods entirely. ### Attributes in roles need to be able to participate in role composition Right now, this fails with no decent workaround: package R1; use Moose::Role; has foo => (is => 'ro'); package R2; use Moose::Role; with 'R1'; requires 'foo'; package C; use Moose; with 'R2'; Role attributes really need to be able to participate in role-role combination. This should also fix "with 'Role1', 'Role2'" being broken when Role1 implements a method as an accessor and Role2 requires that method, but at least in that case you can split it into two 'with' statements with minimal loss of functionality. ### Method modifiers in roles should silently add 'requires' for them This shouldn't be a functionality change, just a better error message (and better introspectability). This shouldn't happen if the role already contains a method by that name, so it'll depend on the previous fix going in (so "has foo => (is => 'ro'); around foo => sub { }" doesn't produce a 'requires' entry). ### has +foo in roles There's no actual reason for this not to work, and it gets asked often enough that we really should just do it at some point. ## Needs Thought These are things we think are good ideas, but they need more fleshing out. ### Actual API for metaclass extensions Right now, the only way to bundle multiple metaclass traits is via Moose::Exporter. This is unhelpful if you want to apply the extension to a metaclass object rather than a class you're actually writing. We should come up with an API for doing this. ### MooseX::NonMoose in core I think all of the actual issues are solved at this point. The only issue is the (necessary) implementation weirdness - it sets up multiple inheritance between the non-Moose class and Moose::Object, and it installs a custom constructor method at 'extends' time (although perhaps this could be solved by moving some of the logic back into Moose::Object::new?). Other than that, it handles everything transparently as far as I can tell. ### Fix attribute and method metaclass compatibility So i got this wrong when rewriting it last year - right now, metaclass compat checks the default attribute and method metaclasses, which is wrong. This means that if a parent class does "use MooseX::FollowPBP", then attributes declared in a subclass will get PBP-style accessors, which is quite surprising. On the other hand, sometimes metaclasses might need to be able to say "I'm going to assume that all of my attributes at least inherit from this custom class", so we might need to split it into "default specified by the user" and "default specified by the metaclass" and only do compat checking on the second? I'm not actually sure this is a valid use case though. Something that probably should be taken into account though is attributes and methods that extend existing attributes or methods from a superclass should inherit the metaclass of the existing one. Also not sure if this is correct, but something to think about. ### Rename a bunch of the public API methods Right now the public API is kind of a mess - we have things like `get_method` vs `find_method_by_name` (you almost always want to use the latter), there being no `has_method` equivalent that checks superclasses, `get_method_list` being public but only returning method names, while `_get_local_methods` is private (returning method objects), and yet neither of those looks at superclasses, and basically none of this naming follows any kind of consistent pattern. What we really need is a consistent and easy to remember API where the method that people would think to use first is the method that they actually mean. Something like renaming `find_method_by_name` to `find_method`, and `get_method` to `find_local_method` or something along those lines. ### Clean up metaclass constructors There's a _lot_ of different conventions in here. Some things to consider: * `new` vs `_new` * allowing new( 'name', %args ) vs ( name => 'name', %args ) * `Method->wrap` vs `Method->new` ### Move method modifiers out to an external module Class::Method::Modifiers uses a different method for doing method modifiers, which I'm not sure why we aren't using in Moose right now. Optionally using Class::Method::Modifiers::Fast would be even better - it uses Data::Util to implement XS method modifiers, which could help things a lot. ### Move type constraints out to an external module There's nothing about our type constraint system that requires being tied to Moose - it's conceptually an entirely separate system that Moose just happens to use. Splitting it out into its own thing (that Moose could extend to add things like role types) would make things conceptually a lot cleaner, and would let people interested in just the type system have that. ### Merge Class::MOP and Moose This is a long term goal, but would allow for a lot of things to be cleaned up. There's a bunch of stuff that's duplicated, and other stuff that's not implemented as well as it could be (Class::MOP::Method::Wrapped should be a role, for instance). ### Moose::Util::TypeConstraints vs Moose::Meta::Type{Coercion,Constraint} The Util module has _way_ too much functionality. It needs to be refactored so it's a thin sugar layer on top of the meta API. As it stands now, it does things like parse type names (and determine if they're valid), manage the registry, and much more. ### Anything with a \_(meta)?class method Every method that returns a class name needs to become a rw attribute that can be set via the constructor. ## Things to contemplate These are ideas we're not sure about. Prototypes are welcome, but we may never merge the feature. ### Does applying metaroles really need to reinitialize the metaclass? Seems like the logic that's actually necessary is already contained in `rebless_instance`, and not reinitializing means that existing attributes and methods won't be blown away when metaroles are applied. ### Do we want to core namespace::autoclean behavior somehow? This would add Variable::Magic as a required XS dep (not a huge deal at the moment, since Sub::Name is also a required XS dep, but it'd be nice for Moose to be able to be pure perl again at some point in the future, and I'm not sure what the relative chances of Sub::Name vs Variable::Magic making it into core are). If we enabled it by default, this would also break things for people who have introduced Moose into legacy-ish systems where roles are faked using exporters (since those imported methods would be cleaned). If we decide we want this, we may want to core it as an option first ("use Moose -clean" or so), and move to making it the default later. ### Should using -excludes with a role add 'requires' for excluded methods? It seems to make sense, since otherwise you're violating the role's API contract. ### Moose "strict" mode use Moose 'strict'; This would allow us to have all sort of expensive tests which can be turned off in prod. ### Moose::Philosophy.pod To explain Moose from a very high level ### moosedoc We certainly have enough meta-information to make pretty complete POD docs. ## TODO test summary Note that some of these are fairly old, and may not be things we actually want to do anymore. ### `t/basics/basic_class_setup.t` Imports aren't automatically cleaned. Need to think about bringing namespace::autoclean functionality into core. ### `t/bugs/create_anon_recursion.t` Loading Moose::Meta::Class (or probably a lot of other metaclasses) before loading Moose or Class::MOP causes issues (the bootstrapping gets confused). ### `t/bugs/handles_foreign_class_bug.t` There should be a warning when delegated methods override 'new' (and possibly others?). ### `t/bugs/role_caller.t` Role methods should be cloned into classes on composition so that using caller(0) in a role method uses the class's package, not the role's. ### `t/cmop/metaclass_incompatibility.t` If a child class is created before a parent class, metaclass compatibility checks won't run on the child when the parent is created, and so the child could end up with an incompatible metaclass. ### `t/cmop/modify_parent_method.t` Modifying parent class methods after a child class has already wrapped them with a method modifier will cause the child class method to retain the original method that it wrapped, not the new one it was replaced with. ### `t/immutable/inline_close_over.t` Initializers and custom error classes still close over metaobjects. Initializers do it because the initializer has to be passed in the attribute metaobject as a parameter, and custom error classes can't be automatically inlined. ### `t/metaclasses/moose_exporter_trait_aliases.t` Renamed imports aren't cleaned on unimport. For instance: package Foo; use Moose has => { -as => 'my_has' }; no Moose; # Foo still contains my_has ### `t/metaclasses/reinitialize.t` Special method types can't have method metaroles applied. Applying a method metarole to a class doesn't apply that role to things like constructors, accessors, etc. ### `t/roles/method_modifiers.t` Method modifiers in roles don't support the regex form of method selection. ### `t/roles/role_compose_requires.t` Accessors for attributes defined in roles don't satisfy role method requirements (this is detailed above - Attributes in roles need to be able to participate in role composition). ### `t/todo_tests/exception_reflects_failed_constraint.t` Type constraint failures should indicate which ancestor constraint failed - subtype 'Foo', as 'Str', where { length < 5 } should mention Str when passed an arrayref, but not when passed the string "ArrayRef". ### `t/todo_tests/moose_and_threads.t` On 5.8, the type constraint name parser isn't thread safe. ### `t/todo_tests/replacing_super_methods.t` Modifying parent class methods after a child class has already wrapped them with a override will cause 'super' in the child class to call the original parent class method, not the one it was overridden with. ### `t/todo_tests/required_role_accessors.t` Role attribute accessors don't satisfy requires from roles they consume. ### `t/todo_tests/role_insertion_order.t` Roles don't preserve attribute `insertion_order`. ### `t/todo_tests/various_role_features.t` * Role attribute accessors don't satisfy requires from roles they consume. * Role combination should produce a conflict when one role has an actual method and the other role has an accessor. * Role attribute accessors should not override methods in the class the role is applied to. * Role attribute accessors should be delegated when a class does handles => 'Role'. * Delegating to a role doesn't make $class->does('Role') true. * Method modifier in a role doesn't create a method requirement. * `Role->meta->has_method('attr_accessor')` is false. ### `t/type_constraints/type_names.t` Type constraint object constructors don't validate the type name provided. ### MooseX::Aliases in core Is there any reason why this would be bad? It would certainly make the implementation a little faster (it can be inlined better). ### MooseX::MethodAttributes in core discuss ---- ## Old todo Old todo stuff which may be totally out of date. ### DDuncan's Str types subtype 'Str' => as 'Value' => where { Encode::is_utf8( $_[0] ) or $_[0] !~ m/[^0x00-0x7F]/x } => optimize_as { defined($_[0]) && !ref($_[0]) }; subtype 'Blob' => as 'Value' => where { !Encode::is_utf8( $_[0] ) } => optimize_as { defined($_[0]) && !ref($_[0]) }; ### type unions Add support for doing it with Classes which do not have a type constraint yet created ### type intersections Mostly just for Roles KENTNL is working on this ### inherited slot specs 'does' can be added to,.. but not changed (need type unions for this) ### proxy attributes a proxied attribute is an attribute which looks like an attribute, talks like an attribute, smells like an attribute,.. but if you look behind the curtain,.. its over there.. in that other object (... probably be a custom metaclass) ### local coerce [13:16] mst stevan: slight problem with coerce [13:16] mst I only get to declare it once [13:17] mst so if I'm trying to declare it cast-style per-source-class rather than per-target-class [13:17] mst I am extremely screwed [13:17] stevan yes [13:17] stevan they are not class specific [13:18] stevan they are attached to the type constraint itself [13:18] * stevan ponders anon-coercion-metaobjects [13:18] mst yes, that's fine [13:19] mst but when I declare a class [13:19] mst I want to be able to say "this class coerces to X type via " [13:19] stevan yeah something like that [13:19] stevan oh,.. hmm [13:20] stevan sort of like inflate/deflate? [13:20] stevan around the accessors? [13:25] * bluefeet has quit (Remote host closed the connection) [13:27] mst no [13:27] mst nothing like that [13:27] mst like a cast [13:31] mst stevan: $obj->foo($bar); where 'foo' expects a 'Foo' object [13:31] mst stevan: is effectively $bar, right? [13:32] mst stevan: I want to be able to say in package Bar [13:32] mst stevan: coerce_to 'Foo' via { ... }; [13:32] mst etc. [13:53] stevan hmm ### add support for locally scoped TC This would borrow from MooseX::TypeLibrary to prefix the TC with the name of the package. It would then be accesible from the outside as the fully scoped name, but the local attributes would use it first. (this would need support in the registry for this). ### look into sugar extensions Use roles as sugar layer function providers (ala MooseX::AttributeHelpers). This would allow custom metaclasses to provide roles to extend the sugar syntax with. (NOTE: Talk to phaylon a bit more on this) ### allow a switch of some kind to optionally turn TC checking off at runtime The type checks can get expensive and some people have suggested that allowing the checks to be turned off would be helpful for deploying into performance intensive systems. Perhaps this can actually be done as an option to `make_immutable`? ### misc. minor bits * make the errors for TCs use `->message` * look into localizing the messages too * make ANON TCs be lazy, so they can possibly be subsituted for the real thing later * make ANON TCs more introspectable * add this ... subtype 'Username', from 'Str', where { (/[a-z][a-z0-9]+/i or fail('Invalid character(s)')) and (length($_) >= 5 or fail('Too short (less than 5 chars)')) } on_fail { MyException->throw(value => $_[0], message => $_[1]) }; fail() will just return false unless the call is made via `$tc->check_or_fail($value);` * and then something like this: subtype Foo => as Bar => where { ... } => scoped => -global; subtype Foo => as Bar => where { ... } => scoped => -local; # or subtype Foo => as Bar => where { ... } => in __PACKAGE__ ; # or (not sure if it would be possible) my $Foo = subtype Bar => where { ... }; ### Deep coercion? [17:10] stevan: it should do it if I pass coerce => 1 as part of the attribute definition [17:12] autarch: what I am not 100% sure of is how to tell it to deep coerce and when to not [17:13] cause a basic coerce is from A to B [17:13] hmm [17:13] which is valid for collection types too [17:13] deep coercion is what you are asking for [17:13] yeah [17:13] so perhaps we add deep_coerce => 1 [17:13] which will do it [17:13] that's fine for me [17:13] k `coerce_deeply => 1 # reads better` ### Moose::Meta::TypeConstraint::Parameter{izable,ized} The relationship between these two classes is very odd. In particular, this line in Parameterized is insane: foreach my $type (Moose::Util::TypeConstraints::get_all_parameterizable_types()) { Why does it need to loop through all parameterizable types? Shouldn't it know which parameterizable type it "came from"? Moose-2.2200/README.md000644 000766 000024 00000000705 14137574636 014435 0ustar00etherstaff000000 000000 [![CPAN version](https://badge.fury.io/pl/Moose.svg)](http://badge.fury.io/pl/Moose) [![Build Status](https://travis-ci.org/moose/Moose.png?branch=master,stable/2.12)](https://travis-ci.org/moose/Moose) [![Coverage Status](https://coveralls.io/repos/moose/Moose/badge.png?branch=master)](https://coveralls.io/r/moose/Moose?branch=master) Moose ===== Moose is a postmodern object system for Perl 5. Moose on CPAN: [https://metacpan.org/release/Moose] Moose-2.2200/benchmarks/000770 000766 000024 00000000000 14137574636 015266 5ustar00etherstaff000000 000000 Moose-2.2200/META.yml000644 000766 000024 00000252037 14137574636 014436 0ustar00etherstaff000000 000000 --- abstract: 'A postmodern object system for Perl 5' author: - 'Stevan Little ' - 'Dave Rolsky ' - 'Jesse Luehrs ' - 'Shawn M Moore ' - "יובל קוג'מן (Yuval Kogman) " - 'Karen Etheridge ' - 'Florian Ragwitz ' - 'Hans Dieter Pearcey ' - 'Chris Prather ' - 'Matt S Trout ' build_requires: CPAN::Meta::Check: '0.011' CPAN::Meta::Requirements: '0' File::Spec: '0' Module::Metadata: '0' Test::CleanNamespaces: '0.13' Test::Fatal: '0.001' Test::More: '0.96' Test::Requires: '0.05' configure_requires: Dist::CheckConflicts: '0.02' ExtUtils::MakeMaker: '0' perl: '5.008003' dynamic_config: 0 generated_by: 'Dist::Zilla version 6.024, CPAN::Meta::Converter version 2.150010' license: perl meta-spec: url: http://module-build.sourceforge.net/META-spec-v1.4.html version: '1.4' name: Moose no_index: directory: - author - benchmarks - doc - inc provides: Class::MOP: file: lib/Class/MOP.pm version: '2.2200' Class::MOP::Attribute: file: lib/Class/MOP/Attribute.pm version: '2.2200' Class::MOP::Class: file: lib/Class/MOP/Class.pm version: '2.2200' Class::MOP::Class::Immutable::Trait: file: lib/Class/MOP/Class/Immutable/Trait.pm version: '2.2200' Class::MOP::Deprecated: file: lib/Class/MOP/Deprecated.pm version: '2.2200' Class::MOP::Instance: file: lib/Class/MOP/Instance.pm version: '2.2200' Class::MOP::Method: file: lib/Class/MOP/Method.pm version: '2.2200' Class::MOP::Method::Accessor: file: lib/Class/MOP/Method/Accessor.pm version: '2.2200' Class::MOP::Method::Constructor: file: lib/Class/MOP/Method/Constructor.pm version: '2.2200' Class::MOP::Method::Generated: file: lib/Class/MOP/Method/Generated.pm version: '2.2200' Class::MOP::Method::Inlined: file: lib/Class/MOP/Method/Inlined.pm version: '2.2200' Class::MOP::Method::Meta: file: lib/Class/MOP/Method/Meta.pm version: '2.2200' Class::MOP::Method::Wrapped: file: lib/Class/MOP/Method/Wrapped.pm version: '2.2200' Class::MOP::MiniTrait: file: lib/Class/MOP/MiniTrait.pm version: '2.2200' Class::MOP::Mixin: file: lib/Class/MOP/Mixin.pm version: '2.2200' Class::MOP::Mixin::AttributeCore: file: lib/Class/MOP/Mixin/AttributeCore.pm version: '2.2200' Class::MOP::Mixin::HasAttributes: file: lib/Class/MOP/Mixin/HasAttributes.pm version: '2.2200' Class::MOP::Mixin::HasMethods: file: lib/Class/MOP/Mixin/HasMethods.pm version: '2.2200' Class::MOP::Mixin::HasOverloads: file: lib/Class/MOP/Mixin/HasOverloads.pm version: '2.2200' Class::MOP::Module: file: lib/Class/MOP/Module.pm version: '2.2200' Class::MOP::Object: file: lib/Class/MOP/Object.pm version: '2.2200' Class::MOP::Overload: file: lib/Class/MOP/Overload.pm version: '2.2200' Class::MOP::Package: file: lib/Class/MOP/Package.pm version: '2.2200' Moose: file: lib/Moose.pm version: '2.2200' Moose::Cookbook: file: lib/Moose/Cookbook.pod version: '2.2200' Moose::Cookbook::Basics::BankAccount_MethodModifiersAndSubclassing: file: lib/Moose/Cookbook/Basics/BankAccount_MethodModifiersAndSubclassing.pod version: '2.2200' Moose::Cookbook::Basics::BinaryTree_AttributeFeatures: file: lib/Moose/Cookbook/Basics/BinaryTree_AttributeFeatures.pod version: '2.2200' Moose::Cookbook::Basics::BinaryTree_BuilderAndLazyBuild: file: lib/Moose/Cookbook/Basics/BinaryTree_BuilderAndLazyBuild.pod version: '2.2200' Moose::Cookbook::Basics::Company_Subtypes: file: lib/Moose/Cookbook/Basics/Company_Subtypes.pod version: '2.2200' Moose::Cookbook::Basics::DateTime_ExtendingNonMooseParent: file: lib/Moose/Cookbook/Basics/DateTime_ExtendingNonMooseParent.pod version: '2.2200' Moose::Cookbook::Basics::Document_AugmentAndInner: file: lib/Moose/Cookbook/Basics/Document_AugmentAndInner.pod version: '2.2200' Moose::Cookbook::Basics::Genome_OverloadingSubtypesAndCoercion: file: lib/Moose/Cookbook/Basics/Genome_OverloadingSubtypesAndCoercion.pod version: '2.2200' Moose::Cookbook::Basics::HTTP_SubtypesAndCoercion: file: lib/Moose/Cookbook/Basics/HTTP_SubtypesAndCoercion.pod version: '2.2200' Moose::Cookbook::Basics::Immutable: file: lib/Moose/Cookbook/Basics/Immutable.pod version: '2.2200' Moose::Cookbook::Basics::Person_BUILDARGSAndBUILD: file: lib/Moose/Cookbook/Basics/Person_BUILDARGSAndBUILD.pod version: '2.2200' Moose::Cookbook::Basics::Point_AttributesAndSubclassing: file: lib/Moose/Cookbook/Basics/Point_AttributesAndSubclassing.pod version: '2.2200' Moose::Cookbook::Extending::Debugging_BaseClassRole: file: lib/Moose/Cookbook/Extending/Debugging_BaseClassRole.pod version: '2.2200' Moose::Cookbook::Extending::ExtensionOverview: file: lib/Moose/Cookbook/Extending/ExtensionOverview.pod version: '2.2200' Moose::Cookbook::Extending::Mooseish_MooseSugar: file: lib/Moose/Cookbook/Extending/Mooseish_MooseSugar.pod version: '2.2200' Moose::Cookbook::Legacy::Debugging_BaseClassReplacement: file: lib/Moose/Cookbook/Legacy/Debugging_BaseClassReplacement.pod version: '2.2200' Moose::Cookbook::Legacy::Labeled_AttributeMetaclass: file: lib/Moose/Cookbook/Legacy/Labeled_AttributeMetaclass.pod version: '2.2200' Moose::Cookbook::Legacy::Table_ClassMetaclass: file: lib/Moose/Cookbook/Legacy/Table_ClassMetaclass.pod version: '2.2200' Moose::Cookbook::Meta::GlobRef_InstanceMetaclass: file: lib/Moose/Cookbook/Meta/GlobRef_InstanceMetaclass.pod version: '2.2200' Moose::Cookbook::Meta::Labeled_AttributeTrait: file: lib/Moose/Cookbook/Meta/Labeled_AttributeTrait.pod version: '2.2200' Moose::Cookbook::Meta::PrivateOrPublic_MethodMetaclass: file: lib/Moose/Cookbook/Meta/PrivateOrPublic_MethodMetaclass.pod version: '2.2200' Moose::Cookbook::Meta::Table_MetaclassTrait: file: lib/Moose/Cookbook/Meta/Table_MetaclassTrait.pod version: '2.2200' Moose::Cookbook::Meta::WhyMeta: file: lib/Moose/Cookbook/Meta/WhyMeta.pod version: '2.2200' Moose::Cookbook::Roles::ApplicationToInstance: file: lib/Moose/Cookbook/Roles/ApplicationToInstance.pod version: '2.2200' Moose::Cookbook::Roles::Comparable_CodeReuse: file: lib/Moose/Cookbook/Roles/Comparable_CodeReuse.pod version: '2.2200' Moose::Cookbook::Roles::Restartable_AdvancedComposition: file: lib/Moose/Cookbook/Roles/Restartable_AdvancedComposition.pod version: '2.2200' Moose::Cookbook::Snack::Keywords: file: lib/Moose/Cookbook/Snack/Keywords.pod version: '2.2200' Moose::Cookbook::Snack::Types: file: lib/Moose/Cookbook/Snack/Types.pod version: '2.2200' Moose::Cookbook::Style: file: lib/Moose/Cookbook/Style.pod version: '2.2200' Moose::Deprecated: file: lib/Moose/Deprecated.pm version: '2.2200' Moose::Exception: file: lib/Moose/Exception.pm version: '2.2200' Moose::Exception::AccessorMustReadWrite: file: lib/Moose/Exception/AccessorMustReadWrite.pm version: '2.2200' Moose::Exception::AddParameterizableTypeTakesParameterizableType: file: lib/Moose/Exception/AddParameterizableTypeTakesParameterizableType.pm version: '2.2200' Moose::Exception::AddRoleTakesAMooseMetaRoleInstance: file: lib/Moose/Exception/AddRoleTakesAMooseMetaRoleInstance.pm version: '2.2200' Moose::Exception::AddRoleToARoleTakesAMooseMetaRole: file: lib/Moose/Exception/AddRoleToARoleTakesAMooseMetaRole.pm version: '2.2200' Moose::Exception::ApplyTakesABlessedInstance: file: lib/Moose/Exception/ApplyTakesABlessedInstance.pm version: '2.2200' Moose::Exception::AttachToClassNeedsAClassMOPClassInstanceOrASubclass: file: lib/Moose/Exception/AttachToClassNeedsAClassMOPClassInstanceOrASubclass.pm version: '2.2200' Moose::Exception::AttributeConflictInRoles: file: lib/Moose/Exception/AttributeConflictInRoles.pm version: '2.2200' Moose::Exception::AttributeConflictInSummation: file: lib/Moose/Exception/AttributeConflictInSummation.pm version: '2.2200' Moose::Exception::AttributeExtensionIsNotSupportedInRoles: file: lib/Moose/Exception/AttributeExtensionIsNotSupportedInRoles.pm version: '2.2200' Moose::Exception::AttributeIsRequired: file: lib/Moose/Exception/AttributeIsRequired.pm version: '2.2200' Moose::Exception::AttributeMustBeAnClassMOPMixinAttributeCoreOrSubclass: file: lib/Moose/Exception/AttributeMustBeAnClassMOPMixinAttributeCoreOrSubclass.pm version: '2.2200' Moose::Exception::AttributeNamesDoNotMatch: file: lib/Moose/Exception/AttributeNamesDoNotMatch.pm version: '2.2200' Moose::Exception::AttributeValueIsNotAnObject: file: lib/Moose/Exception/AttributeValueIsNotAnObject.pm version: '2.2200' Moose::Exception::AttributeValueIsNotDefined: file: lib/Moose/Exception/AttributeValueIsNotDefined.pm version: '2.2200' Moose::Exception::AutoDeRefNeedsArrayRefOrHashRef: file: lib/Moose/Exception/AutoDeRefNeedsArrayRefOrHashRef.pm version: '2.2200' Moose::Exception::BadOptionFormat: file: lib/Moose/Exception/BadOptionFormat.pm version: '2.2200' Moose::Exception::BothBuilderAndDefaultAreNotAllowed: file: lib/Moose/Exception/BothBuilderAndDefaultAreNotAllowed.pm version: '2.2200' Moose::Exception::BuilderDoesNotExist: file: lib/Moose/Exception/BuilderDoesNotExist.pm version: '2.2200' Moose::Exception::BuilderMethodNotSupportedForAttribute: file: lib/Moose/Exception/BuilderMethodNotSupportedForAttribute.pm version: '2.2200' Moose::Exception::BuilderMethodNotSupportedForInlineAttribute: file: lib/Moose/Exception/BuilderMethodNotSupportedForInlineAttribute.pm version: '2.2200' Moose::Exception::BuilderMustBeAMethodName: file: lib/Moose/Exception/BuilderMustBeAMethodName.pm version: '2.2200' Moose::Exception::CallingMethodOnAnImmutableInstance: file: lib/Moose/Exception/CallingMethodOnAnImmutableInstance.pm version: '2.2200' Moose::Exception::CallingReadOnlyMethodOnAnImmutableInstance: file: lib/Moose/Exception/CallingReadOnlyMethodOnAnImmutableInstance.pm version: '2.2200' Moose::Exception::CanExtendOnlyClasses: file: lib/Moose/Exception/CanExtendOnlyClasses.pm version: '2.2200' Moose::Exception::CanOnlyConsumeRole: file: lib/Moose/Exception/CanOnlyConsumeRole.pm version: '2.2200' Moose::Exception::CanOnlyWrapBlessedCode: file: lib/Moose/Exception/CanOnlyWrapBlessedCode.pm version: '2.2200' Moose::Exception::CanReblessOnlyIntoASubclass: file: lib/Moose/Exception/CanReblessOnlyIntoASubclass.pm version: '2.2200' Moose::Exception::CanReblessOnlyIntoASuperclass: file: lib/Moose/Exception/CanReblessOnlyIntoASuperclass.pm version: '2.2200' Moose::Exception::CannotAddAdditionalTypeCoercionsToUnion: file: lib/Moose/Exception/CannotAddAdditionalTypeCoercionsToUnion.pm version: '2.2200' Moose::Exception::CannotAddAsAnAttributeToARole: file: lib/Moose/Exception/CannotAddAsAnAttributeToARole.pm version: '2.2200' Moose::Exception::CannotApplyBaseClassRolesToRole: file: lib/Moose/Exception/CannotApplyBaseClassRolesToRole.pm version: '2.2200' Moose::Exception::CannotAssignValueToReadOnlyAccessor: file: lib/Moose/Exception/CannotAssignValueToReadOnlyAccessor.pm version: '2.2200' Moose::Exception::CannotAugmentIfLocalMethodPresent: file: lib/Moose/Exception/CannotAugmentIfLocalMethodPresent.pm version: '2.2200' Moose::Exception::CannotAugmentNoSuperMethod: file: lib/Moose/Exception/CannotAugmentNoSuperMethod.pm version: '2.2200' Moose::Exception::CannotAutoDerefWithoutIsa: file: lib/Moose/Exception/CannotAutoDerefWithoutIsa.pm version: '2.2200' Moose::Exception::CannotAutoDereferenceTypeConstraint: file: lib/Moose/Exception/CannotAutoDereferenceTypeConstraint.pm version: '2.2200' Moose::Exception::CannotCalculateNativeType: file: lib/Moose/Exception/CannotCalculateNativeType.pm version: '2.2200' Moose::Exception::CannotCallAnAbstractBaseMethod: file: lib/Moose/Exception/CannotCallAnAbstractBaseMethod.pm version: '2.2200' Moose::Exception::CannotCallAnAbstractMethod: file: lib/Moose/Exception/CannotCallAnAbstractMethod.pm version: '2.2200' Moose::Exception::CannotCoerceAWeakRef: file: lib/Moose/Exception/CannotCoerceAWeakRef.pm version: '2.2200' Moose::Exception::CannotCoerceAttributeWhichHasNoCoercion: file: lib/Moose/Exception/CannotCoerceAttributeWhichHasNoCoercion.pm version: '2.2200' Moose::Exception::CannotCreateHigherOrderTypeWithoutATypeParameter: file: lib/Moose/Exception/CannotCreateHigherOrderTypeWithoutATypeParameter.pm version: '2.2200' Moose::Exception::CannotCreateMethodAliasLocalMethodIsPresent: file: lib/Moose/Exception/CannotCreateMethodAliasLocalMethodIsPresent.pm version: '2.2200' Moose::Exception::CannotCreateMethodAliasLocalMethodIsPresentInClass: file: lib/Moose/Exception/CannotCreateMethodAliasLocalMethodIsPresentInClass.pm version: '2.2200' Moose::Exception::CannotDelegateLocalMethodIsPresent: file: lib/Moose/Exception/CannotDelegateLocalMethodIsPresent.pm version: '2.2200' Moose::Exception::CannotDelegateWithoutIsa: file: lib/Moose/Exception/CannotDelegateWithoutIsa.pm version: '2.2200' Moose::Exception::CannotFindDelegateMetaclass: file: lib/Moose/Exception/CannotFindDelegateMetaclass.pm version: '2.2200' Moose::Exception::CannotFindType: file: lib/Moose/Exception/CannotFindType.pm version: '2.2200' Moose::Exception::CannotFindTypeGivenToMatchOnType: file: lib/Moose/Exception/CannotFindTypeGivenToMatchOnType.pm version: '2.2200' Moose::Exception::CannotFixMetaclassCompatibility: file: lib/Moose/Exception/CannotFixMetaclassCompatibility.pm version: '2.2200' Moose::Exception::CannotGenerateInlineConstraint: file: lib/Moose/Exception/CannotGenerateInlineConstraint.pm version: '2.2200' Moose::Exception::CannotInitializeMooseMetaRoleComposite: file: lib/Moose/Exception/CannotInitializeMooseMetaRoleComposite.pm version: '2.2200' Moose::Exception::CannotInlineTypeConstraintCheck: file: lib/Moose/Exception/CannotInlineTypeConstraintCheck.pm version: '2.2200' Moose::Exception::CannotLocatePackageInINC: file: lib/Moose/Exception/CannotLocatePackageInINC.pm version: '2.2200' Moose::Exception::CannotMakeMetaclassCompatible: file: lib/Moose/Exception/CannotMakeMetaclassCompatible.pm version: '2.2200' Moose::Exception::CannotOverrideALocalMethod: file: lib/Moose/Exception/CannotOverrideALocalMethod.pm version: '2.2200' Moose::Exception::CannotOverrideBodyOfMetaMethods: file: lib/Moose/Exception/CannotOverrideBodyOfMetaMethods.pm version: '2.2200' Moose::Exception::CannotOverrideLocalMethodIsPresent: file: lib/Moose/Exception/CannotOverrideLocalMethodIsPresent.pm version: '2.2200' Moose::Exception::CannotOverrideNoSuperMethod: file: lib/Moose/Exception/CannotOverrideNoSuperMethod.pm version: '2.2200' Moose::Exception::CannotRegisterUnnamedTypeConstraint: file: lib/Moose/Exception/CannotRegisterUnnamedTypeConstraint.pm version: '2.2200' Moose::Exception::CannotUseLazyBuildAndDefaultSimultaneously: file: lib/Moose/Exception/CannotUseLazyBuildAndDefaultSimultaneously.pm version: '2.2200' Moose::Exception::CircularReferenceInAlso: file: lib/Moose/Exception/CircularReferenceInAlso.pm version: '2.2200' Moose::Exception::ClassDoesNotHaveInitMeta: file: lib/Moose/Exception/ClassDoesNotHaveInitMeta.pm version: '2.2200' Moose::Exception::ClassDoesTheExcludedRole: file: lib/Moose/Exception/ClassDoesTheExcludedRole.pm version: '2.2200' Moose::Exception::ClassNamesDoNotMatch: file: lib/Moose/Exception/ClassNamesDoNotMatch.pm version: '2.2200' Moose::Exception::CloneObjectExpectsAnInstanceOfMetaclass: file: lib/Moose/Exception/CloneObjectExpectsAnInstanceOfMetaclass.pm version: '2.2200' Moose::Exception::CodeBlockMustBeACodeRef: file: lib/Moose/Exception/CodeBlockMustBeACodeRef.pm version: '2.2200' Moose::Exception::CoercingWithoutCoercions: file: lib/Moose/Exception/CoercingWithoutCoercions.pm version: '2.2200' Moose::Exception::CoercionAlreadyExists: file: lib/Moose/Exception/CoercionAlreadyExists.pm version: '2.2200' Moose::Exception::CoercionNeedsTypeConstraint: file: lib/Moose/Exception/CoercionNeedsTypeConstraint.pm version: '2.2200' Moose::Exception::ConflictDetectedInCheckRoleExclusions: file: lib/Moose/Exception/ConflictDetectedInCheckRoleExclusions.pm version: '2.2200' Moose::Exception::ConflictDetectedInCheckRoleExclusionsInToClass: file: lib/Moose/Exception/ConflictDetectedInCheckRoleExclusionsInToClass.pm version: '2.2200' Moose::Exception::ConstructClassInstanceTakesPackageName: file: lib/Moose/Exception/ConstructClassInstanceTakesPackageName.pm version: '2.2200' Moose::Exception::CouldNotCreateMethod: file: lib/Moose/Exception/CouldNotCreateMethod.pm version: '2.2200' Moose::Exception::CouldNotCreateWriter: file: lib/Moose/Exception/CouldNotCreateWriter.pm version: '2.2200' Moose::Exception::CouldNotEvalConstructor: file: lib/Moose/Exception/CouldNotEvalConstructor.pm version: '2.2200' Moose::Exception::CouldNotEvalDestructor: file: lib/Moose/Exception/CouldNotEvalDestructor.pm version: '2.2200' Moose::Exception::CouldNotFindTypeConstraintToCoerceFrom: file: lib/Moose/Exception/CouldNotFindTypeConstraintToCoerceFrom.pm version: '2.2200' Moose::Exception::CouldNotGenerateInlineAttributeMethod: file: lib/Moose/Exception/CouldNotGenerateInlineAttributeMethod.pm version: '2.2200' Moose::Exception::CouldNotLocateTypeConstraintForUnion: file: lib/Moose/Exception/CouldNotLocateTypeConstraintForUnion.pm version: '2.2200' Moose::Exception::CouldNotParseType: file: lib/Moose/Exception/CouldNotParseType.pm version: '2.2200' Moose::Exception::CreateMOPClassTakesArrayRefOfAttributes: file: lib/Moose/Exception/CreateMOPClassTakesArrayRefOfAttributes.pm version: '2.2200' Moose::Exception::CreateMOPClassTakesArrayRefOfSuperclasses: file: lib/Moose/Exception/CreateMOPClassTakesArrayRefOfSuperclasses.pm version: '2.2200' Moose::Exception::CreateMOPClassTakesHashRefOfMethods: file: lib/Moose/Exception/CreateMOPClassTakesHashRefOfMethods.pm version: '2.2200' Moose::Exception::CreateTakesArrayRefOfRoles: file: lib/Moose/Exception/CreateTakesArrayRefOfRoles.pm version: '2.2200' Moose::Exception::CreateTakesHashRefOfAttributes: file: lib/Moose/Exception/CreateTakesHashRefOfAttributes.pm version: '2.2200' Moose::Exception::CreateTakesHashRefOfMethods: file: lib/Moose/Exception/CreateTakesHashRefOfMethods.pm version: '2.2200' Moose::Exception::DefaultToMatchOnTypeMustBeCodeRef: file: lib/Moose/Exception/DefaultToMatchOnTypeMustBeCodeRef.pm version: '2.2200' Moose::Exception::DelegationToAClassWhichIsNotLoaded: file: lib/Moose/Exception/DelegationToAClassWhichIsNotLoaded.pm version: '2.2200' Moose::Exception::DelegationToARoleWhichIsNotLoaded: file: lib/Moose/Exception/DelegationToARoleWhichIsNotLoaded.pm version: '2.2200' Moose::Exception::DelegationToATypeWhichIsNotAClass: file: lib/Moose/Exception/DelegationToATypeWhichIsNotAClass.pm version: '2.2200' Moose::Exception::DoesRequiresRoleName: file: lib/Moose/Exception/DoesRequiresRoleName.pm version: '2.2200' Moose::Exception::EnumCalledWithAnArrayRefAndAdditionalArgs: file: lib/Moose/Exception/EnumCalledWithAnArrayRefAndAdditionalArgs.pm version: '2.2200' Moose::Exception::EnumValuesMustBeString: file: lib/Moose/Exception/EnumValuesMustBeString.pm version: '2.2200' Moose::Exception::ExtendsMissingArgs: file: lib/Moose/Exception/ExtendsMissingArgs.pm version: '2.2200' Moose::Exception::HandlesMustBeAHashRef: file: lib/Moose/Exception/HandlesMustBeAHashRef.pm version: '2.2200' Moose::Exception::IllegalInheritedOptions: file: lib/Moose/Exception/IllegalInheritedOptions.pm version: '2.2200' Moose::Exception::IllegalMethodTypeToAddMethodModifier: file: lib/Moose/Exception/IllegalMethodTypeToAddMethodModifier.pm version: '2.2200' Moose::Exception::IncompatibleMetaclassOfSuperclass: file: lib/Moose/Exception/IncompatibleMetaclassOfSuperclass.pm version: '2.2200' Moose::Exception::InitMetaRequiresClass: file: lib/Moose/Exception/InitMetaRequiresClass.pm version: '2.2200' Moose::Exception::InitializeTakesUnBlessedPackageName: file: lib/Moose/Exception/InitializeTakesUnBlessedPackageName.pm version: '2.2200' Moose::Exception::InstanceBlessedIntoWrongClass: file: lib/Moose/Exception/InstanceBlessedIntoWrongClass.pm version: '2.2200' Moose::Exception::InstanceMustBeABlessedReference: file: lib/Moose/Exception/InstanceMustBeABlessedReference.pm version: '2.2200' Moose::Exception::InvalidArgPassedToMooseUtilMetaRole: file: lib/Moose/Exception/InvalidArgPassedToMooseUtilMetaRole.pm version: '2.2200' Moose::Exception::InvalidArgumentToMethod: file: lib/Moose/Exception/InvalidArgumentToMethod.pm version: '2.2200' Moose::Exception::InvalidArgumentsToTraitAliases: file: lib/Moose/Exception/InvalidArgumentsToTraitAliases.pm version: '2.2200' Moose::Exception::InvalidBaseTypeGivenToCreateParameterizedTypeConstraint: file: lib/Moose/Exception/InvalidBaseTypeGivenToCreateParameterizedTypeConstraint.pm version: '2.2200' Moose::Exception::InvalidHandleValue: file: lib/Moose/Exception/InvalidHandleValue.pm version: '2.2200' Moose::Exception::InvalidHasProvidedInARole: file: lib/Moose/Exception/InvalidHasProvidedInARole.pm version: '2.2200' Moose::Exception::InvalidNameForType: file: lib/Moose/Exception/InvalidNameForType.pm version: '2.2200' Moose::Exception::InvalidOverloadOperator: file: lib/Moose/Exception/InvalidOverloadOperator.pm version: '2.2200' Moose::Exception::InvalidRoleApplication: file: lib/Moose/Exception/InvalidRoleApplication.pm version: '2.2200' Moose::Exception::InvalidTypeConstraint: file: lib/Moose/Exception/InvalidTypeConstraint.pm version: '2.2200' Moose::Exception::InvalidTypeGivenToCreateParameterizedTypeConstraint: file: lib/Moose/Exception/InvalidTypeGivenToCreateParameterizedTypeConstraint.pm version: '2.2200' Moose::Exception::InvalidValueForIs: file: lib/Moose/Exception/InvalidValueForIs.pm version: '2.2200' Moose::Exception::IsaDoesNotDoTheRole: file: lib/Moose/Exception/IsaDoesNotDoTheRole.pm version: '2.2200' Moose::Exception::IsaLacksDoesMethod: file: lib/Moose/Exception/IsaLacksDoesMethod.pm version: '2.2200' Moose::Exception::LazyAttributeNeedsADefault: file: lib/Moose/Exception/LazyAttributeNeedsADefault.pm version: '2.2200' Moose::Exception::Legacy: file: lib/Moose/Exception/Legacy.pm version: '2.2200' Moose::Exception::MOPAttributeNewNeedsAttributeName: file: lib/Moose/Exception/MOPAttributeNewNeedsAttributeName.pm version: '2.2200' Moose::Exception::MatchActionMustBeACodeRef: file: lib/Moose/Exception/MatchActionMustBeACodeRef.pm version: '2.2200' Moose::Exception::MessageParameterMustBeCodeRef: file: lib/Moose/Exception/MessageParameterMustBeCodeRef.pm version: '2.2200' Moose::Exception::MetaclassIsAClassNotASubclassOfGivenMetaclass: file: lib/Moose/Exception/MetaclassIsAClassNotASubclassOfGivenMetaclass.pm version: '2.2200' Moose::Exception::MetaclassIsARoleNotASubclassOfGivenMetaclass: file: lib/Moose/Exception/MetaclassIsARoleNotASubclassOfGivenMetaclass.pm version: '2.2200' Moose::Exception::MetaclassIsNotASubclassOfGivenMetaclass: file: lib/Moose/Exception/MetaclassIsNotASubclassOfGivenMetaclass.pm version: '2.2200' Moose::Exception::MetaclassMustBeASubclassOfMooseMetaClass: file: lib/Moose/Exception/MetaclassMustBeASubclassOfMooseMetaClass.pm version: '2.2200' Moose::Exception::MetaclassMustBeASubclassOfMooseMetaRole: file: lib/Moose/Exception/MetaclassMustBeASubclassOfMooseMetaRole.pm version: '2.2200' Moose::Exception::MetaclassMustBeDerivedFromClassMOPClass: file: lib/Moose/Exception/MetaclassMustBeDerivedFromClassMOPClass.pm version: '2.2200' Moose::Exception::MetaclassNotLoaded: file: lib/Moose/Exception/MetaclassNotLoaded.pm version: '2.2200' Moose::Exception::MetaclassTypeIncompatible: file: lib/Moose/Exception/MetaclassTypeIncompatible.pm version: '2.2200' Moose::Exception::MethodExpectedAMetaclassObject: file: lib/Moose/Exception/MethodExpectedAMetaclassObject.pm version: '2.2200' Moose::Exception::MethodExpectsFewerArgs: file: lib/Moose/Exception/MethodExpectsFewerArgs.pm version: '2.2200' Moose::Exception::MethodExpectsMoreArgs: file: lib/Moose/Exception/MethodExpectsMoreArgs.pm version: '2.2200' Moose::Exception::MethodModifierNeedsMethodName: file: lib/Moose/Exception/MethodModifierNeedsMethodName.pm version: '2.2200' Moose::Exception::MethodNameConflictInRoles: file: lib/Moose/Exception/MethodNameConflictInRoles.pm version: '2.2200' Moose::Exception::MethodNameNotFoundInInheritanceHierarchy: file: lib/Moose/Exception/MethodNameNotFoundInInheritanceHierarchy.pm version: '2.2200' Moose::Exception::MethodNameNotGiven: file: lib/Moose/Exception/MethodNameNotGiven.pm version: '2.2200' Moose::Exception::MustDefineAMethodName: file: lib/Moose/Exception/MustDefineAMethodName.pm version: '2.2200' Moose::Exception::MustDefineAnAttributeName: file: lib/Moose/Exception/MustDefineAnAttributeName.pm version: '2.2200' Moose::Exception::MustDefineAnOverloadOperator: file: lib/Moose/Exception/MustDefineAnOverloadOperator.pm version: '2.2200' Moose::Exception::MustHaveAtLeastOneValueToEnumerate: file: lib/Moose/Exception/MustHaveAtLeastOneValueToEnumerate.pm version: '2.2200' Moose::Exception::MustPassAHashOfOptions: file: lib/Moose/Exception/MustPassAHashOfOptions.pm version: '2.2200' Moose::Exception::MustPassAMooseMetaRoleInstanceOrSubclass: file: lib/Moose/Exception/MustPassAMooseMetaRoleInstanceOrSubclass.pm version: '2.2200' Moose::Exception::MustPassAPackageNameOrAnExistingClassMOPPackageInstance: file: lib/Moose/Exception/MustPassAPackageNameOrAnExistingClassMOPPackageInstance.pm version: '2.2200' Moose::Exception::MustPassEvenNumberOfArguments: file: lib/Moose/Exception/MustPassEvenNumberOfArguments.pm version: '2.2200' Moose::Exception::MustPassEvenNumberOfAttributeOptions: file: lib/Moose/Exception/MustPassEvenNumberOfAttributeOptions.pm version: '2.2200' Moose::Exception::MustProvideANameForTheAttribute: file: lib/Moose/Exception/MustProvideANameForTheAttribute.pm version: '2.2200' Moose::Exception::MustSpecifyAtleastOneMethod: file: lib/Moose/Exception/MustSpecifyAtleastOneMethod.pm version: '2.2200' Moose::Exception::MustSpecifyAtleastOneRole: file: lib/Moose/Exception/MustSpecifyAtleastOneRole.pm version: '2.2200' Moose::Exception::MustSpecifyAtleastOneRoleToApplicant: file: lib/Moose/Exception/MustSpecifyAtleastOneRoleToApplicant.pm version: '2.2200' Moose::Exception::MustSupplyAClassMOPAttributeInstance: file: lib/Moose/Exception/MustSupplyAClassMOPAttributeInstance.pm version: '2.2200' Moose::Exception::MustSupplyADelegateToMethod: file: lib/Moose/Exception/MustSupplyADelegateToMethod.pm version: '2.2200' Moose::Exception::MustSupplyAMetaclass: file: lib/Moose/Exception/MustSupplyAMetaclass.pm version: '2.2200' Moose::Exception::MustSupplyAMooseMetaAttributeInstance: file: lib/Moose/Exception/MustSupplyAMooseMetaAttributeInstance.pm version: '2.2200' Moose::Exception::MustSupplyAnAccessorTypeToConstructWith: file: lib/Moose/Exception/MustSupplyAnAccessorTypeToConstructWith.pm version: '2.2200' Moose::Exception::MustSupplyAnAttributeToConstructWith: file: lib/Moose/Exception/MustSupplyAnAttributeToConstructWith.pm version: '2.2200' Moose::Exception::MustSupplyArrayRefAsCurriedArguments: file: lib/Moose/Exception/MustSupplyArrayRefAsCurriedArguments.pm version: '2.2200' Moose::Exception::MustSupplyPackageNameAndName: file: lib/Moose/Exception/MustSupplyPackageNameAndName.pm version: '2.2200' Moose::Exception::NeedsTypeConstraintUnionForTypeCoercionUnion: file: lib/Moose/Exception/NeedsTypeConstraintUnionForTypeCoercionUnion.pm version: '2.2200' Moose::Exception::NeitherAttributeNorAttributeNameIsGiven: file: lib/Moose/Exception/NeitherAttributeNorAttributeNameIsGiven.pm version: '2.2200' Moose::Exception::NeitherClassNorClassNameIsGiven: file: lib/Moose/Exception/NeitherClassNorClassNameIsGiven.pm version: '2.2200' Moose::Exception::NeitherRoleNorRoleNameIsGiven: file: lib/Moose/Exception/NeitherRoleNorRoleNameIsGiven.pm version: '2.2200' Moose::Exception::NeitherTypeNorTypeNameIsGiven: file: lib/Moose/Exception/NeitherTypeNorTypeNameIsGiven.pm version: '2.2200' Moose::Exception::NoAttributeFoundInSuperClass: file: lib/Moose/Exception/NoAttributeFoundInSuperClass.pm version: '2.2200' Moose::Exception::NoBodyToInitializeInAnAbstractBaseClass: file: lib/Moose/Exception/NoBodyToInitializeInAnAbstractBaseClass.pm version: '2.2200' Moose::Exception::NoCasesMatched: file: lib/Moose/Exception/NoCasesMatched.pm version: '2.2200' Moose::Exception::NoConstraintCheckForTypeConstraint: file: lib/Moose/Exception/NoConstraintCheckForTypeConstraint.pm version: '2.2200' Moose::Exception::NoDestructorClassSpecified: file: lib/Moose/Exception/NoDestructorClassSpecified.pm version: '2.2200' Moose::Exception::NoImmutableTraitSpecifiedForClass: file: lib/Moose/Exception/NoImmutableTraitSpecifiedForClass.pm version: '2.2200' Moose::Exception::NoParentGivenToSubtype: file: lib/Moose/Exception/NoParentGivenToSubtype.pm version: '2.2200' Moose::Exception::OnlyInstancesCanBeCloned: file: lib/Moose/Exception/OnlyInstancesCanBeCloned.pm version: '2.2200' Moose::Exception::OperatorIsRequired: file: lib/Moose/Exception/OperatorIsRequired.pm version: '2.2200' Moose::Exception::OverloadConflictInSummation: file: lib/Moose/Exception/OverloadConflictInSummation.pm version: '2.2200' Moose::Exception::OverloadRequiresAMetaClass: file: lib/Moose/Exception/OverloadRequiresAMetaClass.pm version: '2.2200' Moose::Exception::OverloadRequiresAMetaMethod: file: lib/Moose/Exception/OverloadRequiresAMetaMethod.pm version: '2.2200' Moose::Exception::OverloadRequiresAMetaOverload: file: lib/Moose/Exception/OverloadRequiresAMetaOverload.pm version: '2.2200' Moose::Exception::OverloadRequiresAMethodNameOrCoderef: file: lib/Moose/Exception/OverloadRequiresAMethodNameOrCoderef.pm version: '2.2200' Moose::Exception::OverloadRequiresAnOperator: file: lib/Moose/Exception/OverloadRequiresAnOperator.pm version: '2.2200' Moose::Exception::OverloadRequiresNamesForCoderef: file: lib/Moose/Exception/OverloadRequiresNamesForCoderef.pm version: '2.2200' Moose::Exception::OverrideConflictInComposition: file: lib/Moose/Exception/OverrideConflictInComposition.pm version: '2.2200' Moose::Exception::OverrideConflictInSummation: file: lib/Moose/Exception/OverrideConflictInSummation.pm version: '2.2200' Moose::Exception::PackageDoesNotUseMooseExporter: file: lib/Moose/Exception/PackageDoesNotUseMooseExporter.pm version: '2.2200' Moose::Exception::PackageNameAndNameParamsNotGivenToWrap: file: lib/Moose/Exception/PackageNameAndNameParamsNotGivenToWrap.pm version: '2.2200' Moose::Exception::PackagesAndModulesAreNotCachable: file: lib/Moose/Exception/PackagesAndModulesAreNotCachable.pm version: '2.2200' Moose::Exception::ParameterIsNotSubtypeOfParent: file: lib/Moose/Exception/ParameterIsNotSubtypeOfParent.pm version: '2.2200' Moose::Exception::ReferencesAreNotAllowedAsDefault: file: lib/Moose/Exception/ReferencesAreNotAllowedAsDefault.pm version: '2.2200' Moose::Exception::RequiredAttributeLacksInitialization: file: lib/Moose/Exception/RequiredAttributeLacksInitialization.pm version: '2.2200' Moose::Exception::RequiredAttributeNeedsADefault: file: lib/Moose/Exception/RequiredAttributeNeedsADefault.pm version: '2.2200' Moose::Exception::RequiredMethodsImportedByClass: file: lib/Moose/Exception/RequiredMethodsImportedByClass.pm version: '2.2200' Moose::Exception::RequiredMethodsNotImplementedByClass: file: lib/Moose/Exception/RequiredMethodsNotImplementedByClass.pm version: '2.2200' Moose::Exception::Role::Attribute: file: lib/Moose/Exception/Role/Attribute.pm version: '2.2200' Moose::Exception::Role::AttributeName: file: lib/Moose/Exception/Role/AttributeName.pm version: '2.2200' Moose::Exception::Role::Class: file: lib/Moose/Exception/Role/Class.pm version: '2.2200' Moose::Exception::Role::EitherAttributeOrAttributeName: file: lib/Moose/Exception/Role/EitherAttributeOrAttributeName.pm version: '2.2200' Moose::Exception::Role::Instance: file: lib/Moose/Exception/Role/Instance.pm version: '2.2200' Moose::Exception::Role::InstanceClass: file: lib/Moose/Exception/Role/InstanceClass.pm version: '2.2200' Moose::Exception::Role::InvalidAttributeOptions: file: lib/Moose/Exception/Role/InvalidAttributeOptions.pm version: '2.2200' Moose::Exception::Role::Method: file: lib/Moose/Exception/Role/Method.pm version: '2.2200' Moose::Exception::Role::ParamsHash: file: lib/Moose/Exception/Role/ParamsHash.pm version: '2.2200' Moose::Exception::Role::Role: file: lib/Moose/Exception/Role/Role.pm version: '2.2200' Moose::Exception::Role::RoleForCreate: file: lib/Moose/Exception/Role/RoleForCreate.pm version: '2.2200' Moose::Exception::Role::RoleForCreateMOPClass: file: lib/Moose/Exception/Role/RoleForCreateMOPClass.pm version: '2.2200' Moose::Exception::Role::TypeConstraint: file: lib/Moose/Exception/Role/TypeConstraint.pm version: '2.2200' Moose::Exception::RoleDoesTheExcludedRole: file: lib/Moose/Exception/RoleDoesTheExcludedRole.pm version: '2.2200' Moose::Exception::RoleExclusionConflict: file: lib/Moose/Exception/RoleExclusionConflict.pm version: '2.2200' Moose::Exception::RoleNameRequired: file: lib/Moose/Exception/RoleNameRequired.pm version: '2.2200' Moose::Exception::RoleNameRequiredForMooseMetaRole: file: lib/Moose/Exception/RoleNameRequiredForMooseMetaRole.pm version: '2.2200' Moose::Exception::RolesDoNotSupportAugment: file: lib/Moose/Exception/RolesDoNotSupportAugment.pm version: '2.2200' Moose::Exception::RolesDoNotSupportExtends: file: lib/Moose/Exception/RolesDoNotSupportExtends.pm version: '2.2200' Moose::Exception::RolesDoNotSupportInner: file: lib/Moose/Exception/RolesDoNotSupportInner.pm version: '2.2200' Moose::Exception::RolesDoNotSupportRegexReferencesForMethodModifiers: file: lib/Moose/Exception/RolesDoNotSupportRegexReferencesForMethodModifiers.pm version: '2.2200' Moose::Exception::RolesInCreateTakesAnArrayRef: file: lib/Moose/Exception/RolesInCreateTakesAnArrayRef.pm version: '2.2200' Moose::Exception::RolesListMustBeInstancesOfMooseMetaRole: file: lib/Moose/Exception/RolesListMustBeInstancesOfMooseMetaRole.pm version: '2.2200' Moose::Exception::SingleParamsToNewMustBeHashRef: file: lib/Moose/Exception/SingleParamsToNewMustBeHashRef.pm version: '2.2200' Moose::Exception::TriggerMustBeACodeRef: file: lib/Moose/Exception/TriggerMustBeACodeRef.pm version: '2.2200' Moose::Exception::TypeConstraintCannotBeUsedForAParameterizableType: file: lib/Moose/Exception/TypeConstraintCannotBeUsedForAParameterizableType.pm version: '2.2200' Moose::Exception::TypeConstraintIsAlreadyCreated: file: lib/Moose/Exception/TypeConstraintIsAlreadyCreated.pm version: '2.2200' Moose::Exception::TypeParameterMustBeMooseMetaType: file: lib/Moose/Exception/TypeParameterMustBeMooseMetaType.pm version: '2.2200' Moose::Exception::UnableToCanonicalizeHandles: file: lib/Moose/Exception/UnableToCanonicalizeHandles.pm version: '2.2200' Moose::Exception::UnableToCanonicalizeNonRolePackage: file: lib/Moose/Exception/UnableToCanonicalizeNonRolePackage.pm version: '2.2200' Moose::Exception::UnableToRecognizeDelegateMetaclass: file: lib/Moose/Exception/UnableToRecognizeDelegateMetaclass.pm version: '2.2200' Moose::Exception::UndefinedHashKeysPassedToMethod: file: lib/Moose/Exception/UndefinedHashKeysPassedToMethod.pm version: '2.2200' Moose::Exception::UnionCalledWithAnArrayRefAndAdditionalArgs: file: lib/Moose/Exception/UnionCalledWithAnArrayRefAndAdditionalArgs.pm version: '2.2200' Moose::Exception::UnionTakesAtleastTwoTypeNames: file: lib/Moose/Exception/UnionTakesAtleastTwoTypeNames.pm version: '2.2200' Moose::Exception::ValidationFailedForInlineTypeConstraint: file: lib/Moose/Exception/ValidationFailedForInlineTypeConstraint.pm version: '2.2200' Moose::Exception::ValidationFailedForTypeConstraint: file: lib/Moose/Exception/ValidationFailedForTypeConstraint.pm version: '2.2200' Moose::Exception::WrapTakesACodeRefToBless: file: lib/Moose/Exception/WrapTakesACodeRefToBless.pm version: '2.2200' Moose::Exception::WrongTypeConstraintGiven: file: lib/Moose/Exception/WrongTypeConstraintGiven.pm version: '2.2200' Moose::Exporter: file: lib/Moose/Exporter.pm version: '2.2200' Moose::Intro: file: lib/Moose/Intro.pod version: '2.2200' Moose::Manual: file: lib/Moose/Manual.pod version: '2.2200' Moose::Manual::Attributes: file: lib/Moose/Manual/Attributes.pod version: '2.2200' Moose::Manual::BestPractices: file: lib/Moose/Manual/BestPractices.pod version: '2.2200' Moose::Manual::Classes: file: lib/Moose/Manual/Classes.pod version: '2.2200' Moose::Manual::Concepts: file: lib/Moose/Manual/Concepts.pod version: '2.2200' Moose::Manual::Construction: file: lib/Moose/Manual/Construction.pod version: '2.2200' Moose::Manual::Contributing: file: lib/Moose/Manual/Contributing.pod version: '2.2200' Moose::Manual::Delegation: file: lib/Moose/Manual/Delegation.pod version: '2.2200' Moose::Manual::Delta: file: lib/Moose/Manual/Delta.pod version: '2.2200' Moose::Manual::Exceptions: file: lib/Moose/Manual/Exceptions.pod version: '2.2200' Moose::Manual::Exceptions::Manifest: file: lib/Moose/Manual/Exceptions/Manifest.pod version: '2.2200' Moose::Manual::FAQ: file: lib/Moose/Manual/FAQ.pod version: '2.2200' Moose::Manual::MOP: file: lib/Moose/Manual/MOP.pod version: '2.2200' Moose::Manual::MethodModifiers: file: lib/Moose/Manual/MethodModifiers.pod version: '2.2200' Moose::Manual::MooseX: file: lib/Moose/Manual/MooseX.pod version: '2.2200' Moose::Manual::Resources: file: lib/Moose/Manual/Resources.pod version: '2.2200' Moose::Manual::Roles: file: lib/Moose/Manual/Roles.pod version: '2.2200' Moose::Manual::Support: file: lib/Moose/Manual/Support.pod version: '2.2200' Moose::Manual::Types: file: lib/Moose/Manual/Types.pod version: '2.2200' Moose::Manual::Unsweetened: file: lib/Moose/Manual/Unsweetened.pod version: '2.2200' Moose::Meta::Attribute: file: lib/Moose/Meta/Attribute.pm version: '2.2200' Moose::Meta::Attribute::Native: file: lib/Moose/Meta/Attribute/Native.pm version: '2.2200' Moose::Meta::Attribute::Native::Trait: file: lib/Moose/Meta/Attribute/Native/Trait.pm version: '2.2200' Moose::Meta::Attribute::Native::Trait::Array: file: lib/Moose/Meta/Attribute/Native/Trait/Array.pm version: '2.2200' Moose::Meta::Attribute::Native::Trait::Bool: file: lib/Moose/Meta/Attribute/Native/Trait/Bool.pm version: '2.2200' Moose::Meta::Attribute::Native::Trait::Code: file: lib/Moose/Meta/Attribute/Native/Trait/Code.pm version: '2.2200' Moose::Meta::Attribute::Native::Trait::Counter: file: lib/Moose/Meta/Attribute/Native/Trait/Counter.pm version: '2.2200' Moose::Meta::Attribute::Native::Trait::Hash: file: lib/Moose/Meta/Attribute/Native/Trait/Hash.pm version: '2.2200' Moose::Meta::Attribute::Native::Trait::Number: file: lib/Moose/Meta/Attribute/Native/Trait/Number.pm version: '2.2200' Moose::Meta::Attribute::Native::Trait::String: file: lib/Moose/Meta/Attribute/Native/Trait/String.pm version: '2.2200' Moose::Meta::Class: file: lib/Moose/Meta/Class.pm version: '2.2200' Moose::Meta::Class::Immutable::Trait: file: lib/Moose/Meta/Class/Immutable/Trait.pm version: '2.2200' Moose::Meta::Instance: file: lib/Moose/Meta/Instance.pm version: '2.2200' Moose::Meta::Method: file: lib/Moose/Meta/Method.pm version: '2.2200' Moose::Meta::Method::Accessor: file: lib/Moose/Meta/Method/Accessor.pm version: '2.2200' Moose::Meta::Method::Accessor::Native: file: lib/Moose/Meta/Method/Accessor/Native.pm version: '2.2200' Moose::Meta::Method::Accessor::Native::Array: file: lib/Moose/Meta/Method/Accessor/Native/Array.pm version: '2.2200' Moose::Meta::Method::Accessor::Native::Array::Writer: file: lib/Moose/Meta/Method/Accessor/Native/Array/Writer.pm version: '2.2200' Moose::Meta::Method::Accessor::Native::Array::accessor: file: lib/Moose/Meta/Method/Accessor/Native/Array/accessor.pm version: '2.2200' Moose::Meta::Method::Accessor::Native::Array::clear: file: lib/Moose/Meta/Method/Accessor/Native/Array/clear.pm version: '2.2200' Moose::Meta::Method::Accessor::Native::Array::count: file: lib/Moose/Meta/Method/Accessor/Native/Array/count.pm version: '2.2200' Moose::Meta::Method::Accessor::Native::Array::delete: file: lib/Moose/Meta/Method/Accessor/Native/Array/delete.pm version: '2.2200' Moose::Meta::Method::Accessor::Native::Array::elements: file: lib/Moose/Meta/Method/Accessor/Native/Array/elements.pm version: '2.2200' Moose::Meta::Method::Accessor::Native::Array::first: file: lib/Moose/Meta/Method/Accessor/Native/Array/first.pm version: '2.2200' Moose::Meta::Method::Accessor::Native::Array::first_index: file: lib/Moose/Meta/Method/Accessor/Native/Array/first_index.pm version: '2.2200' Moose::Meta::Method::Accessor::Native::Array::get: file: lib/Moose/Meta/Method/Accessor/Native/Array/get.pm version: '2.2200' Moose::Meta::Method::Accessor::Native::Array::grep: file: lib/Moose/Meta/Method/Accessor/Native/Array/grep.pm version: '2.2200' Moose::Meta::Method::Accessor::Native::Array::insert: file: lib/Moose/Meta/Method/Accessor/Native/Array/insert.pm version: '2.2200' Moose::Meta::Method::Accessor::Native::Array::is_empty: file: lib/Moose/Meta/Method/Accessor/Native/Array/is_empty.pm version: '2.2200' Moose::Meta::Method::Accessor::Native::Array::join: file: lib/Moose/Meta/Method/Accessor/Native/Array/join.pm version: '2.2200' Moose::Meta::Method::Accessor::Native::Array::map: file: lib/Moose/Meta/Method/Accessor/Native/Array/map.pm version: '2.2200' Moose::Meta::Method::Accessor::Native::Array::natatime: file: lib/Moose/Meta/Method/Accessor/Native/Array/natatime.pm version: '2.2200' Moose::Meta::Method::Accessor::Native::Array::pop: file: lib/Moose/Meta/Method/Accessor/Native/Array/pop.pm version: '2.2200' Moose::Meta::Method::Accessor::Native::Array::push: file: lib/Moose/Meta/Method/Accessor/Native/Array/push.pm version: '2.2200' Moose::Meta::Method::Accessor::Native::Array::reduce: file: lib/Moose/Meta/Method/Accessor/Native/Array/reduce.pm version: '2.2200' Moose::Meta::Method::Accessor::Native::Array::set: file: lib/Moose/Meta/Method/Accessor/Native/Array/set.pm version: '2.2200' Moose::Meta::Method::Accessor::Native::Array::shallow_clone: file: lib/Moose/Meta/Method/Accessor/Native/Array/shallow_clone.pm version: '2.2200' Moose::Meta::Method::Accessor::Native::Array::shift: file: lib/Moose/Meta/Method/Accessor/Native/Array/shift.pm version: '2.2200' Moose::Meta::Method::Accessor::Native::Array::shuffle: file: lib/Moose/Meta/Method/Accessor/Native/Array/shuffle.pm version: '2.2200' Moose::Meta::Method::Accessor::Native::Array::sort: file: lib/Moose/Meta/Method/Accessor/Native/Array/sort.pm version: '2.2200' Moose::Meta::Method::Accessor::Native::Array::sort_in_place: file: lib/Moose/Meta/Method/Accessor/Native/Array/sort_in_place.pm version: '2.2200' Moose::Meta::Method::Accessor::Native::Array::splice: file: lib/Moose/Meta/Method/Accessor/Native/Array/splice.pm version: '2.2200' Moose::Meta::Method::Accessor::Native::Array::uniq: file: lib/Moose/Meta/Method/Accessor/Native/Array/uniq.pm version: '2.2200' Moose::Meta::Method::Accessor::Native::Array::unshift: file: lib/Moose/Meta/Method/Accessor/Native/Array/unshift.pm version: '2.2200' Moose::Meta::Method::Accessor::Native::Bool::not: file: lib/Moose/Meta/Method/Accessor/Native/Bool/not.pm version: '2.2200' Moose::Meta::Method::Accessor::Native::Bool::set: file: lib/Moose/Meta/Method/Accessor/Native/Bool/set.pm version: '2.2200' Moose::Meta::Method::Accessor::Native::Bool::toggle: file: lib/Moose/Meta/Method/Accessor/Native/Bool/toggle.pm version: '2.2200' Moose::Meta::Method::Accessor::Native::Bool::unset: file: lib/Moose/Meta/Method/Accessor/Native/Bool/unset.pm version: '2.2200' Moose::Meta::Method::Accessor::Native::Code::execute: file: lib/Moose/Meta/Method/Accessor/Native/Code/execute.pm version: '2.2200' Moose::Meta::Method::Accessor::Native::Code::execute_method: file: lib/Moose/Meta/Method/Accessor/Native/Code/execute_method.pm version: '2.2200' Moose::Meta::Method::Accessor::Native::Collection: file: lib/Moose/Meta/Method/Accessor/Native/Collection.pm version: '2.2200' Moose::Meta::Method::Accessor::Native::Counter::Writer: file: lib/Moose/Meta/Method/Accessor/Native/Counter/Writer.pm version: '2.2200' Moose::Meta::Method::Accessor::Native::Counter::dec: file: lib/Moose/Meta/Method/Accessor/Native/Counter/dec.pm version: '2.2200' Moose::Meta::Method::Accessor::Native::Counter::inc: file: lib/Moose/Meta/Method/Accessor/Native/Counter/inc.pm version: '2.2200' Moose::Meta::Method::Accessor::Native::Counter::reset: file: lib/Moose/Meta/Method/Accessor/Native/Counter/reset.pm version: '2.2200' Moose::Meta::Method::Accessor::Native::Counter::set: file: lib/Moose/Meta/Method/Accessor/Native/Counter/set.pm version: '2.2200' Moose::Meta::Method::Accessor::Native::Hash: file: lib/Moose/Meta/Method/Accessor/Native/Hash.pm version: '2.2200' Moose::Meta::Method::Accessor::Native::Hash::Writer: file: lib/Moose/Meta/Method/Accessor/Native/Hash/Writer.pm version: '2.2200' Moose::Meta::Method::Accessor::Native::Hash::accessor: file: lib/Moose/Meta/Method/Accessor/Native/Hash/accessor.pm version: '2.2200' Moose::Meta::Method::Accessor::Native::Hash::clear: file: lib/Moose/Meta/Method/Accessor/Native/Hash/clear.pm version: '2.2200' Moose::Meta::Method::Accessor::Native::Hash::count: file: lib/Moose/Meta/Method/Accessor/Native/Hash/count.pm version: '2.2200' Moose::Meta::Method::Accessor::Native::Hash::defined: file: lib/Moose/Meta/Method/Accessor/Native/Hash/defined.pm version: '2.2200' Moose::Meta::Method::Accessor::Native::Hash::delete: file: lib/Moose/Meta/Method/Accessor/Native/Hash/delete.pm version: '2.2200' Moose::Meta::Method::Accessor::Native::Hash::elements: file: lib/Moose/Meta/Method/Accessor/Native/Hash/elements.pm version: '2.2200' Moose::Meta::Method::Accessor::Native::Hash::exists: file: lib/Moose/Meta/Method/Accessor/Native/Hash/exists.pm version: '2.2200' Moose::Meta::Method::Accessor::Native::Hash::get: file: lib/Moose/Meta/Method/Accessor/Native/Hash/get.pm version: '2.2200' Moose::Meta::Method::Accessor::Native::Hash::is_empty: file: lib/Moose/Meta/Method/Accessor/Native/Hash/is_empty.pm version: '2.2200' Moose::Meta::Method::Accessor::Native::Hash::keys: file: lib/Moose/Meta/Method/Accessor/Native/Hash/keys.pm version: '2.2200' Moose::Meta::Method::Accessor::Native::Hash::kv: file: lib/Moose/Meta/Method/Accessor/Native/Hash/kv.pm version: '2.2200' Moose::Meta::Method::Accessor::Native::Hash::set: file: lib/Moose/Meta/Method/Accessor/Native/Hash/set.pm version: '2.2200' Moose::Meta::Method::Accessor::Native::Hash::shallow_clone: file: lib/Moose/Meta/Method/Accessor/Native/Hash/shallow_clone.pm version: '2.2200' Moose::Meta::Method::Accessor::Native::Hash::values: file: lib/Moose/Meta/Method/Accessor/Native/Hash/values.pm version: '2.2200' Moose::Meta::Method::Accessor::Native::Number::abs: file: lib/Moose/Meta/Method/Accessor/Native/Number/abs.pm version: '2.2200' Moose::Meta::Method::Accessor::Native::Number::add: file: lib/Moose/Meta/Method/Accessor/Native/Number/add.pm version: '2.2200' Moose::Meta::Method::Accessor::Native::Number::div: file: lib/Moose/Meta/Method/Accessor/Native/Number/div.pm version: '2.2200' Moose::Meta::Method::Accessor::Native::Number::mod: file: lib/Moose/Meta/Method/Accessor/Native/Number/mod.pm version: '2.2200' Moose::Meta::Method::Accessor::Native::Number::mul: file: lib/Moose/Meta/Method/Accessor/Native/Number/mul.pm version: '2.2200' Moose::Meta::Method::Accessor::Native::Number::set: file: lib/Moose/Meta/Method/Accessor/Native/Number/set.pm version: '2.2200' Moose::Meta::Method::Accessor::Native::Number::sub: file: lib/Moose/Meta/Method/Accessor/Native/Number/sub.pm version: '2.2200' Moose::Meta::Method::Accessor::Native::Reader: file: lib/Moose/Meta/Method/Accessor/Native/Reader.pm version: '2.2200' Moose::Meta::Method::Accessor::Native::String::append: file: lib/Moose/Meta/Method/Accessor/Native/String/append.pm version: '2.2200' Moose::Meta::Method::Accessor::Native::String::chomp: file: lib/Moose/Meta/Method/Accessor/Native/String/chomp.pm version: '2.2200' Moose::Meta::Method::Accessor::Native::String::chop: file: lib/Moose/Meta/Method/Accessor/Native/String/chop.pm version: '2.2200' Moose::Meta::Method::Accessor::Native::String::clear: file: lib/Moose/Meta/Method/Accessor/Native/String/clear.pm version: '2.2200' Moose::Meta::Method::Accessor::Native::String::inc: file: lib/Moose/Meta/Method/Accessor/Native/String/inc.pm version: '2.2200' Moose::Meta::Method::Accessor::Native::String::length: file: lib/Moose/Meta/Method/Accessor/Native/String/length.pm version: '2.2200' Moose::Meta::Method::Accessor::Native::String::match: file: lib/Moose/Meta/Method/Accessor/Native/String/match.pm version: '2.2200' Moose::Meta::Method::Accessor::Native::String::prepend: file: lib/Moose/Meta/Method/Accessor/Native/String/prepend.pm version: '2.2200' Moose::Meta::Method::Accessor::Native::String::replace: file: lib/Moose/Meta/Method/Accessor/Native/String/replace.pm version: '2.2200' Moose::Meta::Method::Accessor::Native::String::substr: file: lib/Moose/Meta/Method/Accessor/Native/String/substr.pm version: '2.2200' Moose::Meta::Method::Accessor::Native::Writer: file: lib/Moose/Meta/Method/Accessor/Native/Writer.pm version: '2.2200' Moose::Meta::Method::Augmented: file: lib/Moose/Meta/Method/Augmented.pm version: '2.2200' Moose::Meta::Method::Constructor: file: lib/Moose/Meta/Method/Constructor.pm version: '2.2200' Moose::Meta::Method::Delegation: file: lib/Moose/Meta/Method/Delegation.pm version: '2.2200' Moose::Meta::Method::Destructor: file: lib/Moose/Meta/Method/Destructor.pm version: '2.2200' Moose::Meta::Method::Meta: file: lib/Moose/Meta/Method/Meta.pm version: '2.2200' Moose::Meta::Method::Overridden: file: lib/Moose/Meta/Method/Overridden.pm version: '2.2200' Moose::Meta::Mixin::AttributeCore: file: lib/Moose/Meta/Mixin/AttributeCore.pm version: '2.2200' Moose::Meta::Object::Trait: file: lib/Moose/Meta/Object/Trait.pm version: '2.2200' Moose::Meta::Role: file: lib/Moose/Meta/Role.pm version: '2.2200' Moose::Meta::Role::Application: file: lib/Moose/Meta/Role/Application.pm version: '2.2200' Moose::Meta::Role::Application::RoleSummation: file: lib/Moose/Meta/Role/Application/RoleSummation.pm version: '2.2200' Moose::Meta::Role::Application::ToClass: file: lib/Moose/Meta/Role/Application/ToClass.pm version: '2.2200' Moose::Meta::Role::Application::ToInstance: file: lib/Moose/Meta/Role/Application/ToInstance.pm version: '2.2200' Moose::Meta::Role::Application::ToRole: file: lib/Moose/Meta/Role/Application/ToRole.pm version: '2.2200' Moose::Meta::Role::Attribute: file: lib/Moose/Meta/Role/Attribute.pm version: '2.2200' Moose::Meta::Role::Composite: file: lib/Moose/Meta/Role/Composite.pm version: '2.2200' Moose::Meta::Role::Method: file: lib/Moose/Meta/Role/Method.pm version: '2.2200' Moose::Meta::Role::Method::Conflicting: file: lib/Moose/Meta/Role/Method/Conflicting.pm version: '2.2200' Moose::Meta::Role::Method::Required: file: lib/Moose/Meta/Role/Method/Required.pm version: '2.2200' Moose::Meta::TypeCoercion: file: lib/Moose/Meta/TypeCoercion.pm version: '2.2200' Moose::Meta::TypeCoercion::Union: file: lib/Moose/Meta/TypeCoercion/Union.pm version: '2.2200' Moose::Meta::TypeConstraint: file: lib/Moose/Meta/TypeConstraint.pm version: '2.2200' Moose::Meta::TypeConstraint::Class: file: lib/Moose/Meta/TypeConstraint/Class.pm version: '2.2200' Moose::Meta::TypeConstraint::DuckType: file: lib/Moose/Meta/TypeConstraint/DuckType.pm version: '2.2200' Moose::Meta::TypeConstraint::Enum: file: lib/Moose/Meta/TypeConstraint/Enum.pm version: '2.2200' Moose::Meta::TypeConstraint::Parameterizable: file: lib/Moose/Meta/TypeConstraint/Parameterizable.pm version: '2.2200' Moose::Meta::TypeConstraint::Parameterized: file: lib/Moose/Meta/TypeConstraint/Parameterized.pm version: '2.2200' Moose::Meta::TypeConstraint::Registry: file: lib/Moose/Meta/TypeConstraint/Registry.pm version: '2.2200' Moose::Meta::TypeConstraint::Role: file: lib/Moose/Meta/TypeConstraint/Role.pm version: '2.2200' Moose::Meta::TypeConstraint::Union: file: lib/Moose/Meta/TypeConstraint/Union.pm version: '2.2200' Moose::Object: file: lib/Moose/Object.pm version: '2.2200' Moose::Role: file: lib/Moose/Role.pm version: '2.2200' Moose::Spec::Role: file: lib/Moose/Spec/Role.pod version: '2.2200' Moose::Unsweetened: file: lib/Moose/Unsweetened.pod version: '2.2200' Moose::Util: file: lib/Moose/Util.pm version: '2.2200' Moose::Util::MetaRole: file: lib/Moose/Util/MetaRole.pm version: '2.2200' Moose::Util::TypeConstraints: file: lib/Moose/Util/TypeConstraints.pm version: '2.2200' Moose::Util::TypeConstraints::Builtins: file: lib/Moose/Util/TypeConstraints/Builtins.pm version: '2.2200' Test::Moose: file: lib/Test/Moose.pm version: '2.2200' metaclass: file: lib/metaclass.pm version: '2.2200' oose: file: lib/oose.pm version: '2.2200' recommends: Data::OptList: '0.110' requires: Carp: '1.22' Class::Load: '0.09' Class::Load::XS: '0.01' Data::OptList: '0.107' Devel::GlobalDestruction: '0' Devel::OverloadInfo: '0.005' Devel::StackTrace: '2.03' Dist::CheckConflicts: '0.02' Eval::Closure: '0.04' List::Util: '1.56' MRO::Compat: '0.05' Module::Runtime: '0.014' Module::Runtime::Conflicts: '0.002' Package::DeprecationManager: '0.11' Package::Stash: '0.32' Package::Stash::XS: '0.24' Params::Util: '1.00' Scalar::Util: '1.19' Sub::Exporter: '0.980' Sub::Name: '0.20' Sub::Util: '1.40' Try::Tiny: '0.17' parent: '0.223' perl: '5.008003' strict: '1.03' warnings: '1.03' resources: IRC: irc://irc.perl.org/#moose MailingList: http://lists.perl.org/list/moose.html bugtracker: https://rt.cpan.org/Dist/Display.html?Name=Moose homepage: http://moose.perl.org/ repository: git://github.com/moose/Moose.git version: '2.2200' x_Dist_Zilla: perl: version: '5.035005' plugins: - class: Dist::Zilla::Plugin::EnsurePrereqsInstalled name: EnsurePrereqsInstalled version: '0.009' - class: Dist::Zilla::Plugin::Git::GatherDir config: Dist::Zilla::Plugin::GatherDir: exclude_filename: - CONTRIBUTING.pod - LICENSE - Makefile.PL - ppport.h exclude_match: - ^t/recipes/(?!basics_genome_overloadingsubtypesandcoercion) follow_symlinks: 0 include_dotfiles: 0 prefix: '' prune_directory: [] root: . Dist::Zilla::Plugin::Git::GatherDir: include_untracked: 0 name: Git::GatherDir version: '2.048' - class: Dist::Zilla::Plugin::PPPort name: PPPort version: '0.009' - class: Dist::Zilla::Plugin::MetaYAML name: MetaYAML version: '6.024' - class: Dist::Zilla::Plugin::MetaJSON name: MetaJSON version: '6.024' - class: Dist::Zilla::Plugin::License name: License version: '6.024' - class: Dist::Zilla::Plugin::ExecDir name: ExecDir version: '6.024' - class: inc::MakeMaker config: Dist::Zilla::Plugin::MakeMaker: make_path: make version: '6.024' Dist::Zilla::Plugin::MakeMaker::Awesome: version: '0.49' Dist::Zilla::Role::TestRunner: default_jobs: '9' version: '6.024' name: =inc::MakeMaker version: ~ - class: Dist::Zilla::Plugin::ModuleIncluder config: Dist::Zilla::Plugin::ModuleIncluder: background_perl: '5.008003' blacklist: [] module: - ExtUtils::HasCompiler only_deps: 0 Dist::Zilla::Role::ModuleIncluder: Module::CoreList: '5.20211020' include_dependencies: 1 version: '0.008' name: ModuleIncluder version: '0.008' - class: Dist::Zilla::Plugin::Manifest name: Manifest version: '6.024' - class: Dist::Zilla::Plugin::MetaConfig name: MetaConfig version: '6.024' - class: inc::SimpleAuthority name: =inc::SimpleAuthority version: ~ - class: Dist::Zilla::Plugin::MetaResources name: MetaResources version: '6.024' - class: Dist::Zilla::Plugin::UseUnsafeInc config: Dist::Zilla::Plugin::UseUnsafeInc: dot_in_INC: 0 name: UseUnsafeInc version: '0.001' - class: inc::Documentation name: =inc::Documentation version: ~ - class: Dist::Zilla::Plugin::FileFinder::ByName name: PodModules version: '6.024' - class: Dist::Zilla::Plugin::FileFinder::Filter name: ModulesSansPod version: '6.024' - class: Dist::Zilla::Plugin::FileFinder::Filter name: VersionedModules version: '6.024' - class: inc::SimpleProvides name: =inc::SimpleProvides version: ~ - class: Dist::Zilla::Plugin::MetaProvides::Package config: Dist::Zilla::Plugin::MetaProvides::Package: finder: - ModulesSansPod finder_objects: - class: Dist::Zilla::Plugin::FileFinder::Filter name: ModulesSansPod version: '6.024' include_underscores: 0 Dist::Zilla::Role::MetaProvider::Provider: $Dist::Zilla::Role::MetaProvider::Provider::VERSION: '2.002004' inherit_missing: '1' inherit_version: '1' meta_noindex: '1' Dist::Zilla::Role::ModuleMetadata: Module::Metadata: '1.000037' version: '0.006' name: MetaProvides::Package version: '2.004003' - class: Dist::Zilla::Plugin::MetaNoIndex name: MetaNoIndex version: '6.024' - class: Dist::Zilla::Plugin::Git::Contributors config: Dist::Zilla::Plugin::Git::Contributors: git_version: 2.31.1 include_authors: 0 include_releaser: 1 order_by: commits paths: [] name: Git::Contributors version: '0.036' - class: Dist::Zilla::Plugin::SurgicalPodWeaver config: Dist::Zilla::Plugin::PodWeaver: finder: - ':InstallModules' - ':ExecFiles' plugins: - class: Pod::Weaver::Plugin::EnsurePod5 name: '@CorePrep/EnsurePod5' version: '4.018' - class: Pod::Weaver::Plugin::H1Nester name: '@CorePrep/H1Nester' version: '4.018' - class: Pod::Weaver::Plugin::SingleEncoding name: '@Default/SingleEncoding' version: '4.018' - class: Pod::Weaver::Section::Name name: '@Default/Name' version: '4.018' - class: Pod::Weaver::Section::Version name: '@Default/Version' version: '4.018' - class: Pod::Weaver::Section::Region name: '@Default/prelude' version: '4.018' - class: Pod::Weaver::Section::Generic name: SYNOPSIS version: '4.018' - class: Pod::Weaver::Section::Generic name: DESCRIPTION version: '4.018' - class: Pod::Weaver::Section::Generic name: OVERVIEW version: '4.018' - class: Pod::Weaver::Section::Collect name: ATTRIBUTES version: '4.018' - class: Pod::Weaver::Section::Collect name: METHODS version: '4.018' - class: Pod::Weaver::Section::Collect name: FUNCTIONS version: '4.018' - class: Pod::Weaver::Section::Leftovers name: '@Default/Leftovers' version: '4.018' - class: Pod::Weaver::Section::Region name: '@Default/postlude' version: '4.018' - class: Pod::Weaver::Section::Authors name: '@Default/Authors' version: '4.018' - class: Pod::Weaver::Section::Legal name: '@Default/Legal' version: '4.018' - class: Pod::Weaver::Section::AllowOverride name: OverrideLegal version: '0.05' name: SurgicalPodWeaver version: '0.0023' - class: Dist::Zilla::Plugin::RewriteVersion config: Dist::Zilla::Plugin::RewriteVersion: add_tarball_name: 0 finders: - VersionedModules global: 0 skip_version_provider: 0 name: RewriteVersion version: '0.018' - class: Dist::Zilla::Plugin::Git::Describe name: Git::Describe version: '0.007' - class: inc::ExtractInlineTests name: =inc::ExtractInlineTests version: ~ - class: Dist::Zilla::Plugin::PromptIfStale config: Dist::Zilla::Plugin::PromptIfStale: check_all_plugins: 1 check_all_prereqs: 1 modules: [] phase: release run_under_travis: 0 skip: [] name: PromptIfStale version: '0.057' - class: Dist::Zilla::Plugin::Test::EOL config: Dist::Zilla::Plugin::Test::EOL: filename: xt/author/eol.t finder: - ':ExecFiles' - ':InstallModules' - ':TestFiles' trailing_whitespace: 1 name: Test::EOL version: '0.19' - class: Dist::Zilla::Plugin::PodSyntaxTests name: PodSyntaxTests version: '6.024' - class: Dist::Zilla::Plugin::Test::NoTabs config: Dist::Zilla::Plugin::Test::NoTabs: filename: xt/author/no-tabs.t finder: - ':InstallModules' - ':ExecFiles' - ':TestFiles' name: Test::NoTabs version: '0.15' - class: Dist::Zilla::Plugin::MetaTests name: MetaTests version: '6.024' - class: Dist::Zilla::Plugin::Test::Kwalitee config: Dist::Zilla::Plugin::Test::Kwalitee: filename: xt/release/kwalitee.t skiptest: - use_strict name: Test::Kwalitee version: '2.12' - class: Dist::Zilla::Plugin::MojibakeTests name: MojibakeTests version: '0.8' - class: Dist::Zilla::Plugin::RunExtraTests config: Dist::Zilla::Role::TestRunner: default_jobs: '9' name: RunExtraTests version: '0.029' - class: Dist::Zilla::Plugin::Test::ReportPrereqs name: Test::ReportPrereqs version: '0.028' - class: Dist::Zilla::Plugin::Test::CPAN::Changes config: Dist::Zilla::Plugin::Test::CPAN::Changes: changelog: Changes name: Test::CPAN::Changes version: '0.012' - 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/release/00-compile.t module_finder: - ':InstallModules' needs_display: 0 phase: develop script_finder: - ':PerlExecFiles' skips: - ^Class::MOP::Attribute$ - ^Class::MOP::Class$ - ^Class::MOP::Method::Accessor$ - ^Class::MOP::Method::Constructor$ - ^Class::MOP::Method::Inlined$ - ^Class::MOP::Method::Wrapped$ - ^Class::MOP::Mixin::HasAttributes$ - ^Class::MOP::Module$ - ^Class::MOP::Package$ - ^Moose::Meta::Attribute$ - ^Moose::Meta::Attribute::Native$ - ^Moose::Meta::Mixin::AttributeCore$ - ^Moose::Meta::Role::Attribute$ - ^Moose::Meta::TypeConstraint::Class$ - ^Moose::Meta::TypeConstraint::DuckType$ - ^Moose::Meta::TypeConstraint::Enum$ - ^Moose::Meta::TypeConstraint::Parameterizable$ - ^Moose::Meta::TypeConstraint::Parameterized$ - ^Moose::Meta::TypeConstraint::Role$ - ^Moose::Meta::TypeConstraint::Union$ switch: [] name: Test::Compile version: '2.058' - class: inc::CheckReleaseType name: =inc::CheckReleaseType version: ~ - class: Dist::Zilla::Plugin::CheckVersionIncrement name: CheckVersionIncrement version: '0.121750' - class: Dist::Zilla::Plugin::Test::ChangesHasContent name: Test::ChangesHasContent version: '0.011' - class: Dist::Zilla::Plugin::Substitute name: Substitute version: '0.006' - class: Dist::Zilla::Plugin::Prereqs config: Dist::Zilla::Plugin::Prereqs: phase: runtime type: requires name: Prereqs version: '6.024' - class: Dist::Zilla::Plugin::Prereqs config: Dist::Zilla::Plugin::Prereqs: phase: test type: requires name: TestRequires version: '6.024' - class: Dist::Zilla::Plugin::Prereqs config: Dist::Zilla::Plugin::Prereqs: phase: configure type: requires name: ConfigureRequires version: '6.024' - class: Dist::Zilla::Plugin::Prereqs::AuthorDeps name: Prereqs::AuthorDeps version: '0.007' - class: Dist::Zilla::Plugin::Prereqs config: Dist::Zilla::Plugin::Prereqs: phase: develop type: requires name: DevelopRequires version: '6.024' - class: Dist::Zilla::Plugin::Prereqs config: Dist::Zilla::Plugin::Prereqs: phase: runtime type: recommends name: RuntimeRecommends version: '6.024' - class: Dist::Zilla::Plugin::Prereqs config: Dist::Zilla::Plugin::Prereqs: phase: runtime type: suggests name: RuntimeSuggests version: '6.024' - class: Dist::Zilla::Plugin::Conflicts name: Conflicts version: '0.19' - class: Dist::Zilla::Plugin::Test::CheckBreaks config: Dist::Zilla::Plugin::Test::CheckBreaks: conflicts_module: - Module::Runtime::Conflicts - Moose::Conflicts no_forced_deps: 0 Dist::Zilla::Role::ModuleMetadata: Module::Metadata: '1.000037' version: '0.006' name: Test::CheckBreaks version: '0.019' - class: inc::CheckAuthorDeps name: =inc::CheckAuthorDeps version: ~ - class: inc::CheckDelta name: =inc::CheckDelta version: ~ - class: inc::GitUpToDate name: =inc::GitUpToDate version: ~ - class: Dist::Zilla::Plugin::Git::Remote::Check name: Git::Remote::Check version: 0.1.2 - class: Dist::Zilla::Plugin::Git::CheckFor::CorrectBranch config: Dist::Zilla::Role::Git::Repo: git_version: 2.31.1 repo_root: . name: Git::CheckFor::CorrectBranch version: '0.014' - class: Dist::Zilla::Plugin::Git::Check config: Dist::Zilla::Plugin::Git::Check: untracked_files: die Dist::Zilla::Role::Git::DirtyFiles: allow_dirty: [] allow_dirty_match: [] changelog: Changes Dist::Zilla::Role::Git::Repo: git_version: 2.31.1 repo_root: . name: Git::Check version: '2.048' - class: Dist::Zilla::Plugin::TestRelease name: TestRelease version: '6.024' - class: Dist::Zilla::Plugin::UploadToCPAN name: UploadToCPAN version: '6.024' - class: Dist::Zilla::Plugin::CopyFilesFromRelease config: Dist::Zilla::Plugin::CopyFilesFromRelease: filename: - Changes match: [] name: CopyChanges version: '0.007' - class: Dist::Zilla::Plugin::CopyFilesFromRelease config: Dist::Zilla::Plugin::CopyFilesFromRelease: filename: - LICENSE - ppport.h match: [] name: CopyFilesFromRelease version: '0.007' - class: Dist::Zilla::Plugin::Regenerate::AfterReleasers config: Dist::Zilla::Plugin::Regenerate::AfterReleasers: plugins: - CopyFilesFromRelease Dist::Zilla::Role::Regenerator: $Dist::Zilla::Role::Regenerator::VERSION: '0.001002' name: Regenerate::AfterReleasers version: '0.001002' - class: Dist::Zilla::Plugin::ReadmeAnyFromPod config: Dist::Zilla::Role::FileWatcher: version: '0.006' name: ReadmeAnyFromPod version: '0.163250' - class: Dist::Zilla::Plugin::Git::Commit config: Dist::Zilla::Plugin::Git::Commit: add_files_in: [] commit_msg: '%N-%v%t%n%n%c' signoff: 0 Dist::Zilla::Role::Git::DirtyFiles: allow_dirty: - CONTRIBUTING.pod - Changes - LICENSE - ppport.h allow_dirty_match: [] changelog: Changes Dist::Zilla::Role::Git::Repo: git_version: 2.31.1 repo_root: . Dist::Zilla::Role::Git::StringFormatter: time_zone: local name: 'release snapshot' version: '2.048' - class: Dist::Zilla::Plugin::Git::Tag config: Dist::Zilla::Plugin::Git::Tag: branch: ~ changelog: Changes signed: 0 tag: '2.2200' tag_format: '%v' tag_message: '%v%t' Dist::Zilla::Role::Git::Repo: git_version: 2.31.1 repo_root: . Dist::Zilla::Role::Git::StringFormatter: time_zone: local name: Git::Tag version: '2.048' - class: Dist::Zilla::Plugin::BumpVersionAfterRelease config: Dist::Zilla::Plugin::BumpVersionAfterRelease: finders: - VersionedModules global: 0 munge_makefile_pl: 1 name: BumpVersionAfterRelease version: '0.018' - class: Dist::Zilla::Plugin::NextRelease name: NextRelease version: '6.024' - class: Dist::Zilla::Plugin::Git::Commit config: Dist::Zilla::Plugin::Git::Commit: add_files_in: [] commit_msg: 'increment $VERSION after %v release' signoff: 0 Dist::Zilla::Role::Git::DirtyFiles: allow_dirty: - Changes allow_dirty_match: - (?^u:^lib/.*\.pm$) changelog: Changes Dist::Zilla::Role::Git::Repo: git_version: 2.31.1 repo_root: . Dist::Zilla::Role::Git::StringFormatter: time_zone: local name: 'increment version' version: '2.048' - class: Dist::Zilla::Plugin::Git::Push config: Dist::Zilla::Plugin::Git::Push: push_to: - origin remotes_must_exist: 1 Dist::Zilla::Role::Git::Repo: git_version: 2.31.1 repo_root: . name: Git::Push version: '2.048' - class: Dist::Zilla::Plugin::Run::AfterRelease config: Dist::Zilla::Plugin::Run::Role::Runner: fatal_errors: 0 quiet: 0 run: - 'git checkout master' - 'git merge --ff-only --quiet stable/2.22' - 'git push' version: '0.048' name: Run::AfterRelease version: '0.048' - class: inc::GenerateDocs name: =inc::GenerateDocs version: ~ - class: inc::Clean name: =inc::Clean version: ~ - class: Dist::Zilla::Plugin::ConfirmRelease name: ConfirmRelease version: '6.024' - class: Dist::Zilla::Plugin::FinderCode name: ':InstallModules' version: '6.024' - class: Dist::Zilla::Plugin::FinderCode name: ':IncModules' version: '6.024' - class: Dist::Zilla::Plugin::FinderCode name: ':TestFiles' version: '6.024' - class: Dist::Zilla::Plugin::FinderCode name: ':ExtraTestFiles' version: '6.024' - class: Dist::Zilla::Plugin::FinderCode name: ':ExecFiles' version: '6.024' - class: Dist::Zilla::Plugin::FinderCode name: ':PerlExecFiles' version: '6.024' - class: Dist::Zilla::Plugin::FinderCode name: ':ShareFiles' version: '6.024' - class: Dist::Zilla::Plugin::FinderCode name: ':MainModule' version: '6.024' - class: Dist::Zilla::Plugin::FinderCode name: ':AllFiles' version: '6.024' - class: Dist::Zilla::Plugin::FinderCode name: ':NoFiles' version: '6.024' zilla: class: Dist::Zilla::Dist::Builder config: is_trial: '0' version: '6.024' x_authority: cpan:STEVAN x_breaks: Catalyst: '<= 5.90049999' Config::MVP: '<= 2.200004' Devel::REPL: '<= 1.003020' Dist::Zilla: '<= 5.043' Dist::Zilla::Plugin::Git: '<= 2.016' Fey: '<= 0.36' Fey::ORM: '<= 0.42' File::ChangeNotify: '<= 0.15' HTTP::Throwable: '<= 0.017' KiokuDB: '<= 0.51' Markdent: '<= 0.16' Mason: '<= 2.18' Moose::Autobox: '<= 0.15' MooseX::ABC: '<= 0.05' MooseX::Aliases: '<= 0.08' MooseX::AlwaysCoerce: '<= 0.13' MooseX::App: '<= 1.22' MooseX::Attribute::Deflator: '<= 2.1.7' MooseX::Attribute::Dependent: '<= 1.1.3' MooseX::Attribute::Prototype: '<= 0.10' MooseX::AttributeHelpers: '<= 0.22' MooseX::AttributeIndexes: '<= 1.0.0' MooseX::AttributeInflate: '<= 0.02' MooseX::CascadeClearing: '<= 0.03' MooseX::ClassAttribute: '<= 0.26' MooseX::Constructor::AllErrors: '<= 0.021' MooseX::Declare: '<= 0.35' MooseX::FollowPBP: '<= 0.02' MooseX::Getopt: '<= 0.56' MooseX::InstanceTracking: '<= 0.04' MooseX::LazyRequire: '<= 0.06' MooseX::Meta::Attribute::Index: '<= 0.04' MooseX::Meta::Attribute::Lvalue: '<= 0.05' MooseX::Method::Signatures: '<= 0.44' MooseX::MethodAttributes: '<= 0.22' MooseX::NonMoose: '<= 0.24' MooseX::Object::Pluggable: '<= 0.0011' MooseX::POE: '<= 0.214' MooseX::Params::Validate: '<= 0.05' MooseX::PrivateSetters: '<= 0.03' MooseX::Role::Cmd: '<= 0.06' MooseX::Role::Parameterized: '<= 1.00' MooseX::Role::WithOverloading: '<= 0.14' MooseX::Runnable: '<= 0.03' MooseX::Scaffold: '<= 0.05' MooseX::SemiAffordanceAccessor: '<= 0.05' MooseX::SetOnce: '<= 0.100473' MooseX::Singleton: '<= 0.25' MooseX::SlurpyConstructor: '<= 1.1' MooseX::Storage: '<= 0.42' MooseX::StrictConstructor: '<= 0.12' MooseX::Traits: '<= 0.11' MooseX::Types: '<= 0.19' MooseX::Types::Parameterizable: '<= 0.05' MooseX::Types::Set::Object: '<= 0.03' MooseX::Types::Signal: '<= 1.101930' MooseX::UndefTolerant: '<= 0.11' Net::Twitter: '<= 4.01041' PRANG: '<= 0.14' Pod::Elemental: '<= 0.093280' Pod::Weaver: '<= 3.101638' Reaction: '<= 0.002003' Test::Able: '<= 0.10' Test::CleanNamespaces: '<= 0.03' Test::Moose::More: '<= 0.022' Test::TempDir: '<= 0.05' Throwable: '<= 0.102080' namespace::autoclean: '<= 0.08' x_contributors: - 'Upasana Shukla ' - 'Graham Knop ' - 'Matt S Trout ' - 'Tomas Doran ' - 'Ricardo Signes ' - 'Guillermo Roditi ' - 'John Napiorkowski ' - 'Aankhen ' - 'Todd Hepler ' - 'Jonathan Rockway ' - 'Gerda Shank ' - 'Perlover ' - 'Shlomi Fish ' - 'Stevan Little ' - 'Brad Bowman ' - 'Justin Hunter ' - 'Kent Fredric ' - 'Paul Driver ' - 'Anders Nor Berle ' - 'Brian Manning ' - 'gfx ' - 'Jay Hannah ' - 'Lars Dɪᴇᴄᴋᴏᴡ 迪拉斯 ' - 'Leon Brocard ' - 'Olivier Mengué ' - 'Rafael Kitover ' - 'Christian Hansen ' - 'Cory Watson ' - 'Dagfinn Ilmari Mannsåker ' - 'Paul Jamieson Fenwick ' - 'Robert Buels ' - 'Dan Dascalescu ' - 'Marcel Grünauer ' - 'Scott McWhirter ' - 'Ævar Arnfjörð Bjarmason ' - 'Daisuke Maki (lestrrat) ' - 'Dylan William Hardison ' - 'Patrick Donelan ' - "Stefan O'Rear " - 'Tokuhiro Matsuno ' - 'Ash Berlin ' - 'Chris Weyl ' - 'Eric Wilhelm ' - 'Jess Robinson ' - 'Marc Mims ' - 'Marcus Ramberg ' - 'Mark Allen ' - 'Mateu X Hunter ' - 'matthof ' - "Robert 'phaylon' Sedlacek " - 'Zachary Lome ' - 'Aran Clary Deltac ' - 'Chip ' - 'Christopher J. Madsen ' - 'Curtis Jewell ' - 'Evan Carroll ' - 'Mark A. Stratman ' - 'Mark Fowler ' - 'Matthew Horsfall ' - 'mauke ' - 'Michael LaGrasta ' - 'Michael Rykov ' - 'Mike Whitaker ' - 'Moritz Onken ' - 'Nelo Onyiah ' - 'Nick Perez ' - 'Robert Boone ' - 'Robin V ' - 'rodrigolive ' - 'shelling ' - 'Thomas Sibley ' - 'Tom Hukins ' - 'Wallace Reis ' - 'Aaron Cohen ' - 'Adam J. Foxson ' - 'Adam Kennedy ' - 'Andy Jack ' - 'Anirvan Chatterjee ' - 'Ansgar Burchardt ' - 'A. Sinan Unur ' - 'Ben Hutton ' - 'Brendan Byrd ' - 'Chad Granum ' - 'Chankey Pathak ' - 'Chia-liang Kao ' - 'Christian Walde (Mithaldu) ' - 'chromatic ' - 'Dann ' - 'Dave Romano ' - 'David Leadbeater ' - 'David Steinbrunner ' - 'dmaestro ' - 'E. Choroba ' - 'franck cuny ' - 'Frew Schmidt ' - 'gregor herrmann ' - 'hakim ' - 'Henry Van Styn ' - 'James Marca ' - 'Jason May ' - 'Jay Allen ' - 'Jay Kuri ' - 'Jeff Bisbee ' - 'Jens Berthold ' - 'Jesse Vincent ' - 'joel ' - 'John Douglas Porter ' - 'John Goulah ' - 'Justin DeVuyst ' - 'Kang-min Liu ' - 'Leon Timmermans ' - "Mark O Grady " - 'Matt Kraai ' - 'Michael Schout ' - 'Nathan Gray ' - 'Olaf Alders ' - 'Olof Johansson ' - 'Paul Cochrane ' - 'Paweł Murias ' - 'Pedro Melo ' - 'Peter Shangov ' - 'Philippe Bruhat (BooK) ' - 'Philipp Gortan ' - 'Phillip Smith ' - 'Piotr Roszatycki ' - 'pktm ' - 'rouzier ' - 'Sam Vilain ' - 'sherrardb <32931314+sherrardb@users.noreply.github.com>' - 'Simon Reinhardt ' - 'sue spence ' - 'Tuomas Jormola ' - 'wickline ' - 'Yanick Champoux ' - 'Zoffix Znet ' x_documentation: - Moose::Manual - Moose::Manual::Attributes - Moose::Manual::BestPractices - Moose::Manual::Classes - Moose::Manual::Concepts - Moose::Manual::Construction - Moose::Manual::Contributing - Moose::Manual::Delegation - Moose::Manual::Delta - Moose::Manual::Exceptions - Moose::Manual::FAQ - Moose::Manual::MOP - Moose::Manual::MethodModifiers - Moose::Manual::MooseX - Moose::Manual::Resources - Moose::Manual::Roles - Moose::Manual::Support - Moose::Manual::Types - Moose::Manual::Unsweetened - Moose::Cookbook - Moose::Cookbook::Basics::BankAccount_MethodModifiersAndSubclassing - Moose::Cookbook::Basics::BinaryTree_AttributeFeatures - Moose::Cookbook::Basics::BinaryTree_BuilderAndLazyBuild - Moose::Cookbook::Basics::Company_Subtypes - Moose::Cookbook::Basics::DateTime_ExtendingNonMooseParent - Moose::Cookbook::Basics::Document_AugmentAndInner - Moose::Cookbook::Basics::Genome_OverloadingSubtypesAndCoercion - Moose::Cookbook::Basics::HTTP_SubtypesAndCoercion - Moose::Cookbook::Basics::Immutable - Moose::Cookbook::Basics::Person_BUILDARGSAndBUILD - Moose::Cookbook::Basics::Point_AttributesAndSubclassing - Moose::Cookbook::Extending::Debugging_BaseClassRole - Moose::Cookbook::Extending::ExtensionOverview - Moose::Cookbook::Extending::Mooseish_MooseSugar - Moose::Cookbook::Legacy::Debugging_BaseClassReplacement - Moose::Cookbook::Legacy::Labeled_AttributeMetaclass - Moose::Cookbook::Legacy::Table_ClassMetaclass - Moose::Cookbook::Meta::GlobRef_InstanceMetaclass - Moose::Cookbook::Meta::Labeled_AttributeTrait - Moose::Cookbook::Meta::PrivateOrPublic_MethodMetaclass - Moose::Cookbook::Meta::Table_MetaclassTrait - Moose::Cookbook::Meta::WhyMeta - Moose::Cookbook::Roles::ApplicationToInstance - Moose::Cookbook::Roles::Comparable_CodeReuse - Moose::Cookbook::Roles::Restartable_AdvancedComposition - Moose::Cookbook::Snack::Keywords - Moose::Cookbook::Snack::Types - Moose::Cookbook::Style x_generated_by_perl: v5.35.5 x_serialization_backend: 'YAML::Tiny version 1.73' x_spdx_expression: 'Artistic-1.0-Perl OR GPL-1.0-or-later' x_use_unsafe_inc: 0 Moose-2.2200/lib/000770 000766 000024 00000000000 14137574636 013717 5ustar00etherstaff000000 000000 Moose-2.2200/Makefile.PL000644 000766 000024 00000015451 14137574636 015134 0ustar00etherstaff000000 000000 # This Makefile.PL for Moose was generated by # inc::MakeMaker # and Dist::Zilla::Plugin::MakeMaker::Awesome 0.49. # Don't edit it but the dist.ini and plugins used to construct it. use strict; use warnings; # Secondary compile testing via ExtUtils::HasCompiler use lib 'inc'; use ExtUtils::HasCompiler 0.014 'can_compile_loadable_object'; die 'This distribution requires a working compiler' unless can_compile_loadable_object(quiet => 1); use ExtUtils::MakeMaker; check_conflicts(); my %WriteMakefileArgs = ( "ABSTRACT" => "A postmodern object system for Perl 5", "AUTHOR" => "Stevan Little , Dave Rolsky , Jesse Luehrs , Shawn M Moore , \x{5d9}\x{5d5}\x{5d1}\x{5dc} \x{5e7}\x{5d5}\x{5d2}'\x{5de}\x{5df} (Yuval Kogman) , Karen Etheridge , Florian Ragwitz , Hans Dieter Pearcey , Chris Prather , Matt S Trout ", "CONFIGURE_REQUIRES" => { "Dist::CheckConflicts" => "0.02", "ExtUtils::MakeMaker" => 0 }, "DISTNAME" => "Moose", "EXE_FILES" => [ "bin/moose-outdated" ], "LICENSE" => "perl", "NAME" => "Moose", "OBJECT" => "xs/Attribute\$(OBJ_EXT) xs/AttributeCore\$(OBJ_EXT) xs/Class\$(OBJ_EXT) xs/Generated\$(OBJ_EXT) xs/HasAttributes\$(OBJ_EXT) xs/HasMethods\$(OBJ_EXT) xs/Inlined\$(OBJ_EXT) xs/Instance\$(OBJ_EXT) xs/Method\$(OBJ_EXT) xs/Moose\$(OBJ_EXT) xs/MOP\$(OBJ_EXT) xs/Package\$(OBJ_EXT) xs/ToInstance\$(OBJ_EXT) mop\$(OBJ_EXT)", "PREREQ_PM" => { "Carp" => "1.22", "Class::Load" => "0.09", "Class::Load::XS" => "0.01", "Data::OptList" => "0.107", "Devel::GlobalDestruction" => 0, "Devel::OverloadInfo" => "0.005", "Devel::StackTrace" => "2.03", "Dist::CheckConflicts" => "0.02", "Eval::Closure" => "0.04", "List::Util" => "1.56", "MRO::Compat" => "0.05", "Module::Runtime" => "0.014", "Module::Runtime::Conflicts" => "0.002", "Package::DeprecationManager" => "0.11", "Package::Stash" => "0.32", "Package::Stash::XS" => "0.24", "Params::Util" => "1.00", "Scalar::Util" => "1.19", "Sub::Exporter" => "0.980", "Sub::Name" => "0.20", "Sub::Util" => "1.40", "Try::Tiny" => "0.17", "parent" => "0.223", "strict" => "1.03", "warnings" => "1.03" }, "TEST_REQUIRES" => { "CPAN::Meta::Check" => "0.011", "CPAN::Meta::Requirements" => 0, "File::Spec" => 0, "Module::Metadata" => 0, "Test::CleanNamespaces" => "0.13", "Test::Fatal" => "0.001", "Test::More" => "0.96", "Test::Requires" => "0.05" }, "VERSION" => "2.2200", "XS" => { "xs/Attribute.xs" => "xs/Attribute.c", "xs/AttributeCore.xs" => "xs/AttributeCore.c", "xs/Class.xs" => "xs/Class.c", "xs/Generated.xs" => "xs/Generated.c", "xs/HasAttributes.xs" => "xs/HasAttributes.c", "xs/HasMethods.xs" => "xs/HasMethods.c", "xs/Inlined.xs" => "xs/Inlined.c", "xs/Instance.xs" => "xs/Instance.c", "xs/MOP.xs" => "xs/MOP.c", "xs/Method.xs" => "xs/Method.c", "xs/Moose.xs" => "xs/Moose.c", "xs/Package.xs" => "xs/Package.c", "xs/ToInstance.xs" => "xs/ToInstance.c" }, "clean" => { "FILES" => "xs/Attribute\$(OBJ_EXT) xs/AttributeCore\$(OBJ_EXT) xs/Class\$(OBJ_EXT) xs/Generated\$(OBJ_EXT) xs/HasAttributes\$(OBJ_EXT) xs/HasMethods\$(OBJ_EXT) xs/Inlined\$(OBJ_EXT) xs/Instance\$(OBJ_EXT) xs/Method\$(OBJ_EXT) xs/Moose\$(OBJ_EXT) xs/MOP\$(OBJ_EXT) xs/Package\$(OBJ_EXT) xs/ToInstance\$(OBJ_EXT) mop\$(OBJ_EXT)" }, "test" => { "TESTS" => "t/*.t t/attributes/*.t t/basics/*.t t/bugs/*.t t/cmop/*.t t/compat/*.t t/examples/*.t t/exceptions/*.t t/immutable/*.t t/metaclasses/*.t t/moose_util/*.t t/native_traits/*.t t/recipes/*.t t/roles/*.t t/test_moose/*.t t/todo_tests/*.t t/type_constraints/*.t" } ); my %FallbackPrereqs = ( "CPAN::Meta::Check" => "0.011", "CPAN::Meta::Requirements" => 0, "Carp" => "1.22", "Class::Load" => "0.09", "Class::Load::XS" => "0.01", "Data::OptList" => "0.107", "Devel::GlobalDestruction" => 0, "Devel::OverloadInfo" => "0.005", "Devel::StackTrace" => "2.03", "Dist::CheckConflicts" => "0.02", "Eval::Closure" => "0.04", "File::Spec" => 0, "List::Util" => "1.56", "MRO::Compat" => "0.05", "Module::Metadata" => 0, "Module::Runtime" => "0.014", "Module::Runtime::Conflicts" => "0.002", "Package::DeprecationManager" => "0.11", "Package::Stash" => "0.32", "Package::Stash::XS" => "0.24", "Params::Util" => "1.00", "Scalar::Util" => "1.19", "Sub::Exporter" => "0.980", "Sub::Name" => "0.20", "Sub::Util" => "1.40", "Test::CleanNamespaces" => "0.13", "Test::Fatal" => "0.001", "Test::More" => "0.96", "Test::Requires" => "0.05", "Try::Tiny" => "0.17", "parent" => "0.223", "strict" => "1.03", "warnings" => "1.03" ); 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) }; $WriteMakefileArgs{CCFLAGS} = ( $Config::Config{ccflags} || '' ) . ' -I.'; WriteMakefile(%WriteMakefileArgs); { package MY; use Config; # These two are necessary to keep bmake happy sub xs_c { my $self = shift; my $ret = $self->SUPER::xs_c(@_); $ret =~ s/\$\*\.xs/\$SUPER::c_o(@_); $ret =~ s/\$\*\.c\b/\$SUPER::const_cccmd(@_); return q{} unless $ret; if ($Config{cc} =~ /^cl\b/i) { warn 'you are using MSVC... we may not have gotten some options quite right.'; $ret .= ' /Fo$@'; } else { $ret .= ' -o $@'; } return $ret; } sub postamble { return <<'EOF'; $(OBJECT) : mop.h EOF } } sub check_conflicts { if ( eval { require './lib/Moose/Conflicts.pm'; 1; } ) { if ( eval { Moose::Conflicts->check_conflicts; 1 } ) { return; } else { my $err = $@; $err =~ s/^/ /mg; warn "***\n$err***\n"; } } else { print <<'EOF'; *** Your toolchain doesn't support configure_requires, so Dist::CheckConflicts hasn't been installed yet. You should check for conflicting modules manually using the 'moose-outdated' script that is installed with this distribution once the installation finishes. *** EOF } return if $ENV{AUTOMATED_TESTING} || $ENV{NONINTERACTIVE_TESTING}; # More or less copied from Module::Build return if $ENV{PERL_MM_USE_DEFAULT}; return unless -t STDIN && ( -t STDOUT || !( -f STDOUT || -c STDOUT ) ); sleep 4; } Moose-2.2200/doc/000770 000766 000024 00000000000 14137574636 013716 5ustar00etherstaff000000 000000 Moose-2.2200/weaver.ini000600 000766 000024 00000000200 14137574636 015126 0ustar00etherstaff000000 000000 [@Default] ; preserve custom licences in a few files [AllowOverride / OverrideLegal] header_re = ^COPYRIGHT match_anywhere = 1 Moose-2.2200/META.json000644 000766 000024 00000360636 14137574636 014613 0ustar00etherstaff000000 000000 { "abstract" : "A postmodern object system for Perl 5", "author" : [ "Stevan Little ", "Dave Rolsky ", "Jesse Luehrs ", "Shawn M Moore ", "\u05d9\u05d5\u05d1\u05dc \u05e7\u05d5\u05d2'\u05de\u05df (Yuval Kogman) ", "Karen Etheridge ", "Florian Ragwitz ", "Hans Dieter Pearcey ", "Chris Prather ", "Matt S Trout " ], "dynamic_config" : 0, "generated_by" : "Dist::Zilla version 6.024, CPAN::Meta::Converter version 2.150010", "license" : [ "perl_5" ], "meta-spec" : { "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", "version" : 2 }, "name" : "Moose", "no_index" : { "directory" : [ "author", "benchmarks", "doc", "inc" ] }, "prereqs" : { "configure" : { "requires" : { "Dist::CheckConflicts" : "0.02", "ExtUtils::MakeMaker" : "0", "perl" : "5.008003" }, "suggests" : { "JSON::PP" : "2.27300" } }, "develop" : { "requires" : { "Algorithm::C3" : "0", "Class::Load" : "0.07", "DBM::Deep" : "1.003", "Data::Visitor" : "0.26", "DateTime" : "0", "DateTime::Calendar::Mayan" : "0", "DateTime::Format::MySQL" : "0", "Declare::Constraints::Simple" : "0", "Devel::PPPort" : "3.62", "ExtUtils::MakeMaker::Dist::Zilla::Develop" : "0", "File::Find::Rule" : "0", "File::Spec" : "0", "HTTP::Headers" : "0", "IO::File" : "0", "IO::Handle" : "0", "IPC::Open3" : "0", "Locale::US" : "0", "Module::CPANTS::Analyse" : "0.92", "Module::Refresh" : "0", "Moo" : "0", "MooseX::MarkAsMethods" : "0", "MooseX::NonMoose" : "0", "PadWalker" : "0", "Params::Coerce" : "0", "Regexp::Common" : "0", "SUPER" : "1.10", "Specio" : "0.10", "Test::CPAN::Changes" : "0.19", "Test::CPAN::Meta" : "0", "Test::Deep" : "0", "Test::EOL" : "0", "Test::Inline" : "0", "Test::Kwalitee" : "1.21", "Test::LeakTrace" : "0", "Test::Memory::Cycle" : "0", "Test::Mojibake" : "0", "Test::More" : "0.94", "Test::NoTabs" : "0", "Test::Output" : "0", "Test::Pod" : "1.41", "Test::Pod::Coverage" : "1.04", "Test::Spelling" : "0", "Test::Warnings" : "0.016", "Types::Standard" : "0", "URI" : "0", "blib" : "0" }, "suggests" : { "CPAN::Meta::Requirements" : "0", "Carp" : "1.22", "Class::Load" : "0.09", "Class::Load::XS" : "0.01", "Config::MVP" : "2.200011", "Data::OptList" : "0.107", "Devel::GlobalDestruction" : "0", "Devel::OverloadInfo" : "0.005", "Devel::PPPort" : "3.62", "Devel::StackTrace" : "2.03", "Dist::Zilla" : "5", "Dist::Zilla::Plugin::BumpVersionAfterRelease" : "0", "Dist::Zilla::Plugin::CheckVersionIncrement" : "0", "Dist::Zilla::Plugin::ConfirmRelease" : "0", "Dist::Zilla::Plugin::Conflicts" : "0.19", "Dist::Zilla::Plugin::CopyFilesFromRelease" : "0", "Dist::Zilla::Plugin::EnsurePrereqsInstalled" : "0.003", "Dist::Zilla::Plugin::ExecDir" : "0", "Dist::Zilla::Plugin::FileFinder::ByName" : "0", "Dist::Zilla::Plugin::FileFinder::Filter" : "0", "Dist::Zilla::Plugin::Git::Check" : "0", "Dist::Zilla::Plugin::Git::CheckFor::CorrectBranch" : "0", "Dist::Zilla::Plugin::Git::Commit" : "0", "Dist::Zilla::Plugin::Git::Contributors" : "0.019", "Dist::Zilla::Plugin::Git::Describe" : "0.004", "Dist::Zilla::Plugin::Git::GatherDir" : "0", "Dist::Zilla::Plugin::Git::Push" : "0", "Dist::Zilla::Plugin::Git::Remote::Check" : "0", "Dist::Zilla::Plugin::Git::Tag" : "0", "Dist::Zilla::Plugin::License" : "0", "Dist::Zilla::Plugin::MakeMaker::Awesome" : "0", "Dist::Zilla::Plugin::Manifest" : "0", "Dist::Zilla::Plugin::MetaConfig" : "0", "Dist::Zilla::Plugin::MetaJSON" : "0", "Dist::Zilla::Plugin::MetaNoIndex" : "0", "Dist::Zilla::Plugin::MetaProvides::Package" : "1.15000002", "Dist::Zilla::Plugin::MetaResources" : "0", "Dist::Zilla::Plugin::MetaTests" : "0", "Dist::Zilla::Plugin::MetaYAML" : "0", "Dist::Zilla::Plugin::ModuleIncluder" : "0.007", "Dist::Zilla::Plugin::MojibakeTests" : "0", "Dist::Zilla::Plugin::NextRelease" : "5.033", "Dist::Zilla::Plugin::PPPort" : "0", "Dist::Zilla::Plugin::PodSyntaxTests" : "0", "Dist::Zilla::Plugin::Prereqs" : "0", "Dist::Zilla::Plugin::Prereqs::AuthorDeps" : "0", "Dist::Zilla::Plugin::PromptIfStale" : "0", "Dist::Zilla::Plugin::ReadmeAnyFromPod" : "0.142180", "Dist::Zilla::Plugin::Regenerate::AfterReleasers" : "0", "Dist::Zilla::Plugin::RewriteVersion" : "0", "Dist::Zilla::Plugin::Run::AfterRelease" : "0.030", "Dist::Zilla::Plugin::RunExtraTests" : "0", "Dist::Zilla::Plugin::Substitute" : "0", "Dist::Zilla::Plugin::SurgicalPodWeaver" : "0.0023", "Dist::Zilla::Plugin::Test::CPAN::Changes" : "0", "Dist::Zilla::Plugin::Test::ChangesHasContent" : "0", "Dist::Zilla::Plugin::Test::CheckBreaks" : "0.017", "Dist::Zilla::Plugin::Test::Compile" : "2.037", "Dist::Zilla::Plugin::Test::EOL" : "0.14", "Dist::Zilla::Plugin::Test::Kwalitee" : "0", "Dist::Zilla::Plugin::Test::NoTabs" : "0", "Dist::Zilla::Plugin::Test::ReportPrereqs" : "0.022", "Dist::Zilla::Plugin::TestRelease" : "0", "Dist::Zilla::Plugin::UploadToCPAN" : "0", "Dist::Zilla::Plugin::UseUnsafeInc" : "0", "Dist::Zilla::Util::AuthorDeps" : "5.021", "Eval::Closure" : "0.04", "ExtUtils::HasCompiler" : "0.022", "File::Find::Rule" : "0", "File::pushd" : "0", "IPC::System::Simple" : "0", "List::Util" : "1.56", "MRO::Compat" : "0.05", "Module::Runtime" : "0.014", "Module::Runtime::Conflicts" : "0.002", "Package::DeprecationManager" : "0.11", "Package::Stash" : "0.32", "Package::Stash::XS" : "0.24", "Params::Util" : "1.00", "Path::Tiny" : "0", "Pod::Weaver::Section::AllowOverride" : "0", "Scalar::Util" : "1.19", "Software::License::Perl_5" : "0", "Sub::Exporter" : "0.980", "Sub::Name" : "0.20", "Sub::Util" : "1.40", "Test::Deep" : "0", "Test::Inline" : "0", "Test::Inline::Extract" : "0", "Try::Tiny" : "0.17", "autodie" : "0", "parent" : "0.223", "perl" : "5.008003", "strict" : "1.03", "warnings" : "1.03" } }, "runtime" : { "recommends" : { "Data::OptList" : "0.110" }, "requires" : { "Carp" : "1.22", "Class::Load" : "0.09", "Class::Load::XS" : "0.01", "Data::OptList" : "0.107", "Devel::GlobalDestruction" : "0", "Devel::OverloadInfo" : "0.005", "Devel::StackTrace" : "2.03", "Dist::CheckConflicts" : "0.02", "Eval::Closure" : "0.04", "List::Util" : "1.56", "MRO::Compat" : "0.05", "Module::Runtime" : "0.014", "Module::Runtime::Conflicts" : "0.002", "Package::DeprecationManager" : "0.11", "Package::Stash" : "0.32", "Package::Stash::XS" : "0.24", "Params::Util" : "1.00", "Scalar::Util" : "1.19", "Sub::Exporter" : "0.980", "Sub::Name" : "0.20", "Sub::Util" : "1.40", "Try::Tiny" : "0.17", "parent" : "0.223", "perl" : "5.008003", "strict" : "1.03", "warnings" : "1.03" }, "suggests" : { "Devel::PartialDump" : "0.14" } }, "test" : { "recommends" : { "CPAN::Meta" : "2.120900" }, "requires" : { "CPAN::Meta::Check" : "0.011", "CPAN::Meta::Requirements" : "0", "File::Spec" : "0", "Module::Metadata" : "0", "Test::CleanNamespaces" : "0.13", "Test::Fatal" : "0.001", "Test::More" : "0.96", "Test::Requires" : "0.05" } } }, "provides" : { "Class::MOP" : { "file" : "lib/Class/MOP.pm", "version" : "2.2200" }, "Class::MOP::Attribute" : { "file" : "lib/Class/MOP/Attribute.pm", "version" : "2.2200" }, "Class::MOP::Class" : { "file" : "lib/Class/MOP/Class.pm", "version" : "2.2200" }, "Class::MOP::Class::Immutable::Trait" : { "file" : "lib/Class/MOP/Class/Immutable/Trait.pm", "version" : "2.2200" }, "Class::MOP::Deprecated" : { "file" : "lib/Class/MOP/Deprecated.pm", "version" : "2.2200" }, "Class::MOP::Instance" : { "file" : "lib/Class/MOP/Instance.pm", "version" : "2.2200" }, "Class::MOP::Method" : { "file" : "lib/Class/MOP/Method.pm", "version" : "2.2200" }, "Class::MOP::Method::Accessor" : { "file" : "lib/Class/MOP/Method/Accessor.pm", "version" : "2.2200" }, "Class::MOP::Method::Constructor" : { "file" : "lib/Class/MOP/Method/Constructor.pm", "version" : "2.2200" }, "Class::MOP::Method::Generated" : { "file" : "lib/Class/MOP/Method/Generated.pm", "version" : "2.2200" }, "Class::MOP::Method::Inlined" : { "file" : "lib/Class/MOP/Method/Inlined.pm", "version" : "2.2200" }, "Class::MOP::Method::Meta" : { "file" : "lib/Class/MOP/Method/Meta.pm", "version" : "2.2200" }, "Class::MOP::Method::Wrapped" : { "file" : "lib/Class/MOP/Method/Wrapped.pm", "version" : "2.2200" }, "Class::MOP::MiniTrait" : { "file" : "lib/Class/MOP/MiniTrait.pm", "version" : "2.2200" }, "Class::MOP::Mixin" : { "file" : "lib/Class/MOP/Mixin.pm", "version" : "2.2200" }, "Class::MOP::Mixin::AttributeCore" : { "file" : "lib/Class/MOP/Mixin/AttributeCore.pm", "version" : "2.2200" }, "Class::MOP::Mixin::HasAttributes" : { "file" : "lib/Class/MOP/Mixin/HasAttributes.pm", "version" : "2.2200" }, "Class::MOP::Mixin::HasMethods" : { "file" : "lib/Class/MOP/Mixin/HasMethods.pm", "version" : "2.2200" }, "Class::MOP::Mixin::HasOverloads" : { "file" : "lib/Class/MOP/Mixin/HasOverloads.pm", "version" : "2.2200" }, "Class::MOP::Module" : { "file" : "lib/Class/MOP/Module.pm", "version" : "2.2200" }, "Class::MOP::Object" : { "file" : "lib/Class/MOP/Object.pm", "version" : "2.2200" }, "Class::MOP::Overload" : { "file" : "lib/Class/MOP/Overload.pm", "version" : "2.2200" }, "Class::MOP::Package" : { "file" : "lib/Class/MOP/Package.pm", "version" : "2.2200" }, "Moose" : { "file" : "lib/Moose.pm", "version" : "2.2200" }, "Moose::Cookbook" : { "file" : "lib/Moose/Cookbook.pod", "version" : "2.2200" }, "Moose::Cookbook::Basics::BankAccount_MethodModifiersAndSubclassing" : { "file" : "lib/Moose/Cookbook/Basics/BankAccount_MethodModifiersAndSubclassing.pod", "version" : "2.2200" }, "Moose::Cookbook::Basics::BinaryTree_AttributeFeatures" : { "file" : "lib/Moose/Cookbook/Basics/BinaryTree_AttributeFeatures.pod", "version" : "2.2200" }, "Moose::Cookbook::Basics::BinaryTree_BuilderAndLazyBuild" : { "file" : "lib/Moose/Cookbook/Basics/BinaryTree_BuilderAndLazyBuild.pod", "version" : "2.2200" }, "Moose::Cookbook::Basics::Company_Subtypes" : { "file" : "lib/Moose/Cookbook/Basics/Company_Subtypes.pod", "version" : "2.2200" }, "Moose::Cookbook::Basics::DateTime_ExtendingNonMooseParent" : { "file" : "lib/Moose/Cookbook/Basics/DateTime_ExtendingNonMooseParent.pod", "version" : "2.2200" }, "Moose::Cookbook::Basics::Document_AugmentAndInner" : { "file" : "lib/Moose/Cookbook/Basics/Document_AugmentAndInner.pod", "version" : "2.2200" }, "Moose::Cookbook::Basics::Genome_OverloadingSubtypesAndCoercion" : { "file" : "lib/Moose/Cookbook/Basics/Genome_OverloadingSubtypesAndCoercion.pod", "version" : "2.2200" }, "Moose::Cookbook::Basics::HTTP_SubtypesAndCoercion" : { "file" : "lib/Moose/Cookbook/Basics/HTTP_SubtypesAndCoercion.pod", "version" : "2.2200" }, "Moose::Cookbook::Basics::Immutable" : { "file" : "lib/Moose/Cookbook/Basics/Immutable.pod", "version" : "2.2200" }, "Moose::Cookbook::Basics::Person_BUILDARGSAndBUILD" : { "file" : "lib/Moose/Cookbook/Basics/Person_BUILDARGSAndBUILD.pod", "version" : "2.2200" }, "Moose::Cookbook::Basics::Point_AttributesAndSubclassing" : { "file" : "lib/Moose/Cookbook/Basics/Point_AttributesAndSubclassing.pod", "version" : "2.2200" }, "Moose::Cookbook::Extending::Debugging_BaseClassRole" : { "file" : "lib/Moose/Cookbook/Extending/Debugging_BaseClassRole.pod", "version" : "2.2200" }, "Moose::Cookbook::Extending::ExtensionOverview" : { "file" : "lib/Moose/Cookbook/Extending/ExtensionOverview.pod", "version" : "2.2200" }, "Moose::Cookbook::Extending::Mooseish_MooseSugar" : { "file" : "lib/Moose/Cookbook/Extending/Mooseish_MooseSugar.pod", "version" : "2.2200" }, "Moose::Cookbook::Legacy::Debugging_BaseClassReplacement" : { "file" : "lib/Moose/Cookbook/Legacy/Debugging_BaseClassReplacement.pod", "version" : "2.2200" }, "Moose::Cookbook::Legacy::Labeled_AttributeMetaclass" : { "file" : "lib/Moose/Cookbook/Legacy/Labeled_AttributeMetaclass.pod", "version" : "2.2200" }, "Moose::Cookbook::Legacy::Table_ClassMetaclass" : { "file" : "lib/Moose/Cookbook/Legacy/Table_ClassMetaclass.pod", "version" : "2.2200" }, "Moose::Cookbook::Meta::GlobRef_InstanceMetaclass" : { "file" : "lib/Moose/Cookbook/Meta/GlobRef_InstanceMetaclass.pod", "version" : "2.2200" }, "Moose::Cookbook::Meta::Labeled_AttributeTrait" : { "file" : "lib/Moose/Cookbook/Meta/Labeled_AttributeTrait.pod", "version" : "2.2200" }, "Moose::Cookbook::Meta::PrivateOrPublic_MethodMetaclass" : { "file" : "lib/Moose/Cookbook/Meta/PrivateOrPublic_MethodMetaclass.pod", "version" : "2.2200" }, "Moose::Cookbook::Meta::Table_MetaclassTrait" : { "file" : "lib/Moose/Cookbook/Meta/Table_MetaclassTrait.pod", "version" : "2.2200" }, "Moose::Cookbook::Meta::WhyMeta" : { "file" : "lib/Moose/Cookbook/Meta/WhyMeta.pod", "version" : "2.2200" }, "Moose::Cookbook::Roles::ApplicationToInstance" : { "file" : "lib/Moose/Cookbook/Roles/ApplicationToInstance.pod", "version" : "2.2200" }, "Moose::Cookbook::Roles::Comparable_CodeReuse" : { "file" : "lib/Moose/Cookbook/Roles/Comparable_CodeReuse.pod", "version" : "2.2200" }, "Moose::Cookbook::Roles::Restartable_AdvancedComposition" : { "file" : "lib/Moose/Cookbook/Roles/Restartable_AdvancedComposition.pod", "version" : "2.2200" }, "Moose::Cookbook::Snack::Keywords" : { "file" : "lib/Moose/Cookbook/Snack/Keywords.pod", "version" : "2.2200" }, "Moose::Cookbook::Snack::Types" : { "file" : "lib/Moose/Cookbook/Snack/Types.pod", "version" : "2.2200" }, "Moose::Cookbook::Style" : { "file" : "lib/Moose/Cookbook/Style.pod", "version" : "2.2200" }, "Moose::Deprecated" : { "file" : "lib/Moose/Deprecated.pm", "version" : "2.2200" }, "Moose::Exception" : { "file" : "lib/Moose/Exception.pm", "version" : "2.2200" }, "Moose::Exception::AccessorMustReadWrite" : { "file" : "lib/Moose/Exception/AccessorMustReadWrite.pm", "version" : "2.2200" }, "Moose::Exception::AddParameterizableTypeTakesParameterizableType" : { "file" : "lib/Moose/Exception/AddParameterizableTypeTakesParameterizableType.pm", "version" : "2.2200" }, "Moose::Exception::AddRoleTakesAMooseMetaRoleInstance" : { "file" : "lib/Moose/Exception/AddRoleTakesAMooseMetaRoleInstance.pm", "version" : "2.2200" }, "Moose::Exception::AddRoleToARoleTakesAMooseMetaRole" : { "file" : "lib/Moose/Exception/AddRoleToARoleTakesAMooseMetaRole.pm", "version" : "2.2200" }, "Moose::Exception::ApplyTakesABlessedInstance" : { "file" : "lib/Moose/Exception/ApplyTakesABlessedInstance.pm", "version" : "2.2200" }, "Moose::Exception::AttachToClassNeedsAClassMOPClassInstanceOrASubclass" : { "file" : "lib/Moose/Exception/AttachToClassNeedsAClassMOPClassInstanceOrASubclass.pm", "version" : "2.2200" }, "Moose::Exception::AttributeConflictInRoles" : { "file" : "lib/Moose/Exception/AttributeConflictInRoles.pm", "version" : "2.2200" }, "Moose::Exception::AttributeConflictInSummation" : { "file" : "lib/Moose/Exception/AttributeConflictInSummation.pm", "version" : "2.2200" }, "Moose::Exception::AttributeExtensionIsNotSupportedInRoles" : { "file" : "lib/Moose/Exception/AttributeExtensionIsNotSupportedInRoles.pm", "version" : "2.2200" }, "Moose::Exception::AttributeIsRequired" : { "file" : "lib/Moose/Exception/AttributeIsRequired.pm", "version" : "2.2200" }, "Moose::Exception::AttributeMustBeAnClassMOPMixinAttributeCoreOrSubclass" : { "file" : "lib/Moose/Exception/AttributeMustBeAnClassMOPMixinAttributeCoreOrSubclass.pm", "version" : "2.2200" }, "Moose::Exception::AttributeNamesDoNotMatch" : { "file" : "lib/Moose/Exception/AttributeNamesDoNotMatch.pm", "version" : "2.2200" }, "Moose::Exception::AttributeValueIsNotAnObject" : { "file" : "lib/Moose/Exception/AttributeValueIsNotAnObject.pm", "version" : "2.2200" }, "Moose::Exception::AttributeValueIsNotDefined" : { "file" : "lib/Moose/Exception/AttributeValueIsNotDefined.pm", "version" : "2.2200" }, "Moose::Exception::AutoDeRefNeedsArrayRefOrHashRef" : { "file" : "lib/Moose/Exception/AutoDeRefNeedsArrayRefOrHashRef.pm", "version" : "2.2200" }, "Moose::Exception::BadOptionFormat" : { "file" : "lib/Moose/Exception/BadOptionFormat.pm", "version" : "2.2200" }, "Moose::Exception::BothBuilderAndDefaultAreNotAllowed" : { "file" : "lib/Moose/Exception/BothBuilderAndDefaultAreNotAllowed.pm", "version" : "2.2200" }, "Moose::Exception::BuilderDoesNotExist" : { "file" : "lib/Moose/Exception/BuilderDoesNotExist.pm", "version" : "2.2200" }, "Moose::Exception::BuilderMethodNotSupportedForAttribute" : { "file" : "lib/Moose/Exception/BuilderMethodNotSupportedForAttribute.pm", "version" : "2.2200" }, "Moose::Exception::BuilderMethodNotSupportedForInlineAttribute" : { "file" : "lib/Moose/Exception/BuilderMethodNotSupportedForInlineAttribute.pm", "version" : "2.2200" }, "Moose::Exception::BuilderMustBeAMethodName" : { "file" : "lib/Moose/Exception/BuilderMustBeAMethodName.pm", "version" : "2.2200" }, "Moose::Exception::CallingMethodOnAnImmutableInstance" : { "file" : "lib/Moose/Exception/CallingMethodOnAnImmutableInstance.pm", "version" : "2.2200" }, "Moose::Exception::CallingReadOnlyMethodOnAnImmutableInstance" : { "file" : "lib/Moose/Exception/CallingReadOnlyMethodOnAnImmutableInstance.pm", "version" : "2.2200" }, "Moose::Exception::CanExtendOnlyClasses" : { "file" : "lib/Moose/Exception/CanExtendOnlyClasses.pm", "version" : "2.2200" }, "Moose::Exception::CanOnlyConsumeRole" : { "file" : "lib/Moose/Exception/CanOnlyConsumeRole.pm", "version" : "2.2200" }, "Moose::Exception::CanOnlyWrapBlessedCode" : { "file" : "lib/Moose/Exception/CanOnlyWrapBlessedCode.pm", "version" : "2.2200" }, "Moose::Exception::CanReblessOnlyIntoASubclass" : { "file" : "lib/Moose/Exception/CanReblessOnlyIntoASubclass.pm", "version" : "2.2200" }, "Moose::Exception::CanReblessOnlyIntoASuperclass" : { "file" : "lib/Moose/Exception/CanReblessOnlyIntoASuperclass.pm", "version" : "2.2200" }, "Moose::Exception::CannotAddAdditionalTypeCoercionsToUnion" : { "file" : "lib/Moose/Exception/CannotAddAdditionalTypeCoercionsToUnion.pm", "version" : "2.2200" }, "Moose::Exception::CannotAddAsAnAttributeToARole" : { "file" : "lib/Moose/Exception/CannotAddAsAnAttributeToARole.pm", "version" : "2.2200" }, "Moose::Exception::CannotApplyBaseClassRolesToRole" : { "file" : "lib/Moose/Exception/CannotApplyBaseClassRolesToRole.pm", "version" : "2.2200" }, "Moose::Exception::CannotAssignValueToReadOnlyAccessor" : { "file" : "lib/Moose/Exception/CannotAssignValueToReadOnlyAccessor.pm", "version" : "2.2200" }, "Moose::Exception::CannotAugmentIfLocalMethodPresent" : { "file" : "lib/Moose/Exception/CannotAugmentIfLocalMethodPresent.pm", "version" : "2.2200" }, "Moose::Exception::CannotAugmentNoSuperMethod" : { "file" : "lib/Moose/Exception/CannotAugmentNoSuperMethod.pm", "version" : "2.2200" }, "Moose::Exception::CannotAutoDerefWithoutIsa" : { "file" : "lib/Moose/Exception/CannotAutoDerefWithoutIsa.pm", "version" : "2.2200" }, "Moose::Exception::CannotAutoDereferenceTypeConstraint" : { "file" : "lib/Moose/Exception/CannotAutoDereferenceTypeConstraint.pm", "version" : "2.2200" }, "Moose::Exception::CannotCalculateNativeType" : { "file" : "lib/Moose/Exception/CannotCalculateNativeType.pm", "version" : "2.2200" }, "Moose::Exception::CannotCallAnAbstractBaseMethod" : { "file" : "lib/Moose/Exception/CannotCallAnAbstractBaseMethod.pm", "version" : "2.2200" }, "Moose::Exception::CannotCallAnAbstractMethod" : { "file" : "lib/Moose/Exception/CannotCallAnAbstractMethod.pm", "version" : "2.2200" }, "Moose::Exception::CannotCoerceAWeakRef" : { "file" : "lib/Moose/Exception/CannotCoerceAWeakRef.pm", "version" : "2.2200" }, "Moose::Exception::CannotCoerceAttributeWhichHasNoCoercion" : { "file" : "lib/Moose/Exception/CannotCoerceAttributeWhichHasNoCoercion.pm", "version" : "2.2200" }, "Moose::Exception::CannotCreateHigherOrderTypeWithoutATypeParameter" : { "file" : "lib/Moose/Exception/CannotCreateHigherOrderTypeWithoutATypeParameter.pm", "version" : "2.2200" }, "Moose::Exception::CannotCreateMethodAliasLocalMethodIsPresent" : { "file" : "lib/Moose/Exception/CannotCreateMethodAliasLocalMethodIsPresent.pm", "version" : "2.2200" }, "Moose::Exception::CannotCreateMethodAliasLocalMethodIsPresentInClass" : { "file" : "lib/Moose/Exception/CannotCreateMethodAliasLocalMethodIsPresentInClass.pm", "version" : "2.2200" }, "Moose::Exception::CannotDelegateLocalMethodIsPresent" : { "file" : "lib/Moose/Exception/CannotDelegateLocalMethodIsPresent.pm", "version" : "2.2200" }, "Moose::Exception::CannotDelegateWithoutIsa" : { "file" : "lib/Moose/Exception/CannotDelegateWithoutIsa.pm", "version" : "2.2200" }, "Moose::Exception::CannotFindDelegateMetaclass" : { "file" : "lib/Moose/Exception/CannotFindDelegateMetaclass.pm", "version" : "2.2200" }, "Moose::Exception::CannotFindType" : { "file" : "lib/Moose/Exception/CannotFindType.pm", "version" : "2.2200" }, "Moose::Exception::CannotFindTypeGivenToMatchOnType" : { "file" : "lib/Moose/Exception/CannotFindTypeGivenToMatchOnType.pm", "version" : "2.2200" }, "Moose::Exception::CannotFixMetaclassCompatibility" : { "file" : "lib/Moose/Exception/CannotFixMetaclassCompatibility.pm", "version" : "2.2200" }, "Moose::Exception::CannotGenerateInlineConstraint" : { "file" : "lib/Moose/Exception/CannotGenerateInlineConstraint.pm", "version" : "2.2200" }, "Moose::Exception::CannotInitializeMooseMetaRoleComposite" : { "file" : "lib/Moose/Exception/CannotInitializeMooseMetaRoleComposite.pm", "version" : "2.2200" }, "Moose::Exception::CannotInlineTypeConstraintCheck" : { "file" : "lib/Moose/Exception/CannotInlineTypeConstraintCheck.pm", "version" : "2.2200" }, "Moose::Exception::CannotLocatePackageInINC" : { "file" : "lib/Moose/Exception/CannotLocatePackageInINC.pm", "version" : "2.2200" }, "Moose::Exception::CannotMakeMetaclassCompatible" : { "file" : "lib/Moose/Exception/CannotMakeMetaclassCompatible.pm", "version" : "2.2200" }, "Moose::Exception::CannotOverrideALocalMethod" : { "file" : "lib/Moose/Exception/CannotOverrideALocalMethod.pm", "version" : "2.2200" }, "Moose::Exception::CannotOverrideBodyOfMetaMethods" : { "file" : "lib/Moose/Exception/CannotOverrideBodyOfMetaMethods.pm", "version" : "2.2200" }, "Moose::Exception::CannotOverrideLocalMethodIsPresent" : { "file" : "lib/Moose/Exception/CannotOverrideLocalMethodIsPresent.pm", "version" : "2.2200" }, "Moose::Exception::CannotOverrideNoSuperMethod" : { "file" : "lib/Moose/Exception/CannotOverrideNoSuperMethod.pm", "version" : "2.2200" }, "Moose::Exception::CannotRegisterUnnamedTypeConstraint" : { "file" : "lib/Moose/Exception/CannotRegisterUnnamedTypeConstraint.pm", "version" : "2.2200" }, "Moose::Exception::CannotUseLazyBuildAndDefaultSimultaneously" : { "file" : "lib/Moose/Exception/CannotUseLazyBuildAndDefaultSimultaneously.pm", "version" : "2.2200" }, "Moose::Exception::CircularReferenceInAlso" : { "file" : "lib/Moose/Exception/CircularReferenceInAlso.pm", "version" : "2.2200" }, "Moose::Exception::ClassDoesNotHaveInitMeta" : { "file" : "lib/Moose/Exception/ClassDoesNotHaveInitMeta.pm", "version" : "2.2200" }, "Moose::Exception::ClassDoesTheExcludedRole" : { "file" : "lib/Moose/Exception/ClassDoesTheExcludedRole.pm", "version" : "2.2200" }, "Moose::Exception::ClassNamesDoNotMatch" : { "file" : "lib/Moose/Exception/ClassNamesDoNotMatch.pm", "version" : "2.2200" }, "Moose::Exception::CloneObjectExpectsAnInstanceOfMetaclass" : { "file" : "lib/Moose/Exception/CloneObjectExpectsAnInstanceOfMetaclass.pm", "version" : "2.2200" }, "Moose::Exception::CodeBlockMustBeACodeRef" : { "file" : "lib/Moose/Exception/CodeBlockMustBeACodeRef.pm", "version" : "2.2200" }, "Moose::Exception::CoercingWithoutCoercions" : { "file" : "lib/Moose/Exception/CoercingWithoutCoercions.pm", "version" : "2.2200" }, "Moose::Exception::CoercionAlreadyExists" : { "file" : "lib/Moose/Exception/CoercionAlreadyExists.pm", "version" : "2.2200" }, "Moose::Exception::CoercionNeedsTypeConstraint" : { "file" : "lib/Moose/Exception/CoercionNeedsTypeConstraint.pm", "version" : "2.2200" }, "Moose::Exception::ConflictDetectedInCheckRoleExclusions" : { "file" : "lib/Moose/Exception/ConflictDetectedInCheckRoleExclusions.pm", "version" : "2.2200" }, "Moose::Exception::ConflictDetectedInCheckRoleExclusionsInToClass" : { "file" : "lib/Moose/Exception/ConflictDetectedInCheckRoleExclusionsInToClass.pm", "version" : "2.2200" }, "Moose::Exception::ConstructClassInstanceTakesPackageName" : { "file" : "lib/Moose/Exception/ConstructClassInstanceTakesPackageName.pm", "version" : "2.2200" }, "Moose::Exception::CouldNotCreateMethod" : { "file" : "lib/Moose/Exception/CouldNotCreateMethod.pm", "version" : "2.2200" }, "Moose::Exception::CouldNotCreateWriter" : { "file" : "lib/Moose/Exception/CouldNotCreateWriter.pm", "version" : "2.2200" }, "Moose::Exception::CouldNotEvalConstructor" : { "file" : "lib/Moose/Exception/CouldNotEvalConstructor.pm", "version" : "2.2200" }, "Moose::Exception::CouldNotEvalDestructor" : { "file" : "lib/Moose/Exception/CouldNotEvalDestructor.pm", "version" : "2.2200" }, "Moose::Exception::CouldNotFindTypeConstraintToCoerceFrom" : { "file" : "lib/Moose/Exception/CouldNotFindTypeConstraintToCoerceFrom.pm", "version" : "2.2200" }, "Moose::Exception::CouldNotGenerateInlineAttributeMethod" : { "file" : "lib/Moose/Exception/CouldNotGenerateInlineAttributeMethod.pm", "version" : "2.2200" }, "Moose::Exception::CouldNotLocateTypeConstraintForUnion" : { "file" : "lib/Moose/Exception/CouldNotLocateTypeConstraintForUnion.pm", "version" : "2.2200" }, "Moose::Exception::CouldNotParseType" : { "file" : "lib/Moose/Exception/CouldNotParseType.pm", "version" : "2.2200" }, "Moose::Exception::CreateMOPClassTakesArrayRefOfAttributes" : { "file" : "lib/Moose/Exception/CreateMOPClassTakesArrayRefOfAttributes.pm", "version" : "2.2200" }, "Moose::Exception::CreateMOPClassTakesArrayRefOfSuperclasses" : { "file" : "lib/Moose/Exception/CreateMOPClassTakesArrayRefOfSuperclasses.pm", "version" : "2.2200" }, "Moose::Exception::CreateMOPClassTakesHashRefOfMethods" : { "file" : "lib/Moose/Exception/CreateMOPClassTakesHashRefOfMethods.pm", "version" : "2.2200" }, "Moose::Exception::CreateTakesArrayRefOfRoles" : { "file" : "lib/Moose/Exception/CreateTakesArrayRefOfRoles.pm", "version" : "2.2200" }, "Moose::Exception::CreateTakesHashRefOfAttributes" : { "file" : "lib/Moose/Exception/CreateTakesHashRefOfAttributes.pm", "version" : "2.2200" }, "Moose::Exception::CreateTakesHashRefOfMethods" : { "file" : "lib/Moose/Exception/CreateTakesHashRefOfMethods.pm", "version" : "2.2200" }, "Moose::Exception::DefaultToMatchOnTypeMustBeCodeRef" : { "file" : "lib/Moose/Exception/DefaultToMatchOnTypeMustBeCodeRef.pm", "version" : "2.2200" }, "Moose::Exception::DelegationToAClassWhichIsNotLoaded" : { "file" : "lib/Moose/Exception/DelegationToAClassWhichIsNotLoaded.pm", "version" : "2.2200" }, "Moose::Exception::DelegationToARoleWhichIsNotLoaded" : { "file" : "lib/Moose/Exception/DelegationToARoleWhichIsNotLoaded.pm", "version" : "2.2200" }, "Moose::Exception::DelegationToATypeWhichIsNotAClass" : { "file" : "lib/Moose/Exception/DelegationToATypeWhichIsNotAClass.pm", "version" : "2.2200" }, "Moose::Exception::DoesRequiresRoleName" : { "file" : "lib/Moose/Exception/DoesRequiresRoleName.pm", "version" : "2.2200" }, "Moose::Exception::EnumCalledWithAnArrayRefAndAdditionalArgs" : { "file" : "lib/Moose/Exception/EnumCalledWithAnArrayRefAndAdditionalArgs.pm", "version" : "2.2200" }, "Moose::Exception::EnumValuesMustBeString" : { "file" : "lib/Moose/Exception/EnumValuesMustBeString.pm", "version" : "2.2200" }, "Moose::Exception::ExtendsMissingArgs" : { "file" : "lib/Moose/Exception/ExtendsMissingArgs.pm", "version" : "2.2200" }, "Moose::Exception::HandlesMustBeAHashRef" : { "file" : "lib/Moose/Exception/HandlesMustBeAHashRef.pm", "version" : "2.2200" }, "Moose::Exception::IllegalInheritedOptions" : { "file" : "lib/Moose/Exception/IllegalInheritedOptions.pm", "version" : "2.2200" }, "Moose::Exception::IllegalMethodTypeToAddMethodModifier" : { "file" : "lib/Moose/Exception/IllegalMethodTypeToAddMethodModifier.pm", "version" : "2.2200" }, "Moose::Exception::IncompatibleMetaclassOfSuperclass" : { "file" : "lib/Moose/Exception/IncompatibleMetaclassOfSuperclass.pm", "version" : "2.2200" }, "Moose::Exception::InitMetaRequiresClass" : { "file" : "lib/Moose/Exception/InitMetaRequiresClass.pm", "version" : "2.2200" }, "Moose::Exception::InitializeTakesUnBlessedPackageName" : { "file" : "lib/Moose/Exception/InitializeTakesUnBlessedPackageName.pm", "version" : "2.2200" }, "Moose::Exception::InstanceBlessedIntoWrongClass" : { "file" : "lib/Moose/Exception/InstanceBlessedIntoWrongClass.pm", "version" : "2.2200" }, "Moose::Exception::InstanceMustBeABlessedReference" : { "file" : "lib/Moose/Exception/InstanceMustBeABlessedReference.pm", "version" : "2.2200" }, "Moose::Exception::InvalidArgPassedToMooseUtilMetaRole" : { "file" : "lib/Moose/Exception/InvalidArgPassedToMooseUtilMetaRole.pm", "version" : "2.2200" }, "Moose::Exception::InvalidArgumentToMethod" : { "file" : "lib/Moose/Exception/InvalidArgumentToMethod.pm", "version" : "2.2200" }, "Moose::Exception::InvalidArgumentsToTraitAliases" : { "file" : "lib/Moose/Exception/InvalidArgumentsToTraitAliases.pm", "version" : "2.2200" }, "Moose::Exception::InvalidBaseTypeGivenToCreateParameterizedTypeConstraint" : { "file" : "lib/Moose/Exception/InvalidBaseTypeGivenToCreateParameterizedTypeConstraint.pm", "version" : "2.2200" }, "Moose::Exception::InvalidHandleValue" : { "file" : "lib/Moose/Exception/InvalidHandleValue.pm", "version" : "2.2200" }, "Moose::Exception::InvalidHasProvidedInARole" : { "file" : "lib/Moose/Exception/InvalidHasProvidedInARole.pm", "version" : "2.2200" }, "Moose::Exception::InvalidNameForType" : { "file" : "lib/Moose/Exception/InvalidNameForType.pm", "version" : "2.2200" }, "Moose::Exception::InvalidOverloadOperator" : { "file" : "lib/Moose/Exception/InvalidOverloadOperator.pm", "version" : "2.2200" }, "Moose::Exception::InvalidRoleApplication" : { "file" : "lib/Moose/Exception/InvalidRoleApplication.pm", "version" : "2.2200" }, "Moose::Exception::InvalidTypeConstraint" : { "file" : "lib/Moose/Exception/InvalidTypeConstraint.pm", "version" : "2.2200" }, "Moose::Exception::InvalidTypeGivenToCreateParameterizedTypeConstraint" : { "file" : "lib/Moose/Exception/InvalidTypeGivenToCreateParameterizedTypeConstraint.pm", "version" : "2.2200" }, "Moose::Exception::InvalidValueForIs" : { "file" : "lib/Moose/Exception/InvalidValueForIs.pm", "version" : "2.2200" }, "Moose::Exception::IsaDoesNotDoTheRole" : { "file" : "lib/Moose/Exception/IsaDoesNotDoTheRole.pm", "version" : "2.2200" }, "Moose::Exception::IsaLacksDoesMethod" : { "file" : "lib/Moose/Exception/IsaLacksDoesMethod.pm", "version" : "2.2200" }, "Moose::Exception::LazyAttributeNeedsADefault" : { "file" : "lib/Moose/Exception/LazyAttributeNeedsADefault.pm", "version" : "2.2200" }, "Moose::Exception::Legacy" : { "file" : "lib/Moose/Exception/Legacy.pm", "version" : "2.2200" }, "Moose::Exception::MOPAttributeNewNeedsAttributeName" : { "file" : "lib/Moose/Exception/MOPAttributeNewNeedsAttributeName.pm", "version" : "2.2200" }, "Moose::Exception::MatchActionMustBeACodeRef" : { "file" : "lib/Moose/Exception/MatchActionMustBeACodeRef.pm", "version" : "2.2200" }, "Moose::Exception::MessageParameterMustBeCodeRef" : { "file" : "lib/Moose/Exception/MessageParameterMustBeCodeRef.pm", "version" : "2.2200" }, "Moose::Exception::MetaclassIsAClassNotASubclassOfGivenMetaclass" : { "file" : "lib/Moose/Exception/MetaclassIsAClassNotASubclassOfGivenMetaclass.pm", "version" : "2.2200" }, "Moose::Exception::MetaclassIsARoleNotASubclassOfGivenMetaclass" : { "file" : "lib/Moose/Exception/MetaclassIsARoleNotASubclassOfGivenMetaclass.pm", "version" : "2.2200" }, "Moose::Exception::MetaclassIsNotASubclassOfGivenMetaclass" : { "file" : "lib/Moose/Exception/MetaclassIsNotASubclassOfGivenMetaclass.pm", "version" : "2.2200" }, "Moose::Exception::MetaclassMustBeASubclassOfMooseMetaClass" : { "file" : "lib/Moose/Exception/MetaclassMustBeASubclassOfMooseMetaClass.pm", "version" : "2.2200" }, "Moose::Exception::MetaclassMustBeASubclassOfMooseMetaRole" : { "file" : "lib/Moose/Exception/MetaclassMustBeASubclassOfMooseMetaRole.pm", "version" : "2.2200" }, "Moose::Exception::MetaclassMustBeDerivedFromClassMOPClass" : { "file" : "lib/Moose/Exception/MetaclassMustBeDerivedFromClassMOPClass.pm", "version" : "2.2200" }, "Moose::Exception::MetaclassNotLoaded" : { "file" : "lib/Moose/Exception/MetaclassNotLoaded.pm", "version" : "2.2200" }, "Moose::Exception::MetaclassTypeIncompatible" : { "file" : "lib/Moose/Exception/MetaclassTypeIncompatible.pm", "version" : "2.2200" }, "Moose::Exception::MethodExpectedAMetaclassObject" : { "file" : "lib/Moose/Exception/MethodExpectedAMetaclassObject.pm", "version" : "2.2200" }, "Moose::Exception::MethodExpectsFewerArgs" : { "file" : "lib/Moose/Exception/MethodExpectsFewerArgs.pm", "version" : "2.2200" }, "Moose::Exception::MethodExpectsMoreArgs" : { "file" : "lib/Moose/Exception/MethodExpectsMoreArgs.pm", "version" : "2.2200" }, "Moose::Exception::MethodModifierNeedsMethodName" : { "file" : "lib/Moose/Exception/MethodModifierNeedsMethodName.pm", "version" : "2.2200" }, "Moose::Exception::MethodNameConflictInRoles" : { "file" : "lib/Moose/Exception/MethodNameConflictInRoles.pm", "version" : "2.2200" }, "Moose::Exception::MethodNameNotFoundInInheritanceHierarchy" : { "file" : "lib/Moose/Exception/MethodNameNotFoundInInheritanceHierarchy.pm", "version" : "2.2200" }, "Moose::Exception::MethodNameNotGiven" : { "file" : "lib/Moose/Exception/MethodNameNotGiven.pm", "version" : "2.2200" }, "Moose::Exception::MustDefineAMethodName" : { "file" : "lib/Moose/Exception/MustDefineAMethodName.pm", "version" : "2.2200" }, "Moose::Exception::MustDefineAnAttributeName" : { "file" : "lib/Moose/Exception/MustDefineAnAttributeName.pm", "version" : "2.2200" }, "Moose::Exception::MustDefineAnOverloadOperator" : { "file" : "lib/Moose/Exception/MustDefineAnOverloadOperator.pm", "version" : "2.2200" }, "Moose::Exception::MustHaveAtLeastOneValueToEnumerate" : { "file" : "lib/Moose/Exception/MustHaveAtLeastOneValueToEnumerate.pm", "version" : "2.2200" }, "Moose::Exception::MustPassAHashOfOptions" : { "file" : "lib/Moose/Exception/MustPassAHashOfOptions.pm", "version" : "2.2200" }, "Moose::Exception::MustPassAMooseMetaRoleInstanceOrSubclass" : { "file" : "lib/Moose/Exception/MustPassAMooseMetaRoleInstanceOrSubclass.pm", "version" : "2.2200" }, "Moose::Exception::MustPassAPackageNameOrAnExistingClassMOPPackageInstance" : { "file" : "lib/Moose/Exception/MustPassAPackageNameOrAnExistingClassMOPPackageInstance.pm", "version" : "2.2200" }, "Moose::Exception::MustPassEvenNumberOfArguments" : { "file" : "lib/Moose/Exception/MustPassEvenNumberOfArguments.pm", "version" : "2.2200" }, "Moose::Exception::MustPassEvenNumberOfAttributeOptions" : { "file" : "lib/Moose/Exception/MustPassEvenNumberOfAttributeOptions.pm", "version" : "2.2200" }, "Moose::Exception::MustProvideANameForTheAttribute" : { "file" : "lib/Moose/Exception/MustProvideANameForTheAttribute.pm", "version" : "2.2200" }, "Moose::Exception::MustSpecifyAtleastOneMethod" : { "file" : "lib/Moose/Exception/MustSpecifyAtleastOneMethod.pm", "version" : "2.2200" }, "Moose::Exception::MustSpecifyAtleastOneRole" : { "file" : "lib/Moose/Exception/MustSpecifyAtleastOneRole.pm", "version" : "2.2200" }, "Moose::Exception::MustSpecifyAtleastOneRoleToApplicant" : { "file" : "lib/Moose/Exception/MustSpecifyAtleastOneRoleToApplicant.pm", "version" : "2.2200" }, "Moose::Exception::MustSupplyAClassMOPAttributeInstance" : { "file" : "lib/Moose/Exception/MustSupplyAClassMOPAttributeInstance.pm", "version" : "2.2200" }, "Moose::Exception::MustSupplyADelegateToMethod" : { "file" : "lib/Moose/Exception/MustSupplyADelegateToMethod.pm", "version" : "2.2200" }, "Moose::Exception::MustSupplyAMetaclass" : { "file" : "lib/Moose/Exception/MustSupplyAMetaclass.pm", "version" : "2.2200" }, "Moose::Exception::MustSupplyAMooseMetaAttributeInstance" : { "file" : "lib/Moose/Exception/MustSupplyAMooseMetaAttributeInstance.pm", "version" : "2.2200" }, "Moose::Exception::MustSupplyAnAccessorTypeToConstructWith" : { "file" : "lib/Moose/Exception/MustSupplyAnAccessorTypeToConstructWith.pm", "version" : "2.2200" }, "Moose::Exception::MustSupplyAnAttributeToConstructWith" : { "file" : "lib/Moose/Exception/MustSupplyAnAttributeToConstructWith.pm", "version" : "2.2200" }, "Moose::Exception::MustSupplyArrayRefAsCurriedArguments" : { "file" : "lib/Moose/Exception/MustSupplyArrayRefAsCurriedArguments.pm", "version" : "2.2200" }, "Moose::Exception::MustSupplyPackageNameAndName" : { "file" : "lib/Moose/Exception/MustSupplyPackageNameAndName.pm", "version" : "2.2200" }, "Moose::Exception::NeedsTypeConstraintUnionForTypeCoercionUnion" : { "file" : "lib/Moose/Exception/NeedsTypeConstraintUnionForTypeCoercionUnion.pm", "version" : "2.2200" }, "Moose::Exception::NeitherAttributeNorAttributeNameIsGiven" : { "file" : "lib/Moose/Exception/NeitherAttributeNorAttributeNameIsGiven.pm", "version" : "2.2200" }, "Moose::Exception::NeitherClassNorClassNameIsGiven" : { "file" : "lib/Moose/Exception/NeitherClassNorClassNameIsGiven.pm", "version" : "2.2200" }, "Moose::Exception::NeitherRoleNorRoleNameIsGiven" : { "file" : "lib/Moose/Exception/NeitherRoleNorRoleNameIsGiven.pm", "version" : "2.2200" }, "Moose::Exception::NeitherTypeNorTypeNameIsGiven" : { "file" : "lib/Moose/Exception/NeitherTypeNorTypeNameIsGiven.pm", "version" : "2.2200" }, "Moose::Exception::NoAttributeFoundInSuperClass" : { "file" : "lib/Moose/Exception/NoAttributeFoundInSuperClass.pm", "version" : "2.2200" }, "Moose::Exception::NoBodyToInitializeInAnAbstractBaseClass" : { "file" : "lib/Moose/Exception/NoBodyToInitializeInAnAbstractBaseClass.pm", "version" : "2.2200" }, "Moose::Exception::NoCasesMatched" : { "file" : "lib/Moose/Exception/NoCasesMatched.pm", "version" : "2.2200" }, "Moose::Exception::NoConstraintCheckForTypeConstraint" : { "file" : "lib/Moose/Exception/NoConstraintCheckForTypeConstraint.pm", "version" : "2.2200" }, "Moose::Exception::NoDestructorClassSpecified" : { "file" : "lib/Moose/Exception/NoDestructorClassSpecified.pm", "version" : "2.2200" }, "Moose::Exception::NoImmutableTraitSpecifiedForClass" : { "file" : "lib/Moose/Exception/NoImmutableTraitSpecifiedForClass.pm", "version" : "2.2200" }, "Moose::Exception::NoParentGivenToSubtype" : { "file" : "lib/Moose/Exception/NoParentGivenToSubtype.pm", "version" : "2.2200" }, "Moose::Exception::OnlyInstancesCanBeCloned" : { "file" : "lib/Moose/Exception/OnlyInstancesCanBeCloned.pm", "version" : "2.2200" }, "Moose::Exception::OperatorIsRequired" : { "file" : "lib/Moose/Exception/OperatorIsRequired.pm", "version" : "2.2200" }, "Moose::Exception::OverloadConflictInSummation" : { "file" : "lib/Moose/Exception/OverloadConflictInSummation.pm", "version" : "2.2200" }, "Moose::Exception::OverloadRequiresAMetaClass" : { "file" : "lib/Moose/Exception/OverloadRequiresAMetaClass.pm", "version" : "2.2200" }, "Moose::Exception::OverloadRequiresAMetaMethod" : { "file" : "lib/Moose/Exception/OverloadRequiresAMetaMethod.pm", "version" : "2.2200" }, "Moose::Exception::OverloadRequiresAMetaOverload" : { "file" : "lib/Moose/Exception/OverloadRequiresAMetaOverload.pm", "version" : "2.2200" }, "Moose::Exception::OverloadRequiresAMethodNameOrCoderef" : { "file" : "lib/Moose/Exception/OverloadRequiresAMethodNameOrCoderef.pm", "version" : "2.2200" }, "Moose::Exception::OverloadRequiresAnOperator" : { "file" : "lib/Moose/Exception/OverloadRequiresAnOperator.pm", "version" : "2.2200" }, "Moose::Exception::OverloadRequiresNamesForCoderef" : { "file" : "lib/Moose/Exception/OverloadRequiresNamesForCoderef.pm", "version" : "2.2200" }, "Moose::Exception::OverrideConflictInComposition" : { "file" : "lib/Moose/Exception/OverrideConflictInComposition.pm", "version" : "2.2200" }, "Moose::Exception::OverrideConflictInSummation" : { "file" : "lib/Moose/Exception/OverrideConflictInSummation.pm", "version" : "2.2200" }, "Moose::Exception::PackageDoesNotUseMooseExporter" : { "file" : "lib/Moose/Exception/PackageDoesNotUseMooseExporter.pm", "version" : "2.2200" }, "Moose::Exception::PackageNameAndNameParamsNotGivenToWrap" : { "file" : "lib/Moose/Exception/PackageNameAndNameParamsNotGivenToWrap.pm", "version" : "2.2200" }, "Moose::Exception::PackagesAndModulesAreNotCachable" : { "file" : "lib/Moose/Exception/PackagesAndModulesAreNotCachable.pm", "version" : "2.2200" }, "Moose::Exception::ParameterIsNotSubtypeOfParent" : { "file" : "lib/Moose/Exception/ParameterIsNotSubtypeOfParent.pm", "version" : "2.2200" }, "Moose::Exception::ReferencesAreNotAllowedAsDefault" : { "file" : "lib/Moose/Exception/ReferencesAreNotAllowedAsDefault.pm", "version" : "2.2200" }, "Moose::Exception::RequiredAttributeLacksInitialization" : { "file" : "lib/Moose/Exception/RequiredAttributeLacksInitialization.pm", "version" : "2.2200" }, "Moose::Exception::RequiredAttributeNeedsADefault" : { "file" : "lib/Moose/Exception/RequiredAttributeNeedsADefault.pm", "version" : "2.2200" }, "Moose::Exception::RequiredMethodsImportedByClass" : { "file" : "lib/Moose/Exception/RequiredMethodsImportedByClass.pm", "version" : "2.2200" }, "Moose::Exception::RequiredMethodsNotImplementedByClass" : { "file" : "lib/Moose/Exception/RequiredMethodsNotImplementedByClass.pm", "version" : "2.2200" }, "Moose::Exception::Role::Attribute" : { "file" : "lib/Moose/Exception/Role/Attribute.pm", "version" : "2.2200" }, "Moose::Exception::Role::AttributeName" : { "file" : "lib/Moose/Exception/Role/AttributeName.pm", "version" : "2.2200" }, "Moose::Exception::Role::Class" : { "file" : "lib/Moose/Exception/Role/Class.pm", "version" : "2.2200" }, "Moose::Exception::Role::EitherAttributeOrAttributeName" : { "file" : "lib/Moose/Exception/Role/EitherAttributeOrAttributeName.pm", "version" : "2.2200" }, "Moose::Exception::Role::Instance" : { "file" : "lib/Moose/Exception/Role/Instance.pm", "version" : "2.2200" }, "Moose::Exception::Role::InstanceClass" : { "file" : "lib/Moose/Exception/Role/InstanceClass.pm", "version" : "2.2200" }, "Moose::Exception::Role::InvalidAttributeOptions" : { "file" : "lib/Moose/Exception/Role/InvalidAttributeOptions.pm", "version" : "2.2200" }, "Moose::Exception::Role::Method" : { "file" : "lib/Moose/Exception/Role/Method.pm", "version" : "2.2200" }, "Moose::Exception::Role::ParamsHash" : { "file" : "lib/Moose/Exception/Role/ParamsHash.pm", "version" : "2.2200" }, "Moose::Exception::Role::Role" : { "file" : "lib/Moose/Exception/Role/Role.pm", "version" : "2.2200" }, "Moose::Exception::Role::RoleForCreate" : { "file" : "lib/Moose/Exception/Role/RoleForCreate.pm", "version" : "2.2200" }, "Moose::Exception::Role::RoleForCreateMOPClass" : { "file" : "lib/Moose/Exception/Role/RoleForCreateMOPClass.pm", "version" : "2.2200" }, "Moose::Exception::Role::TypeConstraint" : { "file" : "lib/Moose/Exception/Role/TypeConstraint.pm", "version" : "2.2200" }, "Moose::Exception::RoleDoesTheExcludedRole" : { "file" : "lib/Moose/Exception/RoleDoesTheExcludedRole.pm", "version" : "2.2200" }, "Moose::Exception::RoleExclusionConflict" : { "file" : "lib/Moose/Exception/RoleExclusionConflict.pm", "version" : "2.2200" }, "Moose::Exception::RoleNameRequired" : { "file" : "lib/Moose/Exception/RoleNameRequired.pm", "version" : "2.2200" }, "Moose::Exception::RoleNameRequiredForMooseMetaRole" : { "file" : "lib/Moose/Exception/RoleNameRequiredForMooseMetaRole.pm", "version" : "2.2200" }, "Moose::Exception::RolesDoNotSupportAugment" : { "file" : "lib/Moose/Exception/RolesDoNotSupportAugment.pm", "version" : "2.2200" }, "Moose::Exception::RolesDoNotSupportExtends" : { "file" : "lib/Moose/Exception/RolesDoNotSupportExtends.pm", "version" : "2.2200" }, "Moose::Exception::RolesDoNotSupportInner" : { "file" : "lib/Moose/Exception/RolesDoNotSupportInner.pm", "version" : "2.2200" }, "Moose::Exception::RolesDoNotSupportRegexReferencesForMethodModifiers" : { "file" : "lib/Moose/Exception/RolesDoNotSupportRegexReferencesForMethodModifiers.pm", "version" : "2.2200" }, "Moose::Exception::RolesInCreateTakesAnArrayRef" : { "file" : "lib/Moose/Exception/RolesInCreateTakesAnArrayRef.pm", "version" : "2.2200" }, "Moose::Exception::RolesListMustBeInstancesOfMooseMetaRole" : { "file" : "lib/Moose/Exception/RolesListMustBeInstancesOfMooseMetaRole.pm", "version" : "2.2200" }, "Moose::Exception::SingleParamsToNewMustBeHashRef" : { "file" : "lib/Moose/Exception/SingleParamsToNewMustBeHashRef.pm", "version" : "2.2200" }, "Moose::Exception::TriggerMustBeACodeRef" : { "file" : "lib/Moose/Exception/TriggerMustBeACodeRef.pm", "version" : "2.2200" }, "Moose::Exception::TypeConstraintCannotBeUsedForAParameterizableType" : { "file" : "lib/Moose/Exception/TypeConstraintCannotBeUsedForAParameterizableType.pm", "version" : "2.2200" }, "Moose::Exception::TypeConstraintIsAlreadyCreated" : { "file" : "lib/Moose/Exception/TypeConstraintIsAlreadyCreated.pm", "version" : "2.2200" }, "Moose::Exception::TypeParameterMustBeMooseMetaType" : { "file" : "lib/Moose/Exception/TypeParameterMustBeMooseMetaType.pm", "version" : "2.2200" }, "Moose::Exception::UnableToCanonicalizeHandles" : { "file" : "lib/Moose/Exception/UnableToCanonicalizeHandles.pm", "version" : "2.2200" }, "Moose::Exception::UnableToCanonicalizeNonRolePackage" : { "file" : "lib/Moose/Exception/UnableToCanonicalizeNonRolePackage.pm", "version" : "2.2200" }, "Moose::Exception::UnableToRecognizeDelegateMetaclass" : { "file" : "lib/Moose/Exception/UnableToRecognizeDelegateMetaclass.pm", "version" : "2.2200" }, "Moose::Exception::UndefinedHashKeysPassedToMethod" : { "file" : "lib/Moose/Exception/UndefinedHashKeysPassedToMethod.pm", "version" : "2.2200" }, "Moose::Exception::UnionCalledWithAnArrayRefAndAdditionalArgs" : { "file" : "lib/Moose/Exception/UnionCalledWithAnArrayRefAndAdditionalArgs.pm", "version" : "2.2200" }, "Moose::Exception::UnionTakesAtleastTwoTypeNames" : { "file" : "lib/Moose/Exception/UnionTakesAtleastTwoTypeNames.pm", "version" : "2.2200" }, "Moose::Exception::ValidationFailedForInlineTypeConstraint" : { "file" : "lib/Moose/Exception/ValidationFailedForInlineTypeConstraint.pm", "version" : "2.2200" }, "Moose::Exception::ValidationFailedForTypeConstraint" : { "file" : "lib/Moose/Exception/ValidationFailedForTypeConstraint.pm", "version" : "2.2200" }, "Moose::Exception::WrapTakesACodeRefToBless" : { "file" : "lib/Moose/Exception/WrapTakesACodeRefToBless.pm", "version" : "2.2200" }, "Moose::Exception::WrongTypeConstraintGiven" : { "file" : "lib/Moose/Exception/WrongTypeConstraintGiven.pm", "version" : "2.2200" }, "Moose::Exporter" : { "file" : "lib/Moose/Exporter.pm", "version" : "2.2200" }, "Moose::Intro" : { "file" : "lib/Moose/Intro.pod", "version" : "2.2200" }, "Moose::Manual" : { "file" : "lib/Moose/Manual.pod", "version" : "2.2200" }, "Moose::Manual::Attributes" : { "file" : "lib/Moose/Manual/Attributes.pod", "version" : "2.2200" }, "Moose::Manual::BestPractices" : { "file" : "lib/Moose/Manual/BestPractices.pod", "version" : "2.2200" }, "Moose::Manual::Classes" : { "file" : "lib/Moose/Manual/Classes.pod", "version" : "2.2200" }, "Moose::Manual::Concepts" : { "file" : "lib/Moose/Manual/Concepts.pod", "version" : "2.2200" }, "Moose::Manual::Construction" : { "file" : "lib/Moose/Manual/Construction.pod", "version" : "2.2200" }, "Moose::Manual::Contributing" : { "file" : "lib/Moose/Manual/Contributing.pod", "version" : "2.2200" }, "Moose::Manual::Delegation" : { "file" : "lib/Moose/Manual/Delegation.pod", "version" : "2.2200" }, "Moose::Manual::Delta" : { "file" : "lib/Moose/Manual/Delta.pod", "version" : "2.2200" }, "Moose::Manual::Exceptions" : { "file" : "lib/Moose/Manual/Exceptions.pod", "version" : "2.2200" }, "Moose::Manual::Exceptions::Manifest" : { "file" : "lib/Moose/Manual/Exceptions/Manifest.pod", "version" : "2.2200" }, "Moose::Manual::FAQ" : { "file" : "lib/Moose/Manual/FAQ.pod", "version" : "2.2200" }, "Moose::Manual::MOP" : { "file" : "lib/Moose/Manual/MOP.pod", "version" : "2.2200" }, "Moose::Manual::MethodModifiers" : { "file" : "lib/Moose/Manual/MethodModifiers.pod", "version" : "2.2200" }, "Moose::Manual::MooseX" : { "file" : "lib/Moose/Manual/MooseX.pod", "version" : "2.2200" }, "Moose::Manual::Resources" : { "file" : "lib/Moose/Manual/Resources.pod", "version" : "2.2200" }, "Moose::Manual::Roles" : { "file" : "lib/Moose/Manual/Roles.pod", "version" : "2.2200" }, "Moose::Manual::Support" : { "file" : "lib/Moose/Manual/Support.pod", "version" : "2.2200" }, "Moose::Manual::Types" : { "file" : "lib/Moose/Manual/Types.pod", "version" : "2.2200" }, "Moose::Manual::Unsweetened" : { "file" : "lib/Moose/Manual/Unsweetened.pod", "version" : "2.2200" }, "Moose::Meta::Attribute" : { "file" : "lib/Moose/Meta/Attribute.pm", "version" : "2.2200" }, "Moose::Meta::Attribute::Native" : { "file" : "lib/Moose/Meta/Attribute/Native.pm", "version" : "2.2200" }, "Moose::Meta::Attribute::Native::Trait" : { "file" : "lib/Moose/Meta/Attribute/Native/Trait.pm", "version" : "2.2200" }, "Moose::Meta::Attribute::Native::Trait::Array" : { "file" : "lib/Moose/Meta/Attribute/Native/Trait/Array.pm", "version" : "2.2200" }, "Moose::Meta::Attribute::Native::Trait::Bool" : { "file" : "lib/Moose/Meta/Attribute/Native/Trait/Bool.pm", "version" : "2.2200" }, "Moose::Meta::Attribute::Native::Trait::Code" : { "file" : "lib/Moose/Meta/Attribute/Native/Trait/Code.pm", "version" : "2.2200" }, "Moose::Meta::Attribute::Native::Trait::Counter" : { "file" : "lib/Moose/Meta/Attribute/Native/Trait/Counter.pm", "version" : "2.2200" }, "Moose::Meta::Attribute::Native::Trait::Hash" : { "file" : "lib/Moose/Meta/Attribute/Native/Trait/Hash.pm", "version" : "2.2200" }, "Moose::Meta::Attribute::Native::Trait::Number" : { "file" : "lib/Moose/Meta/Attribute/Native/Trait/Number.pm", "version" : "2.2200" }, "Moose::Meta::Attribute::Native::Trait::String" : { "file" : "lib/Moose/Meta/Attribute/Native/Trait/String.pm", "version" : "2.2200" }, "Moose::Meta::Class" : { "file" : "lib/Moose/Meta/Class.pm", "version" : "2.2200" }, "Moose::Meta::Class::Immutable::Trait" : { "file" : "lib/Moose/Meta/Class/Immutable/Trait.pm", "version" : "2.2200" }, "Moose::Meta::Instance" : { "file" : "lib/Moose/Meta/Instance.pm", "version" : "2.2200" }, "Moose::Meta::Method" : { "file" : "lib/Moose/Meta/Method.pm", "version" : "2.2200" }, "Moose::Meta::Method::Accessor" : { "file" : "lib/Moose/Meta/Method/Accessor.pm", "version" : "2.2200" }, "Moose::Meta::Method::Accessor::Native" : { "file" : "lib/Moose/Meta/Method/Accessor/Native.pm", "version" : "2.2200" }, "Moose::Meta::Method::Accessor::Native::Array" : { "file" : "lib/Moose/Meta/Method/Accessor/Native/Array.pm", "version" : "2.2200" }, "Moose::Meta::Method::Accessor::Native::Array::Writer" : { "file" : "lib/Moose/Meta/Method/Accessor/Native/Array/Writer.pm", "version" : "2.2200" }, "Moose::Meta::Method::Accessor::Native::Array::accessor" : { "file" : "lib/Moose/Meta/Method/Accessor/Native/Array/accessor.pm", "version" : "2.2200" }, "Moose::Meta::Method::Accessor::Native::Array::clear" : { "file" : "lib/Moose/Meta/Method/Accessor/Native/Array/clear.pm", "version" : "2.2200" }, "Moose::Meta::Method::Accessor::Native::Array::count" : { "file" : "lib/Moose/Meta/Method/Accessor/Native/Array/count.pm", "version" : "2.2200" }, "Moose::Meta::Method::Accessor::Native::Array::delete" : { "file" : "lib/Moose/Meta/Method/Accessor/Native/Array/delete.pm", "version" : "2.2200" }, "Moose::Meta::Method::Accessor::Native::Array::elements" : { "file" : "lib/Moose/Meta/Method/Accessor/Native/Array/elements.pm", "version" : "2.2200" }, "Moose::Meta::Method::Accessor::Native::Array::first" : { "file" : "lib/Moose/Meta/Method/Accessor/Native/Array/first.pm", "version" : "2.2200" }, "Moose::Meta::Method::Accessor::Native::Array::first_index" : { "file" : "lib/Moose/Meta/Method/Accessor/Native/Array/first_index.pm", "version" : "2.2200" }, "Moose::Meta::Method::Accessor::Native::Array::get" : { "file" : "lib/Moose/Meta/Method/Accessor/Native/Array/get.pm", "version" : "2.2200" }, "Moose::Meta::Method::Accessor::Native::Array::grep" : { "file" : "lib/Moose/Meta/Method/Accessor/Native/Array/grep.pm", "version" : "2.2200" }, "Moose::Meta::Method::Accessor::Native::Array::insert" : { "file" : "lib/Moose/Meta/Method/Accessor/Native/Array/insert.pm", "version" : "2.2200" }, "Moose::Meta::Method::Accessor::Native::Array::is_empty" : { "file" : "lib/Moose/Meta/Method/Accessor/Native/Array/is_empty.pm", "version" : "2.2200" }, "Moose::Meta::Method::Accessor::Native::Array::join" : { "file" : "lib/Moose/Meta/Method/Accessor/Native/Array/join.pm", "version" : "2.2200" }, "Moose::Meta::Method::Accessor::Native::Array::map" : { "file" : "lib/Moose/Meta/Method/Accessor/Native/Array/map.pm", "version" : "2.2200" }, "Moose::Meta::Method::Accessor::Native::Array::natatime" : { "file" : "lib/Moose/Meta/Method/Accessor/Native/Array/natatime.pm", "version" : "2.2200" }, "Moose::Meta::Method::Accessor::Native::Array::pop" : { "file" : "lib/Moose/Meta/Method/Accessor/Native/Array/pop.pm", "version" : "2.2200" }, "Moose::Meta::Method::Accessor::Native::Array::push" : { "file" : "lib/Moose/Meta/Method/Accessor/Native/Array/push.pm", "version" : "2.2200" }, "Moose::Meta::Method::Accessor::Native::Array::reduce" : { "file" : "lib/Moose/Meta/Method/Accessor/Native/Array/reduce.pm", "version" : "2.2200" }, "Moose::Meta::Method::Accessor::Native::Array::set" : { "file" : "lib/Moose/Meta/Method/Accessor/Native/Array/set.pm", "version" : "2.2200" }, "Moose::Meta::Method::Accessor::Native::Array::shallow_clone" : { "file" : "lib/Moose/Meta/Method/Accessor/Native/Array/shallow_clone.pm", "version" : "2.2200" }, "Moose::Meta::Method::Accessor::Native::Array::shift" : { "file" : "lib/Moose/Meta/Method/Accessor/Native/Array/shift.pm", "version" : "2.2200" }, "Moose::Meta::Method::Accessor::Native::Array::shuffle" : { "file" : "lib/Moose/Meta/Method/Accessor/Native/Array/shuffle.pm", "version" : "2.2200" }, "Moose::Meta::Method::Accessor::Native::Array::sort" : { "file" : "lib/Moose/Meta/Method/Accessor/Native/Array/sort.pm", "version" : "2.2200" }, "Moose::Meta::Method::Accessor::Native::Array::sort_in_place" : { "file" : "lib/Moose/Meta/Method/Accessor/Native/Array/sort_in_place.pm", "version" : "2.2200" }, "Moose::Meta::Method::Accessor::Native::Array::splice" : { "file" : "lib/Moose/Meta/Method/Accessor/Native/Array/splice.pm", "version" : "2.2200" }, "Moose::Meta::Method::Accessor::Native::Array::uniq" : { "file" : "lib/Moose/Meta/Method/Accessor/Native/Array/uniq.pm", "version" : "2.2200" }, "Moose::Meta::Method::Accessor::Native::Array::unshift" : { "file" : "lib/Moose/Meta/Method/Accessor/Native/Array/unshift.pm", "version" : "2.2200" }, "Moose::Meta::Method::Accessor::Native::Bool::not" : { "file" : "lib/Moose/Meta/Method/Accessor/Native/Bool/not.pm", "version" : "2.2200" }, "Moose::Meta::Method::Accessor::Native::Bool::set" : { "file" : "lib/Moose/Meta/Method/Accessor/Native/Bool/set.pm", "version" : "2.2200" }, "Moose::Meta::Method::Accessor::Native::Bool::toggle" : { "file" : "lib/Moose/Meta/Method/Accessor/Native/Bool/toggle.pm", "version" : "2.2200" }, "Moose::Meta::Method::Accessor::Native::Bool::unset" : { "file" : "lib/Moose/Meta/Method/Accessor/Native/Bool/unset.pm", "version" : "2.2200" }, "Moose::Meta::Method::Accessor::Native::Code::execute" : { "file" : "lib/Moose/Meta/Method/Accessor/Native/Code/execute.pm", "version" : "2.2200" }, "Moose::Meta::Method::Accessor::Native::Code::execute_method" : { "file" : "lib/Moose/Meta/Method/Accessor/Native/Code/execute_method.pm", "version" : "2.2200" }, "Moose::Meta::Method::Accessor::Native::Collection" : { "file" : "lib/Moose/Meta/Method/Accessor/Native/Collection.pm", "version" : "2.2200" }, "Moose::Meta::Method::Accessor::Native::Counter::Writer" : { "file" : "lib/Moose/Meta/Method/Accessor/Native/Counter/Writer.pm", "version" : "2.2200" }, "Moose::Meta::Method::Accessor::Native::Counter::dec" : { "file" : "lib/Moose/Meta/Method/Accessor/Native/Counter/dec.pm", "version" : "2.2200" }, "Moose::Meta::Method::Accessor::Native::Counter::inc" : { "file" : "lib/Moose/Meta/Method/Accessor/Native/Counter/inc.pm", "version" : "2.2200" }, "Moose::Meta::Method::Accessor::Native::Counter::reset" : { "file" : "lib/Moose/Meta/Method/Accessor/Native/Counter/reset.pm", "version" : "2.2200" }, "Moose::Meta::Method::Accessor::Native::Counter::set" : { "file" : "lib/Moose/Meta/Method/Accessor/Native/Counter/set.pm", "version" : "2.2200" }, "Moose::Meta::Method::Accessor::Native::Hash" : { "file" : "lib/Moose/Meta/Method/Accessor/Native/Hash.pm", "version" : "2.2200" }, "Moose::Meta::Method::Accessor::Native::Hash::Writer" : { "file" : "lib/Moose/Meta/Method/Accessor/Native/Hash/Writer.pm", "version" : "2.2200" }, "Moose::Meta::Method::Accessor::Native::Hash::accessor" : { "file" : "lib/Moose/Meta/Method/Accessor/Native/Hash/accessor.pm", "version" : "2.2200" }, "Moose::Meta::Method::Accessor::Native::Hash::clear" : { "file" : "lib/Moose/Meta/Method/Accessor/Native/Hash/clear.pm", "version" : "2.2200" }, "Moose::Meta::Method::Accessor::Native::Hash::count" : { "file" : "lib/Moose/Meta/Method/Accessor/Native/Hash/count.pm", "version" : "2.2200" }, "Moose::Meta::Method::Accessor::Native::Hash::defined" : { "file" : "lib/Moose/Meta/Method/Accessor/Native/Hash/defined.pm", "version" : "2.2200" }, "Moose::Meta::Method::Accessor::Native::Hash::delete" : { "file" : "lib/Moose/Meta/Method/Accessor/Native/Hash/delete.pm", "version" : "2.2200" }, "Moose::Meta::Method::Accessor::Native::Hash::elements" : { "file" : "lib/Moose/Meta/Method/Accessor/Native/Hash/elements.pm", "version" : "2.2200" }, "Moose::Meta::Method::Accessor::Native::Hash::exists" : { "file" : "lib/Moose/Meta/Method/Accessor/Native/Hash/exists.pm", "version" : "2.2200" }, "Moose::Meta::Method::Accessor::Native::Hash::get" : { "file" : "lib/Moose/Meta/Method/Accessor/Native/Hash/get.pm", "version" : "2.2200" }, "Moose::Meta::Method::Accessor::Native::Hash::is_empty" : { "file" : "lib/Moose/Meta/Method/Accessor/Native/Hash/is_empty.pm", "version" : "2.2200" }, "Moose::Meta::Method::Accessor::Native::Hash::keys" : { "file" : "lib/Moose/Meta/Method/Accessor/Native/Hash/keys.pm", "version" : "2.2200" }, "Moose::Meta::Method::Accessor::Native::Hash::kv" : { "file" : "lib/Moose/Meta/Method/Accessor/Native/Hash/kv.pm", "version" : "2.2200" }, "Moose::Meta::Method::Accessor::Native::Hash::set" : { "file" : "lib/Moose/Meta/Method/Accessor/Native/Hash/set.pm", "version" : "2.2200" }, "Moose::Meta::Method::Accessor::Native::Hash::shallow_clone" : { "file" : "lib/Moose/Meta/Method/Accessor/Native/Hash/shallow_clone.pm", "version" : "2.2200" }, "Moose::Meta::Method::Accessor::Native::Hash::values" : { "file" : "lib/Moose/Meta/Method/Accessor/Native/Hash/values.pm", "version" : "2.2200" }, "Moose::Meta::Method::Accessor::Native::Number::abs" : { "file" : "lib/Moose/Meta/Method/Accessor/Native/Number/abs.pm", "version" : "2.2200" }, "Moose::Meta::Method::Accessor::Native::Number::add" : { "file" : "lib/Moose/Meta/Method/Accessor/Native/Number/add.pm", "version" : "2.2200" }, "Moose::Meta::Method::Accessor::Native::Number::div" : { "file" : "lib/Moose/Meta/Method/Accessor/Native/Number/div.pm", "version" : "2.2200" }, "Moose::Meta::Method::Accessor::Native::Number::mod" : { "file" : "lib/Moose/Meta/Method/Accessor/Native/Number/mod.pm", "version" : "2.2200" }, "Moose::Meta::Method::Accessor::Native::Number::mul" : { "file" : "lib/Moose/Meta/Method/Accessor/Native/Number/mul.pm", "version" : "2.2200" }, "Moose::Meta::Method::Accessor::Native::Number::set" : { "file" : "lib/Moose/Meta/Method/Accessor/Native/Number/set.pm", "version" : "2.2200" }, "Moose::Meta::Method::Accessor::Native::Number::sub" : { "file" : "lib/Moose/Meta/Method/Accessor/Native/Number/sub.pm", "version" : "2.2200" }, "Moose::Meta::Method::Accessor::Native::Reader" : { "file" : "lib/Moose/Meta/Method/Accessor/Native/Reader.pm", "version" : "2.2200" }, "Moose::Meta::Method::Accessor::Native::String::append" : { "file" : "lib/Moose/Meta/Method/Accessor/Native/String/append.pm", "version" : "2.2200" }, "Moose::Meta::Method::Accessor::Native::String::chomp" : { "file" : "lib/Moose/Meta/Method/Accessor/Native/String/chomp.pm", "version" : "2.2200" }, "Moose::Meta::Method::Accessor::Native::String::chop" : { "file" : "lib/Moose/Meta/Method/Accessor/Native/String/chop.pm", "version" : "2.2200" }, "Moose::Meta::Method::Accessor::Native::String::clear" : { "file" : "lib/Moose/Meta/Method/Accessor/Native/String/clear.pm", "version" : "2.2200" }, "Moose::Meta::Method::Accessor::Native::String::inc" : { "file" : "lib/Moose/Meta/Method/Accessor/Native/String/inc.pm", "version" : "2.2200" }, "Moose::Meta::Method::Accessor::Native::String::length" : { "file" : "lib/Moose/Meta/Method/Accessor/Native/String/length.pm", "version" : "2.2200" }, "Moose::Meta::Method::Accessor::Native::String::match" : { "file" : "lib/Moose/Meta/Method/Accessor/Native/String/match.pm", "version" : "2.2200" }, "Moose::Meta::Method::Accessor::Native::String::prepend" : { "file" : "lib/Moose/Meta/Method/Accessor/Native/String/prepend.pm", "version" : "2.2200" }, "Moose::Meta::Method::Accessor::Native::String::replace" : { "file" : "lib/Moose/Meta/Method/Accessor/Native/String/replace.pm", "version" : "2.2200" }, "Moose::Meta::Method::Accessor::Native::String::substr" : { "file" : "lib/Moose/Meta/Method/Accessor/Native/String/substr.pm", "version" : "2.2200" }, "Moose::Meta::Method::Accessor::Native::Writer" : { "file" : "lib/Moose/Meta/Method/Accessor/Native/Writer.pm", "version" : "2.2200" }, "Moose::Meta::Method::Augmented" : { "file" : "lib/Moose/Meta/Method/Augmented.pm", "version" : "2.2200" }, "Moose::Meta::Method::Constructor" : { "file" : "lib/Moose/Meta/Method/Constructor.pm", "version" : "2.2200" }, "Moose::Meta::Method::Delegation" : { "file" : "lib/Moose/Meta/Method/Delegation.pm", "version" : "2.2200" }, "Moose::Meta::Method::Destructor" : { "file" : "lib/Moose/Meta/Method/Destructor.pm", "version" : "2.2200" }, "Moose::Meta::Method::Meta" : { "file" : "lib/Moose/Meta/Method/Meta.pm", "version" : "2.2200" }, "Moose::Meta::Method::Overridden" : { "file" : "lib/Moose/Meta/Method/Overridden.pm", "version" : "2.2200" }, "Moose::Meta::Mixin::AttributeCore" : { "file" : "lib/Moose/Meta/Mixin/AttributeCore.pm", "version" : "2.2200" }, "Moose::Meta::Object::Trait" : { "file" : "lib/Moose/Meta/Object/Trait.pm", "version" : "2.2200" }, "Moose::Meta::Role" : { "file" : "lib/Moose/Meta/Role.pm", "version" : "2.2200" }, "Moose::Meta::Role::Application" : { "file" : "lib/Moose/Meta/Role/Application.pm", "version" : "2.2200" }, "Moose::Meta::Role::Application::RoleSummation" : { "file" : "lib/Moose/Meta/Role/Application/RoleSummation.pm", "version" : "2.2200" }, "Moose::Meta::Role::Application::ToClass" : { "file" : "lib/Moose/Meta/Role/Application/ToClass.pm", "version" : "2.2200" }, "Moose::Meta::Role::Application::ToInstance" : { "file" : "lib/Moose/Meta/Role/Application/ToInstance.pm", "version" : "2.2200" }, "Moose::Meta::Role::Application::ToRole" : { "file" : "lib/Moose/Meta/Role/Application/ToRole.pm", "version" : "2.2200" }, "Moose::Meta::Role::Attribute" : { "file" : "lib/Moose/Meta/Role/Attribute.pm", "version" : "2.2200" }, "Moose::Meta::Role::Composite" : { "file" : "lib/Moose/Meta/Role/Composite.pm", "version" : "2.2200" }, "Moose::Meta::Role::Method" : { "file" : "lib/Moose/Meta/Role/Method.pm", "version" : "2.2200" }, "Moose::Meta::Role::Method::Conflicting" : { "file" : "lib/Moose/Meta/Role/Method/Conflicting.pm", "version" : "2.2200" }, "Moose::Meta::Role::Method::Required" : { "file" : "lib/Moose/Meta/Role/Method/Required.pm", "version" : "2.2200" }, "Moose::Meta::TypeCoercion" : { "file" : "lib/Moose/Meta/TypeCoercion.pm", "version" : "2.2200" }, "Moose::Meta::TypeCoercion::Union" : { "file" : "lib/Moose/Meta/TypeCoercion/Union.pm", "version" : "2.2200" }, "Moose::Meta::TypeConstraint" : { "file" : "lib/Moose/Meta/TypeConstraint.pm", "version" : "2.2200" }, "Moose::Meta::TypeConstraint::Class" : { "file" : "lib/Moose/Meta/TypeConstraint/Class.pm", "version" : "2.2200" }, "Moose::Meta::TypeConstraint::DuckType" : { "file" : "lib/Moose/Meta/TypeConstraint/DuckType.pm", "version" : "2.2200" }, "Moose::Meta::TypeConstraint::Enum" : { "file" : "lib/Moose/Meta/TypeConstraint/Enum.pm", "version" : "2.2200" }, "Moose::Meta::TypeConstraint::Parameterizable" : { "file" : "lib/Moose/Meta/TypeConstraint/Parameterizable.pm", "version" : "2.2200" }, "Moose::Meta::TypeConstraint::Parameterized" : { "file" : "lib/Moose/Meta/TypeConstraint/Parameterized.pm", "version" : "2.2200" }, "Moose::Meta::TypeConstraint::Registry" : { "file" : "lib/Moose/Meta/TypeConstraint/Registry.pm", "version" : "2.2200" }, "Moose::Meta::TypeConstraint::Role" : { "file" : "lib/Moose/Meta/TypeConstraint/Role.pm", "version" : "2.2200" }, "Moose::Meta::TypeConstraint::Union" : { "file" : "lib/Moose/Meta/TypeConstraint/Union.pm", "version" : "2.2200" }, "Moose::Object" : { "file" : "lib/Moose/Object.pm", "version" : "2.2200" }, "Moose::Role" : { "file" : "lib/Moose/Role.pm", "version" : "2.2200" }, "Moose::Spec::Role" : { "file" : "lib/Moose/Spec/Role.pod", "version" : "2.2200" }, "Moose::Unsweetened" : { "file" : "lib/Moose/Unsweetened.pod", "version" : "2.2200" }, "Moose::Util" : { "file" : "lib/Moose/Util.pm", "version" : "2.2200" }, "Moose::Util::MetaRole" : { "file" : "lib/Moose/Util/MetaRole.pm", "version" : "2.2200" }, "Moose::Util::TypeConstraints" : { "file" : "lib/Moose/Util/TypeConstraints.pm", "version" : "2.2200" }, "Moose::Util::TypeConstraints::Builtins" : { "file" : "lib/Moose/Util/TypeConstraints/Builtins.pm", "version" : "2.2200" }, "Test::Moose" : { "file" : "lib/Test/Moose.pm", "version" : "2.2200" }, "metaclass" : { "file" : "lib/metaclass.pm", "version" : "2.2200" }, "oose" : { "file" : "lib/oose.pm", "version" : "2.2200" } }, "release_status" : "stable", "resources" : { "bugtracker" : { "mailto" : "bug-Moose@rt.cpan.org", "web" : "https://rt.cpan.org/Dist/Display.html?Name=Moose" }, "homepage" : "http://moose.perl.org/", "repository" : { "type" : "git", "url" : "git://github.com/moose/Moose.git", "web" : "https://github.com/moose/Moose" }, "x_IRC" : "irc://irc.perl.org/#moose", "x_MailingList" : "http://lists.perl.org/list/moose.html" }, "version" : "2.2200", "x_Dist_Zilla" : { "perl" : { "version" : "5.035005" }, "plugins" : [ { "class" : "Dist::Zilla::Plugin::EnsurePrereqsInstalled", "name" : "EnsurePrereqsInstalled", "version" : "0.009" }, { "class" : "Dist::Zilla::Plugin::Git::GatherDir", "config" : { "Dist::Zilla::Plugin::GatherDir" : { "exclude_filename" : [ "CONTRIBUTING.pod", "LICENSE", "Makefile.PL", "ppport.h" ], "exclude_match" : [ "^t/recipes/(?!basics_genome_overloadingsubtypesandcoercion)" ], "follow_symlinks" : 0, "include_dotfiles" : 0, "prefix" : "", "prune_directory" : [], "root" : "." }, "Dist::Zilla::Plugin::Git::GatherDir" : { "include_untracked" : 0 } }, "name" : "Git::GatherDir", "version" : "2.048" }, { "class" : "Dist::Zilla::Plugin::PPPort", "name" : "PPPort", "version" : "0.009" }, { "class" : "Dist::Zilla::Plugin::MetaYAML", "name" : "MetaYAML", "version" : "6.024" }, { "class" : "Dist::Zilla::Plugin::MetaJSON", "name" : "MetaJSON", "version" : "6.024" }, { "class" : "Dist::Zilla::Plugin::License", "name" : "License", "version" : "6.024" }, { "class" : "Dist::Zilla::Plugin::ExecDir", "name" : "ExecDir", "version" : "6.024" }, { "class" : "inc::MakeMaker", "config" : { "Dist::Zilla::Plugin::MakeMaker" : { "make_path" : "make", "version" : "6.024" }, "Dist::Zilla::Plugin::MakeMaker::Awesome" : { "version" : "0.49" }, "Dist::Zilla::Role::TestRunner" : { "default_jobs" : "9", "version" : "6.024" } }, "name" : "=inc::MakeMaker", "version" : null }, { "class" : "Dist::Zilla::Plugin::ModuleIncluder", "config" : { "Dist::Zilla::Plugin::ModuleIncluder" : { "background_perl" : "5.008003", "blacklist" : [], "module" : [ "ExtUtils::HasCompiler" ], "only_deps" : 0 }, "Dist::Zilla::Role::ModuleIncluder" : { "Module::CoreList" : "5.20211020", "include_dependencies" : 1, "version" : "0.008" } }, "name" : "ModuleIncluder", "version" : "0.008" }, { "class" : "Dist::Zilla::Plugin::Manifest", "name" : "Manifest", "version" : "6.024" }, { "class" : "Dist::Zilla::Plugin::MetaConfig", "name" : "MetaConfig", "version" : "6.024" }, { "class" : "inc::SimpleAuthority", "name" : "=inc::SimpleAuthority", "version" : null }, { "class" : "Dist::Zilla::Plugin::MetaResources", "name" : "MetaResources", "version" : "6.024" }, { "class" : "Dist::Zilla::Plugin::UseUnsafeInc", "config" : { "Dist::Zilla::Plugin::UseUnsafeInc" : { "dot_in_INC" : 0 } }, "name" : "UseUnsafeInc", "version" : "0.001" }, { "class" : "inc::Documentation", "name" : "=inc::Documentation", "version" : null }, { "class" : "Dist::Zilla::Plugin::FileFinder::ByName", "name" : "PodModules", "version" : "6.024" }, { "class" : "Dist::Zilla::Plugin::FileFinder::Filter", "name" : "ModulesSansPod", "version" : "6.024" }, { "class" : "Dist::Zilla::Plugin::FileFinder::Filter", "name" : "VersionedModules", "version" : "6.024" }, { "class" : "inc::SimpleProvides", "name" : "=inc::SimpleProvides", "version" : null }, { "class" : "Dist::Zilla::Plugin::MetaProvides::Package", "config" : { "Dist::Zilla::Plugin::MetaProvides::Package" : { "finder" : [ "ModulesSansPod" ], "finder_objects" : [ { "class" : "Dist::Zilla::Plugin::FileFinder::Filter", "name" : "ModulesSansPod", "version" : "6.024" } ], "include_underscores" : 0 }, "Dist::Zilla::Role::MetaProvider::Provider" : { "$Dist::Zilla::Role::MetaProvider::Provider::VERSION" : "2.002004", "inherit_missing" : 1, "inherit_version" : 1, "meta_noindex" : "1" }, "Dist::Zilla::Role::ModuleMetadata" : { "Module::Metadata" : "1.000037", "version" : "0.006" } }, "name" : "MetaProvides::Package", "version" : "2.004003" }, { "class" : "Dist::Zilla::Plugin::MetaNoIndex", "name" : "MetaNoIndex", "version" : "6.024" }, { "class" : "Dist::Zilla::Plugin::Git::Contributors", "config" : { "Dist::Zilla::Plugin::Git::Contributors" : { "git_version" : "2.31.1", "include_authors" : 0, "include_releaser" : 1, "order_by" : "commits", "paths" : [] } }, "name" : "Git::Contributors", "version" : "0.036" }, { "class" : "Dist::Zilla::Plugin::SurgicalPodWeaver", "config" : { "Dist::Zilla::Plugin::PodWeaver" : { "finder" : [ ":InstallModules", ":ExecFiles" ], "plugins" : [ { "class" : "Pod::Weaver::Plugin::EnsurePod5", "name" : "@CorePrep/EnsurePod5", "version" : "4.018" }, { "class" : "Pod::Weaver::Plugin::H1Nester", "name" : "@CorePrep/H1Nester", "version" : "4.018" }, { "class" : "Pod::Weaver::Plugin::SingleEncoding", "name" : "@Default/SingleEncoding", "version" : "4.018" }, { "class" : "Pod::Weaver::Section::Name", "name" : "@Default/Name", "version" : "4.018" }, { "class" : "Pod::Weaver::Section::Version", "name" : "@Default/Version", "version" : "4.018" }, { "class" : "Pod::Weaver::Section::Region", "name" : "@Default/prelude", "version" : "4.018" }, { "class" : "Pod::Weaver::Section::Generic", "name" : "SYNOPSIS", "version" : "4.018" }, { "class" : "Pod::Weaver::Section::Generic", "name" : "DESCRIPTION", "version" : "4.018" }, { "class" : "Pod::Weaver::Section::Generic", "name" : "OVERVIEW", "version" : "4.018" }, { "class" : "Pod::Weaver::Section::Collect", "name" : "ATTRIBUTES", "version" : "4.018" }, { "class" : "Pod::Weaver::Section::Collect", "name" : "METHODS", "version" : "4.018" }, { "class" : "Pod::Weaver::Section::Collect", "name" : "FUNCTIONS", "version" : "4.018" }, { "class" : "Pod::Weaver::Section::Leftovers", "name" : "@Default/Leftovers", "version" : "4.018" }, { "class" : "Pod::Weaver::Section::Region", "name" : "@Default/postlude", "version" : "4.018" }, { "class" : "Pod::Weaver::Section::Authors", "name" : "@Default/Authors", "version" : "4.018" }, { "class" : "Pod::Weaver::Section::Legal", "name" : "@Default/Legal", "version" : "4.018" }, { "class" : "Pod::Weaver::Section::AllowOverride", "name" : "OverrideLegal", "version" : "0.05" } ] } }, "name" : "SurgicalPodWeaver", "version" : "0.0023" }, { "class" : "Dist::Zilla::Plugin::RewriteVersion", "config" : { "Dist::Zilla::Plugin::RewriteVersion" : { "add_tarball_name" : 0, "finders" : [ "VersionedModules" ], "global" : 0, "skip_version_provider" : 0 } }, "name" : "RewriteVersion", "version" : "0.018" }, { "class" : "Dist::Zilla::Plugin::Git::Describe", "name" : "Git::Describe", "version" : "0.007" }, { "class" : "inc::ExtractInlineTests", "name" : "=inc::ExtractInlineTests", "version" : null }, { "class" : "Dist::Zilla::Plugin::PromptIfStale", "config" : { "Dist::Zilla::Plugin::PromptIfStale" : { "check_all_plugins" : 1, "check_all_prereqs" : 1, "modules" : [], "phase" : "release", "run_under_travis" : 0, "skip" : [] } }, "name" : "PromptIfStale", "version" : "0.057" }, { "class" : "Dist::Zilla::Plugin::Test::EOL", "config" : { "Dist::Zilla::Plugin::Test::EOL" : { "filename" : "xt/author/eol.t", "finder" : [ ":ExecFiles", ":InstallModules", ":TestFiles" ], "trailing_whitespace" : 1 } }, "name" : "Test::EOL", "version" : "0.19" }, { "class" : "Dist::Zilla::Plugin::PodSyntaxTests", "name" : "PodSyntaxTests", "version" : "6.024" }, { "class" : "Dist::Zilla::Plugin::Test::NoTabs", "config" : { "Dist::Zilla::Plugin::Test::NoTabs" : { "filename" : "xt/author/no-tabs.t", "finder" : [ ":InstallModules", ":ExecFiles", ":TestFiles" ] } }, "name" : "Test::NoTabs", "version" : "0.15" }, { "class" : "Dist::Zilla::Plugin::MetaTests", "name" : "MetaTests", "version" : "6.024" }, { "class" : "Dist::Zilla::Plugin::Test::Kwalitee", "config" : { "Dist::Zilla::Plugin::Test::Kwalitee" : { "filename" : "xt/release/kwalitee.t", "skiptest" : [ "use_strict" ] } }, "name" : "Test::Kwalitee", "version" : "2.12" }, { "class" : "Dist::Zilla::Plugin::MojibakeTests", "name" : "MojibakeTests", "version" : "0.8" }, { "class" : "Dist::Zilla::Plugin::RunExtraTests", "config" : { "Dist::Zilla::Role::TestRunner" : { "default_jobs" : "9" } }, "name" : "RunExtraTests", "version" : "0.029" }, { "class" : "Dist::Zilla::Plugin::Test::ReportPrereqs", "name" : "Test::ReportPrereqs", "version" : "0.028" }, { "class" : "Dist::Zilla::Plugin::Test::CPAN::Changes", "config" : { "Dist::Zilla::Plugin::Test::CPAN::Changes" : { "changelog" : "Changes" } }, "name" : "Test::CPAN::Changes", "version" : "0.012" }, { "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/release/00-compile.t", "module_finder" : [ ":InstallModules" ], "needs_display" : 0, "phase" : "develop", "script_finder" : [ ":PerlExecFiles" ], "skips" : [ "^Class::MOP::Attribute$", "^Class::MOP::Class$", "^Class::MOP::Method::Accessor$", "^Class::MOP::Method::Constructor$", "^Class::MOP::Method::Inlined$", "^Class::MOP::Method::Wrapped$", "^Class::MOP::Mixin::HasAttributes$", "^Class::MOP::Module$", "^Class::MOP::Package$", "^Moose::Meta::Attribute$", "^Moose::Meta::Attribute::Native$", "^Moose::Meta::Mixin::AttributeCore$", "^Moose::Meta::Role::Attribute$", "^Moose::Meta::TypeConstraint::Class$", "^Moose::Meta::TypeConstraint::DuckType$", "^Moose::Meta::TypeConstraint::Enum$", "^Moose::Meta::TypeConstraint::Parameterizable$", "^Moose::Meta::TypeConstraint::Parameterized$", "^Moose::Meta::TypeConstraint::Role$", "^Moose::Meta::TypeConstraint::Union$" ], "switch" : [] } }, "name" : "Test::Compile", "version" : "2.058" }, { "class" : "inc::CheckReleaseType", "name" : "=inc::CheckReleaseType", "version" : null }, { "class" : "Dist::Zilla::Plugin::CheckVersionIncrement", "name" : "CheckVersionIncrement", "version" : "0.121750" }, { "class" : "Dist::Zilla::Plugin::Test::ChangesHasContent", "name" : "Test::ChangesHasContent", "version" : "0.011" }, { "class" : "Dist::Zilla::Plugin::Substitute", "name" : "Substitute", "version" : "0.006" }, { "class" : "Dist::Zilla::Plugin::Prereqs", "config" : { "Dist::Zilla::Plugin::Prereqs" : { "phase" : "runtime", "type" : "requires" } }, "name" : "Prereqs", "version" : "6.024" }, { "class" : "Dist::Zilla::Plugin::Prereqs", "config" : { "Dist::Zilla::Plugin::Prereqs" : { "phase" : "test", "type" : "requires" } }, "name" : "TestRequires", "version" : "6.024" }, { "class" : "Dist::Zilla::Plugin::Prereqs", "config" : { "Dist::Zilla::Plugin::Prereqs" : { "phase" : "configure", "type" : "requires" } }, "name" : "ConfigureRequires", "version" : "6.024" }, { "class" : "Dist::Zilla::Plugin::Prereqs::AuthorDeps", "name" : "Prereqs::AuthorDeps", "version" : "0.007" }, { "class" : "Dist::Zilla::Plugin::Prereqs", "config" : { "Dist::Zilla::Plugin::Prereqs" : { "phase" : "develop", "type" : "requires" } }, "name" : "DevelopRequires", "version" : "6.024" }, { "class" : "Dist::Zilla::Plugin::Prereqs", "config" : { "Dist::Zilla::Plugin::Prereqs" : { "phase" : "runtime", "type" : "recommends" } }, "name" : "RuntimeRecommends", "version" : "6.024" }, { "class" : "Dist::Zilla::Plugin::Prereqs", "config" : { "Dist::Zilla::Plugin::Prereqs" : { "phase" : "runtime", "type" : "suggests" } }, "name" : "RuntimeSuggests", "version" : "6.024" }, { "class" : "Dist::Zilla::Plugin::Conflicts", "name" : "Conflicts", "version" : "0.19" }, { "class" : "Dist::Zilla::Plugin::Test::CheckBreaks", "config" : { "Dist::Zilla::Plugin::Test::CheckBreaks" : { "conflicts_module" : [ "Module::Runtime::Conflicts", "Moose::Conflicts" ], "no_forced_deps" : 0 }, "Dist::Zilla::Role::ModuleMetadata" : { "Module::Metadata" : "1.000037", "version" : "0.006" } }, "name" : "Test::CheckBreaks", "version" : "0.019" }, { "class" : "inc::CheckAuthorDeps", "name" : "=inc::CheckAuthorDeps", "version" : null }, { "class" : "inc::CheckDelta", "name" : "=inc::CheckDelta", "version" : null }, { "class" : "inc::GitUpToDate", "name" : "=inc::GitUpToDate", "version" : null }, { "class" : "Dist::Zilla::Plugin::Git::Remote::Check", "name" : "Git::Remote::Check", "version" : "0.1.2" }, { "class" : "Dist::Zilla::Plugin::Git::CheckFor::CorrectBranch", "config" : { "Dist::Zilla::Role::Git::Repo" : { "git_version" : "2.31.1", "repo_root" : "." } }, "name" : "Git::CheckFor::CorrectBranch", "version" : "0.014" }, { "class" : "Dist::Zilla::Plugin::Git::Check", "config" : { "Dist::Zilla::Plugin::Git::Check" : { "untracked_files" : "die" }, "Dist::Zilla::Role::Git::DirtyFiles" : { "allow_dirty" : [], "allow_dirty_match" : [], "changelog" : "Changes" }, "Dist::Zilla::Role::Git::Repo" : { "git_version" : "2.31.1", "repo_root" : "." } }, "name" : "Git::Check", "version" : "2.048" }, { "class" : "Dist::Zilla::Plugin::TestRelease", "name" : "TestRelease", "version" : "6.024" }, { "class" : "Dist::Zilla::Plugin::UploadToCPAN", "name" : "UploadToCPAN", "version" : "6.024" }, { "class" : "Dist::Zilla::Plugin::CopyFilesFromRelease", "config" : { "Dist::Zilla::Plugin::CopyFilesFromRelease" : { "filename" : [ "Changes" ], "match" : [] } }, "name" : "CopyChanges", "version" : "0.007" }, { "class" : "Dist::Zilla::Plugin::CopyFilesFromRelease", "config" : { "Dist::Zilla::Plugin::CopyFilesFromRelease" : { "filename" : [ "LICENSE", "ppport.h" ], "match" : [] } }, "name" : "CopyFilesFromRelease", "version" : "0.007" }, { "class" : "Dist::Zilla::Plugin::Regenerate::AfterReleasers", "config" : { "Dist::Zilla::Plugin::Regenerate::AfterReleasers" : { "plugins" : [ "CopyFilesFromRelease" ] }, "Dist::Zilla::Role::Regenerator" : { "$Dist::Zilla::Role::Regenerator::VERSION" : "0.001002" } }, "name" : "Regenerate::AfterReleasers", "version" : "0.001002" }, { "class" : "Dist::Zilla::Plugin::ReadmeAnyFromPod", "config" : { "Dist::Zilla::Role::FileWatcher" : { "version" : "0.006" } }, "name" : "ReadmeAnyFromPod", "version" : "0.163250" }, { "class" : "Dist::Zilla::Plugin::Git::Commit", "config" : { "Dist::Zilla::Plugin::Git::Commit" : { "add_files_in" : [], "commit_msg" : "%N-%v%t%n%n%c", "signoff" : 0 }, "Dist::Zilla::Role::Git::DirtyFiles" : { "allow_dirty" : [ "CONTRIBUTING.pod", "Changes", "LICENSE", "ppport.h" ], "allow_dirty_match" : [], "changelog" : "Changes" }, "Dist::Zilla::Role::Git::Repo" : { "git_version" : "2.31.1", "repo_root" : "." }, "Dist::Zilla::Role::Git::StringFormatter" : { "time_zone" : "local" } }, "name" : "release snapshot", "version" : "2.048" }, { "class" : "Dist::Zilla::Plugin::Git::Tag", "config" : { "Dist::Zilla::Plugin::Git::Tag" : { "branch" : null, "changelog" : "Changes", "signed" : 0, "tag" : "2.2200", "tag_format" : "%v", "tag_message" : "%v%t" }, "Dist::Zilla::Role::Git::Repo" : { "git_version" : "2.31.1", "repo_root" : "." }, "Dist::Zilla::Role::Git::StringFormatter" : { "time_zone" : "local" } }, "name" : "Git::Tag", "version" : "2.048" }, { "class" : "Dist::Zilla::Plugin::BumpVersionAfterRelease", "config" : { "Dist::Zilla::Plugin::BumpVersionAfterRelease" : { "finders" : [ "VersionedModules" ], "global" : 0, "munge_makefile_pl" : 1 } }, "name" : "BumpVersionAfterRelease", "version" : "0.018" }, { "class" : "Dist::Zilla::Plugin::NextRelease", "name" : "NextRelease", "version" : "6.024" }, { "class" : "Dist::Zilla::Plugin::Git::Commit", "config" : { "Dist::Zilla::Plugin::Git::Commit" : { "add_files_in" : [], "commit_msg" : "increment $VERSION after %v release", "signoff" : 0 }, "Dist::Zilla::Role::Git::DirtyFiles" : { "allow_dirty" : [ "Changes" ], "allow_dirty_match" : [ "(?^u:^lib/.*\\.pm$)" ], "changelog" : "Changes" }, "Dist::Zilla::Role::Git::Repo" : { "git_version" : "2.31.1", "repo_root" : "." }, "Dist::Zilla::Role::Git::StringFormatter" : { "time_zone" : "local" } }, "name" : "increment version", "version" : "2.048" }, { "class" : "Dist::Zilla::Plugin::Git::Push", "config" : { "Dist::Zilla::Plugin::Git::Push" : { "push_to" : [ "origin" ], "remotes_must_exist" : 1 }, "Dist::Zilla::Role::Git::Repo" : { "git_version" : "2.31.1", "repo_root" : "." } }, "name" : "Git::Push", "version" : "2.048" }, { "class" : "Dist::Zilla::Plugin::Run::AfterRelease", "config" : { "Dist::Zilla::Plugin::Run::Role::Runner" : { "fatal_errors" : 0, "quiet" : 0, "run" : [ "git checkout master", "git merge --ff-only --quiet stable/2.22", "git push" ], "version" : "0.048" } }, "name" : "Run::AfterRelease", "version" : "0.048" }, { "class" : "inc::GenerateDocs", "name" : "=inc::GenerateDocs", "version" : null }, { "class" : "inc::Clean", "name" : "=inc::Clean", "version" : null }, { "class" : "Dist::Zilla::Plugin::ConfirmRelease", "name" : "ConfirmRelease", "version" : "6.024" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":InstallModules", "version" : "6.024" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":IncModules", "version" : "6.024" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":TestFiles", "version" : "6.024" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":ExtraTestFiles", "version" : "6.024" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":ExecFiles", "version" : "6.024" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":PerlExecFiles", "version" : "6.024" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":ShareFiles", "version" : "6.024" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":MainModule", "version" : "6.024" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":AllFiles", "version" : "6.024" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":NoFiles", "version" : "6.024" } ], "zilla" : { "class" : "Dist::Zilla::Dist::Builder", "config" : { "is_trial" : 0 }, "version" : "6.024" } }, "x_authority" : "cpan:STEVAN", "x_breaks" : { "Catalyst" : "<= 5.90049999", "Config::MVP" : "<= 2.200004", "Devel::REPL" : "<= 1.003020", "Dist::Zilla" : "<= 5.043", "Dist::Zilla::Plugin::Git" : "<= 2.016", "Fey" : "<= 0.36", "Fey::ORM" : "<= 0.42", "File::ChangeNotify" : "<= 0.15", "HTTP::Throwable" : "<= 0.017", "KiokuDB" : "<= 0.51", "Markdent" : "<= 0.16", "Mason" : "<= 2.18", "Moose::Autobox" : "<= 0.15", "MooseX::ABC" : "<= 0.05", "MooseX::Aliases" : "<= 0.08", "MooseX::AlwaysCoerce" : "<= 0.13", "MooseX::App" : "<= 1.22", "MooseX::Attribute::Deflator" : "<= 2.1.7", "MooseX::Attribute::Dependent" : "<= 1.1.3", "MooseX::Attribute::Prototype" : "<= 0.10", "MooseX::AttributeHelpers" : "<= 0.22", "MooseX::AttributeIndexes" : "<= 1.0.0", "MooseX::AttributeInflate" : "<= 0.02", "MooseX::CascadeClearing" : "<= 0.03", "MooseX::ClassAttribute" : "<= 0.26", "MooseX::Constructor::AllErrors" : "<= 0.021", "MooseX::Declare" : "<= 0.35", "MooseX::FollowPBP" : "<= 0.02", "MooseX::Getopt" : "<= 0.56", "MooseX::InstanceTracking" : "<= 0.04", "MooseX::LazyRequire" : "<= 0.06", "MooseX::Meta::Attribute::Index" : "<= 0.04", "MooseX::Meta::Attribute::Lvalue" : "<= 0.05", "MooseX::Method::Signatures" : "<= 0.44", "MooseX::MethodAttributes" : "<= 0.22", "MooseX::NonMoose" : "<= 0.24", "MooseX::Object::Pluggable" : "<= 0.0011", "MooseX::POE" : "<= 0.214", "MooseX::Params::Validate" : "<= 0.05", "MooseX::PrivateSetters" : "<= 0.03", "MooseX::Role::Cmd" : "<= 0.06", "MooseX::Role::Parameterized" : "<= 1.00", "MooseX::Role::WithOverloading" : "<= 0.14", "MooseX::Runnable" : "<= 0.03", "MooseX::Scaffold" : "<= 0.05", "MooseX::SemiAffordanceAccessor" : "<= 0.05", "MooseX::SetOnce" : "<= 0.100473", "MooseX::Singleton" : "<= 0.25", "MooseX::SlurpyConstructor" : "<= 1.1", "MooseX::Storage" : "<= 0.42", "MooseX::StrictConstructor" : "<= 0.12", "MooseX::Traits" : "<= 0.11", "MooseX::Types" : "<= 0.19", "MooseX::Types::Parameterizable" : "<= 0.05", "MooseX::Types::Set::Object" : "<= 0.03", "MooseX::Types::Signal" : "<= 1.101930", "MooseX::UndefTolerant" : "<= 0.11", "Net::Twitter" : "<= 4.01041", "PRANG" : "<= 0.14", "Pod::Elemental" : "<= 0.093280", "Pod::Weaver" : "<= 3.101638", "Reaction" : "<= 0.002003", "Test::Able" : "<= 0.10", "Test::CleanNamespaces" : "<= 0.03", "Test::Moose::More" : "<= 0.022", "Test::TempDir" : "<= 0.05", "Throwable" : "<= 0.102080", "namespace::autoclean" : "<= 0.08" }, "x_contributors" : [ "Upasana Shukla ", "Graham Knop ", "Matt S Trout ", "Tomas Doran ", "Ricardo Signes ", "Guillermo Roditi ", "John Napiorkowski ", "Aankhen ", "Todd Hepler ", "Jonathan Rockway ", "Gerda Shank ", "Perlover ", "Shlomi Fish ", "Stevan Little ", "Brad Bowman ", "Justin Hunter ", "Kent Fredric ", "Paul Driver ", "Anders Nor Berle ", "Brian Manning ", "gfx ", "Jay Hannah ", "Lars D\u026a\u1d07\u1d04\u1d0b\u1d0f\u1d21 \u8fea\u62c9\u65af ", "Leon Brocard ", "Olivier Mengu\u00e9 ", "Rafael Kitover ", "Christian Hansen ", "Cory Watson ", "Dagfinn Ilmari Manns\u00e5ker ", "Paul Jamieson Fenwick ", "Robert Buels ", "Dan Dascalescu ", "Marcel Gr\u00fcnauer ", "Scott McWhirter ", "\u00c6var Arnfj\u00f6r\u00f0 Bjarmason ", "Daisuke Maki (lestrrat) ", "Dylan William Hardison ", "Patrick Donelan ", "Stefan O'Rear ", "Tokuhiro Matsuno ", "Ash Berlin ", "Chris Weyl ", "Eric Wilhelm ", "Jess Robinson ", "Marc Mims ", "Marcus Ramberg ", "Mark Allen ", "Mateu X Hunter ", "matthof ", "Robert 'phaylon' Sedlacek ", "Zachary Lome ", "Aran Clary Deltac ", "Chip ", "Christopher J. Madsen ", "Curtis Jewell ", "Evan Carroll ", "Mark A. Stratman ", "Mark Fowler ", "Matthew Horsfall ", "mauke ", "Michael LaGrasta ", "Michael Rykov ", "Mike Whitaker ", "Moritz Onken ", "Nelo Onyiah ", "Nick Perez ", "Robert Boone ", "Robin V ", "rodrigolive ", "shelling ", "Thomas Sibley ", "Tom Hukins ", "Wallace Reis ", "Aaron Cohen ", "Adam J. Foxson ", "Adam Kennedy ", "Andy Jack ", "Anirvan Chatterjee ", "Ansgar Burchardt ", "A. Sinan Unur ", "Ben Hutton ", "Brendan Byrd ", "Chad Granum ", "Chankey Pathak ", "Chia-liang Kao ", "Christian Walde (Mithaldu) ", "chromatic ", "Dann ", "Dave Romano ", "David Leadbeater ", "David Steinbrunner ", "dmaestro ", "E. Choroba ", "franck cuny ", "Frew Schmidt ", "gregor herrmann ", "hakim ", "Henry Van Styn ", "James Marca ", "Jason May ", "Jay Allen ", "Jay Kuri ", "Jeff Bisbee ", "Jens Berthold ", "Jesse Vincent ", "joel ", "John Douglas Porter ", "John Goulah ", "Justin DeVuyst ", "Kang-min Liu ", "Leon Timmermans ", "Mark O Grady ", "Matt Kraai ", "Michael Schout ", "Nathan Gray ", "Olaf Alders ", "Olof Johansson ", "Paul Cochrane ", "Pawe\u0142 Murias ", "Pedro Melo ", "Peter Shangov ", "Philippe Bruhat (BooK) ", "Philipp Gortan ", "Phillip Smith ", "Piotr Roszatycki ", "pktm ", "rouzier ", "Sam Vilain ", "sherrardb <32931314+sherrardb@users.noreply.github.com>", "Simon Reinhardt ", "sue spence ", "Tuomas Jormola ", "wickline ", "Yanick Champoux ", "Zoffix Znet " ], "x_documentation" : [ "Moose::Manual", "Moose::Manual::Attributes", "Moose::Manual::BestPractices", "Moose::Manual::Classes", "Moose::Manual::Concepts", "Moose::Manual::Construction", "Moose::Manual::Contributing", "Moose::Manual::Delegation", "Moose::Manual::Delta", "Moose::Manual::Exceptions", "Moose::Manual::FAQ", "Moose::Manual::MOP", "Moose::Manual::MethodModifiers", "Moose::Manual::MooseX", "Moose::Manual::Resources", "Moose::Manual::Roles", "Moose::Manual::Support", "Moose::Manual::Types", "Moose::Manual::Unsweetened", "Moose::Cookbook", "Moose::Cookbook::Basics::BankAccount_MethodModifiersAndSubclassing", "Moose::Cookbook::Basics::BinaryTree_AttributeFeatures", "Moose::Cookbook::Basics::BinaryTree_BuilderAndLazyBuild", "Moose::Cookbook::Basics::Company_Subtypes", "Moose::Cookbook::Basics::DateTime_ExtendingNonMooseParent", "Moose::Cookbook::Basics::Document_AugmentAndInner", "Moose::Cookbook::Basics::Genome_OverloadingSubtypesAndCoercion", "Moose::Cookbook::Basics::HTTP_SubtypesAndCoercion", "Moose::Cookbook::Basics::Immutable", "Moose::Cookbook::Basics::Person_BUILDARGSAndBUILD", "Moose::Cookbook::Basics::Point_AttributesAndSubclassing", "Moose::Cookbook::Extending::Debugging_BaseClassRole", "Moose::Cookbook::Extending::ExtensionOverview", "Moose::Cookbook::Extending::Mooseish_MooseSugar", "Moose::Cookbook::Legacy::Debugging_BaseClassReplacement", "Moose::Cookbook::Legacy::Labeled_AttributeMetaclass", "Moose::Cookbook::Legacy::Table_ClassMetaclass", "Moose::Cookbook::Meta::GlobRef_InstanceMetaclass", "Moose::Cookbook::Meta::Labeled_AttributeTrait", "Moose::Cookbook::Meta::PrivateOrPublic_MethodMetaclass", "Moose::Cookbook::Meta::Table_MetaclassTrait", "Moose::Cookbook::Meta::WhyMeta", "Moose::Cookbook::Roles::ApplicationToInstance", "Moose::Cookbook::Roles::Comparable_CodeReuse", "Moose::Cookbook::Roles::Restartable_AdvancedComposition", "Moose::Cookbook::Snack::Keywords", "Moose::Cookbook::Snack::Types", "Moose::Cookbook::Style" ], "x_generated_by_perl" : "v5.35.5", "x_serialization_backend" : "Cpanel::JSON::XS version 4.27", "x_spdx_expression" : "Artistic-1.0-Perl OR GPL-1.0-or-later", "x_use_unsafe_inc" : 0 } Moose-2.2200/mop.c000640 000766 000024 00000016331 14137574636 014113 0ustar00etherstaff000000 000000 #include "mop.h" #include "ppport.h" void mop_call_xs (pTHX_ XSPROTO(subaddr), CV *cv, SV **mark) { dSP; PUSHMARK(mark); (*subaddr)(aTHX_ cv); PUTBACK; } #if PERL_VERSION_GE(5,10,0) UV mop_check_package_cache_flag (pTHX_ HV *stash) { assert(SvTYPE(stash) == SVt_PVHV); /* here we're trying to implement a c version of mro::get_pkg_gen($stash), * however the perl core doesn't make it easy for us. It doesn't provide an * api that just does what we want. * * However, we know that the information we want is, inside the core, * available using HvMROMETA(stash)->pkg_gen. Unfortunately, although the * HvMROMETA macro is public, it is implemented using Perl_mro_meta_init, * which is not public and only available inside the core, as the mro * interface as well as the structure returned by mro_meta_init isn't * considered to be stable yet. * * Perl_mro_meta_init isn't declared static, so we could just define it * ourselfs if perls headers don't do that for us, except that won't work * on platforms where symbols need to be explicitly exported when linking * shared libraries. * * So our, hopefully temporary, solution is to be even more evil and * basically reimplement HvMROMETA in a very fragile way that'll blow up * when the relevant parts of the mro implementation in core change. * * :-( * */ return HvAUX(stash)->xhv_mro_meta ? HvAUX(stash)->xhv_mro_meta->pkg_gen : 0; } #else /* pre 5.10.0 */ UV mop_check_package_cache_flag (pTHX_ HV *stash) { PERL_UNUSED_ARG(stash); assert(SvTYPE(stash) == SVt_PVHV); return PL_sub_generation; } #endif SV * mop_call0 (pTHX_ SV *const self, SV *const method) { dSP; SV *ret; PUSHMARK(SP); XPUSHs(self); PUTBACK; call_sv(method, G_SCALAR | G_METHOD); SPAGAIN; ret = POPs; PUTBACK; return ret; } int mop_get_code_info (SV *coderef, char **pkg, char **name) { if (!SvOK(coderef) || !SvROK(coderef) || SvTYPE(SvRV(coderef)) != SVt_PVCV) { return 0; } coderef = SvRV(coderef); /* sub is still being compiled */ if (!CvGV(coderef)) { return 0; } /* I think this only gets triggered with a mangled coderef, but if we hit it without the guard, we segfault. The slightly odd return value strikes me as an improvement (mst) */ if ( isGV_with_GP(CvGV(coderef)) ) { GV *gv = CvGV(coderef); HV *stash = GvSTASH(gv) ? GvSTASH(gv) : CvSTASH(coderef); *pkg = stash ? HvNAME(stash) : "__UNKNOWN__"; *name = GvNAME( CvGV(coderef) ); } else { *pkg = "__UNKNOWN__"; *name = "__ANON__"; } return 1; } /* XXX: eventually this should just use the implementation in Package::Stash */ void mop_get_package_symbols (HV *stash, type_filter_t filter, get_package_symbols_cb_t cb, void *ud) { HE *he; (void)hv_iterinit(stash); if (filter == TYPE_FILTER_NONE) { while ( (he = hv_iternext(stash)) ) { STRLEN keylen; const char *key = HePV(he, keylen); if (!cb(key, keylen, HeVAL(he), ud)) { return; } } return; } while ( (he = hv_iternext(stash)) ) { GV * const gv = (GV*)HeVAL(he); STRLEN keylen; const char * const key = HePV(he, keylen); SV *sv = NULL; if(isGV(gv)){ switch (filter) { case TYPE_FILTER_CODE: sv = (SV *)GvCVu(gv); break; case TYPE_FILTER_ARRAY: sv = (SV *)GvAV(gv); break; case TYPE_FILTER_IO: sv = (SV *)GvIO(gv); break; case TYPE_FILTER_HASH: sv = (SV *)GvHV(gv); break; case TYPE_FILTER_SCALAR: sv = (SV *)GvSV(gv); break; default: croak("Unknown type"); } } /* expand the gv into a real typeglob if it * contains stub functions or constants and we * were asked to return CODE references */ else if (filter == TYPE_FILTER_CODE) { gv_init(gv, stash, key, keylen, GV_ADDMULTI); sv = (SV *)GvCV(gv); } if (sv) { if (!cb(key, keylen, sv, ud)) { return; } } } } static bool collect_all_symbols (const char *key, STRLEN keylen, SV *val, void *ud) { HV *hash = (HV *)ud; if (!hv_store (hash, key, keylen, newRV_inc(val), 0)) { croak("failed to store symbol ref"); } return TRUE; } HV * mop_get_all_package_symbols (HV *stash, type_filter_t filter) { HV *ret = newHV (); mop_get_package_symbols (stash, filter, collect_all_symbols, ret); return ret; } #define DECLARE_KEY(name) { #name, #name, NULL, 0 } #define DECLARE_KEY_WITH_VALUE(name, value) { #name, value, NULL, 0 } /* the order of these has to match with those in mop.h */ static struct { const char *name; const char *value; SV *key; U32 hash; } prehashed_keys[key_last] = { DECLARE_KEY(_expected_method_class), DECLARE_KEY(ISA), DECLARE_KEY(VERSION), DECLARE_KEY(accessor), DECLARE_KEY(associated_class), DECLARE_KEY(associated_metaclass), DECLARE_KEY(associated_methods), DECLARE_KEY(attribute_metaclass), DECLARE_KEY(attributes), DECLARE_KEY(body), DECLARE_KEY(builder), DECLARE_KEY(clearer), DECLARE_KEY(constructor_class), DECLARE_KEY(constructor_name), DECLARE_KEY(definition_context), DECLARE_KEY(destructor_class), DECLARE_KEY(immutable_trait), DECLARE_KEY(init_arg), DECLARE_KEY(initializer), DECLARE_KEY(insertion_order), DECLARE_KEY(instance_metaclass), DECLARE_KEY(is_inline), DECLARE_KEY(method_metaclass), DECLARE_KEY(methods), DECLARE_KEY(name), DECLARE_KEY(package), DECLARE_KEY(package_name), DECLARE_KEY(predicate), DECLARE_KEY(reader), DECLARE_KEY(wrapped_method_metaclass), DECLARE_KEY(writer), DECLARE_KEY_WITH_VALUE(package_cache_flag, "_package_cache_flag"), DECLARE_KEY_WITH_VALUE(_version, "-version"), DECLARE_KEY(operator) }; SV * mop_prehashed_key_for (mop_prehashed_key_t key) { return prehashed_keys[key].key; } U32 mop_prehashed_hash_for (mop_prehashed_key_t key) { return prehashed_keys[key].hash; } void mop_prehash_keys () { int i; for (i = 0; i < key_last; i++) { const char *value = prehashed_keys[i].value; prehashed_keys[i].key = newSVpv(value, strlen(value)); PERL_HASH(prehashed_keys[i].hash, value, strlen(value)); } } XS_EXTERNAL(mop_xs_simple_reader) { dVAR; dXSARGS; register HE *he; mop_prehashed_key_t key = (mop_prehashed_key_t)CvXSUBANY(cv).any_i32; SV *self; if (items != 1) { croak("expected exactly one argument"); } self = ST(0); if (!SvROK(self)) { croak("can't call %s as a class method", prehashed_keys[key].name); } if (SvTYPE(SvRV(self)) != SVt_PVHV) { croak("object is not a hashref"); } if ((he = hv_fetch_ent((HV *)SvRV(self), prehashed_keys[key].key, 0, prehashed_keys[key].hash))) { ST(0) = HeVAL(he); } else { ST(0) = &PL_sv_undef; } XSRETURN(1); } Moose-2.2200/dist.ini000640 000766 000024 00000041165 14137574636 014623 0ustar00etherstaff000000 000000 name = Moose author = Stevan Little author = Dave Rolsky author = Jesse Luehrs author = Shawn M Moore author = יובל קוג'מן (Yuval Kogman) author = Karen Etheridge author = Florian Ragwitz author = Hans Dieter Pearcey author = Chris Prather author = Matt S Trout license = Perl_5 copyright_holder = Infinity Interactive, Inc. copyright_year = 2006 ; $VERSION will be extracted from lib/Moose.pm, ; or override it with $ENV{V} ; authordep Config::MVP = 2.200011 [EnsurePrereqsInstalled] :version = 0.003 build_phase = release ; be nice to travis type = requires type = recommends [Git::GatherDir] exclude_match = ^t/recipes/(?!basics_genome_overloadingsubtypesandcoercion) exclude_filename = Makefile.PL exclude_filename = LICENSE exclude_filename = CONTRIBUTING.pod exclude_filename = ppport.h ; authordep Devel::PPPort = 3.62 [PPPort] version = 3.62 [MetaYAML] [MetaJSON] [License] [ExecDir] ; bin/moose-outdated ;[lib] ;lib = inc ; authordep Dist::Zilla::Plugin::MakeMaker::Awesome [=inc::MakeMaker] default_jobs = 9 ; authordep ExtUtils::HasCompiler = 0.022 [ModuleIncluder] :version = 0.007 module = ExtUtils::HasCompiler background_perl = 5.008003 [Manifest] [MetaConfig] [=inc::SimpleAuthority] [MetaResources] bugtracker.web = https://rt.cpan.org/Dist/Display.html?Name=Moose bugtracker.mailto = bug-Moose@rt.cpan.org homepage = http://moose.perl.org/ repository.url = git://github.com/moose/Moose.git repository.web = https://github.com/moose/Moose repository.type = git x_IRC = irc://irc.perl.org/#moose x_MailingList = http://lists.perl.org/list/moose.html [UseUnsafeInc] dot_in_INC = 0 [=inc::Documentation] module = Moose::Manual module = Moose::Manual::Attributes module = Moose::Manual::BestPractices module = Moose::Manual::Classes module = Moose::Manual::Concepts module = Moose::Manual::Construction module = Moose::Manual::Contributing module = Moose::Manual::Delegation module = Moose::Manual::Delta module = Moose::Manual::Exceptions module = Moose::Manual::FAQ module = Moose::Manual::MOP module = Moose::Manual::MethodModifiers module = Moose::Manual::MooseX module = Moose::Manual::Resources module = Moose::Manual::Roles module = Moose::Manual::Support module = Moose::Manual::Types module = Moose::Manual::Unsweetened module = Moose::Cookbook module = Moose::Cookbook::Basics::BankAccount_MethodModifiersAndSubclassing module = Moose::Cookbook::Basics::BinaryTree_AttributeFeatures module = Moose::Cookbook::Basics::BinaryTree_BuilderAndLazyBuild module = Moose::Cookbook::Basics::Company_Subtypes module = Moose::Cookbook::Basics::DateTime_ExtendingNonMooseParent module = Moose::Cookbook::Basics::Document_AugmentAndInner module = Moose::Cookbook::Basics::Genome_OverloadingSubtypesAndCoercion module = Moose::Cookbook::Basics::HTTP_SubtypesAndCoercion module = Moose::Cookbook::Basics::Immutable module = Moose::Cookbook::Basics::Person_BUILDARGSAndBUILD module = Moose::Cookbook::Basics::Point_AttributesAndSubclassing module = Moose::Cookbook::Extending::Debugging_BaseClassRole module = Moose::Cookbook::Extending::ExtensionOverview module = Moose::Cookbook::Extending::Mooseish_MooseSugar module = Moose::Cookbook::Legacy::Debugging_BaseClassReplacement module = Moose::Cookbook::Legacy::Labeled_AttributeMetaclass module = Moose::Cookbook::Legacy::Table_ClassMetaclass module = Moose::Cookbook::Meta::GlobRef_InstanceMetaclass module = Moose::Cookbook::Meta::Labeled_AttributeTrait module = Moose::Cookbook::Meta::PrivateOrPublic_MethodMetaclass module = Moose::Cookbook::Meta::Table_MetaclassTrait module = Moose::Cookbook::Meta::WhyMeta module = Moose::Cookbook::Roles::ApplicationToInstance module = Moose::Cookbook::Roles::Comparable_CodeReuse module = Moose::Cookbook::Roles::Restartable_AdvancedComposition module = Moose::Cookbook::Snack::Keywords module = Moose::Cookbook::Snack::Types module = Moose::Cookbook::Style [FileFinder::ByName / PodModules] dir = lib file = *.pod [FileFinder::Filter / ModulesSansPod] finder = :InstallModules skip = \.pod$ [FileFinder::Filter / VersionedModules] finder = :InstallModules skip = \.pod$ skip = ^lib/Moose/Conflicts.pm$ [=inc::SimpleProvides] finder = PodModules [MetaProvides::Package] meta_noindex = 1 :version = 1.15000002 finder = ModulesSansPod ; to avoid "No namespaces detected in file..." spewage [MetaNoIndex] directory = author directory = benchmarks directory = doc directory = inc [Git::Contributors] :version = 0.019 order_by = commits ; authordep Pod::Weaver::Section::AllowOverride [SurgicalPodWeaver] :version = 0.0023 replacer = replace_with_comment post_code_replacer = replace_with_nothing [RewriteVersion] finder = VersionedModules [Git::Describe] :version = 0.004 on_package_line = 1 ; authordep Test::Inline ; authordep File::Find::Rule ; authordep Test::Inline::Extract [=inc::ExtractInlineTests] [PromptIfStale] phase = release check_all_prereqs = 1 check_all_plugins = 1 [Test::EOL] :version = 0.14 [PodSyntaxTests] [Test::NoTabs] [MetaTests] [Test::Kwalitee] skiptest = use_strict ; temporary, until RT#94468 is fixed [MojibakeTests] [RunExtraTests] default_jobs = 9 [Test::ReportPrereqs] :version = 0.022 version_extractor = Module::Metadata verify_prereqs = 1 include = Algorithm::C3 include = DBM::Deep include = DateTime include = DateTime::Calendar::Mayan include = DateTime::Format::MySQL include = Declare::Constraints::Simple include = Dist::CheckConflicts include = DynaLoader include = HTTP::Headers include = IO::File include = Locale::US include = Module::Refresh include = MooseX::NonMoose include = Params::Coerce include = Regexp::Common include = SUPER include = Test::Deep include = Test::DependentModules include = Test::LeakTrace include = Test::Output include = URI include = YAML include = autodie [Test::CPAN::Changes] [Test::Compile] :version = 2.037 phase = develop filename = xt/release/00-compile.t bail_out_on_fail = 1 ; this serves as a TODO list for getting all modules to load independently -- ; see RT#89536 skip = ^Class::MOP::Attribute$ skip = ^Class::MOP::Class$ skip = ^Class::MOP::Method::Accessor$ skip = ^Class::MOP::Method::Constructor$ skip = ^Class::MOP::Method::Inlined$ skip = ^Class::MOP::Method::Wrapped$ skip = ^Class::MOP::Mixin::HasAttributes$ skip = ^Class::MOP::Module$ skip = ^Class::MOP::Package$ skip = ^Moose::Meta::Attribute$ skip = ^Moose::Meta::Attribute::Native$ skip = ^Moose::Meta::Mixin::AttributeCore$ skip = ^Moose::Meta::Role::Attribute$ skip = ^Moose::Meta::TypeConstraint::Class$ skip = ^Moose::Meta::TypeConstraint::DuckType$ skip = ^Moose::Meta::TypeConstraint::Enum$ skip = ^Moose::Meta::TypeConstraint::Parameterizable$ skip = ^Moose::Meta::TypeConstraint::Parameterized$ skip = ^Moose::Meta::TypeConstraint::Role$ skip = ^Moose::Meta::TypeConstraint::Union$ [=inc::CheckReleaseType] [CheckVersionIncrement] ; we would like to have this, but currently there are false negatives: ; https://rt.cpan.org/Ticket/Display.html?id=87883 ; https://rt.cpan.org/Ticket/Display.html?id=87884 ;[Test::MinimumVersion] ;:version = 2.000003 ;max_target_perl = 5.008003 [Test::ChangesHasContent] [Substitute] file = xt/release/changes_has_content.t code = s{^(note 'Checking Changes')}{if \(\(\$ENV\{TRAVIS_PULL_REQUEST\} \|\| '') eq 'false'\) \{\n chomp\(my \$branch_name = \(\$ENV\{TRAVIS_BRANCH\} || \`git rev-parse --abbrev-ref HEAD\`\)\);\n \$TODO = 'Changes need not have content for this release yet if this is only the master branch'\n if \(\$branch_name \|\| ''\) eq 'master';\n\}\n\n$1} ;[CheckPrereqsIndexed] ; all runtime deps must be author deps [Prereqs] Carp = 1.22 ;authordep Carp = 1.22 Class::Load = 0.09 ;authordep Class::Load = 0.09 Class::Load::XS = 0.01 ;authordep Class::Load::XS = 0.01 Data::OptList = 0.107 ;authordep Data::OptList = 0.107 Devel::GlobalDestruction = 0 ;authordep Devel::GlobalDestruction = 0 Devel::OverloadInfo = 0.005 ;authordep Devel::OverloadInfo = 0.005 Devel::StackTrace = 2.03 ;authordep Devel::StackTrace = 2.03 Eval::Closure = 0.04 ;authordep Eval::Closure = 0.04 List::Util = 1.56 ;authordep List::Util = 1.56 MRO::Compat = 0.05 ;authordep MRO::Compat = 0.05 Module::Runtime = 0.014 ;authordep Module::Runtime = 0.014 Module::Runtime::Conflicts = 0.002 ;authordep Module::Runtime::Conflicts = 0.002 Package::DeprecationManager = 0.11 ;authordep Package::DeprecationManager = 0.11 Package::Stash = 0.32 ;authordep Package::Stash = 0.32 Package::Stash::XS = 0.24 ;authordep Package::Stash::XS = 0.24 Params::Util = 1.00 ;authordep Params::Util = 1.00 Scalar::Util = 1.19 ;authordep Scalar::Util = 1.19 Sub::Exporter = 0.980 ;authordep Sub::Exporter = 0.980 Sub::Name = 0.20 ;authordep Sub::Name = 0.20 Sub::Util = 1.40 ;authordep Sub::Util = 1.40 Try::Tiny = 0.17 ;authordep Try::Tiny = 0.17 parent = 0.223 ;authordep parent = 0.223 perl = 5.008003 ;authordep perl = 5.008003 strict = 1.03 ;authordep strict = 1.03 warnings = 1.03 ;authordep warnings = 1.03 [Prereqs / TestRequires] Test::CleanNamespaces = 0.13 Test::Fatal = 0.001 Test::More = 0.96 Test::Requires = 0.05 ; all configure deps must be author deps [Prereqs / ConfigureRequires] perl = 5.008003 ;Config = 0 ; not actually in 02packages.details.txt!!! [Prereqs::AuthorDeps] relation = suggests exclude = CheckAuthorDeps exclude = CheckDelta exclude = CheckReleaseType exclude = Clean exclude = Documentation exclude = ExtractInlineTests exclude = GenerateDocs exclude = GitUpToDate exclude = MMHelper exclude = MakeMaker exclude = MyInline exclude = SimpleAuthority exclude = SimpleProvides exclude = TestRelease ; mostly, these are things needed by xt tests [Prereqs / DevelopRequires] Algorithm::C3 = 0 Class::Load = 0.07 DBM::Deep = 1.003 Data::Visitor = 0.26 DateTime = 0 DateTime::Calendar::Mayan = 0 DateTime::Format::MySQL = 0 Declare::Constraints::Simple = 0 ExtUtils::MakeMaker::Dist::Zilla::Develop = 0 File::Find::Rule = 0 HTTP::Headers = 0 IO::File = 0 Locale::US = 0 Module::CPANTS::Analyse = 0.92 Module::Refresh = 0 Moo = 0 MooseX::MarkAsMethods = 0 MooseX::NonMoose = 0 PadWalker = 0 Params::Coerce = 0 Regexp::Common = 0 SUPER = 1.10 Specio = 0.10 Test::Deep = 0 ;Test::DependentModules = 0.13 ; bad dep chain, used by a disabled test. Test::Inline = 0 Test::Kwalitee = 1.15 Test::LeakTrace = 0 Test::Memory::Cycle = 0 Test::Output = 0 Test::Pod::Coverage = 1.04 Test::Spelling = 0 Test::Warnings = 0.016 Types::Standard = 0 URI = 0 blib = 0 [Prereqs / RuntimeRecommends] Data::OptList = 0.110 ; faster https://github.com/rjbs/Data-OptList/pull/1 [Prereqs / RuntimeSuggests] ; this needs to be installed *after*, since it deps on Moose ; remove this if this is an issue Devel::PartialDump = 0.14 [Conflicts] :version = 0.19 -script = bin/moose-outdated Catalyst = 5.90049999 Config::MVP = 2.200004 Devel::REPL = 1.003020 Dist::Zilla = 5.043 Dist::Zilla::Plugin::Git = 2.016 Fey = 0.36 Fey::ORM = 0.42 File::ChangeNotify = 0.15 HTTP::Throwable = 0.017 KiokuDB = 0.51 Markdent = 0.16 Mason = 2.18 Moose::Autobox = 0.15 MooseX::ABC = 0.05 MooseX::Aliases = 0.08 MooseX::AlwaysCoerce = 0.13 MooseX::App = 1.22 MooseX::Attribute::Deflator = 2.1.7 MooseX::Attribute::Dependent = 1.1.3 MooseX::Attribute::Prototype = 0.10 MooseX::AttributeHelpers = 0.22 MooseX::AttributeIndexes = 1.0.0 MooseX::AttributeInflate = 0.02 MooseX::CascadeClearing = 0.03 MooseX::ClassAttribute = 0.26 MooseX::Constructor::AllErrors = 0.021 MooseX::Declare = 0.35 MooseX::FollowPBP = 0.02 MooseX::Getopt = 0.56 MooseX::InstanceTracking = 0.04 MooseX::LazyRequire = 0.06 MooseX::Meta::Attribute::Index = 0.04 MooseX::Meta::Attribute::Lvalue = 0.05 MooseX::Method::Signatures = 0.44 MooseX::MethodAttributes = 0.22 MooseX::NonMoose = 0.24 MooseX::Object::Pluggable = 0.0011 MooseX::POE = 0.214 ; MooseX::Params = 0.010 waiting for https://github.com/pshangov/moosex-params/pull/2 MooseX::Params::Validate = 0.05 MooseX::PrivateSetters = 0.03 MooseX::Role::Cmd = 0.06 MooseX::Role::Parameterized = 1.00 MooseX::Role::WithOverloading = 0.14 MooseX::Runnable = 0.03 MooseX::Scaffold = 0.05 MooseX::SemiAffordanceAccessor = 0.05 MooseX::SetOnce = 0.100473 MooseX::Singleton = 0.25 MooseX::SlurpyConstructor = 1.1 MooseX::Storage = 0.42 MooseX::StrictConstructor = 0.12 MooseX::Traits = 0.11 MooseX::Types = 0.19 MooseX::Types::Parameterizable = 0.05 MooseX::Types::Set::Object = 0.03 MooseX::Types::Signal = 1.101930 MooseX::UndefTolerant = 0.11 Net::Twitter = 4.01041 PRANG = 0.14 Pod::Elemental = 0.093280 Pod::Weaver = 3.101638 Reaction = 0.002003 Test::Able = 0.10 Test::CleanNamespaces = 0.03 Test::Moose::More = 0.022 Test::TempDir = 0.05 Throwable = 0.102080 namespace::autoclean = 0.08 [Test::CheckBreaks] :version = 0.017 conflicts_module = Moose::Conflicts conflicts_module = Module::Runtime::Conflicts ; authordep Dist::Zilla::Util::AuthorDeps = 5.021 ; authordep CPAN::Meta::Requirements ; authordep Test::Deep [=inc::CheckAuthorDeps] [=inc::CheckDelta] [=inc::GitUpToDate] [Git::Remote::Check] branch = stable/2.22 remote_branch = stable/2.22 [Git::CheckFor::CorrectBranch] release_branch = stable/2.22 [Git::Check] allow_dirty = [TestRelease] [UploadToCPAN] [CopyFilesFromRelease / CopyChanges] filename = Changes [CopyFilesFromRelease] filename = LICENSE filename = ppport.h [Regenerate::AfterReleasers] plugin = CopyFilesFromRelease [ReadmeAnyFromPod] :version = 0.142180 phase = release type = pod location = root source_filename = lib/Moose/Manual/Contributing.pod filename = CONTRIBUTING.pod [Git::Commit / release snapshot] allow_dirty = Changes allow_dirty = LICENSE allow_dirty = CONTRIBUTING.pod allow_dirty = ppport.h commit_msg = %N-%v%t%n%n%c [Git::Tag] tag_format = %v tag_message = %v%t [BumpVersionAfterRelease] finder = VersionedModules [NextRelease] :version = 5.033 time_zone = UTC format = %-7v %{yyyy-MM-dd}d%{ (TRIAL RELEASE)}T [Git::Commit / increment version] allow_dirty = Changes allow_dirty_match = ^lib/.*\.pm$ commit_msg = increment $VERSION after %v release [Git::Push] ; note: this is going to die if releasing from an older release branch (the ; merge won't go in cleanly) [Run::AfterRelease] :version = 0.030 fatal_errors = 0 run = git checkout master run = git merge --ff-only --quiet stable/2.22 run = git push ; authordep IPC::System::Simple ; authordep File::pushd ; authordep Path::Tiny ; authordep autodie ; authordep Module::Runtime [=inc::GenerateDocs] [=inc::Clean] ; last, so all before-release checks can occur first before prompting [ConfirmRelease] Moose-2.2200/Changes.Class-MOP000600 000766 000024 00000173100 14137574636 016136 0ustar00etherstaff000000 000000 After 1.12, Class::MOP was merged into the Moose distribution, and is no longer released separately. 1.12 Mon, Jan 3, 2011 * Remove usage of undocumented Package::Stash APIs from the tests. This prevents the tests from failing on Package::Stash >= 0.18. 1.11 Sun, Oct 31, 2010 [ENHANCEMENTS] * Replace use of Test::Exception with Test::Fatal. (Karen Etheridge and Dave Rolsky) 1.10 Mon, Oct 18, 2010 [BUG FIXES] * Lots of fixes for edge cases with anon classes. (doy) 1.09 Tue, Oct 5, 2010 [ENHANCEMENTS] * It's now possible to tell Class::MOP::Class->create and the metaclass pragma to not install a 'meta' method into classes they manipulate, or to install one under a different name. (doy) * Reinitializing a metaclass no longer removes the existing method and attribute objects (it instead fixes them so they are correct for the reinitialized metaclass). (doy) * All 'meta' methods created by Class::MOP are now of the class Class::MOP::Method::Meta. This is overridable at the metaclass layer. (doy) [OTHER] * Use get_or_add_package_symbol when we intend for it to autovivify, in preparation for changes in Package::Stash. (doy) * We now use Module::Install::AuthorRequires to force authors to run all tests, just like we do for Moose. (sartak) 1.08 Mon, Sep 13, 2010 [BUG FIXES] * The get_method_list and _get_local_methods methods blew up in the face of subroutine stubs. (Goro Fuji) 1.07 Tue, Aug 25, 2010 [BUG FIXES] * Fix a mysterious error reported by Piers Cawley. The error showed up as "Can't use an undefined value as a symbol reference at /usr/local/lib/perl/5.10.1/Class/MOP/Mixin/HasMethods.pm line 167." (Dave Rolsky) 1.06 Sun, Aug 23, 2010 [BUG FIXES] * Version 1.05 no longer reported constants as methods, except with Perl 5.8.x, and doing so in 5.8.x caused test failures. Constants are now _expected_ to be reported as methods, and we explicitly test this. (Dave Rolsky) 1.05 Sun, Aug 22, 2010 [ENHANCEMENTS] * Refactorings and improvements to how defaults are handled, particularly for inlined code (doy). * Optimizations that should help speed up compilation time (Dave Rolsky). 1.04 Tue, Jul 25, 2010 [ENHANCEMENTS] * Class::MOP::Deprecated now uses Package::DeprecationManager internally. Deprecation warnings are now only issued once for each calling package, which cuts down on noise. When importing Class::MOP::Deprecated, the request API version should now be passed in the "-api_version" flag. However, the old "-compatible" flag will continue to work. (Dave Rolsky) 1.03 Sat, Jun 5, 2010 [ENHANCEMENTS] * Make CMOP::Package a thin wrapper around Package::Stash (doy). 1.02 Thu, May 20, 2010 [API CHANGES] * Packages and modules no longer have methods - this functionality was moved back up into Class::MOP::Class (doy). [ENHANCEMENTS] * Metaclass incompatibility checking now checks all metaclass types. (doy) * Class::MOP can now do simple metaclass incompatibility fixing: if your class's metaclass is a subclass of your parent class's metaclass, it will just use the parent class's metaclass directly. (doy) 1.01 Thu, May 6, 2010 [NEW FEATURES] * is_class_loaded, load_class and load_first_existing_class now allow specifying a minimum required version (Florian Ragwitz). [BUG FIXES] * The __INSTANCE__ parameter to Class::MOP::Class::new_object now enforces that the passed in reference is blessed into the correct class (by dying if it's not) (doy, jhallock). 1.00 Thu, Mar 25, 2010 [GRRR< FUCKING STEVAN@] * Re-release 0.99 as 1.00. 0.99 Thu, Mar 25, 2010 [DOCUMENTATION] * Fix typo in Class::MOP::Attribute (Franck Cuny). 0.98 Mon, Jan 18, 2010 [ENHANCEMENTS] * Added Class::MOP::Class->rebless_instance_back, which does the inverse of rebless_instance (doy, rafl). 0.97_01 Mon, Jan 4, 2010 [ENHANCEMENTS] * Internal refactorings to move shared behavior into new "mixin" classes. This made adding some new features to Moose much easier. (Dave Rolsky) 0.97 Fri, Dec 18, 2009 * No code changes, just packaging fixes to make this distro installable. 0.96 Fri, Dec 18, 2009 * tests - Fixed t/082_get_code_info.t so it passes with bleadperl. (Dave Rolsky) - Add XS & C files to no tabs check (Dave Rolsky) - Convert all tests to done_testing. (Florian Ragwitz) 0.95 Wed, Nov 19, 2009 * Class::MOP - Make is_class_loaded without any arguments fail loudly (Florian Ragwitz). - Make load_class throw more standard error messages when loading single modules (nothingmuch). * Class::MOP::Package - Stop add_method from behaving differently under the debugger (Florian Ragwitz). * Class::MOP::Class * Class::MOP::Package - Any method which takes a method name as an argument now allows names which are false (like "0"), but the name must be defined and not be an empty string. (Dave Rolsky) * Class::MOP::Class - Deprecated get_attribute_map as a public method. You can use a combination of get_attribute_list and get_attribute instead. (Dave Rolsky) 0.94 Tue, Sep 22, 2009 * Class::MOP::Attribute - Introduce set_raw_value and get_raw_value, side effect free variants of {get,set}_value. These don't do anything useful in Class::MOP but have different behavior that set_value and get_value for Moose attributes. (nothingmuch) 0.93 Tue, Sep 15, 2009 * Class::MOP - The load_class function just returns true, since its return value was confusing (either a metaclass object or a class name). It either loads a class or dies trying. In the future, this may change to not return anything, since there's no point in checking its return value. Addresses RT #45883. (Dave Rolsky) * Class::MOP::Class::Trait::Immutable - When throwing an error because of an immutable method, include that method's name. Addresses RT #49680. (Shawn M Moore) * Class::MOP::Package - Adding the same sub reference to multiple packages failed to update the method map properly. RT #48985. Reported by Paul Mooney. (Dave Rolsky) - The get_method_map method is now private (and called as _full_method_map or _method_map). The public version is available as a deprecated method. (Dave Rolsky) 0.92_01 Thu, Sep 10, 2009 * Class::MOP::Package - Backwards compatibility tweaks to XS for 5.8.1. (Goro Fuji) * Class::MOP - Make sure XS code handles magical scalars correctly. (Goro Fuji) * Class::MOP::Class - Documented the immutable_options method, which is useful if you need to make a class mutable temporarily, and then nede to restore immutability. (Dave Rolsky) * Many modules - Deprecated features have been moved to their own module, Class::MOP::Deprecated, for easier deprecation management. (Goro Fuji) 0.92 Thu Aug 13, 2009 * Class::MOP::Class * Class::MOP::Package - Move get_method_map and its various scaffolding into Package. (hdp) * Class::MOP::Method - Allow Class::MOP::Method->wrap to take a Class::MOP::Method object as the first argument, rather than just a coderef. (doy) * Class::MOP::Attribute * Class::MOP::Class - Allow attribute names to be false (while still requiring them to be defined). (rafl) 0.91 Wed Jul 29, 2009 * Class::MOP::Method::Wrapped - Fixing variable usage issues with the patch from previous version, not properly using lexicals in the for loops. (stevan) 0.90 Tue Jul 21, 2009 Japan Perl Association has sponsored Goro Fuji to improve startup performance of Class::MOP and Moose. These enhancements may break backwards compatibility if you're doing (or using) complex metaprogramming, so, as always, test your code! http://blog.perlassociation.org/2009/07/jpa-sponsors-moose-class-mop-work.html * Class::MOP::Class * XS - Anonymous classes were not completely destroyed when they went out of scope, leading to a memory leak. RT #47480. (Goro Fuji). * Class::MOP::Class - The get_method, has_method, and add_method methods no longer use get_method_map. Method objects are instantiated lazily. This significantly improves Class::MOP's load time. (Goro Fuji) * All classes - Inline fewer metaclass-level constructors since the ones we have are perfectly fine. This reduces the number of string evals. (Goro Fuji) * Class::MOP::Method::Wrapped - If a method modifier set $_, this caused the modifier to blow up, because of some weird internals. (Jeremy Stashewsky) 0.89 Fri Jul 3, 2009 * Class::MOP::Class * Class::MOP::Class::Immutable::Trait - Made the Trait act like a role with a bunch of "around" modifiers, rather than sticking it in the inheritance hierarchy. This fixes various problems that caused with metaclass compatibility, which broke Fey::ORM. * Class::MOP::Method - Allow a blessed code reference as the method body. Fixes a problem interaction with MooseX::Types. (ash) * Class::MOP::Instance - add inline version of rebless_instance_structure. (doy) - change inline_slot_access to use single quotes (gphat) 0.88 Tue, Jun 23, 2009 * Class::MOP::Class - Moved the __INSTANCE__ parameter to _construct_instance from Moose to here. (doy) - Fixed some issues involving metaclasses of metaclasses and immutability. (doy) 0.87 Sun, Jun 21, 2009 * Various - Made sure to always local-ize $@ and $SIG{__DIE__} before calling an eval. Fixes RT #45973. * Class::MOP::Class - Synced docs about immutability with the current reality (which changed back in 0.82_01) - Removed the immutable_transformer method, which had been returning undef since 0.82_01 anyway. * Tests - Got rid of tests which needed Moose and improved testing of constructor/destructor inlining warnings. Fixes RT #47119. 0.86 Tue, Jun 16, 2009 * Class::MOP::Class - If you redefined a subroutine at runtime and then wrapped it with a method modifier, the modifier could in some cases wrap the original version of the subroutine. Fixes RT #46957. * Class::MOP::Class - make_immutable issues a warning instead of overriding an existing DESTROY method (Dylan William Hardison). Fixes RT #46854. 0.85 Sat, Jun 6, 2009 * Class::MOP::Attribute - Allow default values to be Class::MOP::Methods. (Florian Ragwitz) - Test the above. (Rhesa Rozendaal) - Tweak original commit so the intent matches the accepted behavior (Nicholas Perez) * Class::MOP - Localize $SIG{__DIE__} inside _try_load_one_class (Sartak) * Class::MOP::Class - Add direct_subclasses method (Sartak) - Tests for subclasses and direct_subclasses (Sartak) - subname is no longer used unconditionally in add_method, but only if the code reference's name is '__ANON__' (nothingmuch) - Add a hook for _superclasses_updated (Sartak) * Class::MOP::Method - Remove long, old warning about possibly outdated modules (Sartak) 0.84 Tue, May 12, 2009 * Makefile.PL - Depend on Text::Exception 0.27 to avoid failing tests ond old versions (rafl) * Class::MOP - Made is_class_loaded a little stricter. It was reporting that a class was loaded if it merely had an @ISA variable in its stash. Now it checks that the @ISA var has elements in it. - Deprecate in_global_destruction and subname re-exporting (perigrin & Sartak) * Class::MOP::Class - Explicitly use Devel::GlobalDestruction and Sub::Name (perigrin) * Class::MOP::Package - Disable prototype mismatch warnings for add_package_symbol. (Florian Ragwitz) * Tests - Add test for finding methods from $meta->name->meta before immutable, (t0m) 0.83 Mon, April 27, 2009 * Class::MOP::Class - Fix segfault when calling get_method_map on a metaclass for an empty package (doy) 0.82_02 Fri, April 24, 2009 * Class::MOP::Method::Inlined - Don't inline if the expected method is not defined at all (happens with e.g. Moose::Object::_new is the expected method due to an overridden name) * Tests - Some tests were trying to load Class::MOP::Immutable, which was removed in 0.82_01. 0.82_01 Thu, April 23, 2009 * Class::MOP::Immutable (and others) - Refactor the immutability system to use a pre-defined class for the immutable metaclass of Class::MOP::Class::Immutable::$class - Rather than generating methods into this class every time, use a Trait (basic mixin) to supply the cached methods - Remove the hack that returns the mutable metaclass for metacircularity in order to provide consistent meta-metaclasses for the Moose compatibility handling code (mst broke it, nothingmuch fixed it) 0.82 Mon, April 20, 2009 * Various - The deprecation wrappers for some renamed methods were not passing arguments to the new method. (nothingmuch) * Class::MOP::Immutable - Warn during immutablization if the local class provides its own constructor, to parallel the warning in Moose when a superclass provides its own constructor (doy) 0.81 Tue, April 7, 2009 * Class::MOP * Class::MOP::Class * Class::MOP::Instance * Class::MOP::Attribute * Class::MOP::Method::Accessor * Class::MOP::Method::Constructor - Include stack traces in the deprecation warnings introduced in 0.80_01. (Florian Ragwitz) * MOP.xs - Avoid c compiler warnings by declaring some unused function arguments. (Florian Ragwitz) 0.80_01 Sun, April 5, 2009 * Makefile.PL - Make sure to preserve any compiler flags already defined in Config.pm. Patch by Vincent Pit. RT #44739. * Many methods have been renamed with a leading underscore, and a few have been deprecated entirely. The methods with a leading underscore are considered "internals only". People writing subclasses or extensions to Class::MOP should feel free to override them, but they are not for "public" use. - Class::MOP::Class - construct_class_instance => _construct_class_instance (use new_object) - construct_instance => _construct_instance (use new_object) - check_metaclass_compatibility => _check_metaclass_compatibility - create_meta_instance => _create_meta_instance (use get_meta_instance) - clone_instance => _clone_instance (use clone_object) - compute_all_applicable_methods is deprecated, use get_all_methods - compute_all_applicable_attributes is deprecated, use get_all_attributes - Class::MOP::Instance - bless_instance_structure is deprecated and will be removed in a future release - Class::MOP::Module - create has been renamed to _instantiate_module. This method does not construct an object, it evals some code that creates the relevant package in Perl's symbol table. - Class::MOP::Method::Accessor - initialize_body => _initialize_body (this is always called when an object is constructed) - /(generate_.*_method(?:_inline)?)/ => '_' . $1 - Class::MOP::Method::Constructor - initialize_body => _initialize_body (this is always called when an object is constructed) - /(generate_constructor_method(?:_inline)?)/ => '_' . $1 - attributes => _attributes - meta_instance => _meta_instance 0.80 Wed, April 1, 2009 * Class::MOP::* - Call user_class->meta in fewer places, with the eventual goal of allowing the user to rename or exclude ->meta altogether. Instead uses Class::MOP::class_of. (Sartak) * Class::MOP - New class_of function that should be used to retrieve a metaclass. This is unlike get_metaclass_by_name in that it accepts instances, not just class names. (Sartak) * Class::MOP - load_first_existing_class didn't actually load the first existing class; instead, it loaded the first existing and compiling class. It now throws an error if a class exists (in @INC) but fails to compile. (hdp) * Class::MOP * Class::MOP::Class - we had some semi-buggy code that purported to provide a HAS_ISAREV based on whether mro had get_isarev (due to an oversight, it always returned 1). Since mro and MRO::Compat have always had get_isarev, HAS_ISAREV was pointless. This insight simplified the subclasses method by deleting the pure-perl fallback. HAS_ISAREV is now deprecated. (Sartak) 0.79 Fri, March 29, 2009 * No changes from 0.78_02. 0.78_02 Thu, March 26, 2009 * Class::MOP::Class * Class::MOP::Immutable - A big backwards-incompatible refactoring of the Immutable API, and the make_immutable/make_mutable pieces of the Class API. The core __PACKAGE__->meta->make_immutable API remains the same, however, so this should only affect the most guts-digging code. * XS code - The XS code used a macro, XSPROTO, that's only in 5.10.x. This has been fixed to be backwards compatible with 5.8.x. * Class::MOP::Class - Add a hook for rebless_instance_away (Sartak) - Use blessed instead of ref to get an instance's class name in rebless_instance. (Sartak) 0.78_01 Wed, March 18, 2009 * Class::MOP::* - Revised and reorganized all of the API documentation. All classes now have (more or less) complete API documentation. * Class::MOP::Class * Class::MOP::Instance - Reblessing into a package that supports overloading wasn't properly adding overload magic to the object due to a bug in (at least) 5.8.8. We now use $_[1] directly which seems to set the magic properly. (Sartak) * Class::MOP::Attribute - The process_accessors method is now private. A public alias exists (and will stick around for a few releases), but it warns that calling the public method is deprecated. * Class::MOP::Method::Generated - Removed the new and _new methods, since this is an abstract base class, and all existing subclasses implement their own constructors. * MOP.xs - Stop is_class_loaded from thinking a class is loaded if it only has an empty GV (Florian Ragwitz). - Add a test for this (Yappo). - Refactor get_all_package_symbols to allow short-circuiting (Florian Ragwitz). - Use this in is_class_loaded (Florian Ragwitz). - Stop segfaulting when trying to get the name from a sub that's still being compiled (Florian Ragwitz). - Add tests for this (Florian Ragwitz). - Prefix all public symbols with "mop_" (Florian Ragwitz). - Clean up and simplify prehashing of hash keys (Florian Ragwitz). - Simplify creating simple xs reader methods (Florian Ragwitz). - Make everything compile with c++ compilers (Florian Ragwitz). - Upgrade ppport.h from 3.14 to 3.17 (Florian Ragwitz). * Tests - Remove optional test plans for tests depending on Sub::Name as we have a hard dependency on Sub::Name anyway (Florian Ragwitz). * Makefile.PL - Rebuild all c code if mop.h has changed (Florian Ragwitz) 0.78 Mon, February 23, 2009 * No changes from 0.77_01 0.77_01 Sun, February 22, 2009 * Everything - This package now requires its XS components. Not using Sub::Name lead to different behavior and bugginess in the pure Perl version of the code. A Moose test would fail when run against the pure Perl version of this code. * Class::MOP::Instance - The inline_* methods now quote attribute names themselves, and don't expect to receive a quoted value. 0.77 Sat, February 14, 2009 * MOP.xs - Avoid assertion errors on debugging perls in is_class_loaded (Florian Ragwitz) * Class::MOP - Fixed various corner cases where is_class_loaded incorrectly returned true for a class that wasn't really loaded. (Dave Rolsky) * Class::MOP::Class - Add get_all_method_names (Sartak) - Add a wrapped_method_metaclass attribute (Florian Ragwitz) * Class::MOP::Package - Disable deprecated get_all_package_symbols in list context. (Florian Ragwitz) * Makefile.PL - Make sure we generate a BSD-compatible Makefile (Florian Ragwitz) * Class::MOP::Class - The misspelled "check_metaclass_compatability" method we've kept around for backwards compat_i_bility will be removed in a near future release. You've been warned. 0.76 Thu, January 22, 2009 * Class::MOP::Method::Generated - Added new private methods to support code generation, which are being used by Moose and can be used by MooseX authors. (mst) - Generated methods are now generated with a #line directive reflecting the source of the generated method. (nothingmuch) * Class::MOP::Class - Clarified documentation of methods that return Class::MOP::Method objects. (doy) * Class::MOP - Clarified documentation of the metaclass cache methods. (Sartak) * Tests - Add test showing how the xs Class::MOP::is_class_loaded can be made to operate differently to the pure perl version (t0m) 0.75 Wed, December 31, 2008 * Class::MOP::Class - A class that was made immutable and then mutable could end up sharing an immutable transformer object (Class::MOP::Immutable) with other classes, leading to all sorts of odd bugs. Reported by t0m. (Dave Rolsky) 0.74 Tue, December 25, 2008 * MOP.xs - Add an xs implementation of Class::MOP::is_class_loaded (closes RT#41862). Based on a patch by Goro Fuji. (Florian Ragwitz) - Changed internals to make prehashing of hash keys easier and less error-prone. (Florian Ragwitz) * Class::MOP::Class - Fix documentation to show that around modifiers happen on both sides of the modified method. (Dave Rolsky) 0.73 Tue, December 16, 2008 * MOP.xs - Don't use Perl_mro_meta_init. It's not part of the public perl api. Fixes failures to build on Win32 (RT #41750). (Florian Ragwitz) * t/082_get_code_info.t - Add $^P &= ~0x200; (per Ovid's suggestion) in order to not munger anonymous subs when under -d and so making the tests succeed in that case. 0.72 Mon, December 8, 2008 * Class::MOP::Package - Pass options to _new, so subclass' attributes can be initialized (Sartak) * Class::MOP::Method - In the docs, indicate that package_name and name are required when calling ->wrap (Stefan O'Rear) 0.71_02 Fri, December 5, 2008 * Class::MOP::Immutable - Added a new attribute, inlined_constructor, which is true if the constructor was inlined. * Class::MOP::Package - Make get_all_package_symbols return a hash ref in scalar context and deprecate calling it in list context with a warning. (Florian Ragwitz) * MOP.xs - Various improvements and refactoring, making things more robust and easier to maintain. (Florian Ragwitz) 0.71_01 Wed, December 3, 2008 * Class::MOP::Method - Add an "execute" method to invoke the body so we can avoid using the coderef overload (Sartak) * Class::MOP::Immutable - When we memoize methods, get their results lazily to remove some compile-time cost (Sartak) - Small speedup from eliminating several method calls (Sartak) * Class::MOP::Class - Some small internal tweaks to try to reduce the number of times we call get_method_map when bootstrapping the MOP. This might make loading Class::MOP (and Moose) a little faster. (Dave Rolsky) - Implemented an optional XS version of get_method_map. Mostly taken from a patch by Goro Fuji (rt.cpan.org #41080), with help form Florian Ragwitz. (Dave Rolsky) - Make the behaviour of of get_all_package_symbols (and therefore get_method_map) consistent for stub methods. Report and test by Goro Fuji (rt.cpan.org #41255). (Florian Ragwitz) 0.71 Wed November 26, 2008 * Class::MOP::Class * Class::MOP::Module - Actual package creation has moved upward from Class to Module so that Moose roles can share the code (Sartak) 0.70_01 Mon, November 19, 2008 * Class::MOP - Fixes for failures with blead (Florian Ragwitz) - Silenced compiler warnings (Florian Ragwitz) 0.70 Fri, November 14, 2008 * Class::MOP - Fixed an odd corner case where the XS version of get_all_package_symbols could cause a segfault. This only happened with inlined constants in Perl 5.10.0 (Florian Ragwitz) 0.69 Fri, November 7, 2008 * Class::MOP::Method::Wrapped - Added introspection methods for method modifiers (Dave Rolsky) 0.68 Fri October 24, 2008 * Class::MOP - Make load_class require by file name instead of module name. This stops confusing error messages when loading '__PACKAGE__'. (Florian Ragwitz) - Add load_one_class_of function to enable you to load one of a list of classes, rather than having to call load_class multiple times in an eval. (t0m) 0.67 Tue October 14, 2008 * Class::MOP::Class - Call a method on the class after setting the superclass list so that we can get Perl to detect cycles before MRO::Compat spirals into an infinite loop (sartak) - Reported by Schwern, [rt.cpan.org #39001] - In create(), pass unused options on to initialize() - added test for this 0.66 Sat September 20, 2008 !! This release has an incompatible change regarding !! introspection of a class's method with Class::MOP::Class !! * Tests and XS - We (us maintainers) now run all tests with XS and then without XS, which should help us catch skew between the XS/pure Perl code. (Dave Rolsky) * Class::MOP::Class ! The alias_method method has been deprecated. It now simply calls add_method instead. There is no distinction between aliased methods and "real" methods. This means that methods added via alias_method now show up as part of the class's method list/map. This is a backwards incompatible change, but seems unlikely to break any code. Famous last words. (Dave Rolsky) * Class::MOP::Class - Fixed the spelling of "compatibility", but we still have a "check_metaclass_compatability" method for backwards compatibility. 0.65 Mon September 1, 2008 For those not following the series of dev releases, the changes from 0.64 from 0.65 can mostly be summed up as a lot performance improvements by nothingmuch, including new optional XS versions of some methods. Also, Class::MOP now works _without_ any XS modules, for sad systems without a compiler. * Class::MOP::Method - Added name and package_name XS accessors, and make sure all the XS and Perl versions work the same way. (Dave Rolsky) * MOP.xs - The XS versions of various methods just returned undef when called class methods, rather than dying like the pure Perl versions. (Dave Rolsky) 0.64_07 Fri August 29, 2008 * Class::MOP - Silenced warnings that managed to break Moose tests when XS was loaded. (Dave Rolsky) - Some XS versions of methods were ignored because of typos in MOP.xs. (Dave Rolsky) 0.64_06 Mon August 25, 2008 * Class::MOP (MOP.xs) - Another MS VC++ fix, cannot declare a variable in the middle of a scope (Taro Nishino). 0.64_05 Sun August 24, 2008 * Class::MOP - None of the dev releases actually loaded the XS properly, but we silently fell back to the pure Perl version of the code. (Dave Rolsky) * Class::MOP (MOP.xs) - Replaced some code that used functions not available on Visual C++ with some Perl XS API bits (Dave Rolsky). 0.64_04 Sat August 23, 2008 * Class::MOP::Class - Workaround a bug in 5.8.1's goto sub (nothingmuch) * pod.t and pod_coveraget.t - These are no longer shipped with the tarball because of bogus failures from CPAN testers. (Dave Rolsky) 0.64_03 Thu August 21, 2008 * Class::MOP::Package - Some (legit) code was misparsed by earlier 5.8.x releases. (nothingmuch) * Class::MOP - Fix a constant in void context warning (nothingmuch) 0.64_02 Thu August 21, 2008 * Makefile.PL and Class::MOP - Explicitly require Perl 5.8.0+ (Dave Rolsky) * Makefile.PL - Add missing prereqs that got lost in the switch away from Module::Install. * Class::MOP::Instance - New method - get_all_attributes (nothingmuch) 0.64_01 Wed August 20, 2008 * Makefile.PL - We now check to see if you have a compiler. If you don't, the module installs without some XS bits, but will work the same as with XS. This should make it easier to install on platforms without a compiler (like Windows). (Dave Rolsky) * many modules - Perl 6 style attribute naming replaced with sane style ('methods', not '%!methods'). These changes should not impact any existing API uses. (nothingmuch). * many modules - Quite a number of optimizations based on profiling, including allowing constructors to take hash references instead of hashes, duplicating some frequently used code in XS, and making constructors immutable. These changes should not impact any existing API uses. (nothingmuch) * Many modules - Constructors now respect the meta attributes of their subclasses, facilitating MOP extensibility. More related changes will happen in the next several releases. (nothingmuch) * Class::MOP::Class - New method - get_all_methods, replaces the deprecated compute_all_applicable_methods. get_all_attributes provided for consistency (nothingmuch) - New method - wrap_method was refactored out of get_method_map (nothingmuch) - New API for meta instance invalidation - invalidate_meta_instance, invalidate_meta_instances, add_dependent_meta_instance, remove_dependent_meta_instance, called automatically when attribute definitions change and allows notification of dependent subclasses. (nothingmuch) 0.64 Sun August 3, 2008 * Class::MOP::Immutable - fixing subtle edge case in immutable when you call ->meta (stevan) - clean up option processing (nothingmuch) * Class::MOP::Instance - inlined initialize slot didn't match non-inlined (nothingmuch) 0.63 Mon July 7, 2008 * Class::MOP - load_class will initialize a metaclass even if the class is already loaded (sartak) - load_class now returns the metaclass instance instead of just 1 (sartak) * elsewhere - better error messages (sartak and Dave Rolsky) 0.62 Wed June 18, 2008 - in is_class_loaded, recognize scalar references (as opposed to globs) in the symbol table as methods (these are optimized constant subs) 0.61 Fri. June 13, 2008 - Okay, lets give this another try and see if PAUSE recognizes it correct this time. 0.60 Thurs. Jun 12, 2008 - Fixed a version number issue by bumping all modules to 0.60. 0.59 Thurs. Jun 12, 2008 !! Several fixes resulting in yet another 25-30% speedup !! * Class::MOP::Class - now stores the instance of the instance metaclass to avoid needless recomputation and deletes it when the cache is blown - introduce methods to query Class::MOP::Class for the options used to make it immutable as well as the proper immutable transformer. (groditi) * Class::MOP::Package - {add, has, get, remove}_package_symbol all now accept a HASH ref argument as well as the string. All internal usages now use the HASH ref version. * Class::MOP - MOP.xs does sanity checks on the coderef to avoid a segfault - is_class_loaded check now uses code that was improved in Moose's ClassName type check (Sartak) - nonsensical (undef, empty, reference) class names now throw a more direct error in load_class (Sartak) - tests for this and other aspects of load_class (Sartak) * Class::MOP Class::MOP::Class Class::MOP::Method Class::MOP::Method::Wrapped Class::MOP::Attribute - switched usage of reftype to ref because it is much faster 0.58 Thurs. May 29, 2008 (late night release engineering)-- - fixing the version is META.yml, no functional changes in this release 0.57 Wed. May 28, 2008 !! Several speedups resulting in 20-25% speedups !! || (thanks to konobi, groditi, mst & CataMoose) !! * Class::MOP::Class - made get_method_map use list_all_package_symbols instead of manually grabbing each symbol - streamlining &initialize somewhat, since it gets called so much * Class::MOP::Package - made {get, has}_package_symbol not call &namespace so much - inlining a few calls to &name with direct HASH access key access - added get_all_package_symbols to fetch a HASH of items based on a type filter similar to list_all_package_symbols - added tests for this * Class::MOP::Method Class::MOP::Method::Constructor Class::MOP::Method::Generated Class::MOP::Method::Accessor - added more descriptive error message to help keep people from wasting time tracking an error that is easily fixed by upgrading. * Class::MOP::Immutable - Don't inline a destructor unless the user actually needs one - added tests for this 0.56 Saturday, May 24, 2008 * Class::MOP - we now get the &check_package_cache_flag function from MRO::Compat - All XS based functionality now has a Pure Perl alternative - the CLASS_MOP_NO_XS environment variable can now be used to force non-XS versions to always be used * Class::MOP::Attribute - add has_read_method and has_write_method - get_{read,write}_method_ref now wraps the anon-sub ref in the method metaclass when possible - added tests for this * Class::MOP::Immutable - added the ability to "wrap" methods when making the class immutable * Class::MOP::Class - now handling the edge case of ->meta->identifier dying by wrapping add_package_symbol to specifically allow for it to work. - added tests for this * Class::MOP::Attribute Class::MOP::Class Class::MOP::Immutable - any time a method meta object is constructed we make sure to pass the correct package and method name information * Class::MOP::Method Class::MOP::Method::Wrapped Class::MOP::Method::Generated Class::MOP::Method::Accessor Class::MOP::Method::Consructor - the &wrap constructor method now requires that a 'package_name' and 'name' attribute are passed. This is to help support the no-XS version, and will throw an error if these are not supplied. - all these classes are now bootstrapped properly and now store the package_name and name attributes correctly as well ~ Build.PL has been removed since the Module::Install support has been removed 0.55 Mon. April 28, 2008 - All classes now have proper C3 MRO support - added MRO::Compat as a dependency to allow for the C3 MRO support to Just Work in all perl versions * Class::MOP::Class - rebless_instance now returns the instance it has just blessed, this is mostly to facilitate chaining - set the attr correctly in rebless_instance when it has no init_arg - tweaked &linear_isa and &class_precedence_list to support c3 classes. 0.54 Fri. March, 14, 2008 * Class::MOP metaclass.pm - making sure that load_class never gets passed a value from @_ or $_ to squash Ovid's bug (http://use.perl.org/~Ovid/journal/35763) * Class::MOP::Class - make_{immutable,mutable} now return 1 (cause Sartak asked) - improved error handling in ->create method - rebless_instance now takes extra params which will be used to populate values - added tests for this * Class::MOP::Object - localizing the Data::Dumper configurations so that it does not pollute others (RT #33509) * Class::MOP::Class Class::MOP::Package Class::MOP::Module Class::MOP::Method Class::MOP::Attribute - these classes no longer define their own ->meta, but instead just inherit from Class::MOP::Object * Class::MOP::Instance Class::MOP::Immutable - these classes now inherit from Class::MOP::Object * t/ - fixed the filename length on several test files so we install on VMS better (RT #32295) - fixed incorrect use of catdir when it should be catfile (RT #32385) 0.53 Thurs. Feb. 14, 1008 ~~ several doc. fixes and updates ~~ * Class::MOP::Class Class::MOP::Method::Constructor Class::MOP::Attribute - making init_arg accept an undefined value to indicate that no constructor args can be passed (thanks to nothingmuch) - added tests for this - added attribute initializer attribute (rjbs) * Class::MOP. - making this use the new init_arg => undef feature instead of the silly hack from before (thanks to nothingmuch) 0.52 Tues. Jan. 22, 2008 * Class::MOP::Class - fixed bug in rebless_instance (discovered by ash) * Class::MOP::Method::Constructor - removed assumptions about the existence of a &meta method 0.51 Mon. Jan. 14, 2008 ~~~ some misc. doc. fixes ~~~ ~~ updated copyright dates ~~ * Class::MOP - now sets the IS_RUNNING_ON_5_10 constant so that we can take advantage of some of the nice bits of 5.10 * Class::MOP::Class - uses the IS_RUNNING_ON_5_10 flag to optimize the &linearized_isa method and avoid the hack/check for circular inheritence in &class_precedence_list - added rebless_instance method (Sartak) - added tests for this * Class::MOP::Immutable - the immutable class now keeps track of the transformer which immutablized it * Class::MOP::Instance - added rebless_instance_structure method (Sartak) - added tests for this 0.50 Fri. Dec. 21, 2007 * Class::MOP::Class - fixed bug in immutable to make sure that transformation arguments are saved correctly (mst) - added tests for this * Class::MOP::Immutable - fixed a bug (see above) * Class::MOP::Attribute - some doc updates 0.49 Fri. Dec. 14, 2007 !! Class::MOP now loads 2 x faster !! !! with XS speedups (thanks konobi) !! * Class::MOP - removed the dependency on B - added two XS functions (thanks konobi) - get_code_info($code) which replaces all the B fiddling we were doing with faster/leaner XS level fiddling - check_package_cache_flag($pkg_name) which returns the PL_sub_generation variable to be used to help manage method caching. NOTE: In 5.10 or greater this will actually use the mro::get_pkg_gen instead to give even more accurate caching information. blblack++ for that stuff :) * Class::MOP::Class - added the &subclasses method (thanks rlb) - added the update_package_cache_flag and reset_package_cache_flag which help keep track of when we need to re-fetch the method map. - Several small improvements to take advantage of the new method map caching features 0.48 Mon. Nov. 26, 2007 * Class::MOP::Attribute - fixed get_read/write_method to handle the HASH ref case, which makes the get_read/write_method_ref handle it too. - added more tests for this 0.47 Sat. Nov. 24, 2007 * Class::MOP::Attribute - fixed misspelling in get_write_method_ref - added more tests for this 0.46 Fri. Nov. 23, 2007 * Class::MOP::Class - added the linearized_isa method instead of constantly pruning duplicate classes (this will be even more useful in the 5.10-compat version coming soon) * Class::MOP::Attribute - added the get_read_method_ref and get_write_method_ref methods which allow you to retrieve a CODE ref which can always be used to read or write an attribute. 0.45 Thurs. Nov. 13, 2007 * Class::MOP::Attribute - Fix error message on confess (groditi) 0.44 Thurs. Nov. 13, 2007 - Apparently I didn't make dist correctly (groditi) 0.43 Thurs. Nov. 13, 2007 * Class::MOP - Add support for the 'builder' attribute (groditi) * Class::MOP::Class - optimise metaclass-already-exists check in construct_class_instance (groditi) - duplicate check into initialize to save a call through (groditi) * Class::MOP::Attribute - Add support for the 'builder' attribute (groditi) - Make predicates check for the existence of a value, not whether it is defined (groditi) * Class::MOP::Instance - Make predicates check for the existence of a value, not whether it is defined (groditi) * Class::MOP::Method::Accessor - made this a subclass of Class::MOP::Method::Generated - removed the relevant attributes * Class::MOP::Method::Constructor - fixed the cached values we had to be more sane - made this a subclass of Class::MOP::Method::Generated - fixed generated constructor so it properly handles subclasses now. - added tests for this - added the option to allow for both inlined and non-inlined constructors. - Update inlined methods for builder and predicate changes (groditi) * Class::MOP::Method::Generated - added this class as an abstract base for the Class::MOP::Method::{Constructor,Accessor} classes - added tests for this *t/ - Alter tests (005, 014 020, 021) for new builder addition (groditi) - Tests for new predicate behavior (and corrections to old tests) (groditi) *examples/ - Update ArrayRef based class example to work with predicate changes 0.42 Mon. July 16, 2007 !!! Horray for mst, he fixed it !!! * Class::MOP::Package - alter symbol table handling to deal with 5.8.x and 5.9.x * t/ - Get rid of the crappy workaround from 0.40/41 0.41 Sun. July 15, 2007 * t/ Arghh!!! My TODO test didn't work, so I handle it manually now so that people can use this with 5.9.5/bleadperl without issue. 0.40 Tues, July 3, 2007 * t/ ~ marked a test in 003_methods.t as TODO for perl 5.9.5 (this test is irrelvant to the module functioning on 5.9.5 for the most part anyway) 0.39 Mon. June 18, 2007 * Class::MOP::Immutable - added make_metaclass_mutable + docs (groditi) - removed unused variable - added create_immutable_transformer necessary for sane overloading of immutable behavior - tests for this (groditi) * Class::MOP::Class - Immutability can now be undone, added make_mutable + tests + docs (groditi) - Massive changes to the way Immutable is done for details see comments next to make_immutable This fixes a bug where custom metaclasses broke when made immutable. We are now keeping one immutable metaclass instance per metaclass instead of just one to prevent isa hierarchy corruption. Memory use will go up, but I suspect it will be neglible. - New tests added for this behavior. (groditi) 0.38 Thurs. May 31, 2007 ~~ More documentation updates ~~ * Class::MOP::Package - we now deal with stub methods properly - added tests for this - fixed some tests failing on 5.9.5 (thanks blblack) * Class::MOP::Attribute - added get_read_method and get_write_method thanks to groditi for this code, tests and docs. - added tests and POD for this * Class::MOP::Class - fixed RT issue #27329, clone object now handles undef values correctly. - added tests for this - Corrected anon-class handling so that they will not get reaped when instances still exist which need to reference them. This is the correct behavior, hopefully this is an obscure enough feature that there are not too many work arounds out in the wild. - added tests for this by groditi - updated docs to explain this * metaclass - load custom metaclasses automatically (thanks groditi) - added tests for this behavior 0.37 Sat. March 10, 2007 ~~ Many, many documentation updates ~~ * Class::MOP - added &load_class and &is_class_loaded - added tests and docs for these * Class::MOP::Attribute - default now checks the instance with defined to avoid setting off bool-overloads (found by Carl Franks) 0.37_002 * /t - bad name in a test, causing meaningless failuress. No other changes. 0.37_001 ~~ GLOBAL CHANGES ~~ - All attribute names are now consistent and follow Perl 6 style (prefixed with the sigil, and ! as the twigil for private attrs). This should not affect any code, unless you broke encapsulation, in which case, it is your problem anyway. !! Class::MOP::Class::Immutable has been removed * Class::MOP::Method::Constructor - this has been moved out of Class::MOP::Class::Immutable and is a proper subclass of Class::MOP::Method now. * Class::MOP::Class - this module now uses Class::MOP::Immutable for the immutable transformation instead of Class::MOP::Class::Immutable. + Class::MOP::Immutable - this module now controls the transformation from a mutable to an immutable version of the class. Docs for this will be coming eventually. 0.36 Sun. Nov. 5, 2006 * Class::MOP::Class - added a few 'no warnings' lines to keep annoying (and meaningless) warnings from chirping during global destruction. * Class::MOP - some more bootstrapping is now done on the new classes * Class::MOP::Class::Immutable *** API CHANGE *** - constructor generation is now handled by the Class::MOP::Method::Constructor class * Class::MOP::Method::Constructor - created this to handle constructor generation in Class::MOP::Class::Immutable * Class::MOP::Attribute *** API CHANGE *** - attributes now delegate to the Class::MOP::Method::Accessor to generate accessors * Class::MOP::Method::Accessor - all accessor generation functions from Class::MOP::Attribute have been moved here 0.35 Sat. Sept. 30, 2006 * scripts/class_browser.pl - initial prototype of a class browser, more on this to come. Comments and patches are very much welcome. * Class::MOP - All Class::MOP::* accessors are no longer re-generated in the bootstrap, instead they are aliased from the originals - fixed tests to reflect - added Class::MOP::Method (and its subclasses) to the bootstrap - adjusted tests for this - added the Class::MOP::Instance attributes to the bootstrap * Class::MOP::Method *** API CHANGE *** - methods are no longer blessed CODE refs but are actual objects which can be CODE-ified - adjusted tests to compensate - adjusted docs for this * Class::MOP::Class - changed how methods are dealt with to encapsulate most of the work into the &get_method_map method - made several adjustments for the change in Class::MOP::Method - &add_attribute now checks if you are adding a duplicate name, and properly removes the old one before installing the new one - added tests for this - adjusted docs for this * Class::MOP::Class::Immutable - added caching of &get_method_map - fixed issue with &get_package_symbol - cleaned up the methods that die (patch by David Wheeler) * Class::MOP::Package - added filtering capabilities to &list_all_package_symbols 0.34 Sat. Aug. 26, 2006 * Class::MOP::Class - added the %:methods attribute, which like the $:version and such just actually goes to the symbol table to get its stuff. However, it makes the MOP more complete. ** API CHANGE ** - The &create method now requires that all but the package name now is passed in as named parameters. See docs for more info. - updated docs and tests for this * Class::MOP::Object - added &dump method to easily Data::Dumper an object * Class::MOP - cleaned up the initialization of attributes which do not store things in the instance - added the %:methods attribute definition to the bootstrap ~ lots of misc. test cleanup 0.33 Sat. Aug. 19, 2006 * Class::MOP::Class - moved the metaclass cache out of here and it is now in Class::MOP itself. * Class::MOP - moved all the metaclass cache stuff here - fixed all tests for this * Class::MOP::Attribute - reference values (other than CODE refs) are no longer allowed for defaults - added tests for this * Class::MOP::Package - fixed an issue with perl 5.8.1 and how it deals with symbol tables. The namespace hash is now always reloaded from the symbol table. ~ lots of misc. documentation cleanup 0.32 Sat. Aug. 12, 2006 + added Class::MOP::Object so that the metamodel is more complete (and closer to what Perl 6 will probably be). * Class::MOP::Package - refactored entire class, this is now the primary gateway between the metaclass and the Perl 5 symbol table - added many tests for this - this class is now a subclass of Class::MOP::Object - added some tests to reflect this * Class::MOP::Class - refactored all symbol table access to use Class::MOP::Package methods instead * Class::MOP::Module - adding the $:version attribute in the bootstrap so that Module has a version as an attribute - see comment in Class::MOP for details - added the $:authority attribute to this module as well as an &identifier method, to bring us ever closer to Perl 6 goodness - I have added $AUTHORITY to all the modules - added tests for this * Class::MOP::Instance - added &deinitialize_slot for removing slots from an instance - added tests for this * Class::MOP::Attribute - added support for &deinitialize_slot for removing slots from an instance - added tests for this 0.31 Sat. July 15, 2006 * Class::MOP::Class - added &find_method_by_name to locate a method anywhere within the class hierarchy * Class::MOP::Attribute - added &set_value and &get_value for getting the value of the attribute for a particular instance. 0.30 Wed. July 5, 2006 --------------------------------------- This is the first version of Class::MOP to introduce the immutable features which will be used for optimizating the MOP. This support should still be considered experimental, but moving towards stability. --------------------------------------- * Created Class::MOP::Class::Immutable * Created the Class::MOP::Package and Class::MOP::Module classes to more closely conform to Perl 6's meta-model * Class::MOP::Class - now inherits from Class::MOP::Module - several methods moved to ::Module and ::Package and now inherited - added tests for this * Class::MOP::Instance - added an is_inlinable method to allow other classes to check before they attempt to optimize. - added an inline_create_instance to inline instance creation (of course) ** API CHANGE ** - the Class::MOP::Class::*_package_variable methods are all now methods of Class::MOP::Package and called *_package_symbol instead. This is because they are now more general purpose symbol table manipulation methods. 0.29_02 Thurs. June 22, 2006 ++ DEVELOPER RELEASE ++ * Class::MOP::Class - small change in &create so that it behaves properly when inherited - small fix to &clone_instance 0.29_01 Fri. May 12, 2006 ++ DEVELOPER RELEASE ++ - This release works in combination with Moose 0.09_01, it is a developer release because it introduces a new instance sub-protocol and has not yet been optimized. * Class::MOP::Class - anon-classes are now properly garbage collected - added tests for this - improved method modifier wrapping * Class::MOP::Instance - added new instance protocol - added tests for this - changed all relevant modules and examples - Class::MOP::Class - Class::MOP::Attribute - examples/* * metaclass - you no longer need to specify the metaclass itself, if it is not there, Class::MOP::Class is just assumed - updated tests for this * examples/ - added ArrayBasedStorage example to show instance storage using ARRAY refs instead of HASH refs. - added tests for this - InsideOutClass is totally revised using the new instance protocol - added more tests for this 0.26 Mon. April 24, 2006 * Class::MOP::Class - added find_attribute_by_name method - added tests and docs for this - some small optimizations * Class::MOP::Attribute - some small optimizations 0.25 Thurs. April 20, 2006 * Class::MOP::Class - added create_anon_class for creating anonymous classes - added tests for this - added get_all_metaclasses, get_all_metaclass_names and get_all_metaclass_instances method to allow access to all the cached metaclass objects. - attribute slot initialization is now the responsibility of the attribute itself, and construct_instance now delegates appropriately * Class::MOP::Attribute - attribute slot initialization is now the responsibility of the attribute itself, so we added a method for it called initialize_instance_slot * examples/ - adjusted all the examples to use the new attribute initialize_instance_slot method 0.24 Tues. April 11, 2006 * Class::MOP::Class - cleaned up how the before/after/around method modifiers get named with Sub::Name 0.23 Thurs. March 30, 2006 * Class::MOP::Class - fixed the way attribute defaults are handled during instance construction (bug found by chansen) * Class::MOP::Attribute - read-only accessors ('reader') will now die if passed more than one argument (attempting to write to them basically) - added tests for this - adjusted all /example files to comply 0.22 Mon. March 20, 2006 * Class::MOP::Class - localized $@ in the *_package_variable functions because otherwise, it does ugly things in Moose. - added test case for this 0.21 Wed. March 15, 2006 * Class::MOP::Class - fixed issue where metaclasses are reaped from our cache in global destruction, and so are not available in DESTORY calls 0.20 Thurs. March 2, 2006 - removed the dependency for Clone since we no longer to deep-cloning by default. * Class::MOP::Method - added &package_name, &name and &fully_qualified_name methods, some of which were formerly private subs in Class::MOP::Class * Class::MOP::Method::Wrapped - allows for a method to be wrapped with before, after and around modifiers - added tests and docs for this feature * Class::MOP::Class - improved &get_package_symbol - &version and &superclasses now use it - methods are now blessed into Class::MOP::Method whenever possible - added methods to install CLOS-style method modifiers - &add_before_method_modifier - &add_after_method_modifier - &add_around_method_modifier - added tests and docs for these - added &find_next_method_by_name which finds the equivalent of SUPER::method_name 0.12 Thurs. Feb 23, 2006 - reduced the dependency on B, no need to always have the latest * examples/ - added docs to the C3 method dispatch order test - fixed missing Algorithm::C3 dependency by making the test skip if it is not installed 0.11 Mon Feb. 20, 2006 * examples/ - added example of changing method dispatch order to C3 * Class::MOP::Class - changed how clone_instance behaves, it now only does a shallow clone (see docs for more details) - added docs and tests 0.10 Tues Feb. 14, 2006 ** This release was mostly about writing more tests and cleaning out old and dusty code, the MOP should now be considered "ready to use". - adding more tests to get coverage up a little higher, mostly testing errors and edge cases. - test coverage is now at 99% * Class::MOP - no longer optionally exports to UNIVERSAL::meta or creates a custom metaclass generator, use the metaclass pragma instead. * Class::MOP::Class - fixed a number of minor issues which came up in the error/edge-case tests * Class::MOP::Attribute - fixed a number of minor issues which came up in the error/edge-case tests * examples/ - fixing the AttributesWithHistory example, it was broken. 0.06 Thurs Feb. 9, 2006 * metaclass - adding new metaclass pragma to make setting up the metaclass a little more straightforward * Class::MOP - clean up bootstrapping to include more complete attribute definitions for Class::MOP::Class and Class::MOP::Attribute (accessors, readers, writers, etc.) ... it is redundant, but is useful meta-info to have around. * Class::MOP::Class - fixing minor meta-circularity issue with &meta, it is now more useful for subclasses - added &get_attribute_map as an accessor for the hash of attribute meta objects - &compute_all_applicable_attributes now just returns the attribute meta-object, rather than the HASH ref since all the same info can be gotten from the attribute meta-object itself - updated docs & tests to reflect - added &clone_instance method which does a deep clone of the instance structure created by &construct_instance - added docs & tests for this - added Clone as a dependency - added &new_object and &clone_object convience methods to return blessed new or cloned instances - they handle Class::MOP::Class singletons correctly too - added docs & tests for this - cleaned up the &constuct_class_instance so that it behaves more like &construct_instance (and managed the singletons too) - added the &check_metaclass_compatibility method to make sure that metaclasses are upward and downward compatible. - added tests and docs for this * examples/ - adjusting code to use the &Class::MOP::Class::meta fix detailed above - adjusting code to use the metaclass pragma 0.05 Sat Feb. 4, 2006 * Class::MOP::Class - added the &attribute_metaclass and &method_metaclass attributes which contain a metaclass name to use for attributes/methods respectively * Class::MOP - bootstrap additional attributes for Class::MOP::Class * examples/ - adjusted the example code and tests to use the new &attribute_metaclass feature of Class::MOP::Class - added new example: - LazyClass 0.04 Fri Feb. 3, 2006 * Class::MOP::Class - some documentation suggestions from #perl6 * Class::MOP::Attribute - improved error messages * examples/ - added new examples: - AttributesWithHistory - ClassEncapsultedAttributes 0.03 Fri Feb. 3, 2006 - converted to Module::Build instead of EU::MM * Class::MOP::Attribute - refactored method generation code - attributes are now associated with class directly * examples/ - refactored the InsideOut example to take advantage of the Class::MOP::Attribute refactoring - changed example files to .pod files and hide thier package names from PAUSE (I don't want to own these namespaces really, they are just examples) 0.02 Thurs Feb. 2, 2006 - moving examples from t/lib/* to examples/* - adding POD documentation to the examples 0.01 Thurs Feb. 2, 2006 - Initial release Moose-2.2200/doc/moosex-compile000644 000766 000024 00000024406 14137574636 016612 0ustar00etherstaff000000 000000 MooseX-Compile, wherein Yuval explains how MooseX::Compile is supposed to work and what needs doing. TODO: PLEASE EDIT ME 19:11 hiya 19:12 hola 19:13 so, my empty mail was an attempted abort 19:13 but was going to be "MX::Compile doesn't depend on MX::Compile::CLI. should it?" 19:13 ah, ok =) 19:13 but i'm without my laptop, so i couldn't actually check my assumption 19:14 no, because MX::Compile::CLI is "just a a frontend" and at the time the dependencies were a little sketchy 19:14 they've since matured, so maybe it should dep 19:21 * obra nods 19:21 I was on a plane and was trying to see if MX::Compile was at the point where I could try trivial tests 19:22 ah 19:22 so the answer is definitely maybe ;-) 19:22 i haven't been able to make time for it in the past week 19:23 if you guys hand me small, targetted test cases (just commit to it) of code that passes under plain Moose and should pass with MX::Compile i can probably do that stuff pretty quickly 19:23 but the biggest barrier MXC has right now is testing, in order for it to progress towards something production worthy it basically needs to pass the Moose test suite 19:23 except without the Moose test suite's assumptions 19:23 about state and module loading, and all that 19:24 and doing that is a much more daunting prospect than hacking on MXC itself 19:24 understood. the problem is that I still don't have a good sense of how to get it going, even manually 19:24 ah 19:24 none of the test files seem to show off what I need 19:24 i can walk you through thjat 19:25 the assumptions of the system are: 19:25 the class you are compiling is in its own .pm using standard moose sugar 19:25 there is one package in that file 19:26 the compiler object takes the metaclass and the .pm file as args 19:26 it serializes the metaclass to a .mopc file, and the generated code into a .pmc 19:26 the .pmc contains the original .pm verbatim 19:26 except that all the moose sugar does nothing 19:27 meta is overriden to lazy load .mopc 19:27 and the class is supposed to be usable without loading Moose at all 19:27 what is the point of containing the original pm verbatim? 19:27 the user code 19:28 could open and slurp and eval 19:28 but this is a little more flexible 19:28 basically any subroutines the user has written, global/lexical variable initialization, loading of assorted modules etc all must work 19:28 are you using the flexibility? 19:28 (open, slurp, eval sounds suspiciously like "do") 19:29 can't use do/require/etc because it will go to the .pmc 19:29 instead of the .pm 19:29 the flexibility is helpful because you get a lexical set if the code is compiled 19:29 for when you need to do trickery 19:29 see Moose/Object.pm 19:29 I didn't think 'do' had that logic. but ok :) 19:30 anyway 19:30 do go on 19:30 now that we have Devel::Declare that might prove even simpler 19:30 simply replacing has() etc to export the subs inline 19:30 and write the resulting buffers to a .pmc 19:30 but that's for Later™ 19:30 The fact that the TM shows up in my terminal scare me 19:30 but only a bit less than that you typed it ;) 19:30 utf8++ 19:31 ubuntu++ 19:31 most linuxes seem to get that refreshingly right 19:31 so, erm 19:31 yeah. it's pleasant. 19:31 mxcompile 19:31 anyway 19:31 that is a nice frontend to the compiler object 19:31 I guess "what do I need to do to try MX::Compile for prophet+sd?" 19:31 it can recurse through a directory of modules, or take a list of classes 19:31 for starters, role support 19:31 i know how to do it 19:31 but haven't yet 19:32 type constraint support is very primitive 19:32 is that essentially the same code sartak needs to write to give Mouse roles? 19:32 i don't know what that is but doesn't sound likely 19:32 in MXC moose has already done the role composition 19:32 i just need to figure where the data came from, load that file and realias the subs 19:33 (at bootstrap time) 19:33 no role composition per se 19:33 it's nice to make clear that MXC has two "levels" of awesome 19:33 so you can figure out what you can hope to achieve 19:34 100% compiled everything means you don't load Moose or Class::MOP 19:34 until you need runtime reflection 19:34 no codegen at compile time 19:34 it should load as fast as hand written code 19:34 i've had it beating Object::Tiny in some benchmarks =) 19:35 oo 19:35 Moose::XS should aid in making MooseX::Compile's supported feature set easier 19:35 the less awesome level of awesome is just some classes 19:35 you don't pay for those classes' compilation (Role composition, etc) 19:35 (especially since for me perl -MMoose -e1 takes up 50% of "sd help"'s runtime 19:36 (.4s here) 19:36 5.8.8/ 19:36 ? 19:36 yeah 19:36 "that's what's in the wild" 19:36 i'm just curious if it makes a dfif 19:36 * obra nods 19:36 I don't have my macbook right now or I'd test 19:36 trunk moose loads slower 19:36 how much slower? 19:36 but 5.10 loads faster 19:36 negligiably 19:36 i think like 10% 19:36 this was trunk moose as of friday 19:36 but we can fix that 19:36 ah 19:36 my tests aren't scientific. 19:36 trunk moose as of you sending me nytprofs 19:37 actually that's CPAN moose now 19:37 0.35 - 0.45 19:37 ouch 19:37 well, part of the problem is that it loads *EVERYTHING* 19:37 every type of meta method class, meta type constraint, the role system, etc 19:37 for a big app these probably will get loaded 19:38 but for a small app, especially if you load the various sub modules only as needed, you shouldn't pay for these 19:38 that's a trivial fix that perigrin started working on 19:38 yeah. I played with his branch and saw no change as of last night 19:39 so yeah, we're using roles. if roles aren't ready yet, I won't get far at all. 19:39 (Also, I do really appreciate all the work you're doing. That I'm not paying for, even ;) 19:39 Thank you. 19:39 i will try shaving Moose's own load time with a profile based approach 19:39 It's SO MUCH better than it was 19:39 well, everybody wins =) 19:39 a. you're a friend 19:40 b. part of my job is making Moose work well 19:40 c. your using Moose helps moose directly and indirectly 19:40 d. I LIKE TACOS 19:40 erm, i mean sushi 19:40 so no worries on that 19:41 so, long term goals: 19:41 App::SD etc has all the meta calculations already cached in .mopc and .pmc 19:41 moose is not loaded 19:41 all generated code is cached 19:41 at worst Moose::XS is loaded to install subs with newXS 19:41 that would be really cool 19:41 depending on which actually fairs better 19:42 that goal is realistic, but involves a lot of work 19:42 more realistic short term goals: 19:42 I started playing with try to dump the symbol table, etc 19:42 MooseX::Compile partly speeding up SD 19:42 we can incrementally improve on that 19:42 and found that DD::Streamer is a lot closer than anything has ever been, but it craps out around not being able to dump lvalue subs 19:43 Moose::XS replacing some code gen 19:43 yes, the initial approach was to to try and marshall Moose classes into DDS 19:43 but it wasn't stable enough 19:43 and also there's the problem of imports 19:43 you must serialize the whole table at once 19:43 or manage an intricate web of inter dependencies 19:43 * obra nods 19:44 i sort of work around that by making all the require()/use() statements stay verbatim 19:44 also it doesn't handle xsubs 19:44 how hard would it be to get moose's codegen to write out source code instead of blowing subs into memory? 19:44 so there's guesswork for where ::bootstrap was called 19:44 i was just getting to that = 19:44 =) 19:44 pretty trivial 19:44 heh 19:44 just grunt work 19:44 is that a more viable approach? 19:44 it's one of the limiting parts of MooseX::Compile 19:45 if we clean up that code it will be easier to add support for more features 19:45 but it's not a huge hurdle since it's a very contained problem 19:45 it doesn't directly affect the design of MXC 19:45 is this stuff written down anywhere other than this buffer? 19:45 i don't think so 19:46 where should it get pasted? 19:46 good question =) 19:46 i think #moose-dev is pretty aware 19:46 is there a moose wiki? 19:46 but documenting is good for people to help out 19:46 no, there should be 19:46 yeah. but the goal is to turn it into written docs. 19:46 ok. for now, it should end up in MooseX-Compile/doc/design 19:46 sounds good 19:46 . o O { Thank god I don't have a moose commit bit } 19:47 though most of this affects moose itself though 19:47 * obra nods 19:47 Moose/doc/moosex-compile, then Moose-2.2200/lib/Moose/000770 000766 000024 00000000000 14137574636 015001 5ustar00etherstaff000000 000000 Moose-2.2200/lib/Test/000770 000766 000024 00000000000 14137574636 014636 5ustar00etherstaff000000 000000 Moose-2.2200/lib/Moose.pm000640 000766 000024 00000115201 14137574636 015336 0ustar00etherstaff000000 000000 use strict; use warnings; package Moose; # git description: 2.2100-2-g9c08679f9 our $VERSION = '2.2200'; our $AUTHORITY = 'cpan:STEVAN'; use 5.008003; use Scalar::Util (); use Carp 'carp'; use Module::Runtime 'module_notional_filename'; use Class::Load 'is_class_loaded'; use Moose::Deprecated; use Moose::Exporter; use Class::MOP; die "Class::MOP version $Moose::VERSION required--this is version $Class::MOP::VERSION" if $Class::MOP::VERSION ne $Moose::VERSION; use Moose::Meta::Class; use Moose::Meta::TypeConstraint; use Moose::Meta::TypeCoercion; use Moose::Meta::Attribute; use Moose::Meta::Instance; use Moose::Object; use Moose::Meta::Role; use Moose::Meta::Role::Composite; use Moose::Meta::Role::Application; use Moose::Meta::Role::Application::RoleSummation; use Moose::Meta::Role::Application::ToClass; use Moose::Meta::Role::Application::ToRole; use Moose::Meta::Role::Application::ToInstance; use Moose::Util::TypeConstraints; use Moose::Util 'throw_exception'; use Moose::Meta::Attribute::Native; sub extends { my $meta = shift; unless ( @_ ) { throw_exception( ExtendsMissingArgs => class_name => $meta->name ); } # this checks the metaclass to make sure # it is correct, sometimes it can get out # of sync when the classes are being built $meta->superclasses(@_); } sub with { Moose::Util::apply_all_roles(shift, @_); } sub throw_error { shift; Class::MOP::Object->throw_error(@_); } sub has { my $meta = shift; my $name = shift; my %context = Moose::Util::_caller_info; $context{context} = 'has declaration'; $context{type} = 'class'; my @options = ( definition_context => \%context, @_ ); my $attrs = ( ref($name) eq 'ARRAY' ) ? $name : [ ($name) ]; $meta->add_attribute( $_, @options ) for @$attrs; } sub before { Moose::Util::add_method_modifier(shift, 'before', \@_); } sub after { Moose::Util::add_method_modifier(shift, 'after', \@_); } sub around { Moose::Util::add_method_modifier(shift, 'around', \@_); } our $SUPER_PACKAGE; our $SUPER_BODY; our @SUPER_ARGS; sub super { if (@_) { carp 'Arguments passed to super() are ignored'; } # This check avoids a recursion loop - see # t/bugs/super_recursion.t return if defined $SUPER_PACKAGE && $SUPER_PACKAGE ne caller(); return unless $SUPER_BODY; $SUPER_BODY->(@SUPER_ARGS); } sub override { my $meta = shift; my ( $name, $method ) = @_; $meta->add_override_method_modifier( $name => $method ); } sub inner { my $pkg = caller(); our ( %INNER_BODY, %INNER_ARGS ); if ( my $body = $INNER_BODY{$pkg} ) { my @args = @{ $INNER_ARGS{$pkg} }; local $INNER_ARGS{$pkg}; local $INNER_BODY{$pkg}; return $body->(@args); } else { return; } } sub augment { my $meta = shift; my ( $name, $method ) = @_; $meta->add_augment_method_modifier( $name => $method ); } Moose::Exporter->setup_import_methods( with_meta => [ qw( extends with has before after around override augment ) ], as_is => [ qw( super inner ), 'Carp::confess', 'Scalar::Util::blessed', ], ); sub init_meta { shift; my %args = @_; my $class = $args{for_class} or throw_exception( InitMetaRequiresClass => params => \%args ); my $base_class = $args{base_class} || 'Moose::Object'; my $metaclass = $args{metaclass} || 'Moose::Meta::Class'; my $meta_name = exists $args{meta_name} ? $args{meta_name} : 'meta'; throw_exception( MetaclassNotLoaded => class_name => $metaclass ) unless is_class_loaded($metaclass); throw_exception( MetaclassMustBeASubclassOfMooseMetaClass => class_name => $metaclass ) unless $metaclass->isa('Moose::Meta::Class'); # make a subtype for each Moose class class_type($class) unless find_type_constraint($class); my $meta; if ( $meta = Class::MOP::get_metaclass_by_name($class) ) { unless ( $meta->isa("Moose::Meta::Class") ) { if ( $meta->isa('Moose::Meta::Role') ) { throw_exception( MetaclassIsARoleNotASubclassOfGivenMetaclass => role_name => $class, metaclass => $metaclass, role => $meta ); } else { throw_exception( MetaclassIsNotASubclassOfGivenMetaclass => class_name => $class, metaclass => $metaclass, class => $meta ); } } } else { # no metaclass # now we check whether our ancestors have metaclass, and if so borrow that my ( undef, @isa ) = @{ mro::get_linear_isa($class) }; foreach my $ancestor ( @isa ) { my $ancestor_meta = Class::MOP::get_metaclass_by_name($ancestor) || next; my $ancestor_meta_class = $ancestor_meta->_real_ref_name; # if we have an ancestor metaclass that inherits $metaclass, we use # that. This is like _fix_metaclass_incompatibility, but we can do it now. # the case of having an ancestry is not very common, but arises in # e.g. Reaction unless ( $metaclass->isa( $ancestor_meta_class ) ) { if ( $ancestor_meta_class->isa($metaclass) ) { $metaclass = $ancestor_meta_class; } } } $meta = $metaclass->initialize($class); my $filename = module_notional_filename($meta->name); $INC{$filename} = '(set by Moose)' unless exists $INC{$filename}; } if (defined $meta_name) { # also check for inherited non moose 'meta' method? my $existing = $meta->get_method($meta_name); if ($existing && !$existing->isa('Class::MOP::Method::Meta')) { Carp::cluck "Moose is overwriting an existing method named " . "$meta_name in class $class with a method " . "which returns the class's metaclass. If this is " . "actually what you want, you should remove the " . "existing method, otherwise, you should rename or " . "disable this generated method using the " . "'-meta_name' option to 'use Moose'."; } $meta->_add_meta_method($meta_name); } # make sure they inherit from Moose::Object $meta->superclasses($base_class) unless $meta->superclasses(); return $meta; } # This may be used in some older MooseX extensions. sub _get_caller { goto &Moose::Exporter::_get_caller; } ## make 'em all immutable $_->make_immutable( inline_constructor => 1, constructor_name => "_new", # these are Class::MOP accessors, so they need inlining inline_accessors => 1 ) for grep { $_->is_mutable } map { $_->meta } qw( Moose::Meta::Attribute Moose::Meta::Class Moose::Meta::Instance Moose::Meta::TypeCoercion Moose::Meta::TypeCoercion::Union Moose::Meta::Method Moose::Meta::Method::Constructor Moose::Meta::Method::Destructor Moose::Meta::Method::Overridden Moose::Meta::Method::Augmented Moose::Meta::Role Moose::Meta::Role::Attribute Moose::Meta::Role::Method Moose::Meta::Role::Method::Required Moose::Meta::Role::Method::Conflicting Moose::Meta::Role::Composite Moose::Meta::Role::Application Moose::Meta::Role::Application::RoleSummation Moose::Meta::Role::Application::ToClass Moose::Meta::Role::Application::ToRole Moose::Meta::Role::Application::ToInstance ); $_->make_immutable( inline_constructor => 0, constructor_name => undef, # these are Class::MOP accessors, so they need inlining inline_accessors => 1 ) for grep { $_->is_mutable } map { $_->meta } qw( Moose::Meta::Method::Accessor Moose::Meta::Method::Delegation Moose::Meta::Mixin::AttributeCore ); 1; # ABSTRACT: A postmodern object system for Perl 5 __END__ =pod =encoding UTF-8 =head1 NAME Moose - A postmodern object system for Perl 5 =head1 VERSION version 2.2200 =head1 SYNOPSIS package Point; use Moose; # automatically turns on strict and warnings has 'x' => (is => 'rw', isa => 'Int'); has 'y' => (is => 'rw', isa => 'Int'); sub clear { my $self = shift; $self->x(0); $self->y(0); } package Point3D; use Moose; extends 'Point'; has 'z' => (is => 'rw', isa => 'Int'); after 'clear' => sub { my $self = shift; $self->z(0); }; =head1 DESCRIPTION Moose is an extension of the Perl 5 object system. The main goal of Moose is to make Perl 5 Object Oriented programming easier, more consistent, and less tedious. With Moose you can think more about what you want to do and less about the mechanics of OOP. Additionally, Moose is built on top of L, which is a metaclass system for Perl 5. This means that Moose not only makes building normal Perl 5 objects better, but it provides the power of metaclass programming as well. =head2 New to Moose? If you're new to Moose, the best place to start is the L docs, followed by the L. The intro will show you what Moose is, and how it makes Perl 5 OO better. The cookbook recipes on Moose basics will get you up to speed with many of Moose's features quickly. Once you have an idea of what Moose can do, you can use the API documentation to get more detail on features which interest you. =head2 Moose Extensions The C namespace is the official place to find Moose extensions. These extensions can be found on the CPAN. The easiest way to find them is to search for them (L), or to examine L which aims to keep an up-to-date, easily installable list of Moose extensions. =head1 TRANSLATIONS Much of the Moose documentation has been translated into other languages. =over 4 =item Japanese Japanese docs can be found at L. The source POD files can be found in GitHub: L =back =head1 BUILDING CLASSES WITH MOOSE Moose makes every attempt to provide as much convenience as possible during class construction/definition, but still stay out of your way if you want it to. Here are a few items to note when building classes with Moose. When you C, Moose will set the class's parent class to L, I the class using Moose already has a parent class. In addition, specifying a parent with C will change the parent class. Moose will also manage all attributes (including inherited ones) that are defined with C. And (assuming you call C, which is inherited from L) this includes properly initializing all instance slots, setting defaults where appropriate, and performing any type constraint checking or coercion. =head1 PROVIDED METHODS Moose provides a number of methods to all your classes, mostly through the inheritance of L. There is however, one exception. By default, Moose will install a method named C in any class which uses C. This method returns the current class's metaclass. If you'd like to rename this method, you can do so by passing the C<-meta_name> option when using Moose: use Moose -meta_name => 'my_meta'; However, the L class I provides a method named C which does the same thing. If your class inherits from L (which is the default), then you will still have a C method. However, if your class inherits from a parent which provides a C method of its own, your class will inherit that instead. If you'd like for Moose to not install a meta method at all, you can pass C as the C<-meta_name> option: use Moose -meta_name => undef; Again, you will still inherit C from L in this case. =head1 EXPORTED FUNCTIONS Moose will export a number of functions into the class's namespace which may then be used to set up the class. These functions all work directly on the current class. =head2 extends (@superclasses) This function will set the superclass(es) for the current class. If the parent classes are not yet loaded, then C tries to load them. This approach is recommended instead of C>/C>, because C actually Ces onto the class's C<@ISA>, whereas C will replace it. This is important to ensure that classes which do not have superclasses still properly inherit from L. Each superclass can be followed by a hash reference with options. Currently, only L<-version|Class::MOP/Class Loading Options> is recognized: extends 'My::Parent' => { -version => 0.01 }, 'My::OtherParent' => { -version => 0.03 }; An exception will be thrown if the version requirements are not satisfied. =head2 with (@roles) This will apply a given set of C<@roles> to the local class. Like with C, each specified role can be followed by a hash reference with a L<-version|Class::MOP/Class Loading Options> option: with 'My::Role' => { -version => 0.32 }, 'My::Otherrole' => { -version => 0.23 }; The specified version requirements must be satisfied, otherwise an exception will be thrown. If your role takes options or arguments, they can be passed along in the hash reference as well. You should only use one C, even if you are consuming multiple roles. If you consume roles using multiple C statements Moose cannot detect method conflicts between those roles. =head2 has $name|@$names =E %options This will install an attribute of a given C<$name> into the current class. If the first parameter is an array reference, it will create an attribute for every C<$name> in the list. The C<%options> will be passed to the constructor for L (which inherits from L), so the full documentation for the valid options can be found there. These are the most commonly used options: =over 4 =item I 'rw'|'ro'> The I option accepts either I (for read/write) or I (for read only). These will create either a read/write accessor or a read-only accessor respectively, using the same name as the C<$name> of the attribute. If you need more control over how your accessors are named, you can use the L, L and L options inherited from L, however if you use those, you won't need the I option. =item I $type_name> The I option uses Moose's type constraint facilities to set up runtime type checking for this attribute. Moose will perform the checks during class construction, and within any accessors. The C<$type_name> argument must be a string. The string may be either a class name or a type defined using Moose's type definition features. (Refer to L for information on how to define a new type, and how to retrieve type meta-data). =item I (1|0)> This will attempt to use coercion with the supplied type constraint to change the value passed into any accessors or constructors. You B supply a type constraint, and that type constraint B define a coercion. See L for an example. =item I $role_name> This will accept the name of a role which the value stored in this attribute is expected to have consumed. =item I (1|0)> This marks the attribute as being required. This means a value must be supplied during class construction, I the attribute must be lazy and have either a default or a builder. Note that C does not say anything about the attribute's value, which can be C. =item I (1|0)> This will tell the class to store the value of this attribute as a weakened reference. If an attribute is a weakened reference, it B also be coerced. Note that when a weak ref expires, the attribute's value becomes undefined, and is still considered to be set for purposes of predicate, default, etc. =item I (1|0)> This will tell the class to not create this slot until absolutely necessary. If an attribute is marked as lazy it B have a default or builder supplied. =item I $code> The I option is a CODE reference which will be called after the value of the attribute is set. The CODE ref is passed the instance itself, the updated value, and the original value if the attribute was already set. You B have a trigger on a read-only attribute. B Triggers will only fire when you B to the attribute, either in the constructor, or using the writer. Default and built values will B cause the trigger to be fired. =item I ARRAY | HASH | REGEXP | ROLE | ROLETYPE | DUCKTYPE | CODE> The I option provides Moose classes with automated delegation features. This is a pretty complex and powerful option. It accepts many different option formats, each with its own benefits and drawbacks. B The class being delegated to does not need to be a Moose based class, which is why this feature is especially useful when wrapping non-Moose classes. All I option formats share the following traits: You cannot override a locally defined method with a delegated method; an exception will be thrown if you try. That is to say, if you define C in your class, you cannot override it with a delegated C. This is almost never something you would want to do, and if it is, you should do it by hand and not use Moose. You cannot override any of the methods found in Moose::Object, or the C and C methods. These will not throw an exception, but will silently move on to the next method in the list. My reasoning for this is that you would almost never want to do this, since it usually breaks your class. As with overriding locally defined methods, if you do want to do this, you should do it manually, not with Moose. You do not I to have a reader (or accessor) for the attribute in order to delegate to it. Moose will create a means of accessing the value for you, however this will be several times B efficient then if you had given the attribute a reader (or accessor) to use. Below is the documentation for each option format: =over 4 =item C This is the most common usage for I. You basically pass a list of method names to be delegated, and Moose will install a delegation method for each one. =item C This is the second most common usage for I. Instead of a list of method names, you pass a HASH ref where each key is the method name you want installed locally, and its value is the name of the original method in the class being delegated to. This can be very useful for recursive classes like trees. Here is a quick example (soon to be expanded into a Moose::Cookbook recipe): package Tree; use Moose; has 'node' => (is => 'rw', isa => 'Any'); has 'children' => ( is => 'ro', isa => 'ArrayRef', default => sub { [] } ); has 'parent' => ( is => 'rw', isa => 'Tree', weak_ref => 1, handles => { parent_node => 'node', siblings => 'children', } ); In this example, the Tree package gets C and C methods, which delegate to the C and C methods (respectively) of the Tree instance stored in the C slot. You may also use an array reference to curry arguments to the original method. has 'thing' => ( ... handles => { set_foo => [ set => 'foo' ] }, ); # $self->set_foo(...) calls $self->thing->set('foo', ...) The first element of the array reference is the original method name, and the rest is a list of curried arguments. =item C The regexp option works very similar to the ARRAY option, except that it builds the list of methods for you. It starts by collecting all possible methods of the class being delegated to, then filters that list using the regexp supplied here. B An I option is required when using the regexp option format. This is so that we can determine (at compile time) the method list from the class. Without an I this is just not possible. =item C or C With the role option, you specify the name of a role or a L whose "interface" then becomes the list of methods to handle. The "interface" can be defined as; the methods of the role and any required methods of the role. It should be noted that this does B include any method modifiers or generated attribute methods (which is consistent with role composition). =item C With the duck type option, you pass a duck type object whose "interface" then becomes the list of methods to handle. The "interface" can be defined as the list of methods passed to C to create a duck type object. For more information on C please check L. =item C This is the option to use when you really want to do something funky. You should only use it if you really know what you are doing, as it involves manual metaclass twiddling. This takes a code reference, which should expect two arguments. The first is the attribute meta-object this I is attached to. The second is the metaclass of the class being delegated to. It expects you to return a hash (not a HASH ref) of the methods you want mapped. =back =item I [ @role_names ]> This tells Moose to take the list of C<@role_names> and apply them to the attribute meta-object. Custom attribute metaclass traits are useful for extending the capabilities of the I keyword: they are the simplest way to extend the MOP, but they are still a fairly advanced topic and too much to cover here. See L for details on how a trait name is resolved to a role name. Also see L for a metaclass trait example. =item I => Str The value of this key is the name of the method that will be called to obtain the value used to initialize the attribute. See the L and/or L for more information. =item I => SCALAR | CODE The value of this key is the default value which will initialize the attribute. NOTE: If the value is a simple scalar (string or number), then it can be just passed as is. However, if you wish to initialize it with a HASH or ARRAY ref, then you need to wrap that inside a CODE reference. See the L for more information. =item I => Str Creates a method allowing you to clear the value. See the L for more information. =item I => Str Creates a method to perform a basic test to see if a value has been set in the attribute. See the L for more information. Note that the predicate will return true even for a C attribute whose value has expired. =item I => $string An arbitrary string that can be retrieved later by calling C<< $attr->documentation >>. =back =head2 has +$name =E %options This is variation on the normal attribute creator C which allows you to clone and extend an attribute from a superclass or from a role. Here is an example of the superclass usage: package Foo; use Moose; has 'message' => ( is => 'rw', isa => 'Str', default => 'Hello, I am a Foo' ); package My::Foo; use Moose; extends 'Foo'; has '+message' => (default => 'Hello I am My::Foo'); What is happening here is that B is cloning the C attribute from its parent class B, retaining the C 'rw'> and C 'Str'> characteristics, but changing the value in C. Here is another example, but within the context of a role: package Foo::Role; use Moose::Role; has 'message' => ( is => 'rw', isa => 'Str', default => 'Hello, I am a Foo' ); package My::Foo; use Moose; with 'Foo::Role'; has '+message' => (default => 'Hello I am My::Foo'); In this case, we are basically taking the attribute which the role supplied and altering it within the bounds of this feature. Note that you can only extend an attribute from either a superclass or a role, you cannot extend an attribute in a role that composes over an attribute from another role. Aside from where the attributes come from (one from superclass, the other from a role), this feature works exactly the same. This feature is restricted somewhat, so as to try and force at least I sanity into it. Most options work the same, but there are some exceptions: =over 4 =item I =item I =item I =item I =item I These options can be added, but cannot override a superclass definition. =item I You are allowed to B additional traits to the C definition. These traits will be composed into the attribute, but preexisting traits B overridden, or removed. =back =head2 before $name|@names|\@names|qr/.../ =E sub { ... } =head2 after $name|@names|\@names|qr/.../ =E sub { ... } =head2 around $name|@names|\@names|qr/.../ =E sub { ... } These three items are syntactic sugar for the before, after, and around method modifier features that L provides. More information on these may be found in L and the L. =head2 override ($name, &sub) An C method is a way of explicitly saying "I am overriding this method from my superclass". You can call C within this method, and it will work as expected. The same thing I be accomplished with a normal method call and the C pseudo-package; it is really your choice. =head2 super The keyword C is a no-op when called outside of an C method. In the context of an C method, it will call the next most appropriate superclass method with the same arguments as the original method. =head2 augment ($name, &sub) An C method, is a way of explicitly saying "I am augmenting this method from my superclass". Once again, the details of how C and C work is best described in the L. =head2 inner The keyword C, much like C, is a no-op outside of the context of an C method. You can think of C as being the inverse of C; the details of how C and C work is best described in the L. =head2 blessed This is the C function. It is highly recommended that this is used instead of C anywhere you need to test for an object's class name. =head2 confess This is the C function, and exported here for historical reasons. =head1 METACLASS When you use Moose, you can specify traits which will be applied to your metaclass: use Moose -traits => 'My::Trait'; This is very similar to the attribute traits feature. When you do this, your class's C object will have the specified traits applied to it. =head2 Metaclass and Trait Name Resolution By default, when given a trait name, Moose simply tries to load a class of the same name. If such a class does not exist, it then looks for a class matching B. The C<$type> variable here will be one of B or B, depending on what the trait is being applied to. If a class with this long name exists, Moose checks to see if it has the method C. This method is expected to return the I class name of the trait. If there is no C method, it will fall back to using B as the trait name. The lookup method for metaclasses is the same, except that it looks for a class matching B. If all this is confusing, take a look at L, which demonstrates how to create an attribute trait. =head1 UNIMPORTING FUNCTIONS =head2 B Moose offers a way to remove the keywords it exports, through the C method. You simply have to say C at the bottom of your code for this to work. Here is an example: package Person; use Moose; has 'first_name' => (is => 'rw', isa => 'Str'); has 'last_name' => (is => 'rw', isa => 'Str'); sub full_name { my $self = shift; $self->first_name . ' ' . $self->last_name } no Moose; # keywords are removed from the Person package =head1 EXTENDING AND EMBEDDING MOOSE To learn more about extending Moose, we recommend checking out the "Extending" recipes in the L, starting with L, which provides an overview of all the different ways you might extend Moose. L and L are the modules which provide the majority of the extension functionality, so reading their documentation should also be helpful. =head2 The MooseX:: namespace Generally if you're writing an extension I Moose itself you'll want to put your extension in the C namespace. This namespace is specifically for extensions that make Moose better or different in some fundamental way. It is traditionally B for a package that just happens to use Moose. This namespace follows from the examples of the C and C namespaces that perform the same function for C and C respectively. =head1 METACLASS COMPATIBILITY AND MOOSE Metaclass compatibility is a thorny subject. You should start by reading the "About Metaclass compatibility" section in the L docs. Moose will attempt to resolve a few cases of metaclass incompatibility when you set the superclasses for a class, in addition to the cases that L handles. Moose tries to determine if the metaclasses only "differ by roles". This means that the parent and child's metaclass share a common ancestor in their respective hierarchies, and that the subclasses under the common ancestor are only different because of role applications. This case is actually fairly common when you mix and match various C modules, many of which apply roles to the metaclass. If the parent and child do differ by roles, Moose replaces the metaclass in the child with a newly created metaclass. This metaclass is a subclass of the parent's metaclass which does all of the roles that the child's metaclass did before being replaced. Effectively, this means the new metaclass does all of the roles done by both the parent's and child's original metaclasses. Ultimately, this is all transparent to you except in the case of an unresolvable conflict. =head1 CAVEATS It should be noted that C and C B be used in the same method. However, they may be combined within the same class hierarchy; see F for an example. The reason for this is that C is only valid within a method with the C modifier, and C will never be valid within an C method. In fact, C will skip over any C methods when searching for its appropriate C. This might seem like a restriction, but I am of the opinion that keeping these two features separate (yet interoperable) actually makes them easy to use, since their behavior is then easier to predict. Time will tell whether I am right or not (UPDATE: so far so good). =head1 GETTING HELP We offer both a mailing list and a very active IRC channel. The mailing list is L. You must be subscribed to send a message. To subscribe, send an empty message to L You can also visit us at C<#moose> on L This channel is quite active, and questions at all levels (on Moose-related topics ;) are welcome. =head1 WHAT DOES MOOSE STAND FOR? Moose doesn't stand for one thing in particular, however, if you want, here are a few of our favorites. Feel free to contribute more! =over 4 =item * Make Other Object Systems Envious =item * Makes Object Orientation So Easy =item * Makes Object Orientation Spiffy- Er (sorry ingy) =item * Most Other Object Systems Emasculate =item * Moose Often Ovulate Sorta Early =item * Moose Offers Often Super Extensions =item * Meta Object Obligates Salivary Excitation =item * Meta Object Orientation Syntax Extensions =item * Moo, Only Overengineered, Slow, and Execrable (blame rjbs!) =item * Massive Object-Oriented Stacktrace Emitter =back =head1 ACKNOWLEDGEMENTS =over 4 =item I blame Sam Vilain for introducing me to the insanity that is meta-models. =item I blame Audrey Tang for then encouraging my meta-model habit in #perl6. =item Without Yuval "nothingmuch" Kogman this module would not be possible, and it certainly wouldn't have this name ;P =item The basis of the TypeContraints module was Rob Kinyon's idea originally, I just ran with it. =item Thanks to mst & chansen and the whole #moose posse for all the early ideas/feature-requests/encouragement/bug-finding. =item Thanks to David "Theory" Wheeler for meta-discussions and spelling fixes. =back =head1 SEE ALSO =over 4 =item L This is the official web home of Moose. It contains links to our public git repository, as well as links to a number of talks and articles on Moose and Moose related technologies. =item the L This is an introduction to Moose which covers most of the basics. =item Modern Perl, by chromatic This is an introduction to modern Perl programming, which includes a section on Moose. It is available in print and as a free download from L. =item The Moose is flying, a tutorial by Randal Schwartz Part 1 - L Part 2 - L =item Several Moose extension modules in the C namespace. See L for extensions. =back =head2 Books =over 4 =item The Art of the MetaObject Protocol I mention this in the L docs too, as this book was critical in the development of both modules and is highly recommended. =back =head2 Papers =over 4 =item L This paper (suggested by lbr on #moose) was what lead to the implementation of the C/C and C/C features. If you really want to understand them, I suggest you read this. =back =head1 BUGS All complex software has bugs lurking in it, and this module is no exception. Please report any bugs to C, or through the web interface at L. You can also submit a C test as a pull request at L. You can also discuss feature requests or possible bugs on the Moose mailing list (moose@perl.org) or on IRC at L. =head1 FEATURE REQUESTS We are very strict about what features we add to the Moose core, especially the user-visible features. Instead we have made sure that the underlying meta-system of Moose is as extensible as possible so that you can add your own features easily. That said, occasionally there is a feature needed in the meta-system to support your planned extension, in which case you should either email the mailing list (moose@perl.org) or join us on IRC at L to discuss. The L has more detail about how and when you can contribute. =head1 CABAL There are only a few people with the rights to release a new version of Moose. The Moose Cabal are the people to go to with questions regarding the wider purview of Moose. They help maintain not just the code but the community as well. See the list below under L. =head1 CONTRIBUTORS Moose is a community project, and as such, involves the work of many, many members of the community beyond just the members in the cabal. In particular: Dave (autarch) Rolsky wrote most of the documentation in L. John (jgoulah) Goulah wrote L. Jess (castaway) Robinson wrote L. Aran (bluefeet) Clary Deltac wrote L. Anders (Debolaz) Nor Berle contributed L and L. Also, the code in L is based on code from the L distribution, which had contributions from: Chris (perigrin) Prather Cory (gphat) Watson Evan Carroll Florian (rafl) Ragwitz Jason May Jay Hannah Jesse (doy) Luehrs Paul (frodwith) Driver Robert (rlb3) Boone Robert Buels Robert (phaylon) Sedlacek Shawn (Sartak) Moore Stevan Little Tom (dec) Lanyon Yuval Kogman Finally, these people also contributed various tests, bug fixes, documentation, and features to the Moose codebase: Aankhen Adam (Alias) Kennedy Christian (chansen) Hansen Cory (gphat) Watson Dylan Hardison (doc fixes) Eric (ewilhelm) Wilhelm Evan Carroll Guillermo (groditi) Roditi Jason May Jay Hannah Jonathan (jrockway) Rockway Matt (mst) Trout Nathan (kolibrie) Gray Paul (frodwith) Driver Piotr (dexter) Roszatycki Robert Buels Robert (phaylon) Sedlacek Robert (rlb3) Boone Sam (mugwump) Vilain Scott (konobi) McWhirter Shlomi (rindolf) Fish Tom (dec) Lanyon Wallace (wreis) Reis ... and many other #moose folks =head1 AUTHORS =over 4 =item * Stevan Little =item * Dave Rolsky =item * Jesse Luehrs =item * Shawn M Moore =item * יובל קוג'מן (Yuval Kogman) =item * Karen Etheridge =item * Florian Ragwitz =item * Hans Dieter Pearcey =item * Chris Prather =item * Matt S Trout =back =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2006 by Infinity Interactive, Inc. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Moose-2.2200/lib/metaclass.pm000640 000766 000024 00000006347 14137574636 016242 0ustar00etherstaff000000 000000 package metaclass; our $VERSION = '2.2200'; use strict; use warnings; use Module::Runtime 'use_package_optimistically', 'use_module'; use Class::MOP; sub import { my ( $class, @args ) = @_; unshift @args, "metaclass" if @args % 2 == 1; my %options = @args; my $meta_name = exists $options{meta_name} ? $options{meta_name} : 'meta'; my $metaclass = delete $options{metaclass}; unless ( defined $metaclass ) { $metaclass = "Class::MOP::Class"; } else { use_package_optimistically($metaclass); } ($metaclass->isa('Class::MOP::Class')) || die use_module('Moose::Exception::MetaclassMustBeDerivedFromClassMOPClass')->new( class_name => $metaclass ); # make sure the custom metaclasses get loaded foreach my $key (grep { /_(?:meta)?class$/ } keys %options) { unless ( ref( my $class = $options{$key} ) ) { use_package_optimistically($class) } } my $package = caller(); # create a meta object so we can install &meta my $meta = $metaclass->initialize($package => %options); $meta->_add_meta_method($meta_name) if defined $meta_name; } 1; # ABSTRACT: a pragma for installing and using Class::MOP metaclasses __END__ =pod =encoding UTF-8 =head1 NAME metaclass - a pragma for installing and using Class::MOP metaclasses =head1 VERSION version 2.2200 =head1 SYNOPSIS package MyClass; # use Class::MOP::Class use metaclass; # ... or use a custom metaclass use metaclass 'MyMetaClass'; # ... or use a custom metaclass # and custom attribute and method # metaclasses use metaclass 'MyMetaClass' => ( 'attribute_metaclass' => 'MyAttributeMetaClass', 'method_metaclass' => 'MyMethodMetaClass', ); # ... or just specify custom attribute # and method classes, and Class::MOP::Class # is the assumed metaclass use metaclass ( 'attribute_metaclass' => 'MyAttributeMetaClass', 'method_metaclass' => 'MyMethodMetaClass', ); # if we'd rather not install a 'meta' method, we can do this use metaclass meta_name => undef; # or if we'd like it to have a different name, use metaclass meta_name => 'my_meta'; =head1 DESCRIPTION This is a pragma to make it easier to use a specific metaclass and a set of custom attribute and method metaclasses. It also installs a C method to your class as well, unless C is passed to the C option. Note that if you are using Moose, you most likely do B want to be using this - look into L instead. =head1 AUTHORS =over 4 =item * Stevan Little =item * Dave Rolsky =item * Jesse Luehrs =item * Shawn M Moore =item * יובל קוג'מן (Yuval Kogman) =item * Karen Etheridge =item * Florian Ragwitz =item * Hans Dieter Pearcey =item * Chris Prather =item * Matt S Trout =back =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2006 by Infinity Interactive, Inc. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Moose-2.2200/lib/oose.pm000640 000766 000024 00000005166 14137574636 015231 0ustar00etherstaff000000 000000 package oose; our $VERSION = '2.2200'; use strict; use warnings; use Moose::Util (); BEGIN { my $package; sub import { $package = $_[1] || 'Class'; if ($package =~ /^\+/) { $package =~ s/^\+//; Moose::Util::_load_user_class($package); } } use Filter::Simple sub { s/^/package $package;\nuse Moose;use Moose::Util::TypeConstraints;\n/; } } 1; # ABSTRACT: syntactic sugar to make Moose one-liners easier __END__ =pod =encoding UTF-8 =head1 NAME oose - syntactic sugar to make Moose one-liners easier =head1 VERSION version 2.2200 =head1 SYNOPSIS # create a Moose class on the fly ... perl -Moose=Foo -e 'has bar => ( is=>q[ro], default => q[baz] ); print Foo->new->bar' # prints baz # loads an existing class (Moose or non-Moose) # and re-"opens" the package definition to make # debugging/introspection easier perl -Moose=+My::Class -e 'print join ", " => __PACKAGE__->meta->get_method_list' # also loads Moose::Util::TypeConstraints to allow subtypes etc perl -Moose=Person -e'subtype q[ValidAge] => as q[Int] => where { $_ > 0 && $_ < 78 }; has => age ( isa => q[ValidAge], is => q[ro]); Person->new(age => 90)' =head1 DESCRIPTION oose.pm is a simple source filter that adds C to the beginning of your script and was entirely created because typing C was annoying me. =head1 INTERFACE oose provides exactly one method and it's automatically called by perl: =over 4 =item B Pass a package name to import to be used by the source filter. The package defaults to C if none is given. =back =head1 DEPENDENCIES You will need L and eventually L =head1 INCOMPATIBILITIES None reported. But it is a source filter and might have issues there. =head1 BUGS See L for details on reporting bugs. =head1 AUTHORS =over 4 =item * Stevan Little =item * Dave Rolsky =item * Jesse Luehrs =item * Shawn M Moore =item * יובל קוג'מן (Yuval Kogman) =item * Karen Etheridge =item * Florian Ragwitz =item * Hans Dieter Pearcey =item * Chris Prather =item * Matt S Trout =back =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2006 by Infinity Interactive, Inc. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Moose-2.2200/lib/Class/000770 000766 000024 00000000000 14137574636 014764 5ustar00etherstaff000000 000000 Moose-2.2200/lib/Class/MOP.pm000640 000766 000024 00000114463 14137574636 015765 0ustar00etherstaff000000 000000 package Class::MOP; our $VERSION = '2.2200'; use strict; use warnings; use 5.008003; use MRO::Compat; use Class::Load 0.07 (); use Scalar::Util 'weaken', 'isweak', 'blessed'; use Data::OptList; use Class::MOP::Mixin::AttributeCore; use Class::MOP::Mixin::HasAttributes; use Class::MOP::Mixin::HasMethods; use Class::MOP::Mixin::HasOverloads; use Class::MOP::Class; use Class::MOP::Attribute; use Class::MOP::Method; BEGIN { *IS_RUNNING_ON_5_10 = ("$]" < 5.009_005) ? sub () { 0 } : sub () { 1 }; # this is either part of core or set up appropriately by MRO::Compat *check_package_cache_flag = \&mro::get_pkg_gen; } XSLoader::load( 'Moose', $VERSION, ); { # Metaclasses are singletons, so we cache them here. # there is no need to worry about destruction though # because they should die only when the program dies. # After all, do package definitions even get reaped? # Anonymous classes manage their own destruction. my %METAS; sub get_all_metaclasses { %METAS } sub get_all_metaclass_instances { values %METAS } sub get_all_metaclass_names { keys %METAS } sub get_metaclass_by_name { $METAS{$_[0]} } sub store_metaclass_by_name { $METAS{$_[0]} = $_[1] } sub weaken_metaclass { weaken($METAS{$_[0]}) } sub metaclass_is_weak { isweak($METAS{$_[0]}) } sub does_metaclass_exist { exists $METAS{$_[0]} && defined $METAS{$_[0]} } sub remove_metaclass_by_name { delete $METAS{$_[0]}; return } # This handles instances as well as class names sub class_of { return unless defined $_[0]; my $class = blessed($_[0]) || $_[0]; return $METAS{$class}; } # NOTE: # We only cache metaclasses, meaning instances of # Class::MOP::Class. We do not cache instance of # Class::MOP::Package or Class::MOP::Module. Mostly # because I don't yet see a good reason to do so. } sub load_class { Class::MOP::Deprecated::deprecated( message => 'Class::MOP::load_class is deprecated', feature => 'Class::Load wrapper functions', ); require Class::Load; goto &Class::Load::load_class; } sub load_first_existing_class { Class::MOP::Deprecated::deprecated( message => 'Class::MOP::load_first_existing_class is deprecated', feature => 'Class::Load wrapper functions', ); require Class::Load; goto &Class::Load::load_first_existing_class; } sub is_class_loaded { Class::MOP::Deprecated::deprecated( message => 'Class::MOP::is_class_loaded is deprecated', feature => 'Class::Load wrapper functions', ); require Class::Load; goto &Class::Load::is_class_loaded; } sub _definition_context { my %context; @context{qw(package file line)} = caller(0); return ( definition_context => \%context, ); } ## ---------------------------------------------------------------------------- ## Setting up our environment ... ## ---------------------------------------------------------------------------- ## Class::MOP needs to have a few things in the global perl environment so ## that it can operate effectively. Those things are done here. ## ---------------------------------------------------------------------------- # ... nothing yet actually ;) ## ---------------------------------------------------------------------------- ## Bootstrapping ## ---------------------------------------------------------------------------- ## The code below here is to bootstrap our MOP with itself. This is also ## sometimes called "tying the knot". By doing this, we make it much easier ## to extend the MOP through subclassing and such since now you can use the ## MOP itself to extend itself. ## ## Yes, I know, that's weird and insane, but it's a good thing, trust me :) ## ---------------------------------------------------------------------------- # We need to add in the meta-attributes here so that # any subclass of Class::MOP::* will be able to # inherit them using _construct_instance ## -------------------------------------------------------- ## Class::MOP::Mixin::HasMethods Class::MOP::Mixin::HasMethods->meta->add_attribute( Class::MOP::Attribute->new('_methods' => ( reader => { # NOTE: # we just alias the original method # rather than re-produce it here '_method_map' => \&Class::MOP::Mixin::HasMethods::_method_map }, default => sub { {} }, _definition_context(), )) ); Class::MOP::Mixin::HasMethods->meta->add_attribute( Class::MOP::Attribute->new('method_metaclass' => ( reader => { # NOTE: # we just alias the original method # rather than re-produce it here 'method_metaclass' => \&Class::MOP::Mixin::HasMethods::method_metaclass }, default => 'Class::MOP::Method', _definition_context(), )) ); Class::MOP::Mixin::HasMethods->meta->add_attribute( Class::MOP::Attribute->new('wrapped_method_metaclass' => ( reader => { # NOTE: # we just alias the original method # rather than re-produce it here 'wrapped_method_metaclass' => \&Class::MOP::Mixin::HasMethods::wrapped_method_metaclass }, default => 'Class::MOP::Method::Wrapped', _definition_context(), )) ); ## -------------------------------------------------------- ## Class::MOP::Mixin::HasAttributes Class::MOP::Mixin::HasAttributes->meta->add_attribute( Class::MOP::Attribute->new('attributes' => ( reader => { # NOTE: we need to do this in order # for the instance meta-object to # not fall into meta-circular death # # we just alias the original method # rather than re-produce it here '_attribute_map' => \&Class::MOP::Mixin::HasAttributes::_attribute_map }, default => sub { {} }, _definition_context(), )) ); Class::MOP::Mixin::HasAttributes->meta->add_attribute( Class::MOP::Attribute->new('attribute_metaclass' => ( reader => { # NOTE: # we just alias the original method # rather than re-produce it here 'attribute_metaclass' => \&Class::MOP::Mixin::HasAttributes::attribute_metaclass }, default => 'Class::MOP::Attribute', _definition_context(), )) ); ## -------------------------------------------------------- ## Class::MOP::Mixin::HasOverloads Class::MOP::Mixin::HasOverloads->meta->add_attribute( Class::MOP::Attribute->new('_overload_map' => ( reader => { '_overload_map' => \&Class::MOP::Mixin::HasOverloads::_overload_map }, clearer => '_clear_overload_map', default => sub { {} }, _definition_context(), )) ); ## -------------------------------------------------------- ## Class::MOP::Package Class::MOP::Package->meta->add_attribute( Class::MOP::Attribute->new('package' => ( reader => { # NOTE: we need to do this in order # for the instance meta-object to # not fall into meta-circular death # # we just alias the original method # rather than re-produce it here 'name' => \&Class::MOP::Package::name }, _definition_context(), )) ); Class::MOP::Package->meta->add_attribute( Class::MOP::Attribute->new('namespace' => ( reader => { # NOTE: # we just alias the original method # rather than re-produce it here 'namespace' => \&Class::MOP::Package::namespace }, init_arg => undef, default => sub { \undef }, _definition_context(), )) ); ## -------------------------------------------------------- ## Class::MOP::Module # NOTE: # yeah this is kind of stretching things a bit, # but truthfully the version should be an attribute # of the Module, the weirdness comes from having to # stick to Perl 5 convention and store it in the # $VERSION package variable. Basically if you just # squint at it, it will look how you want it to look. # Either as a package variable, or as a attribute of # the metaclass, isn't abstraction great :) Class::MOP::Module->meta->add_attribute( Class::MOP::Attribute->new('version' => ( reader => { # NOTE: # we just alias the original method # rather than re-produce it here 'version' => \&Class::MOP::Module::version }, init_arg => undef, default => sub { \undef }, _definition_context(), )) ); # NOTE: # By following the same conventions as version here, # we are opening up the possibility that people can # use the $AUTHORITY in non-Class::MOP modules as # well. Class::MOP::Module->meta->add_attribute( Class::MOP::Attribute->new('authority' => ( reader => { # NOTE: # we just alias the original method # rather than re-produce it here 'authority' => \&Class::MOP::Module::authority }, init_arg => undef, default => sub { \undef }, _definition_context(), )) ); ## -------------------------------------------------------- ## Class::MOP::Class Class::MOP::Class->meta->add_attribute( Class::MOP::Attribute->new('superclasses' => ( accessor => { # NOTE: # we just alias the original method # rather than re-produce it here 'superclasses' => \&Class::MOP::Class::superclasses }, init_arg => undef, default => sub { \undef }, _definition_context(), )) ); Class::MOP::Class->meta->add_attribute( Class::MOP::Attribute->new('instance_metaclass' => ( reader => { # NOTE: we need to do this in order # for the instance meta-object to # not fall into meta-circular death # # we just alias the original method # rather than re-produce it here 'instance_metaclass' => \&Class::MOP::Class::instance_metaclass }, default => 'Class::MOP::Instance', _definition_context(), )) ); Class::MOP::Class->meta->add_attribute( Class::MOP::Attribute->new('immutable_trait' => ( reader => { 'immutable_trait' => \&Class::MOP::Class::immutable_trait }, default => "Class::MOP::Class::Immutable::Trait", _definition_context(), )) ); Class::MOP::Class->meta->add_attribute( Class::MOP::Attribute->new('constructor_name' => ( reader => { 'constructor_name' => \&Class::MOP::Class::constructor_name, }, default => "new", _definition_context(), )) ); Class::MOP::Class->meta->add_attribute( Class::MOP::Attribute->new('constructor_class' => ( reader => { 'constructor_class' => \&Class::MOP::Class::constructor_class, }, default => "Class::MOP::Method::Constructor", _definition_context(), )) ); Class::MOP::Class->meta->add_attribute( Class::MOP::Attribute->new('destructor_class' => ( reader => { 'destructor_class' => \&Class::MOP::Class::destructor_class, }, _definition_context(), )) ); # NOTE: # we don't actually need to tie the knot with # Class::MOP::Class here, it is actually handled # within Class::MOP::Class itself in the # _construct_class_instance method. ## -------------------------------------------------------- ## Class::MOP::Mixin::AttributeCore Class::MOP::Mixin::AttributeCore->meta->add_attribute( Class::MOP::Attribute->new('name' => ( reader => { # NOTE: we need to do this in order # for the instance meta-object to # not fall into meta-circular death # # we just alias the original method # rather than re-produce it here 'name' => \&Class::MOP::Mixin::AttributeCore::name }, _definition_context(), )) ); Class::MOP::Mixin::AttributeCore->meta->add_attribute( Class::MOP::Attribute->new('accessor' => ( reader => { 'accessor' => \&Class::MOP::Mixin::AttributeCore::accessor }, predicate => { 'has_accessor' => \&Class::MOP::Mixin::AttributeCore::has_accessor }, _definition_context(), )) ); Class::MOP::Mixin::AttributeCore->meta->add_attribute( Class::MOP::Attribute->new('reader' => ( reader => { 'reader' => \&Class::MOP::Mixin::AttributeCore::reader }, predicate => { 'has_reader' => \&Class::MOP::Mixin::AttributeCore::has_reader }, _definition_context(), )) ); Class::MOP::Mixin::AttributeCore->meta->add_attribute( Class::MOP::Attribute->new('initializer' => ( reader => { 'initializer' => \&Class::MOP::Mixin::AttributeCore::initializer }, predicate => { 'has_initializer' => \&Class::MOP::Mixin::AttributeCore::has_initializer }, _definition_context(), )) ); Class::MOP::Mixin::AttributeCore->meta->add_attribute( Class::MOP::Attribute->new('definition_context' => ( reader => { 'definition_context' => \&Class::MOP::Mixin::AttributeCore::definition_context }, _definition_context(), )) ); Class::MOP::Mixin::AttributeCore->meta->add_attribute( Class::MOP::Attribute->new('writer' => ( reader => { 'writer' => \&Class::MOP::Mixin::AttributeCore::writer }, predicate => { 'has_writer' => \&Class::MOP::Mixin::AttributeCore::has_writer }, _definition_context(), )) ); Class::MOP::Mixin::AttributeCore->meta->add_attribute( Class::MOP::Attribute->new('predicate' => ( reader => { 'predicate' => \&Class::MOP::Mixin::AttributeCore::predicate }, predicate => { 'has_predicate' => \&Class::MOP::Mixin::AttributeCore::has_predicate }, _definition_context(), )) ); Class::MOP::Mixin::AttributeCore->meta->add_attribute( Class::MOP::Attribute->new('clearer' => ( reader => { 'clearer' => \&Class::MOP::Mixin::AttributeCore::clearer }, predicate => { 'has_clearer' => \&Class::MOP::Mixin::AttributeCore::has_clearer }, _definition_context(), )) ); Class::MOP::Mixin::AttributeCore->meta->add_attribute( Class::MOP::Attribute->new('builder' => ( reader => { 'builder' => \&Class::MOP::Mixin::AttributeCore::builder }, predicate => { 'has_builder' => \&Class::MOP::Mixin::AttributeCore::has_builder }, _definition_context(), )) ); Class::MOP::Mixin::AttributeCore->meta->add_attribute( Class::MOP::Attribute->new('init_arg' => ( reader => { 'init_arg' => \&Class::MOP::Mixin::AttributeCore::init_arg }, predicate => { 'has_init_arg' => \&Class::MOP::Mixin::AttributeCore::has_init_arg }, _definition_context(), )) ); Class::MOP::Mixin::AttributeCore->meta->add_attribute( Class::MOP::Attribute->new('default' => ( # default has a custom 'reader' method ... predicate => { 'has_default' => \&Class::MOP::Mixin::AttributeCore::has_default }, _definition_context(), )) ); Class::MOP::Mixin::AttributeCore->meta->add_attribute( Class::MOP::Attribute->new('insertion_order' => ( reader => { 'insertion_order' => \&Class::MOP::Mixin::AttributeCore::insertion_order }, writer => { '_set_insertion_order' => \&Class::MOP::Mixin::AttributeCore::_set_insertion_order }, predicate => { 'has_insertion_order' => \&Class::MOP::Mixin::AttributeCore::has_insertion_order }, _definition_context(), )) ); ## -------------------------------------------------------- ## Class::MOP::Attribute Class::MOP::Attribute->meta->add_attribute( Class::MOP::Attribute->new('associated_class' => ( reader => { # NOTE: we need to do this in order # for the instance meta-object to # not fall into meta-circular death # # we just alias the original method # rather than re-produce it here 'associated_class' => \&Class::MOP::Attribute::associated_class }, _definition_context(), )) ); Class::MOP::Attribute->meta->add_attribute( Class::MOP::Attribute->new('associated_methods' => ( reader => { 'associated_methods' => \&Class::MOP::Attribute::associated_methods }, default => sub { [] }, _definition_context(), )) ); Class::MOP::Attribute->meta->add_method('clone' => sub { my $self = shift; $self->meta->clone_object($self, @_); }); ## -------------------------------------------------------- ## Class::MOP::Method Class::MOP::Method->meta->add_attribute( Class::MOP::Attribute->new('body' => ( reader => { 'body' => \&Class::MOP::Method::body }, _definition_context(), )) ); Class::MOP::Method->meta->add_attribute( Class::MOP::Attribute->new('associated_metaclass' => ( reader => { 'associated_metaclass' => \&Class::MOP::Method::associated_metaclass }, _definition_context(), )) ); Class::MOP::Method->meta->add_attribute( Class::MOP::Attribute->new('package_name' => ( reader => { 'package_name' => \&Class::MOP::Method::package_name }, _definition_context(), )) ); Class::MOP::Method->meta->add_attribute( Class::MOP::Attribute->new('name' => ( reader => { 'name' => \&Class::MOP::Method::name }, _definition_context(), )) ); Class::MOP::Method->meta->add_attribute( Class::MOP::Attribute->new('original_method' => ( reader => { 'original_method' => \&Class::MOP::Method::original_method }, writer => { '_set_original_method' => \&Class::MOP::Method::_set_original_method }, _definition_context(), )) ); ## -------------------------------------------------------- ## Class::MOP::Method::Wrapped # NOTE: # the way this item is initialized, this # really does not follow the standard # practices of attributes, but we put # it here for completeness Class::MOP::Method::Wrapped->meta->add_attribute( Class::MOP::Attribute->new('modifier_table' => ( _definition_context(), )) ); ## -------------------------------------------------------- ## Class::MOP::Method::Generated Class::MOP::Method::Generated->meta->add_attribute( Class::MOP::Attribute->new('is_inline' => ( reader => { 'is_inline' => \&Class::MOP::Method::Generated::is_inline }, default => 0, _definition_context(), )) ); Class::MOP::Method::Generated->meta->add_attribute( Class::MOP::Attribute->new('definition_context' => ( reader => { 'definition_context' => \&Class::MOP::Method::Generated::definition_context }, _definition_context(), )) ); ## -------------------------------------------------------- ## Class::MOP::Method::Inlined Class::MOP::Method::Inlined->meta->add_attribute( Class::MOP::Attribute->new('_expected_method_class' => ( reader => { '_expected_method_class' => \&Class::MOP::Method::Inlined::_expected_method_class }, _definition_context(), )) ); ## -------------------------------------------------------- ## Class::MOP::Method::Accessor Class::MOP::Method::Accessor->meta->add_attribute( Class::MOP::Attribute->new('attribute' => ( reader => { 'associated_attribute' => \&Class::MOP::Method::Accessor::associated_attribute }, _definition_context(), )) ); Class::MOP::Method::Accessor->meta->add_attribute( Class::MOP::Attribute->new('accessor_type' => ( reader => { 'accessor_type' => \&Class::MOP::Method::Accessor::accessor_type }, _definition_context(), )) ); ## -------------------------------------------------------- ## Class::MOP::Method::Constructor Class::MOP::Method::Constructor->meta->add_attribute( Class::MOP::Attribute->new('options' => ( reader => { 'options' => \&Class::MOP::Method::Constructor::options }, default => sub { +{} }, _definition_context(), )) ); Class::MOP::Method::Constructor->meta->add_attribute( Class::MOP::Attribute->new('associated_metaclass' => ( init_arg => "metaclass", # FIXME alias and rename reader => { 'associated_metaclass' => \&Class::MOP::Method::Constructor::associated_metaclass }, _definition_context(), )) ); ## -------------------------------------------------------- ## Class::MOP::Overload Class::MOP::Overload->meta->add_attribute( Class::MOP::Attribute->new( 'operator' => ( reader => { 'operator' => \&Class::MOP::Overload::operator }, required => 1, _definition_context(), ) ) ); for my $attr (qw( method_name coderef coderef_package coderef_name method )) { Class::MOP::Overload->meta->add_attribute( Class::MOP::Attribute->new( $attr => ( reader => { $attr => Class::MOP::Overload->can($attr) }, predicate => { 'has_' . $attr => Class::MOP::Overload->can( 'has_' . $attr ) }, _definition_context(), ) ) ); } Class::MOP::Overload->meta->add_attribute( Class::MOP::Attribute->new( 'associated_metaclass' => ( reader => { 'associated_metaclass' => \&Class::MOP::Overload::associated_metaclass }, _definition_context(), ) ) ); ## -------------------------------------------------------- ## Class::MOP::Instance # NOTE: # these don't yet do much of anything, but are just # included for completeness Class::MOP::Instance->meta->add_attribute( Class::MOP::Attribute->new('associated_metaclass', reader => { associated_metaclass => \&Class::MOP::Instance::associated_metaclass }, _definition_context(), ), ); Class::MOP::Instance->meta->add_attribute( Class::MOP::Attribute->new('_class_name', init_arg => undef, reader => { _class_name => \&Class::MOP::Instance::_class_name }, #lazy => 1, # not yet supported by Class::MOP but out our version does it anyway #default => sub { $_[0]->associated_metaclass->name }, _definition_context(), ), ); Class::MOP::Instance->meta->add_attribute( Class::MOP::Attribute->new('attributes', reader => { attributes => \&Class::MOP::Instance::get_all_attributes }, _definition_context(), ), ); Class::MOP::Instance->meta->add_attribute( Class::MOP::Attribute->new('slots', reader => { slots => \&Class::MOP::Instance::slots }, _definition_context(), ), ); Class::MOP::Instance->meta->add_attribute( Class::MOP::Attribute->new('slot_hash', reader => { slot_hash => \&Class::MOP::Instance::slot_hash }, _definition_context(), ), ); ## -------------------------------------------------------- ## Class::MOP::Object # need to replace the meta method there with a real meta method object Class::MOP::Object->meta->_add_meta_method('meta'); ## -------------------------------------------------------- ## Class::MOP::Mixin # need to replace the meta method there with a real meta method object Class::MOP::Mixin->meta->_add_meta_method('meta'); require Class::MOP::Deprecated unless our $no_deprecated; # we need the meta instance of the meta instance to be created now, in order # for the constructor to be able to use it Class::MOP::Instance->meta->get_meta_instance; # pretend the add_method never happened. it hasn't yet affected anything undef Class::MOP::Instance->meta->{_package_cache_flag}; ## -------------------------------------------------------- ## Now close all the Class::MOP::* classes # NOTE: we don't need to inline the accessors this only lengthens the compile # time of the MOP, and gives us no actual benefits. $_->meta->make_immutable( inline_constructor => 0, constructor_name => "_new", inline_accessors => 0, ) for qw/ Class::MOP::Package Class::MOP::Module Class::MOP::Class Class::MOP::Attribute Class::MOP::Method Class::MOP::Instance Class::MOP::Object Class::MOP::Method::Generated Class::MOP::Method::Inlined Class::MOP::Method::Accessor Class::MOP::Method::Constructor Class::MOP::Method::Wrapped Class::MOP::Method::Meta Class::MOP::Overload /; $_->meta->make_immutable( inline_constructor => 0, constructor_name => undef, inline_accessors => 0, ) for qw/ Class::MOP::Mixin Class::MOP::Mixin::AttributeCore Class::MOP::Mixin::HasAttributes Class::MOP::Mixin::HasMethods Class::MOP::Mixin::HasOverloads /; 1; # ABSTRACT: A Meta Object Protocol for Perl 5 __END__ =pod =encoding UTF-8 =head1 NAME Class::MOP - A Meta Object Protocol for Perl 5 =head1 VERSION version 2.2200 =head1 DESCRIPTION This module is a fully functioning meta object protocol for the Perl 5 object system. It makes no attempt to change the behavior or characteristics of the Perl 5 object system, only to create a protocol for its manipulation and introspection. That said, it does attempt to create the tools for building a rich set of extensions to the Perl 5 object system. Every attempt has been made to abide by the spirit of the Perl 5 object system that we all know and love. This documentation is sparse on conceptual details. We suggest looking at the items listed in the L section for more information. In particular the book "The Art of the Meta Object Protocol" was very influential in the development of this system. =head2 What is a Meta Object Protocol? A meta object protocol is an API to an object system. To be more specific, it abstracts the components of an object system (classes, object, methods, object attributes, etc.). These abstractions can then be used to inspect and manipulate the object system which they describe. It can be said that there are two MOPs for any object system; the implicit MOP and the explicit MOP. The implicit MOP handles things like method dispatch or inheritance, which happen automatically as part of how the object system works. The explicit MOP typically handles the introspection/reflection features of the object system. All object systems have implicit MOPs. Without one, they would not work. Explicit MOPs are much less common, and depending on the language can vary from restrictive (Reflection in Java or C#) to wide open (CLOS is a perfect example). =head2 Yet Another Class Builder! Why? This is B a class builder so much as a I>. The intent is that an end user will not use this module directly, but instead this module is used by module authors to build extensions and features onto the Perl 5 object system. This system is used by L, which supplies a powerful class builder system built entirely on top of C. =head2 Who is this module for? This module is for anyone who has ever created or wanted to create a module for the Class:: namespace. The tools which this module provides make doing complex Perl 5 wizardry simpler, by removing such barriers as the need to hack symbol tables, or understand the fine details of method dispatch. =head2 What changes do I have to make to use this module? This module was designed to be as unobtrusive as possible. Many of its features are accessible without B change to your existing code. It is meant to be a complement to your existing code and not an intrusion on your code base. Unlike many other B modules, this module B require you subclass it, or even that you C it in within your module's package. The only features which require additions to your code are the attribute handling and instance construction features, and these are both completely optional features. The only reason for this is because Perl 5's object system does not actually have these features built in. More information about this feature can be found below. =head2 About Performance It is a common misconception that explicit MOPs are a performance hit. This is not a universal truth, it is a side-effect of some specific implementations. For instance, using Java reflection is slow because the JVM cannot take advantage of any compiler optimizations, and the JVM has to deal with much more runtime type information as well. Reflection in C# is marginally better as it was designed into the language and runtime (the CLR). In contrast, CLOS (the Common Lisp Object System) was built to support an explicit MOP, and so performance is tuned for it. This library in particular does its absolute best to avoid putting B drain at all upon your code's performance. In fact, by itself it does nothing to affect your existing code. So you only pay for what you actually use. =head2 About Metaclass compatibility This module makes sure that all metaclasses created are both upwards and downwards compatible. The topic of metaclass compatibility is highly esoteric and is something only encountered when doing deep and involved metaclass hacking. There are two basic kinds of metaclass incompatibility; upwards and downwards. Upwards metaclass compatibility means that the metaclass of a given class is either the same as (or a subclass of) all of the metaclasses of the class's ancestors. Downward metaclass compatibility means that the metaclasses of a given class's ancestors are all the same as (or a subclass of) that class's metaclass. Here is a diagram showing a set of two classes (C and C) and two metaclasses (C and C) which have correct metaclass compatibility both upwards and downwards. +---------+ +---------+ | Meta::A |<----| Meta::B | <....... (instance of ) +---------+ +---------+ <------- (inherits from) ^ ^ : : +---------+ +---------+ | A |<----| B | +---------+ +---------+ In actuality, I of a class's metaclasses must be compatible, not just the class metaclass. That includes the instance, attribute, and method metaclasses, as well as the constructor and destructor classes. C will attempt to fix some simple types of incompatibilities. If all the metaclasses for the parent class are I of the child's metaclasses then we can simply replace the child's metaclasses with the parent's. In addition, if the child is missing a metaclass that the parent has, we can also just make the child use the parent's metaclass. As I said this is a highly esoteric topic and one you will only run into if you do a lot of subclassing of L. If you are interested in why this is an issue see the paper I linked to in the L section of this document. =head2 Using custom metaclasses Always use the L pragma when using a custom metaclass, this will ensure the proper initialization order and not accidentally create an incorrect type of metaclass for you. This is a very rare problem, and one which can only occur if you are doing deep metaclass programming. So in other words, don't worry about it. Note that if you're using L we encourage you to I use the L pragma, and instead use L to apply roles to a class's metaclasses. This topic is covered at length in various L recipes. =head1 PROTOCOLS The meta-object protocol is divided into 4 main sub-protocols: =head2 The Class protocol This provides a means of manipulating and introspecting a Perl 5 class. It handles symbol table hacking for you, and provides a rich set of methods that go beyond simple package introspection. See L for more details. =head2 The Attribute protocol This provides a consistent representation for an attribute of a Perl 5 class. Since there are so many ways to create and handle attributes in Perl 5 OO, the Attribute protocol provide as much of a unified approach as possible. Of course, you are always free to extend this protocol by subclassing the appropriate classes. See L for more details. =head2 The Method protocol This provides a means of manipulating and introspecting methods in the Perl 5 object system. As with attributes, there are many ways to approach this topic, so we try to keep it pretty basic, while still making it possible to extend the system in many ways. See L for more details. =head2 The Instance protocol This provides a layer of abstraction for creating object instances. Since the other layers use this protocol, it is relatively easy to change the type of your instances from the default hash reference to some other type of reference. Several examples are provided in the F directory included in this distribution. See L for more details. =head1 FUNCTIONS Note that this module does not export any constants or functions. =head2 Utility functions Note that these are all called as B. =head3 Class::MOP::get_code_info($code) This function returns two values, the name of the package the C<$code> is from and the name of the C<$code> itself. This is used by several elements of the MOP to determine where a given C<$code> reference is from. =head3 Class::MOP::class_of($instance_or_class_name) This will return the metaclass of the given instance or class name. If the class lacks a metaclass, no metaclass will be initialized, and C will be returned. You should almost certainly be using L|Moose::Util/find_meta> instead. =head2 Metaclass cache functions C holds a cache of metaclasses. The following are functions (B) which can be used to access that cache. It is not recommended that you mess with these. Bad things could happen, but if you are brave and willing to risk it: go for it! =head3 Class::MOP::get_all_metaclasses This will return a hash of all the metaclass instances that have been cached by L, keyed by the package name. =head3 Class::MOP::get_all_metaclass_instances This will return a list of all the metaclass instances that have been cached by L. =head3 Class::MOP::get_all_metaclass_names This will return a list of all the metaclass names that have been cached by L. =head3 Class::MOP::get_metaclass_by_name($name) This will return a cached L instance, or nothing if no metaclass exists with that C<$name>. =head3 Class::MOP::store_metaclass_by_name($name, $meta) This will store a metaclass in the cache at the supplied C<$key>. =head3 Class::MOP::weaken_metaclass($name) In rare cases (e.g. anonymous metaclasses) it is desirable to store a weakened reference in the metaclass cache. This function will weaken the reference to the metaclass stored in C<$name>. =head3 Class::MOP::metaclass_is_weak($name) Returns true if the metaclass for C<$name> has been weakened (via C). =head3 Class::MOP::does_metaclass_exist($name) This will return true of there exists a metaclass stored in the C<$name> key, and return false otherwise. =head3 Class::MOP::remove_metaclass_by_name($name) This will remove the metaclass stored in the C<$name> key. Some utility functions (such as C) that were previously defined in C regarding loading of classes have been extracted to L. Please see L for documentation. =head1 SEE ALSO =head2 Books There are very few books out on Meta Object Protocols and Metaclasses because it is such an esoteric topic. The following books are really the only ones I have found. If you know of any more, B> email me and let me know, I would love to hear about them. =over 4 =item I =item I =item I =item I =back =head2 Papers =over 4 =item "Uniform and safe metaclass composition" An excellent paper by the people who brought us the original Traits paper. This paper is on how Traits can be used to do safe metaclass composition, and offers an excellent introduction section which delves into the topic of metaclass compatibility. L =item "Safe Metaclass Programming" This paper seems to precede the above paper, and propose a mix-in based approach as opposed to the Traits based approach. Both papers have similar information on the metaclass compatibility problem space. L =back =head2 Prior Art =over 4 =item The Perl 6 MetaModel work in the Pugs project =over 4 =item L =back =back =head2 Articles =over 4 =item CPAN Module Review of Class::MOP L =back =head1 SIMILAR MODULES As I have said above, this module is a class-builder-builder, so it is not the same thing as modules like L and L. That being said there are very few modules on CPAN with similar goals to this module. The one I have found which is most like this module is L, although its philosophy and the MOP it creates are very different from this modules. =head1 BUGS All complex software has bugs lurking in it, and this module is no exception. Please report any bugs to C, or through the web interface at L. You can also discuss feature requests or possible bugs on the Moose mailing list (moose@perl.org) or on IRC at L. =head1 ACKNOWLEDGEMENTS =over 4 =item Rob Kinyon Thanks to Rob for actually getting the development of this module kick-started. =back =head1 AUTHORS =over 4 =item * Stevan Little =item * Dave Rolsky =item * Jesse Luehrs =item * Shawn M Moore =item * יובל קוג'מן (Yuval Kogman) =item * Karen Etheridge =item * Florian Ragwitz =item * Hans Dieter Pearcey =item * Chris Prather =item * Matt S Trout =back =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2006 by Infinity Interactive, Inc. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Moose-2.2200/lib/Class/MOP/000770 000766 000024 00000000000 14137574636 015417 5ustar00etherstaff000000 000000 Moose-2.2200/lib/Class/MOP/Instance.pm000640 000766 000024 00000032311 14137574636 017520 0ustar00etherstaff000000 000000 package Class::MOP::Instance; our $VERSION = '2.2200'; use strict; use warnings; use Scalar::Util 'isweak', 'weaken', 'blessed'; use parent 'Class::MOP::Object'; # make this not a valid method name, to avoid (most) attribute conflicts my $RESERVED_MOP_SLOT = '<>'; sub BUILDARGS { my ($class, @args) = @_; if ( @args == 1 ) { unshift @args, "associated_metaclass"; } elsif ( @args >= 2 && blessed($args[0]) && $args[0]->isa("Class::MOP::Class") ) { # compat mode my ( $meta, @attrs ) = @args; @args = ( associated_metaclass => $meta, attributes => \@attrs ); } my %options = @args; # FIXME lazy_build $options{slots} ||= [ map { $_->slots } @{ $options{attributes} || [] } ]; $options{slot_hash} = { map { $_ => undef } @{ $options{slots} } }; # FIXME lazy_build return \%options; } sub new { my $class = shift; my $options = $class->BUILDARGS(@_); # FIXME replace with a proper constructor my $instance = $class->_new(%$options); # FIXME weak_ref => 1, weaken($instance->{'associated_metaclass'}); return $instance; } sub _new { my $class = shift; return Class::MOP::Class->initialize($class)->new_object(@_) if $class ne __PACKAGE__; my $params = @_ == 1 ? $_[0] : {@_}; return bless { # NOTE: # I am not sure that it makes # sense to pass in the meta # The ideal would be to just # pass in the class name, but # that is placing too much of # an assumption on bless(), # which is *probably* a safe # assumption,.. but you can # never tell <:) 'associated_metaclass' => $params->{associated_metaclass}, 'attributes' => $params->{attributes}, 'slots' => $params->{slots}, 'slot_hash' => $params->{slot_hash}, } => $class; } sub _class_name { $_[0]->{_class_name} ||= $_[0]->associated_metaclass->name } sub create_instance { my $self = shift; bless {}, $self->_class_name; } sub clone_instance { my ($self, $instance) = @_; my $clone = $self->create_instance; for my $attr ($self->get_all_attributes) { next unless $attr->has_value($instance); for my $slot ($attr->slots) { my $val = $self->get_slot_value($instance, $slot); $self->set_slot_value($clone, $slot, $val); $self->weaken_slot_value($clone, $slot) if $self->slot_value_is_weak($instance, $slot); } } $self->_set_mop_slot($clone, $self->_get_mop_slot($instance)) if $self->_has_mop_slot($instance); return $clone; } # operations on meta instance sub get_all_slots { my $self = shift; return @{$self->{'slots'}}; } sub get_all_attributes { my $self = shift; return @{$self->{attributes}}; } sub is_valid_slot { my ($self, $slot_name) = @_; exists $self->{'slot_hash'}->{$slot_name}; } # operations on created instances sub get_slot_value { my ($self, $instance, $slot_name) = @_; $instance->{$slot_name}; } sub set_slot_value { my ($self, $instance, $slot_name, $value) = @_; $instance->{$slot_name} = $value; } sub initialize_slot { my ($self, $instance, $slot_name) = @_; return; } sub deinitialize_slot { my ( $self, $instance, $slot_name ) = @_; delete $instance->{$slot_name}; } sub initialize_all_slots { my ($self, $instance) = @_; foreach my $slot_name ($self->get_all_slots) { $self->initialize_slot($instance, $slot_name); } } sub deinitialize_all_slots { my ($self, $instance) = @_; foreach my $slot_name ($self->get_all_slots) { $self->deinitialize_slot($instance, $slot_name); } } sub is_slot_initialized { my ($self, $instance, $slot_name, $value) = @_; exists $instance->{$slot_name}; } sub weaken_slot_value { my ($self, $instance, $slot_name) = @_; weaken $instance->{$slot_name}; } sub slot_value_is_weak { my ($self, $instance, $slot_name) = @_; isweak $instance->{$slot_name}; } sub strengthen_slot_value { my ($self, $instance, $slot_name) = @_; $self->set_slot_value($instance, $slot_name, $self->get_slot_value($instance, $slot_name)); } sub rebless_instance_structure { my ($self, $instance, $metaclass) = @_; # we use $_[1] here because of t/cmop/rebless_overload.t regressions # on 5.8.8 bless $_[1], $metaclass->name; } sub is_dependent_on_superclasses { return; # for meta instances that require updates on inherited slot changes } sub _get_mop_slot { my ($self, $instance) = @_; $self->get_slot_value($instance, $RESERVED_MOP_SLOT); } sub _has_mop_slot { my ($self, $instance) = @_; $self->is_slot_initialized($instance, $RESERVED_MOP_SLOT); } sub _set_mop_slot { my ($self, $instance, $value) = @_; $self->set_slot_value($instance, $RESERVED_MOP_SLOT, $value); } sub _clear_mop_slot { my ($self, $instance) = @_; $self->deinitialize_slot($instance, $RESERVED_MOP_SLOT); } # inlinable operation snippets sub is_inlinable { 1 } sub inline_create_instance { my ($self, $class_variable) = @_; 'bless {} => ' . $class_variable; } sub inline_slot_access { my ($self, $instance, $slot_name) = @_; sprintf q[%s->{"%s"}], $instance, quotemeta($slot_name); } sub inline_get_is_lvalue { 1 } sub inline_get_slot_value { my ($self, $instance, $slot_name) = @_; $self->inline_slot_access($instance, $slot_name); } sub inline_set_slot_value { my ($self, $instance, $slot_name, $value) = @_; $self->inline_slot_access($instance, $slot_name) . " = $value", } sub inline_initialize_slot { my ($self, $instance, $slot_name) = @_; return ''; } sub inline_deinitialize_slot { my ($self, $instance, $slot_name) = @_; "delete " . $self->inline_slot_access($instance, $slot_name); } sub inline_is_slot_initialized { my ($self, $instance, $slot_name) = @_; "exists " . $self->inline_slot_access($instance, $slot_name); } sub inline_weaken_slot_value { my ($self, $instance, $slot_name) = @_; sprintf "Scalar::Util::weaken( %s )", $self->inline_slot_access($instance, $slot_name); } sub inline_strengthen_slot_value { my ($self, $instance, $slot_name) = @_; $self->inline_set_slot_value($instance, $slot_name, $self->inline_slot_access($instance, $slot_name)); } sub inline_rebless_instance_structure { my ($self, $instance, $class_variable) = @_; "bless $instance => $class_variable"; } sub _inline_get_mop_slot { my ($self, $instance) = @_; $self->inline_get_slot_value($instance, $RESERVED_MOP_SLOT); } sub _inline_set_mop_slot { my ($self, $instance, $value) = @_; $self->inline_set_slot_value($instance, $RESERVED_MOP_SLOT, $value); } sub _inline_clear_mop_slot { my ($self, $instance) = @_; $self->inline_deinitialize_slot($instance, $RESERVED_MOP_SLOT); } 1; # ABSTRACT: Instance Meta Object __END__ =pod =encoding UTF-8 =head1 NAME Class::MOP::Instance - Instance Meta Object =head1 VERSION version 2.2200 =head1 DESCRIPTION The Instance Protocol controls the creation of object instances, and the storage of attribute values in those instances. Using this API directly in your own code violates encapsulation, and we recommend that you use the appropriate APIs in L and L instead. Those APIs in turn call the methods in this class as appropriate. This class also participates in generating inlined code by providing snippets of code to access an object instance. =head1 METHODS =head2 Object construction =over 4 =item B<< Class::MOP::Instance->new(%options) >> This method creates a new meta-instance object. It accepts the following keys in C<%options>: =over 8 =item * associated_metaclass The L object for which instances will be created. =item * attributes An array reference of L objects. These are the attributes which can be stored in each instance. =back =back =head2 Creating and altering instances =over 4 =item B<< $metainstance->create_instance >> This method returns a reference blessed into the associated metaclass's class. The default is to use a hash reference. Subclasses can override this. =item B<< $metainstance->clone_instance($instance) >> Given an instance, this method creates a new object by making I clone of the original. =back =head2 Introspection =over 4 =item B<< $metainstance->associated_metaclass >> This returns the L object associated with the meta-instance object. =item B<< $metainstance->get_all_slots >> This returns a list of slot names stored in object instances. In almost all cases, slot names correspond directly attribute names. =item B<< $metainstance->is_valid_slot($slot_name) >> This will return true if C<$slot_name> is a valid slot name. =item B<< $metainstance->get_all_attributes >> This returns a list of attributes corresponding to the attributes passed to the constructor. =back =head2 Operations on Instance Structures It's important to understand that the meta-instance object is a different entity from the actual instances it creates. For this reason, any operations on the C<$instance_structure> always require that the object instance be passed to the method. =over 4 =item B<< $metainstance->get_slot_value($instance_structure, $slot_name) >> =item B<< $metainstance->set_slot_value($instance_structure, $slot_name, $value) >> =item B<< $metainstance->initialize_slot($instance_structure, $slot_name) >> =item B<< $metainstance->deinitialize_slot($instance_structure, $slot_name) >> =item B<< $metainstance->initialize_all_slots($instance_structure) >> =item B<< $metainstance->deinitialize_all_slots($instance_structure) >> =item B<< $metainstance->is_slot_initialized($instance_structure, $slot_name) >> =item B<< $metainstance->weaken_slot_value($instance_structure, $slot_name) >> =item B<< $metainstance->slot_value_is_weak($instance_structure, $slot_name) >> =item B<< $metainstance->strengthen_slot_value($instance_structure, $slot_name) >> =item B<< $metainstance->rebless_instance_structure($instance_structure, $new_metaclass) >> The exact details of what each method does should be fairly obvious from the method name. =back =head2 Inlinable Instance Operations =over 4 =item B<< $metainstance->is_inlinable >> This is a boolean that indicates whether or not slot access operations can be inlined. By default it is true, but subclasses can override this. =item B<< $metainstance->inline_create_instance($class_variable) >> This method expects a string that, I, will become a class name. This would literally be something like C<'$class'>, not an actual class name. It returns a snippet of code that creates a new object for the class. This is something like C< bless {}, $class_name >. =item B<< $metainstance->inline_get_is_lvalue >> Returns whether or not C is a valid lvalue. This can be used to do extra optimizations when generating inlined methods. =item B<< $metainstance->inline_slot_access($instance_variable, $slot_name) >> =item B<< $metainstance->inline_get_slot_value($instance_variable, $slot_name) >> =item B<< $metainstance->inline_set_slot_value($instance_variable, $slot_name, $value) >> =item B<< $metainstance->inline_initialize_slot($instance_variable, $slot_name) >> =item B<< $metainstance->inline_deinitialize_slot($instance_variable, $slot_name) >> =item B<< $metainstance->inline_is_slot_initialized($instance_variable, $slot_name) >> =item B<< $metainstance->inline_weaken_slot_value($instance_variable, $slot_name) >> =item B<< $metainstance->inline_strengthen_slot_value($instance_variable, $slot_name) >> These methods all expect two arguments. The first is the name of a variable, than when inlined, will represent the object instance. Typically this will be a literal string like C<'$_[0]'>. The second argument is a slot name. The method returns a snippet of code that, when inlined, performs some operation on the instance. =item B<< $metainstance->inline_rebless_instance_structure($instance_variable, $class_variable) >> This takes the name of a variable that will, when inlined, represent the object instance, and the name of a variable that will represent the class to rebless into, and returns code to rebless an instance into a class. =back =head2 Introspection =over 4 =item B<< Class::MOP::Instance->meta >> This will return a L instance for this class. It should also be noted that L will actually bootstrap this module by installing a number of attribute meta-objects into its metaclass. =back =head1 AUTHORS =over 4 =item * Stevan Little =item * Dave Rolsky =item * Jesse Luehrs =item * Shawn M Moore =item * יובל קוג'מן (Yuval Kogman) =item * Karen Etheridge =item * Florian Ragwitz =item * Hans Dieter Pearcey =item * Chris Prather =item * Matt S Trout =back =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2006 by Infinity Interactive, Inc. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Moose-2.2200/lib/Class/MOP/Package.pm000640 000766 000024 00000030206 14137574636 017310 0ustar00etherstaff000000 000000 package Class::MOP::Package; our $VERSION = '2.2200'; use strict; use warnings; use Scalar::Util 'blessed', 'weaken'; use Devel::GlobalDestruction 'in_global_destruction'; use Module::Runtime 'module_notional_filename'; use Package::Stash; use parent 'Class::MOP::Object'; # creation ... sub initialize { my ( $class, @args ) = @_; unshift @args, "package" if @args % 2; my %options = @args; my $package_name = delete $options{package}; # we hand-construct the class until we can bootstrap it if ( my $meta = Class::MOP::get_metaclass_by_name($package_name) ) { return $meta; } else { my $meta = ( ref $class || $class )->_new({ 'package' => $package_name, %options, }); Class::MOP::store_metaclass_by_name($package_name, $meta); Class::MOP::weaken_metaclass($package_name) if $options{weaken}; return $meta; } } sub reinitialize { my ( $class, @args ) = @_; unshift @args, "package" if @args % 2; my %options = @args; my $package_name = delete $options{package}; (defined $package_name && $package_name && (!blessed $package_name || $package_name->isa('Class::MOP::Package'))) || $class->_throw_exception( MustPassAPackageNameOrAnExistingClassMOPPackageInstance => params => \%options, class => $class ); $package_name = $package_name->name if blessed $package_name; Class::MOP::remove_metaclass_by_name($package_name); $class->initialize($package_name, %options); # call with first arg form for compat } sub create { my $class = shift; my @args = @_; my $meta = $class->initialize(@args); my $filename = module_notional_filename($meta->name); $INC{$filename} = '(set by Moose)' unless exists $INC{$filename}; return $meta; } ## ANON packages { # NOTE: # this should be sufficient, if you have a # use case where it is not, write a test and # I will change it. my $ANON_SERIAL = 0; my %ANON_PACKAGE_CACHE; # NOTE: # we need a sufficiently annoying prefix # this should suffice for now, this is # used in a couple of places below, so # need to put it up here for now. sub _anon_package_prefix { 'Class::MOP::Package::__ANON__::SERIAL::' } sub is_anon { my $self = shift; no warnings 'uninitialized'; my $prefix = $self->_anon_package_prefix; $self->name =~ /^\Q$prefix/; } sub create_anon { my ($class, %options) = @_; my $cache_ok = delete $options{cache}; $options{weaken} = !$cache_ok unless exists $options{weaken}; my $cache_key; if ($cache_ok) { $cache_key = $class->_anon_cache_key(%options); undef $cache_ok if !defined($cache_key); } if ($cache_ok) { if (defined $ANON_PACKAGE_CACHE{$cache_key}) { return $ANON_PACKAGE_CACHE{$cache_key}; } } my $package_name = $class->_anon_package_prefix . ++$ANON_SERIAL; my $meta = $class->create($package_name, %options); if ($cache_ok) { $ANON_PACKAGE_CACHE{$cache_key} = $meta; weaken($ANON_PACKAGE_CACHE{$cache_key}); } return $meta; } sub _anon_cache_key { my $class = shift; my %options = @_; $class->_throw_exception( PackagesAndModulesAreNotCachable => class_name => $class, params => \%options, is_module => 0 ); } sub DESTROY { my $self = shift; return if in_global_destruction(); # it'll happen soon anyway and this just makes things more complicated $self->_free_anon if $self->is_anon; } sub _free_anon { my $self = shift; my $name = $self->name; # Moose does a weird thing where it replaces the metaclass for # class when fixing metaclass incompatibility. In that case, # we don't want to clean out the namespace now. We can detect # that because Moose will explicitly update the singleton # cache in Class::MOP using store_metaclass_by_name, which # means that the new metaclass will already exist in the cache # by this point. # The other options here are that $current_meta can be undef if # remove_metaclass_by_name is called explicitly (since the hash # entry is removed first, and then this destructor is called), # or that $current_meta can be the same as $self, which happens # when the metaclass goes out of scope (since the weak reference # in the metaclass cache won't be freed until after this # destructor runs). my $current_meta = Class::MOP::get_metaclass_by_name($name); return if defined($current_meta) && $current_meta ne $self; my ($first_fragments, $last_fragment) = ($name =~ /^(.*)::(.*)$/); no strict 'refs'; # clear @ISA first, to avoid a memory leak # see https://rt.perl.org/rt3/Public/Bug/Display.html?id=92708 @{$name . '::ISA'} = (); %{$name . '::'} = (); delete ${$first_fragments . '::'}{$last_fragment . '::'}; Class::MOP::remove_metaclass_by_name($name); delete $INC{module_notional_filename($name)}; } } sub _new { my $class = shift; return Class::MOP::Class->initialize($class)->new_object(@_) if $class ne __PACKAGE__; my $params = @_ == 1 ? $_[0] : {@_}; return bless { # Need to quote package to avoid a problem with PPI mis-parsing this # as a package statement. 'package' => $params->{package}, # NOTE: # because of issues with the Perl API # to the typeglob in some versions, we # need to just always grab a new # reference to the hash in the accessor. # Ideally we could just store a ref and # it would Just Work, but oh well :\ namespace => \undef, } => $class; } # Attributes # NOTE: # all these attribute readers will be bootstrapped # away in the Class::MOP bootstrap section sub _package_stash { $_[0]->{_package_stash} ||= Package::Stash->new($_[0]->name) } sub namespace { $_[0]->_package_stash->namespace } # Class attributes # ... these functions have to touch the symbol table itself,.. yuk sub add_package_symbol { my $self = shift; $self->_package_stash->add_symbol(@_); } sub remove_package_glob { my $self = shift; $self->_package_stash->remove_glob(@_); } # ... these functions deal with stuff on the namespace level sub has_package_symbol { my $self = shift; $self->_package_stash->has_symbol(@_); } sub get_package_symbol { my $self = shift; $self->_package_stash->get_symbol(@_); } sub get_or_add_package_symbol { my $self = shift; $self->_package_stash->get_or_add_symbol(@_); } sub remove_package_symbol { my $self = shift; $self->_package_stash->remove_symbol(@_); } sub list_all_package_symbols { my $self = shift; $self->_package_stash->list_all_symbols(@_); } sub get_all_package_symbols { my $self = shift; $self->_package_stash->get_all_symbols(@_); } 1; # ABSTRACT: Package Meta Object __END__ =pod =encoding UTF-8 =head1 NAME Class::MOP::Package - Package Meta Object =head1 VERSION version 2.2200 =head1 DESCRIPTION The Package Protocol provides an abstraction of a Perl 5 package. A package is basically namespace, and this module provides methods for looking at and changing that namespace's symbol table. =head1 METHODS =head2 Class::MOP::Package->initialize($package_name, %options) This method creates a new C instance which represents specified package. If an existing metaclass object exists for the package, that will be returned instead. No options are valid at the package level. =head2 Class::MOP::Package->reinitialize($package, %options) This method forcibly removes any existing metaclass for the package before calling C. In contrast to C, you may also pass an existing C instance instead of just a package name as C<$package>. Do not call this unless you know what you are doing. =head2 Class::MOP::Package->create($package, %options) Creates a new C instance which represents the specified package, and also does some initialization of that package. Currently, this just does the same thing as C, but is overridden in subclasses, such as C. =head2 Class::MOP::Package->create_anon(%options) Creates a new anonymous package. Valid keys for C<%options> are: =over 4 =item C If this will be C (the default is C), the instance will be cached in C's metaclass cache. =item C If this is C (the default C when L is C), the instance stored in C's metaclass cache will be weakened, so that the anonymous package will be garbage collected when the returned instance goes out of scope. =back =head2 $metapackage->is_anon Returns true if the package is an anonymous package. =head2 $metapackage->name This is returns the package's name, as passed to the constructor. =head2 $metapackage->namespace This returns a hash reference to the package's symbol table. The keys are symbol names and the values are typeglob references. =head2 $metapackage->add_package_symbol($variable_name, $initial_value) This method accepts a variable name and an optional initial value. The C<$variable_name> must contain a leading sigil. This method creates the variable in the package's symbol table, and sets it to the initial value if one was provided. =head2 $metapackage->get_package_symbol($variable_name) Given a variable name, this method returns the variable as a reference or undef if it does not exist. The C<$variable_name> must contain a leading sigil. =head2 $metapackage->get_or_add_package_symbol($variable_name) Given a variable name, this method returns the variable as a reference. If it does not exist, a default value will be generated if possible. The C<$variable_name> must contain a leading sigil. =head2 $metapackage->has_package_symbol($variable_name) Returns true if there is a package variable defined for C<$variable_name>. The C<$variable_name> must contain a leading sigil. =head2 $metapackage->remove_package_symbol($variable_name) This will remove the package variable specified C<$variable_name>. The C<$variable_name> must contain a leading sigil. =head2 $metapackage->remove_package_glob($glob_name) Given the name of a glob, this will remove that glob from the package's symbol table. Glob names do not include a sigil. Removing the glob removes all variables and subroutines with the specified name. =head2 $metapackage->list_all_package_symbols($type_filter) This will list all the glob names associated with the current package. These names do not have leading sigils. You can provide an optional type filter, which should be one of 'SCALAR', 'ARRAY', 'HASH', or 'CODE'. =head2 $metapackage->get_all_package_symbols($type_filter) This works much like C, but it returns a hash reference. The keys are glob names and the values are references to the value for that name. =head2 Class::MOP::Package->meta This will return a L instance for this class. =head1 AUTHORS =over 4 =item * Stevan Little =item * Dave Rolsky =item * Jesse Luehrs =item * Shawn M Moore =item * יובל קוג'מן (Yuval Kogman) =item * Karen Etheridge =item * Florian Ragwitz =item * Hans Dieter Pearcey =item * Chris Prather =item * Matt S Trout =back =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2006 by Infinity Interactive, Inc. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Moose-2.2200/lib/Class/MOP/Object.pm000640 000766 000024 00000007436 14137574636 017174 0ustar00etherstaff000000 000000 package Class::MOP::Object; our $VERSION = '2.2200'; use strict; use warnings; use parent 'Class::MOP::Mixin'; use Scalar::Util 'blessed'; use Module::Runtime; # introspection sub throw_error { shift->_throw_exception( Legacy => message => join('', @_) ); } sub _inline_throw_error { my ( $self, $message ) = @_; return 'die Module::Runtime::use_module("Moose::Exception::Legacy")->new(message => ' . $message. ')'; } sub _new { Class::MOP::class_of(shift)->new_object(@_); } # RANT: # Cmon, how many times have you written # the following code while debugging: # # use Data::Dumper; # warn Dumper $obj; # # It can get seriously annoying, so why # not just do this ... sub dump { my $self = shift; require Data::Dumper; local $Data::Dumper::Maxdepth = shift || 1; Data::Dumper::Dumper $self; } sub _real_ref_name { my $self = shift; return blessed($self); } sub _is_compatible_with { my $self = shift; my ($other_name) = @_; return $self->isa($other_name); } sub _can_be_made_compatible_with { my $self = shift; return !$self->_is_compatible_with(@_) && defined($self->_get_compatible_metaclass(@_)); } sub _make_compatible_with { my $self = shift; my ($other_name) = @_; my $new_metaclass = $self->_get_compatible_metaclass($other_name); unless ( defined $new_metaclass ) { $self->_throw_exception( CannotMakeMetaclassCompatible => superclass_name => $other_name, class => $self, ); } # can't use rebless_instance here, because it might not be an actual # subclass in the case of, e.g. moose role reconciliation $new_metaclass->meta->_force_rebless_instance($self) if blessed($self) ne $new_metaclass; return $self; } sub _get_compatible_metaclass { my $self = shift; my ($other_name) = @_; return $self->_get_compatible_metaclass_by_subclassing($other_name); } sub _get_compatible_metaclass_by_subclassing { my $self = shift; my ($other_name) = @_; my $meta_name = blessed($self) ? $self->_real_ref_name : $self; if ($meta_name->isa($other_name)) { return $meta_name; } elsif ($other_name->isa($meta_name)) { return $other_name; } return; } 1; # ABSTRACT: Base class for metaclasses __END__ =pod =encoding UTF-8 =head1 NAME Class::MOP::Object - Base class for metaclasses =head1 VERSION version 2.2200 =head1 DESCRIPTION This class is a very minimal base class for metaclasses. =head1 METHODS This class provides a few methods which are useful in all metaclasses. =head2 Class::MOP::???->meta This returns a L object. =head2 $metaobject->dump($max_depth) This method uses L to dump the object. You can pass an optional maximum depth, which will set C<$Data::Dumper::Maxdepth>. The default maximum depth is 1. =head2 $metaclass->throw_error($message) This method calls L internally, with an object of class L. =head1 AUTHORS =over 4 =item * Stevan Little =item * Dave Rolsky =item * Jesse Luehrs =item * Shawn M Moore =item * יובל קוג'מן (Yuval Kogman) =item * Karen Etheridge =item * Florian Ragwitz =item * Hans Dieter Pearcey =item * Chris Prather =item * Matt S Trout =back =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2006 by Infinity Interactive, Inc. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Moose-2.2200/lib/Class/MOP/Mixin.pm000640 000766 000024 00000003331 14137574636 017040 0ustar00etherstaff000000 000000 package Class::MOP::Mixin; our $VERSION = '2.2200'; use strict; use warnings; use Scalar::Util 'blessed'; use Module::Runtime 'use_module'; sub meta { require Class::MOP::Class; Class::MOP::Class->initialize( blessed( $_[0] ) || $_[0] ); } sub _throw_exception { my ($class, $exception_type, @args_to_exception) = @_; die use_module( "Moose::Exception::$exception_type" )->new( @args_to_exception ); } 1; # ABSTRACT: Base class for mixin classes __END__ =pod =encoding UTF-8 =head1 NAME Class::MOP::Mixin - Base class for mixin classes =head1 VERSION version 2.2200 =head1 DESCRIPTION This class provides a few methods which are useful in all metaclasses. =head1 METHODS =head2 Class::MOP::Mixin->meta This returns a L object for the mixin class. =head2 Class::MOP::Mixin->_throw_exception Throws an exception in the L family. This should ONLY be used internally -- any callers outside Class::MOP::* should be using the version in L instead. =head1 AUTHORS =over 4 =item * Stevan Little =item * Dave Rolsky =item * Jesse Luehrs =item * Shawn M Moore =item * יובל קוג'מן (Yuval Kogman) =item * Karen Etheridge =item * Florian Ragwitz =item * Hans Dieter Pearcey =item * Chris Prather =item * Matt S Trout =back =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2006 by Infinity Interactive, Inc. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Moose-2.2200/lib/Class/MOP/MiniTrait.pm000640 000766 000024 00000004173 14137574636 017661 0ustar00etherstaff000000 000000 package Class::MOP::MiniTrait; our $VERSION = '2.2200'; use strict; use warnings; use Module::Runtime 'use_package_optimistically'; sub apply { my ( $to_class, $trait ) = @_; for ( grep { !ref } $to_class, $trait ) { use_package_optimistically($_); $_ = Class::MOP::Class->initialize($_); } for my $meth ( grep { $_->package_name ne 'UNIVERSAL' } $trait->get_all_methods ) { my $meth_name = $meth->name; next if index($meth_name, '__') == 0; # skip private subs if ( $to_class->find_method_by_name($meth_name) ) { $to_class->add_around_method_modifier( $meth_name, $meth->body ); } else { $to_class->add_method( $meth_name, $meth->clone ); } } } # We can't load this with use, since it may be loaded and used from Class::MOP # (via Class::MOP::Class, etc). However, if for some reason this module is loaded # _without_ first loading Class::MOP we need to require Class::MOP so we can # use it and Class::MOP::Class. require Class::MOP; 1; # ABSTRACT: Extremely limited trait application __END__ =pod =encoding UTF-8 =head1 NAME Class::MOP::MiniTrait - Extremely limited trait application =head1 VERSION version 2.2200 =head1 DESCRIPTION This package provides a single function, C, which does a half-assed job of applying a trait to a class. It exists solely for use inside Class::MOP and L core classes. =head1 AUTHORS =over 4 =item * Stevan Little =item * Dave Rolsky =item * Jesse Luehrs =item * Shawn M Moore =item * יובל קוג'מן (Yuval Kogman) =item * Karen Etheridge =item * Florian Ragwitz =item * Hans Dieter Pearcey =item * Chris Prather =item * Matt S Trout =back =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2006 by Infinity Interactive, Inc. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Moose-2.2200/lib/Class/MOP/Attribute.pm000640 000766 000024 00000075055 14137574636 017733 0ustar00etherstaff000000 000000 package Class::MOP::Attribute; our $VERSION = '2.2200'; use strict; use warnings; use Class::MOP::Method::Accessor; use Carp 'confess'; use Scalar::Util 'blessed', 'weaken'; use Try::Tiny; use parent 'Class::MOP::Object', 'Class::MOP::Mixin::AttributeCore'; # NOTE: (meta-circularity) # This method will be replaced in the # boostrap section of Class::MOP, by # a new version which uses the # &Class::MOP::Class::construct_instance # method to build an attribute meta-object # which itself is described with attribute # meta-objects. # - Ain't meta-circularity grand? :) sub new { my ( $class, @args ) = @_; unshift @args, "name" if @args % 2 == 1; my %options = @args; my $name = $options{name}; (defined $name) || $class->_throw_exception( MOPAttributeNewNeedsAttributeName => class => $class, params => \%options ); $options{init_arg} = $name if not exists $options{init_arg}; if(exists $options{builder}){ $class->_throw_exception( BuilderMustBeAMethodName => class => $class, params => \%options ) if ref $options{builder} || !(defined $options{builder}); $class->_throw_exception( BothBuilderAndDefaultAreNotAllowed => class => $class, params => \%options ) if exists $options{default}; } else { ($class->is_default_a_coderef(\%options)) || $class->_throw_exception( ReferencesAreNotAllowedAsDefault => class => $class, params => \%options, attribute_name => $options{name} ) if exists $options{default} && ref $options{default}; } if( $options{required} and not( defined($options{builder}) || defined($options{init_arg}) || exists $options{default} ) ) { $class->_throw_exception( RequiredAttributeLacksInitialization => class => $class, params => \%options ); } $class->_new(\%options); } sub _new { my $class = shift; return Class::MOP::Class->initialize($class)->new_object(@_) if $class ne __PACKAGE__; my $options = @_ == 1 ? $_[0] : {@_}; bless { 'name' => $options->{name}, 'accessor' => $options->{accessor}, 'reader' => $options->{reader}, 'writer' => $options->{writer}, 'predicate' => $options->{predicate}, 'clearer' => $options->{clearer}, 'builder' => $options->{builder}, 'init_arg' => $options->{init_arg}, exists $options->{default} ? ('default' => $options->{default}) : (), 'initializer' => $options->{initializer}, 'definition_context' => $options->{definition_context}, # keep a weakened link to the # class we are associated with 'associated_class' => undef, # and a list of the methods # associated with this attr 'associated_methods' => [], # this let's us keep track of # our order inside the associated # class 'insertion_order' => undef, }, $class; } # NOTE: # this is a primitive (and kludgy) clone operation # for now, it will be replaced in the Class::MOP # bootstrap with a proper one, however we know # that this one will work fine for now. sub clone { my $self = shift; my %options = @_; (blessed($self)) || confess "Can only clone an instance"; # this implementation is overwritten by the bootstrap process, # so this exception will never trigger. If it ever does occur, # it indicates a gigantic problem with the most internal parts # of Moose, so we wouldn't want a Moose-based exception object anyway return bless { %{$self}, %options } => ref($self); } sub initialize_instance_slot { my ($self, $meta_instance, $instance, $params) = @_; my $init_arg = $self->{'init_arg'}; # try to fetch the init arg from the %params ... # if nothing was in the %params, we can use the # attribute's default value (if it has one) if(defined $init_arg and exists $params->{$init_arg}){ $self->_set_initial_slot_value( $meta_instance, $instance, $params->{$init_arg}, ); } elsif (exists $self->{'default'}) { $self->_set_initial_slot_value( $meta_instance, $instance, $self->default($instance), ); } elsif (defined( my $builder = $self->{'builder'})) { if ($builder = $instance->can($builder)) { $self->_set_initial_slot_value( $meta_instance, $instance, $instance->$builder, ); } else { $self->_throw_exception( BuilderMethodNotSupportedForAttribute => attribute => $self, instance => $instance ); } } } sub _set_initial_slot_value { my ($self, $meta_instance, $instance, $value) = @_; my $slot_name = $self->name; return $meta_instance->set_slot_value($instance, $slot_name, $value) unless $self->has_initializer; my $callback = $self->_make_initializer_writer_callback( $meta_instance, $instance, $slot_name ); my $initializer = $self->initializer; # most things will just want to set a value, so make it first arg $instance->$initializer($value, $callback, $self); } sub _make_initializer_writer_callback { my $self = shift; my ($meta_instance, $instance, $slot_name) = @_; return sub { $meta_instance->set_slot_value($instance, $slot_name, $_[0]); }; } sub get_read_method { my $self = shift; my $reader = $self->reader || $self->accessor; # normal case ... return $reader unless ref $reader; # the HASH ref case my ($name) = %$reader; return $name; } sub get_write_method { my $self = shift; my $writer = $self->writer || $self->accessor; # normal case ... return $writer unless ref $writer; # the HASH ref case my ($name) = %$writer; return $name; } sub get_read_method_ref { my $self = shift; if ((my $reader = $self->get_read_method) && $self->associated_class) { return $self->associated_class->get_method($reader); } else { my $code = sub { $self->get_value(@_) }; if (my $class = $self->associated_class) { return $class->method_metaclass->wrap( $code, package_name => $class->name, name => '__ANON__' ); } else { return $code; } } } sub get_write_method_ref { my $self = shift; if ((my $writer = $self->get_write_method) && $self->associated_class) { return $self->associated_class->get_method($writer); } else { my $code = sub { $self->set_value(@_) }; if (my $class = $self->associated_class) { return $class->method_metaclass->wrap( $code, package_name => $class->name, name => '__ANON__' ); } else { return $code; } } } # slots sub slots { (shift)->name } # class association sub attach_to_class { my ($self, $class) = @_; (blessed($class) && $class->isa('Class::MOP::Class')) || $self->_throw_exception( AttachToClassNeedsAClassMOPClassInstanceOrASubclass => attribute => $self, class => $class ); weaken($self->{'associated_class'} = $class); } sub detach_from_class { my $self = shift; $self->{'associated_class'} = undef; } # method association sub associate_method { my ($self, $method) = @_; push @{$self->{'associated_methods'}} => $method; } ## Slot management sub set_initial_value { my ($self, $instance, $value) = @_; $self->_set_initial_slot_value( Class::MOP::Class->initialize(ref($instance))->get_meta_instance, $instance, $value ); } sub set_value { shift->set_raw_value(@_) } sub set_raw_value { my $self = shift; my ($instance, $value) = @_; my $mi = Class::MOP::Class->initialize(ref($instance))->get_meta_instance; return $mi->set_slot_value($instance, $self->name, $value); } sub _inline_set_value { my $self = shift; return $self->_inline_instance_set(@_) . ';'; } sub _inline_instance_set { my $self = shift; my ($instance, $value) = @_; my $mi = $self->associated_class->get_meta_instance; return $mi->inline_set_slot_value($instance, $self->name, $value); } sub get_value { shift->get_raw_value(@_) } sub get_raw_value { my $self = shift; my ($instance) = @_; my $mi = Class::MOP::Class->initialize(ref($instance))->get_meta_instance; return $mi->get_slot_value($instance, $self->name); } sub _inline_get_value { my $self = shift; return $self->_inline_instance_get(@_) . ';'; } sub _inline_instance_get { my $self = shift; my ($instance) = @_; my $mi = $self->associated_class->get_meta_instance; return $mi->inline_get_slot_value($instance, $self->name); } sub has_value { my $self = shift; my ($instance) = @_; my $mi = Class::MOP::Class->initialize(ref($instance))->get_meta_instance; return $mi->is_slot_initialized($instance, $self->name); } sub _inline_has_value { my $self = shift; return $self->_inline_instance_has(@_) . ';'; } sub _inline_instance_has { my $self = shift; my ($instance) = @_; my $mi = $self->associated_class->get_meta_instance; return $mi->inline_is_slot_initialized($instance, $self->name); } sub clear_value { my $self = shift; my ($instance) = @_; my $mi = Class::MOP::Class->initialize(ref($instance))->get_meta_instance; return $mi->deinitialize_slot($instance, $self->name); } sub _inline_clear_value { my $self = shift; return $self->_inline_instance_clear(@_) . ';'; } sub _inline_instance_clear { my $self = shift; my ($instance) = @_; my $mi = $self->associated_class->get_meta_instance; return $mi->inline_deinitialize_slot($instance, $self->name); } ## load em up ... sub accessor_metaclass { 'Class::MOP::Method::Accessor' } sub _process_accessors { my ($self, $type, $accessor, $generate_as_inline_methods) = @_; my $method_ctx = { %{ $self->definition_context || {} } }; if (ref($accessor)) { (ref($accessor) eq 'HASH') || $self->_throw_exception( BadOptionFormat => attribute => $self, option_value => $accessor, option_name => $type ); my ($name, $method) = %{$accessor}; $method_ctx->{description} = $self->_accessor_description($name, $type); $method = $self->accessor_metaclass->wrap( $method, attribute => $self, package_name => $self->associated_class->name, name => $name, associated_metaclass => $self->associated_class, definition_context => $method_ctx, ); $self->associate_method($method); return ($name, $method); } else { my $inline_me = ($generate_as_inline_methods && $self->associated_class->instance_metaclass->is_inlinable); my $method; try { $method_ctx->{description} = $self->_accessor_description($accessor, $type); $method = $self->accessor_metaclass->new( attribute => $self, is_inline => $inline_me, accessor_type => $type, package_name => $self->associated_class->name, name => $accessor, associated_metaclass => $self->associated_class, definition_context => $method_ctx, ); } catch { $self->_throw_exception( CouldNotCreateMethod => attribute => $self, option_value => $accessor, option_name => $type, error => $_ ); }; $self->associate_method($method); return ($accessor, $method); } } sub _accessor_description { my $self = shift; my ($name, $type) = @_; my $desc = "$type " . $self->associated_class->name . "::$name"; if ( $name ne $self->name ) { $desc .= " of attribute " . $self->name; } return $desc; } sub install_accessors { my $self = shift; my $inline = shift; my $class = $self->associated_class; $class->add_method( $self->_process_accessors('accessor' => $self->accessor(), $inline) ) if $self->has_accessor(); $class->add_method( $self->_process_accessors('reader' => $self->reader(), $inline) ) if $self->has_reader(); $class->add_method( $self->_process_accessors('writer' => $self->writer(), $inline) ) if $self->has_writer(); $class->add_method( $self->_process_accessors('predicate' => $self->predicate(), $inline) ) if $self->has_predicate(); $class->add_method( $self->_process_accessors('clearer' => $self->clearer(), $inline) ) if $self->has_clearer(); return; } { my $_remove_accessor = sub { my ($accessor, $class) = @_; if (ref($accessor) && ref($accessor) eq 'HASH') { ($accessor) = keys %{$accessor}; } my $method = $class->get_method($accessor); $class->remove_method($accessor) if (ref($method) && $method->isa('Class::MOP::Method::Accessor')); }; sub remove_accessors { my $self = shift; # TODO: # we really need to make sure to remove from the # associates methods here as well. But this is # such a slimly used method, I am not worried # about it right now. $_remove_accessor->($self->accessor(), $self->associated_class()) if $self->has_accessor(); $_remove_accessor->($self->reader(), $self->associated_class()) if $self->has_reader(); $_remove_accessor->($self->writer(), $self->associated_class()) if $self->has_writer(); $_remove_accessor->($self->predicate(), $self->associated_class()) if $self->has_predicate(); $_remove_accessor->($self->clearer(), $self->associated_class()) if $self->has_clearer(); return; } } 1; # ABSTRACT: Attribute Meta Object __END__ =pod =encoding UTF-8 =head1 NAME Class::MOP::Attribute - Attribute Meta Object =head1 VERSION version 2.2200 =head1 SYNOPSIS Class::MOP::Attribute->new( foo => ( accessor => 'foo', # dual purpose get/set accessor predicate => 'has_foo', # predicate check for defined-ness init_arg => '-foo', # class->new will look for a -foo key default => 'BAR IS BAZ!' # if no -foo key is provided, use this ) ); Class::MOP::Attribute->new( bar => ( reader => 'bar', # getter writer => 'set_bar', # setter predicate => 'has_bar', # predicate check for defined-ness init_arg => ':bar', # class->new will look for a :bar key # no default value means it is undef ) ); =head1 DESCRIPTION The Attribute Protocol is almost entirely an invention of C. Perl 5 does not have a consistent notion of attributes. There are so many ways in which this is done, and very few (if any) are easily discoverable by this module. With that said, this module attempts to inject some order into this chaos, by introducing a consistent API which can be used to create object attributes. =head1 METHODS =head2 Creation =over 4 =item B<< Class::MOP::Attribute->new($name, ?%options) >> An attribute must (at the very least), have a C<$name>. All other C<%options> are added as key-value pairs. =over 8 =item * init_arg This is a string value representing the expected key in an initialization hash. For instance, if we have an C value of C<-foo>, then the following code will Just Work. MyClass->meta->new_object( -foo => 'Hello There' ); If an init_arg is not assigned, it will automatically use the attribute's name. If C is explicitly set to C, the attribute cannot be specified during initialization. =item * builder This provides the name of a method that will be called to initialize the attribute. This method will be called on the object after it is constructed. It is expected to return a valid value for the attribute. =item * default This can be used to provide an explicit default for initializing the attribute. If the default you provide is a subroutine reference, then this reference will be called I on the object. If the value is a simple scalar (string or number), then it can be just passed as is. However, if you wish to initialize it with a HASH or ARRAY ref, then you need to wrap that inside a subroutine reference: Class::MOP::Attribute->new( 'foo' => ( default => sub { [] }, ) ); # or ... Class::MOP::Attribute->new( 'foo' => ( default => sub { {} }, ) ); If you wish to initialize an attribute with a subroutine reference itself, then you need to wrap that in a subroutine as well: Class::MOP::Attribute->new( 'foo' => ( default => sub { sub { print "Hello World" } }, ) ); And lastly, if the value of your attribute is dependent upon some other aspect of the instance structure, then you can take advantage of the fact that when the C value is called as a method: Class::MOP::Attribute->new( 'object_identity' => ( default => sub { Scalar::Util::refaddr( $_[0] ) }, ) ); Note that there is no guarantee that attributes are initialized in any particular order, so you cannot rely on the value of some other attribute when generating the default. =item * initializer This option can be either a method name or a subroutine reference. This method will be called when setting the attribute's value in the constructor. Unlike C and C, the initializer is only called when a value is provided to the constructor. The initializer allows you to munge this value during object construction. The initializer is called as a method with three arguments. The first is the value that was passed to the constructor. The second is a subroutine reference that can be called to actually set the attribute's value, and the last is the associated C object. This contrived example shows an initializer that sets the attribute to twice the given value. Class::MOP::Attribute->new( 'doubled' => ( initializer => sub { my ( $self, $value, $set, $attr ) = @_; $set->( $value * 2 ); }, ) ); Since an initializer can be a method name, you can easily make attribute initialization use the writer: Class::MOP::Attribute->new( 'some_attr' => ( writer => 'some_attr', initializer => 'some_attr', ) ); Your writer (actually, a wrapper around the writer, using L) will need to examine C<@_> and determine under which context it is being called: around 'some_attr' => sub { my $orig = shift; my $self = shift; # $value is not defined if being called as a reader # $setter and $attr are only defined if being called as an initializer my ($value, $setter, $attr) = @_; # the reader behaves normally return $self->$orig if not @_; # mutate $value as desired # $value = ($row) if $setter; # otherwise, call the real writer with the new value $self->$orig($row); }; =back The C, C, C, C and C options all accept the same parameters. You can provide the name of the method, in which case an appropriate default method will be generated for you. Or instead you can also provide hash reference containing exactly one key (the method name) and one value. The value should be a subroutine reference, which will be installed as the method itself. =over 8 =item * accessor An C is a standard Perl-style read/write accessor. It will return the value of the attribute, and if a value is passed as an argument, it will assign that value to the attribute. Note that C is a legitimate value, so this will work: $object->set_something(undef); =item * reader This is a basic read-only accessor. It returns the value of the attribute. =item * writer This is a basic write accessor, it accepts a single argument, and assigns that value to the attribute. Note that C is a legitimate value, so this will work: $object->set_something(undef); =item * predicate The predicate method returns a boolean indicating whether or not the attribute has been explicitly set. Note that the predicate returns true even if the attribute was set to a false value (C<0> or C). =item * clearer This method will uninitialize the attribute. After an attribute is cleared, its C will return false. =item * definition_context Mostly, this exists as a hook for the benefit of Moose. This option should be a hash reference containing several keys which will be used when inlining the attribute's accessors. The keys should include C, the line number where the attribute was created, and either C or C. This information will ultimately be used when eval'ing inlined accessor code so that error messages report a useful line and file name. =back =item B<< $attr->clone(%options) >> This clones the attribute. Any options you provide will override the settings of the original attribute. You can change the name of the new attribute by passing a C key in C<%options>. =back =head2 Informational These are all basic read-only accessors for the values passed into the constructor. =over 4 =item B<< $attr->name >> Returns the attribute's name. =item B<< $attr->accessor >> =item B<< $attr->reader >> =item B<< $attr->writer >> =item B<< $attr->predicate >> =item B<< $attr->clearer >> The C, C, C, C, and C methods all return exactly what was passed to the constructor, so it can be either a string containing a method name, or a hash reference. =item B<< $attr->initializer >> Returns the initializer as passed to the constructor, so this may be either a method name or a subroutine reference. =item B<< $attr->init_arg >> =item B<< $attr->is_default_a_coderef >> =item B<< $attr->builder >> =item B<< $attr->default($instance) >> The C<$instance> argument is optional. If you don't pass it, the return value for this method is exactly what was passed to the constructor, either a simple scalar or a subroutine reference. If you I pass an C<$instance> and the default is a subroutine reference, then the reference is called as a method on the C<$instance> and the generated value is returned. =item B<< $attr->slots >> Return a list of slots required by the attribute. This is usually just one, the name of the attribute. A slot is the name of the hash key used to store the attribute in an object instance. =item B<< $attr->get_read_method >> =item B<< $attr->get_write_method >> Returns the name of a method suitable for reading or writing the value of the attribute in the associated class. If an attribute is read- or write-only, then these methods can return C as appropriate. =item B<< $attr->has_read_method >> =item B<< $attr->has_write_method >> This returns a boolean indicating whether the attribute has a I read or write method. =item B<< $attr->get_read_method_ref >> =item B<< $attr->get_write_method_ref >> Returns the subroutine reference of a method suitable for reading or writing the attribute's value in the associated class. These methods always return a subroutine reference, regardless of whether or not the attribute is read- or write-only. =item B<< $attr->insertion_order >> If this attribute has been inserted into a class, this returns a zero based index regarding the order of insertion. =back =head2 Informational predicates These are all basic predicate methods for the values passed into C. =over 4 =item B<< $attr->has_accessor >> =item B<< $attr->has_reader >> =item B<< $attr->has_writer >> =item B<< $attr->has_predicate >> =item B<< $attr->has_clearer >> =item B<< $attr->has_initializer >> =item B<< $attr->has_init_arg >> This will be I if the C was set to C. =item B<< $attr->has_default >> This will be I if the C was set to C, since C is the default C anyway. =item B<< $attr->has_builder >> =item B<< $attr->has_insertion_order >> This will be I if this attribute has not be inserted into a class =back =head2 Value management These methods are basically "back doors" to the instance, and can be used to bypass the regular accessors, but still stay within the MOP. These methods are not for general use, and should only be used if you really know what you are doing. =over 4 =item B<< $attr->initialize_instance_slot($meta_instance, $instance, $params) >> This method is used internally to initialize the attribute's slot in the object C<$instance>. The C<$params> is a hash reference of the values passed to the object constructor. It's unlikely that you'll need to call this method yourself. =item B<< $attr->set_value($instance, $value) >> Sets the value without going through the accessor. Note that this works even with read-only attributes. =item B<< $attr->set_raw_value($instance, $value) >> Sets the value with no side effects such as a trigger. This doesn't actually apply to Class::MOP attributes, only to subclasses. =item B<< $attr->set_initial_value($instance, $value) >> Sets the value without going through the accessor. This method is only called when the instance is first being initialized. =item B<< $attr->get_value($instance) >> Returns the value without going through the accessor. Note that this works even with write-only accessors. =item B<< $attr->get_raw_value($instance) >> Returns the value without any side effects such as lazy attributes. Doesn't actually apply to Class::MOP attributes, only to subclasses. =item B<< $attr->has_value($instance) >> Return a boolean indicating whether the attribute has been set in C<$instance>. This how the default C method works. =item B<< $attr->clear_value($instance) >> This will clear the attribute's value in C<$instance>. This is what the default C calls. Note that this works even if the attribute does not have any associated read, write or clear methods. =back =head2 Class association These methods allow you to manage the attributes association with the class that contains it. These methods should not be used lightly, nor are they very magical, they are mostly used internally and by metaclass instances. =over 4 =item B<< $attr->associated_class >> This returns the L with which this attribute is associated, if any. =item B<< $attr->attach_to_class($metaclass) >> This method stores a weakened reference to the C<$metaclass> object internally. This method does not remove the attribute from its old class, nor does it create any accessors in the new class. It is probably best to use the L C method instead. =item B<< $attr->detach_from_class >> This method removes the associate metaclass object from the attribute it has one. This method does not remove the attribute itself from the class, or remove its accessors. It is probably best to use the L C method instead. =back =head2 Attribute Accessor generation =over 4 =item B<< $attr->accessor_metaclass >> Accessor methods are generated using an accessor metaclass. By default, this is L. This method returns the name of the accessor metaclass that this attribute uses. =item B<< $attr->associate_method($method) >> This associates a L object with the attribute. Typically, this is called internally when an attribute generates its accessors. =item B<< $attr->associated_methods >> This returns the list of methods which have been associated with the attribute. =item B<< $attr->install_accessors >> This method generates and installs code for the attribute's accessors. It is typically called from the L C method. =item B<< $attr->remove_accessors >> This method removes all of the accessors associated with the attribute. This does not currently remove methods from the list returned by C. =item B<< $attr->inline_get >> =item B<< $attr->inline_set >> =item B<< $attr->inline_has >> =item B<< $attr->inline_clear >> These methods return a code snippet suitable for inlining the relevant operation. They expect strings containing variable names to be used in the inlining, like C<'$self'> or C<'$_[1]'>. =back =head2 Introspection =over 4 =item B<< Class::MOP::Attribute->meta >> This will return a L instance for this class. It should also be noted that L will actually bootstrap this module by installing a number of attribute meta-objects into its metaclass. =back =head1 AUTHORS =over 4 =item * Stevan Little =item * Dave Rolsky =item * Jesse Luehrs =item * Shawn M Moore =item * יובל קוג'מן (Yuval Kogman) =item * Karen Etheridge =item * Florian Ragwitz =item * Hans Dieter Pearcey =item * Chris Prather =item * Matt S Trout =back =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2006 by Infinity Interactive, Inc. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Moose-2.2200/lib/Class/MOP/Deprecated.pm000640 000766 000024 00000002745 14137574636 020024 0ustar00etherstaff000000 000000 package Class::MOP::Deprecated; our $VERSION = '2.2200'; use strict; use warnings; use Package::DeprecationManager -deprecations => { 'Class::Load wrapper functions' => '2.1100', }; 1; # ABSTRACT: Manages deprecation warnings for Class::MOP __END__ =pod =encoding UTF-8 =head1 NAME Class::MOP::Deprecated - Manages deprecation warnings for Class::MOP =head1 VERSION version 2.2200 =head1 DESCRIPTION use Class::MOP::Deprecated -api_version => $version; =head1 FUNCTIONS This module manages deprecation warnings for features that have been deprecated in Class::MOP. If you specify C<< -api_version => $version >>, you can use deprecated features without warnings. Note that this special treatment is limited to the package that loads C. =head1 AUTHORS =over 4 =item * Stevan Little =item * Dave Rolsky =item * Jesse Luehrs =item * Shawn M Moore =item * יובל קוג'מן (Yuval Kogman) =item * Karen Etheridge =item * Florian Ragwitz =item * Hans Dieter Pearcey =item * Chris Prather =item * Matt S Trout =back =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2006 by Infinity Interactive, Inc. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Moose-2.2200/lib/Class/MOP/Mixin/000770 000766 000024 00000000000 14137574636 016503 5ustar00etherstaff000000 000000 Moose-2.2200/lib/Class/MOP/Method.pm000640 000766 000024 00000020447 14137574636 017203 0ustar00etherstaff000000 000000 package Class::MOP::Method; our $VERSION = '2.2200'; use strict; use warnings; use Scalar::Util 'weaken', 'reftype', 'blessed'; use parent 'Class::MOP::Object'; # NOTE: # if poked in the right way, # they should act like CODE refs. use overload '&{}' => sub { $_[0]->body }, 'bool' => sub { 1 }, '""' => sub { overload::StrVal($_[0]) }, fallback => 1; # construction sub wrap { my ( $class, @args ) = @_; unshift @args, 'body' if @args % 2 == 1; my %params = @args; my $code = $params{body}; if (blessed($code) && $code->isa(__PACKAGE__)) { my $method = $code->clone; delete $params{body}; Class::MOP::class_of($class)->rebless_instance($method, %params); return $method; } elsif (!ref $code || 'CODE' ne reftype($code)) { $class->_throw_exception( WrapTakesACodeRefToBless => params => \%params, class => $class, code => $code ); } ($params{package_name} && $params{name}) || $class->_throw_exception( PackageNameAndNameParamsNotGivenToWrap => params => \%params, class => $class, code => $code ); my $self = $class->_new(\%params); weaken($self->{associated_metaclass}) if $self->{associated_metaclass}; return $self; } sub _new { my $class = shift; return Class::MOP::Class->initialize($class)->new_object(@_) if $class ne __PACKAGE__; my $params = @_ == 1 ? $_[0] : {@_}; return bless { 'body' => $params->{body}, 'associated_metaclass' => $params->{associated_metaclass}, 'package_name' => $params->{package_name}, 'name' => $params->{name}, 'original_method' => $params->{original_method}, } => $class; } ## accessors sub associated_metaclass { shift->{'associated_metaclass'} } sub attach_to_class { my ( $self, $class ) = @_; $self->{associated_metaclass} = $class; weaken($self->{associated_metaclass}); } sub detach_from_class { my $self = shift; delete $self->{associated_metaclass}; } sub fully_qualified_name { my $self = shift; $self->package_name . '::' . $self->name; } sub original_method { (shift)->{'original_method'} } sub _set_original_method { $_[0]->{'original_method'} = $_[1] } # It's possible that this could cause a loop if there is a circular # reference in here. That shouldn't ever happen in normal # circumstances, since original method only gets set when clone is # called. We _could_ check for such a loop, but it'd involve some sort # of package-lexical variable, and wouldn't be terribly subclassable. sub original_package_name { my $self = shift; $self->original_method ? $self->original_method->original_package_name : $self->package_name; } sub original_name { my $self = shift; $self->original_method ? $self->original_method->original_name : $self->name; } sub original_fully_qualified_name { my $self = shift; $self->original_method ? $self->original_method->original_fully_qualified_name : $self->fully_qualified_name; } sub execute { my $self = shift; $self->body->(@_); } # We used to go through use Class::MOP::Class->clone_instance to do this, but # this was awfully slow. This method may be called a number of times when # classes are loaded (especially during Moose role application), so it is # worth optimizing. - DR sub clone { my $self = shift; my $clone = bless { %{$self}, @_ }, blessed($self); weaken($clone->{associated_metaclass}) if $clone->{associated_metaclass}; $clone->_set_original_method($self); return $clone; } sub _inline_throw_exception { my ( $self, $exception_type, $throw_args ) = @_; return 'die Module::Runtime::use_module("Moose::Exception::' . $exception_type . '")->new(' . ( $throw_args || '' ) . ')'; } 1; # ABSTRACT: Method Meta Object __END__ =pod =encoding UTF-8 =head1 NAME Class::MOP::Method - Method Meta Object =head1 VERSION version 2.2200 =head1 DESCRIPTION The Method Protocol is very small, since methods in Perl 5 are just subroutines in a specific package. We provide a very basic introspection interface. =head1 METHODS =over 4 =item B<< Class::MOP::Method->wrap($code, %options) >> This is the constructor. It accepts a method body in the form of either a code reference or a L instance, followed by a hash of options. The options are: =over 8 =item * name The method name (without a package name). This is required if C<$code> is a coderef. =item * package_name The package name for the method. This is required if C<$code> is a coderef. =item * associated_metaclass An optional L object. This is the metaclass for the method's class. =back =item B<< $metamethod->clone(%params) >> This makes a shallow clone of the method object. In particular, subroutine reference itself is shared between all clones of a given method. When a method is cloned, the original method object will be available by calling C on the clone. =item B<< $metamethod->body >> This returns a reference to the method's subroutine. =item B<< $metamethod->name >> This returns the method's name. =item B<< $metamethod->package_name >> This returns the method's package name. =item B<< $metamethod->fully_qualified_name >> This returns the method's fully qualified name (package name and method name). =item B<< $metamethod->associated_metaclass >> This returns the L object for the method, if one exists. =item B<< $metamethod->original_method >> If this method object was created as a clone of some other method object, this returns the object that was cloned. =item B<< $metamethod->original_name >> This returns the method's original name, wherever it was first defined. If this method is a clone of a clone (of a clone, etc.), this method returns the name from the I method in the chain of clones. =item B<< $metamethod->original_package_name >> This returns the method's original package name, wherever it was first defined. If this method is a clone of a clone (of a clone, etc.), this method returns the package name from the I method in the chain of clones. =item B<< $metamethod->original_fully_qualified_name >> This returns the method's original fully qualified name, wherever it was first defined. If this method is a clone of a clone (of a clone, etc.), this method returns the fully qualified name from the I method in the chain of clones. =item B<< $metamethod->is_stub >> Returns true if the method is just a stub: sub foo; =item B<< $metamethod->attach_to_class($metaclass) >> Given a L object, this method sets the associated metaclass for the method. This will overwrite any existing associated metaclass. =item B<< $metamethod->detach_from_class >> Removes any associated metaclass object for the method. =item B<< $metamethod->execute(...) >> This executes the method. Any arguments provided will be passed on to the method itself. =item B<< Class::MOP::Method->meta >> This will return a L instance for this class. It should also be noted that L will actually bootstrap this module by installing a number of attribute meta-objects into its metaclass. =back =head1 AUTHORS =over 4 =item * Stevan Little =item * Dave Rolsky =item * Jesse Luehrs =item * Shawn M Moore =item * יובל קוג'מן (Yuval Kogman) =item * Karen Etheridge =item * Florian Ragwitz =item * Hans Dieter Pearcey =item * Chris Prather =item * Matt S Trout =back =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2006 by Infinity Interactive, Inc. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Moose-2.2200/lib/Class/MOP/Class.pm000640 000766 000024 00000207777 14137574636 017045 0ustar00etherstaff000000 000000 package Class::MOP::Class; our $VERSION = '2.2200'; use strict; use warnings; use Class::MOP::Instance; use Class::MOP::Method::Wrapped; use Class::MOP::Method::Accessor; use Class::MOP::Method::Constructor; use Class::MOP::MiniTrait; use Carp 'confess'; use Module::Runtime 'use_package_optimistically'; use Scalar::Util 'blessed'; use Sub::Util 1.40 'set_subname'; use Try::Tiny; use List::Util 1.33 'all'; use parent 'Class::MOP::Module', 'Class::MOP::Mixin::HasAttributes', 'Class::MOP::Mixin::HasMethods', 'Class::MOP::Mixin::HasOverloads'; # Creation sub initialize { my $class = shift; my $package_name; if ( @_ % 2 ) { $package_name = shift; } else { my %options = @_; $package_name = $options{package}; } ($package_name && !ref($package_name)) || ($class||__PACKAGE__)->_throw_exception( InitializeTakesUnBlessedPackageName => package_name => $package_name ); return Class::MOP::get_metaclass_by_name($package_name) || $class->_construct_class_instance(package => $package_name, @_); } sub reinitialize { my ( $class, @args ) = @_; unshift @args, "package" if @args % 2; my %options = @args; my $old_metaclass = blessed($options{package}) ? $options{package} : Class::MOP::get_metaclass_by_name($options{package}); $options{weaken} = Class::MOP::metaclass_is_weak($old_metaclass->name) if !exists $options{weaken} && blessed($old_metaclass) && $old_metaclass->isa('Class::MOP::Class'); $old_metaclass->_remove_generated_metaobjects if $old_metaclass && $old_metaclass->isa('Class::MOP::Class'); my $new_metaclass = $class->SUPER::reinitialize(%options); $new_metaclass->_restore_metaobjects_from($old_metaclass) if $old_metaclass && $old_metaclass->isa('Class::MOP::Class'); return $new_metaclass; } # NOTE: (meta-circularity) # this is a special form of _construct_instance # (see below), which is used to construct class # meta-object instances for any Class::MOP::* # class. All other classes will use the more # normal &construct_instance. sub _construct_class_instance { my $class = shift; my $options = @_ == 1 ? $_[0] : {@_}; my $package_name = $options->{package}; (defined $package_name && $package_name) || $class->_throw_exception("ConstructClassInstanceTakesPackageName"); # NOTE: # return the metaclass if we have it cached, # and it is still defined (it has not been # reaped by DESTROY yet, which can happen # annoyingly enough during global destruction) if (defined(my $meta = Class::MOP::get_metaclass_by_name($package_name))) { return $meta; } $class = ref $class ? $class->_real_ref_name : $class; # now create the metaclass my $meta; if ($class eq 'Class::MOP::Class') { $meta = $class->_new($options); } else { # NOTE: # it is safe to use meta here because # class will always be a subclass of # Class::MOP::Class, which defines meta $meta = $class->meta->_construct_instance($options) } # and check the metaclass compatibility $meta->_check_metaclass_compatibility(); Class::MOP::store_metaclass_by_name($package_name, $meta); # NOTE: # we need to weaken any anon classes # so that they can call DESTROY properly Class::MOP::weaken_metaclass($package_name) if $options->{weaken}; $meta; } sub _real_ref_name { my $self = shift; # NOTE: we need to deal with the possibility of class immutability here, # and then get the name of the class appropriately return $self->is_immutable ? $self->_get_mutable_metaclass_name() : ref $self; } sub _new { my $class = shift; return Class::MOP::Class->initialize($class)->new_object(@_) if $class ne __PACKAGE__; my $options = @_ == 1 ? $_[0] : {@_}; return bless { # inherited from Class::MOP::Package 'package' => $options->{package}, # NOTE: # since the following attributes will # actually be loaded from the symbol # table, and actually bypass the instance # entirely, we can just leave these things # listed here for reference, because they # should not actually have a value associated # with the slot. 'namespace' => \undef, 'methods' => {}, # inherited from Class::MOP::Module 'version' => \undef, 'authority' => \undef, # defined in Class::MOP::Class 'superclasses' => \undef, 'attributes' => {}, 'attribute_metaclass' => ( $options->{'attribute_metaclass'} || 'Class::MOP::Attribute' ), 'method_metaclass' => ( $options->{'method_metaclass'} || 'Class::MOP::Method' ), 'wrapped_method_metaclass' => ( $options->{'wrapped_method_metaclass'} || 'Class::MOP::Method::Wrapped' ), 'instance_metaclass' => ( $options->{'instance_metaclass'} || 'Class::MOP::Instance' ), 'immutable_trait' => ( $options->{'immutable_trait'} || 'Class::MOP::Class::Immutable::Trait' ), 'constructor_name' => ( $options->{constructor_name} || 'new' ), 'constructor_class' => ( $options->{constructor_class} || 'Class::MOP::Method::Constructor' ), 'destructor_class' => $options->{destructor_class}, }, $class; } ## Metaclass compatibility { my %base_metaclass = ( attribute_metaclass => 'Class::MOP::Attribute', method_metaclass => 'Class::MOP::Method', wrapped_method_metaclass => 'Class::MOP::Method::Wrapped', instance_metaclass => 'Class::MOP::Instance', constructor_class => 'Class::MOP::Method::Constructor', destructor_class => 'Class::MOP::Method::Destructor', ); sub _base_metaclasses { %base_metaclass } } sub _check_metaclass_compatibility { my $self = shift; my @superclasses = $self->superclasses or return; $self->_fix_metaclass_incompatibility(@superclasses); my %base_metaclass = $self->_base_metaclasses; # this is always okay ... return if ref($self) eq 'Class::MOP::Class' && all { my $meta = $self->$_; !defined($meta) || $meta eq $base_metaclass{$_}; } keys %base_metaclass; for my $superclass (@superclasses) { $self->_check_class_metaclass_compatibility($superclass); } for my $metaclass_type ( keys %base_metaclass ) { next unless defined $self->$metaclass_type; for my $superclass (@superclasses) { $self->_check_single_metaclass_compatibility( $metaclass_type, $superclass ); } } } sub _check_class_metaclass_compatibility { my $self = shift; my ( $superclass_name ) = @_; if (!$self->_class_metaclass_is_compatible($superclass_name)) { my $super_meta = Class::MOP::get_metaclass_by_name($superclass_name); my $super_meta_type = $super_meta->_real_ref_name; $self->_throw_exception( IncompatibleMetaclassOfSuperclass => class_name => $self->name, class_meta_type => ref( $self ), superclass_name => $superclass_name, superclass_meta_type => $super_meta_type ); } } sub _class_metaclass_is_compatible { my $self = shift; my ( $superclass_name ) = @_; my $super_meta = Class::MOP::get_metaclass_by_name($superclass_name) || return 1; my $super_meta_name = $super_meta->_real_ref_name; return $self->_is_compatible_with($super_meta_name); } sub _check_single_metaclass_compatibility { my $self = shift; my ( $metaclass_type, $superclass_name ) = @_; if (!$self->_single_metaclass_is_compatible($metaclass_type, $superclass_name)) { my $super_meta = Class::MOP::get_metaclass_by_name($superclass_name); $self->_throw_exception( MetaclassTypeIncompatible => class_name => $self->name, superclass_name => $superclass_name, metaclass_type => $metaclass_type ); } } sub _single_metaclass_is_compatible { my $self = shift; my ( $metaclass_type, $superclass_name ) = @_; my $super_meta = Class::MOP::get_metaclass_by_name($superclass_name) || return 1; # for instance, Moose::Meta::Class has a error_class attribute, but # Class::MOP::Class doesn't - this shouldn't be an error return 1 unless $super_meta->can($metaclass_type); # for instance, Moose::Meta::Class has a destructor_class, but # Class::MOP::Class doesn't - this shouldn't be an error return 1 unless defined $super_meta->$metaclass_type; # if metaclass is defined in superclass but not here, it's not compatible # this is a really odd case return 0 unless defined $self->$metaclass_type; return $self->$metaclass_type->_is_compatible_with($super_meta->$metaclass_type); } sub _fix_metaclass_incompatibility { my $self = shift; my @supers = map { Class::MOP::Class->initialize($_) } @_; my $necessary = 0; for my $super (@supers) { $necessary = 1 if $self->_can_fix_metaclass_incompatibility($super); } return unless $necessary; for my $super (@supers) { if (!$self->_class_metaclass_is_compatible($super->name)) { $self->_fix_class_metaclass_incompatibility($super); } } my %base_metaclass = $self->_base_metaclasses; for my $metaclass_type (keys %base_metaclass) { for my $super (@supers) { if (!$self->_single_metaclass_is_compatible($metaclass_type, $super->name)) { $self->_fix_single_metaclass_incompatibility( $metaclass_type, $super ); } } } } sub _can_fix_metaclass_incompatibility { my $self = shift; my ($super_meta) = @_; return 1 if $self->_class_metaclass_can_be_made_compatible($super_meta); my %base_metaclass = $self->_base_metaclasses; for my $metaclass_type (keys %base_metaclass) { return 1 if $self->_single_metaclass_can_be_made_compatible($super_meta, $metaclass_type); } return; } sub _class_metaclass_can_be_made_compatible { my $self = shift; my ($super_meta) = @_; return $self->_can_be_made_compatible_with($super_meta->_real_ref_name); } sub _single_metaclass_can_be_made_compatible { my $self = shift; my ($super_meta, $metaclass_type) = @_; my $specific_meta = $self->$metaclass_type; return unless $super_meta->can($metaclass_type); my $super_specific_meta = $super_meta->$metaclass_type; # for instance, Moose::Meta::Class has a destructor_class, but # Class::MOP::Class doesn't - this shouldn't be an error return unless defined $super_specific_meta; # if metaclass is defined in superclass but not here, it's fixable # this is a really odd case return 1 unless defined $specific_meta; return 1 if $specific_meta->_can_be_made_compatible_with($super_specific_meta); } sub _fix_class_metaclass_incompatibility { my $self = shift; my ( $super_meta ) = @_; if ($self->_class_metaclass_can_be_made_compatible($super_meta)) { ($self->is_pristine) || $self->_throw_exception( CannotFixMetaclassCompatibility => class_name => $self->name, superclass => $super_meta ); my $super_meta_name = $super_meta->_real_ref_name; $self->_make_compatible_with($super_meta_name); } } sub _fix_single_metaclass_incompatibility { my $self = shift; my ( $metaclass_type, $super_meta ) = @_; if ($self->_single_metaclass_can_be_made_compatible($super_meta, $metaclass_type)) { ($self->is_pristine) || $self->_throw_exception( CannotFixMetaclassCompatibility => class_name => $self->name, superclass => $super_meta, metaclass_type => $metaclass_type ); my $new_metaclass = $self->$metaclass_type ? $self->$metaclass_type->_get_compatible_metaclass($super_meta->$metaclass_type) : $super_meta->$metaclass_type; $self->{$metaclass_type} = $new_metaclass; } } sub _restore_metaobjects_from { my $self = shift; my ($old_meta) = @_; $self->_restore_metamethods_from($old_meta); $self->_restore_metaattributes_from($old_meta); } sub _remove_generated_metaobjects { my $self = shift; for my $attr (map { $self->get_attribute($_) } $self->get_attribute_list) { $attr->remove_accessors; } } # creating classes with MOP ... sub create { my $class = shift; my @args = @_; unshift @args, 'package' if @args % 2 == 1; my %options = @args; (ref $options{superclasses} eq 'ARRAY') || __PACKAGE__->_throw_exception( CreateMOPClassTakesArrayRefOfSuperclasses => class => $class, params => \%options ) if exists $options{superclasses}; (ref $options{attributes} eq 'ARRAY') || __PACKAGE__->_throw_exception( CreateMOPClassTakesArrayRefOfAttributes => class => $class, params => \%options ) if exists $options{attributes}; (ref $options{methods} eq 'HASH') || __PACKAGE__->_throw_exception( CreateMOPClassTakesHashRefOfMethods => class => $class, params => \%options ) if exists $options{methods}; my $package = delete $options{package}; my $superclasses = delete $options{superclasses}; my $attributes = delete $options{attributes}; my $methods = delete $options{methods}; my $meta_name = exists $options{meta_name} ? delete $options{meta_name} : 'meta'; my $meta = $class->SUPER::create($package => %options); $meta->_add_meta_method($meta_name) if defined $meta_name; $meta->superclasses(@{$superclasses}) if defined $superclasses; # NOTE: # process attributes first, so that they can # install accessors, but locally defined methods # can then overwrite them. It is maybe a little odd, but # I think this should be the order of things. if (defined $attributes) { foreach my $attr (@{$attributes}) { $meta->add_attribute($attr); } } if (defined $methods) { foreach my $method_name (keys %{$methods}) { $meta->add_method($method_name, $methods->{$method_name}); } } return $meta; } # XXX: something more intelligent here? sub _anon_package_prefix { 'Class::MOP::Class::__ANON__::SERIAL::' } sub create_anon_class { shift->create_anon(@_) } sub is_anon_class { shift->is_anon(@_) } sub _anon_cache_key { my $class = shift; my %options = @_; # Makes something like Super::Class|Super::Class::2 return join '=' => ( join( '|', sort @{ $options{superclasses} || [] } ), ); } # Instance Construction & Cloning sub new_object { my $class = shift; # NOTE: # we need to protect the integrity of the # Class::MOP::Class singletons here, so we # delegate this to &construct_class_instance # which will deal with the singletons return $class->_construct_class_instance(@_) if $class->name->isa('Class::MOP::Class'); return $class->_construct_instance(@_); } sub _construct_instance { my $class = shift; my $params = @_ == 1 ? $_[0] : {@_}; my $meta_instance = $class->get_meta_instance(); # FIXME: # the code below is almost certainly incorrect # but this is foreign inheritance, so we might # have to kludge it in the end. my $instance; if (my $instance_class = blessed($params->{__INSTANCE__})) { ($instance_class eq $class->name) || $class->_throw_exception( InstanceBlessedIntoWrongClass => class_name => $class->name, params => $params, instance => $params->{__INSTANCE__} ); $instance = $params->{__INSTANCE__}; } elsif (exists $params->{__INSTANCE__}) { $class->_throw_exception( InstanceMustBeABlessedReference => class_name => $class->name, params => $params, instance => $params->{__INSTANCE__} ); } else { $instance = $meta_instance->create_instance(); } foreach my $attr ($class->get_all_attributes()) { $attr->initialize_instance_slot($meta_instance, $instance, $params); } if (Class::MOP::metaclass_is_weak($class->name)) { $meta_instance->_set_mop_slot($instance, $class); } return $instance; } sub _inline_new_object { my $self = shift; return ( 'my $class = shift;', '$class = Scalar::Util::blessed($class) || $class;', $self->_inline_fallback_constructor('$class'), $self->_inline_params('$params', '$class'), $self->_inline_generate_instance('$instance', '$class'), $self->_inline_slot_initializers, $self->_inline_preserve_weak_metaclasses, $self->_inline_extra_init, 'return $instance', ); } sub _inline_fallback_constructor { my $self = shift; my ($class) = @_; return ( 'return ' . $self->_generate_fallback_constructor($class), 'if ' . $class . ' ne \'' . $self->name . '\';', ); } sub _generate_fallback_constructor { my $self = shift; my ($class) = @_; return 'Class::MOP::Class->initialize(' . $class . ')->new_object(@_)', } sub _inline_params { my $self = shift; my ($params, $class) = @_; return ( 'my ' . $params . ' = @_ == 1 ? $_[0] : {@_};', ); } sub _inline_generate_instance { my $self = shift; my ($inst, $class) = @_; return ( 'my ' . $inst . ' = ' . $self->_inline_create_instance($class) . ';', ); } sub _inline_create_instance { my $self = shift; return $self->get_meta_instance->inline_create_instance(@_); } sub _inline_slot_initializers { my $self = shift; my $idx = 0; return map { $self->_inline_slot_initializer($_, $idx++) } sort { $a->name cmp $b->name } $self->get_all_attributes; } sub _inline_slot_initializer { my $self = shift; my ($attr, $idx) = @_; if (defined(my $init_arg = $attr->init_arg)) { my @source = ( 'if (exists $params->{\'' . $init_arg . '\'}) {', $self->_inline_init_attr_from_constructor($attr, $idx), '}', ); if (my @default = $self->_inline_init_attr_from_default($attr, $idx)) { push @source, ( 'else {', @default, '}', ); } return @source; } elsif (my @default = $self->_inline_init_attr_from_default($attr, $idx)) { return ( '{', @default, '}', ); } else { return (); } } sub _inline_init_attr_from_constructor { my $self = shift; my ($attr, $idx) = @_; my @initial_value = $attr->_inline_set_value( '$instance', '$params->{\'' . $attr->init_arg . '\'}', ); push @initial_value, ( '$attrs->[' . $idx . ']->set_initial_value(', '$instance,', $attr->_inline_instance_get('$instance'), ');', ) if $attr->has_initializer; return @initial_value; } sub _inline_init_attr_from_default { my $self = shift; my ($attr, $idx) = @_; my $default = $self->_inline_default_value($attr, $idx); return unless $default; my @initial_value = $attr->_inline_set_value('$instance', $default); push @initial_value, ( '$attrs->[' . $idx . ']->set_initial_value(', '$instance,', $attr->_inline_instance_get('$instance'), ');', ) if $attr->has_initializer; return @initial_value; } sub _inline_default_value { my $self = shift; my ($attr, $index) = @_; if ($attr->has_default) { # NOTE: # default values can either be CODE refs # in which case we need to call them. Or # they can be scalars (strings/numbers) # in which case we can just deal with them # in the code we eval. if ($attr->is_default_a_coderef) { return '$defaults->[' . $index . ']->($instance)'; } else { return '$defaults->[' . $index . ']'; } } elsif ($attr->has_builder) { return '$instance->' . $attr->builder; } else { return; } } sub _inline_preserve_weak_metaclasses { my $self = shift; if (Class::MOP::metaclass_is_weak($self->name)) { return ( $self->_inline_set_mop_slot( '$instance', 'Class::MOP::class_of($class)' ) . ';' ); } else { return (); } } sub _inline_extra_init { } sub _eval_environment { my $self = shift; my @attrs = sort { $a->name cmp $b->name } $self->get_all_attributes; my $defaults = [map { $_->default } @attrs]; return { '$defaults' => \$defaults, }; } sub get_meta_instance { my $self = shift; $self->{'_meta_instance'} ||= $self->_create_meta_instance(); } sub _create_meta_instance { my $self = shift; my $instance = $self->instance_metaclass->new( associated_metaclass => $self, attributes => [ $self->get_all_attributes() ], ); $self->add_meta_instance_dependencies() if $instance->is_dependent_on_superclasses(); return $instance; } # TODO: this is actually not being used! sub _inline_rebless_instance { my $self = shift; return $self->get_meta_instance->inline_rebless_instance_structure(@_); } sub _inline_get_mop_slot { my $self = shift; return $self->get_meta_instance->_inline_get_mop_slot(@_); } sub _inline_set_mop_slot { my $self = shift; return $self->get_meta_instance->_inline_set_mop_slot(@_); } sub _inline_clear_mop_slot { my $self = shift; return $self->get_meta_instance->_inline_clear_mop_slot(@_); } sub clone_object { my $class = shift; my $instance = shift; (blessed($instance) && $instance->isa($class->name)) || $class->_throw_exception( CloneObjectExpectsAnInstanceOfMetaclass => class_name => $class->name, instance => $instance, ); # NOTE: # we need to protect the integrity of the # Class::MOP::Class singletons here, they # should not be cloned. return $instance if $instance->isa('Class::MOP::Class'); $class->_clone_instance($instance, @_); } sub _clone_instance { my ($class, $instance, %params) = @_; (blessed($instance)) || $class->_throw_exception( OnlyInstancesCanBeCloned => class_name => $class->name, instance => $instance, params => \%params ); my $meta_instance = $class->get_meta_instance(); my $clone = $meta_instance->clone_instance($instance); foreach my $attr ($class->get_all_attributes()) { if ( defined( my $init_arg = $attr->init_arg ) ) { if (exists $params{$init_arg}) { $attr->set_value($clone, $params{$init_arg}); } } } return $clone; } sub _force_rebless_instance { my ($self, $instance, %params) = @_; my $old_metaclass = Class::MOP::class_of($instance); $old_metaclass->rebless_instance_away($instance, $self, %params) if $old_metaclass; my $meta_instance = $self->get_meta_instance; if (Class::MOP::metaclass_is_weak($old_metaclass->name)) { $meta_instance->_clear_mop_slot($instance); } # rebless! # we use $_[1] here because of t/cmop/rebless_overload.t regressions # on 5.8.8 $meta_instance->rebless_instance_structure($_[1], $self); $self->_fixup_attributes_after_rebless($instance, $old_metaclass, %params); if (Class::MOP::metaclass_is_weak($self->name)) { $meta_instance->_set_mop_slot($instance, $self); } } sub rebless_instance { my ($self, $instance, %params) = @_; my $old_metaclass = Class::MOP::class_of($instance); my $old_class = $old_metaclass ? $old_metaclass->name : blessed($instance); $self->name->isa($old_class) || $self->_throw_exception( CanReblessOnlyIntoASubclass => class_name => $self->name, instance => $instance, instance_class => blessed( $instance ), params => \%params, ); $self->_force_rebless_instance($_[1], %params); return $instance; } sub rebless_instance_back { my ( $self, $instance ) = @_; my $old_metaclass = Class::MOP::class_of($instance); my $old_class = $old_metaclass ? $old_metaclass->name : blessed($instance); $old_class->isa( $self->name ) || $self->_throw_exception( CanReblessOnlyIntoASuperclass => class_name => $self->name, instance => $instance, instance_class => blessed( $instance ), ); $self->_force_rebless_instance($_[1]); return $instance; } sub rebless_instance_away { # this intentionally does nothing, it is just a hook } sub _fixup_attributes_after_rebless { my $self = shift; my ($instance, $rebless_from, %params) = @_; my $meta_instance = $self->get_meta_instance; for my $attr ( $rebless_from->get_all_attributes ) { next if $self->find_attribute_by_name( $attr->name ); $meta_instance->deinitialize_slot( $instance, $_ ) for $attr->slots; } foreach my $attr ( $self->get_all_attributes ) { if ( $attr->has_value($instance) ) { if ( defined( my $init_arg = $attr->init_arg ) ) { $params{$init_arg} = $attr->get_value($instance) unless exists $params{$init_arg}; } else { $attr->set_value($instance, $attr->get_value($instance)); } } } foreach my $attr ($self->get_all_attributes) { $attr->initialize_instance_slot($meta_instance, $instance, \%params); } } sub _attach_attribute { my ($self, $attribute) = @_; $attribute->attach_to_class($self); } sub _post_add_attribute { my ( $self, $attribute ) = @_; $self->invalidate_meta_instances; # invalidate package flag here try { local $SIG{__DIE__}; $attribute->install_accessors; } catch { $self->remove_attribute( $attribute->name ); die $_; }; } sub remove_attribute { my $self = shift; my $removed_attribute = $self->SUPER::remove_attribute(@_) or return; $self->invalidate_meta_instances; $removed_attribute->remove_accessors; $removed_attribute->detach_from_class; return$removed_attribute; } sub find_attribute_by_name { my ( $self, $attr_name ) = @_; foreach my $class ( $self->linearized_isa ) { # fetch the meta-class ... my $meta = Class::MOP::Class->initialize($class); return $meta->get_attribute($attr_name) if $meta->has_attribute($attr_name); } return; } sub get_all_attributes { my $self = shift; my %attrs = map { %{ Class::MOP::Class->initialize($_)->_attribute_map } } reverse $self->linearized_isa; return values %attrs; } # Inheritance sub superclasses { my $self = shift; my $isa = $self->get_or_add_package_symbol('@ISA'); if (@_) { my @supers = @_; @{$isa} = @supers; # NOTE: # on 5.8 and below, we need to call # a method to get Perl to detect # a cycle in the class hierarchy my $class = $self->name; $class->isa($class); # NOTE: # we need to check the metaclass # compatibility here so that we can # be sure that the superclass is # not potentially creating an issues # we don't know about $self->_check_metaclass_compatibility(); $self->_superclasses_updated(); } return @{$isa}; } sub _superclasses_updated { my $self = shift; $self->update_meta_instance_dependencies(); # keep strong references to all our parents, so they don't disappear if # they are anon classes and don't have any direct instances $self->_superclass_metas( map { Class::MOP::class_of($_) } $self->superclasses ); } sub _superclass_metas { my $self = shift; $self->{_superclass_metas} = [@_]; } sub subclasses { my $self = shift; my $super_class = $self->name; return @{ $super_class->mro::get_isarev() }; } sub direct_subclasses { my $self = shift; my $super_class = $self->name; return grep { grep { $_ eq $super_class } Class::MOP::Class->initialize($_)->superclasses } $self->subclasses; } sub linearized_isa { return @{ mro::get_linear_isa( (shift)->name ) }; } sub class_precedence_list { my $self = shift; my $name = $self->name; unless (Class::MOP::IS_RUNNING_ON_5_10()) { # NOTE: # We need to check for circular inheritance here # if we are not on 5.10, cause 5.8 detects it late. # This will do nothing if all is well, and blow up # otherwise. Yes, it's an ugly hack, better # suggestions are welcome. # - SL ($name || return)->isa('This is a test for circular inheritance') } # if our mro is c3, we can # just grab the linear_isa if (mro::get_mro($name) eq 'c3') { return @{ mro::get_linear_isa($name) } } else { # NOTE: # we can't grab the linear_isa for dfs # since it has all the duplicates # already removed. return ( $name, map { Class::MOP::Class->initialize($_)->class_precedence_list() } $self->superclasses() ); } } sub _method_lookup_order { return (shift->linearized_isa, 'UNIVERSAL'); } ## Methods { my $fetch_and_prepare_method = sub { my ($self, $method_name) = @_; my $wrapped_metaclass = $self->wrapped_method_metaclass; # fetch it locally my $method = $self->get_method($method_name); # if we don't have local ... unless ($method) { # try to find the next method $method = $self->find_next_method_by_name($method_name); # die if it does not exist (defined $method) || $self->_throw_exception( MethodNameNotFoundInInheritanceHierarchy => class_name => $self->name, method_name => $method_name ); # and now make sure to wrap it # even if it is already wrapped # because we need a new sub ref $method = $wrapped_metaclass->wrap($method, package_name => $self->name, name => $method_name, ); } else { # now make sure we wrap it properly $method = $wrapped_metaclass->wrap($method, package_name => $self->name, name => $method_name, ) unless $method->isa($wrapped_metaclass); } $self->add_method($method_name => $method); return $method; }; sub add_before_method_modifier { my ($self, $method_name, $method_modifier) = @_; (defined $method_name && length $method_name) || $self->_throw_exception( MethodModifierNeedsMethodName => class_name => $self->name ); my $method = $fetch_and_prepare_method->($self, $method_name); $method->add_before_modifier( set_subname(':before' => $method_modifier) ); } sub add_after_method_modifier { my ($self, $method_name, $method_modifier) = @_; (defined $method_name && length $method_name) || $self->_throw_exception( MethodModifierNeedsMethodName => class_name => $self->name ); my $method = $fetch_and_prepare_method->($self, $method_name); $method->add_after_modifier( set_subname(':after' => $method_modifier) ); } sub add_around_method_modifier { my ($self, $method_name, $method_modifier) = @_; (defined $method_name && length $method_name) || $self->_throw_exception( MethodModifierNeedsMethodName => class_name => $self->name ); my $method = $fetch_and_prepare_method->($self, $method_name); $method->add_around_modifier( set_subname(':around' => $method_modifier) ); } # NOTE: # the methods above used to be named like this: # ${pkg}::${method}:(before|after|around) # but this proved problematic when using one modifier # to wrap multiple methods (something which is likely # to happen pretty regularly IMO). So instead of naming # it like this, I have chosen to just name them purely # with their modifier names, like so: # :(before|after|around) # The fact is that in a stack trace, it will be fairly # evident from the context what method they are attached # to, and so don't need the fully qualified name. } sub find_method_by_name { my ($self, $method_name) = @_; (defined $method_name && length $method_name) || $self->_throw_exception( MethodNameNotGiven => class_name => $self->name ); foreach my $class ($self->_method_lookup_order) { my $method = Class::MOP::Class->initialize($class)->get_method($method_name); return $method if defined $method; } return; } sub get_all_methods { my $self = shift; my %methods; for my $class ( reverse $self->_method_lookup_order ) { my $meta = Class::MOP::Class->initialize($class); $methods{ $_->name } = $_ for $meta->_get_local_methods; } return values %methods; } sub get_all_method_names { my $self = shift; map { $_->name } $self->get_all_methods; } sub find_all_methods_by_name { my ($self, $method_name) = @_; (defined $method_name && length $method_name) || $self->_throw_exception( MethodNameNotGiven => class_name => $self->name ); my @methods; foreach my $class ($self->_method_lookup_order) { # fetch the meta-class ... my $meta = Class::MOP::Class->initialize($class); push @methods => { name => $method_name, class => $class, code => $meta->get_method($method_name) } if $meta->has_method($method_name); } return @methods; } sub find_next_method_by_name { my ($self, $method_name) = @_; (defined $method_name && length $method_name) || $self->_throw_exception( MethodNameNotGiven => class_name => $self->name ); my @cpl = ($self->_method_lookup_order); shift @cpl; # discard ourselves foreach my $class (@cpl) { my $method = Class::MOP::Class->initialize($class)->get_method($method_name); return $method if defined $method; } return; } sub update_meta_instance_dependencies { my $self = shift; if ( $self->{meta_instance_dependencies} ) { return $self->add_meta_instance_dependencies; } } sub add_meta_instance_dependencies { my $self = shift; $self->remove_meta_instance_dependencies; my @attrs = $self->get_all_attributes(); my %seen; my @classes = grep { not $seen{ $_->name }++ } map { $_->associated_class } @attrs; foreach my $class (@classes) { $class->add_dependent_meta_instance($self); } $self->{meta_instance_dependencies} = \@classes; } sub remove_meta_instance_dependencies { my $self = shift; if ( my $classes = delete $self->{meta_instance_dependencies} ) { foreach my $class (@$classes) { $class->remove_dependent_meta_instance($self); } return $classes; } return; } sub add_dependent_meta_instance { my ( $self, $metaclass ) = @_; push @{ $self->{dependent_meta_instances} }, $metaclass; } sub remove_dependent_meta_instance { my ( $self, $metaclass ) = @_; my $name = $metaclass->name; @$_ = grep { $_->name ne $name } @$_ for $self->{dependent_meta_instances}; } sub invalidate_meta_instances { my $self = shift; $_->invalidate_meta_instance() for $self, @{ $self->{dependent_meta_instances} }; } sub invalidate_meta_instance { my $self = shift; undef $self->{_meta_instance}; } # check if we can reinitialize sub is_pristine { my $self = shift; # if any local attr is defined return if $self->get_attribute_list; # or any non-declared methods for my $method ( map { $self->get_method($_) } $self->get_method_list ) { return if $method->isa("Class::MOP::Method::Generated"); # FIXME do we need to enforce this too? return unless $method->isa( $self->method_metaclass ); } return 1; } ## Class closing sub is_mutable { 1 } sub is_immutable { 0 } sub immutable_options { %{ $_[0]{__immutable}{options} || {} } } sub _immutable_options { my ( $self, @args ) = @_; return ( inline_accessors => 1, inline_constructor => 1, inline_destructor => 0, debug => 0, immutable_trait => $self->immutable_trait, constructor_name => $self->constructor_name, constructor_class => $self->constructor_class, destructor_class => $self->destructor_class, @args, ); } sub make_immutable { my ( $self, @args ) = @_; return $self unless $self->is_mutable; my ($file, $line) = (caller)[1..2]; $self->_initialize_immutable( file => $file, line => $line, $self->_immutable_options(@args), ); $self->_rebless_as_immutable(@args); return $self; } sub make_mutable { my $self = shift; if ( $self->is_immutable ) { my @args = $self->immutable_options; $self->_rebless_as_mutable(); $self->_remove_inlined_code(@args); delete $self->{__immutable}; return $self; } else { return; } } sub _rebless_as_immutable { my ( $self, @args ) = @_; $self->{__immutable}{original_class} = ref $self; bless $self => $self->_immutable_metaclass(@args); } sub _immutable_metaclass { my ( $self, %args ) = @_; if ( my $class = $args{immutable_metaclass} ) { return $class; } my $trait = $args{immutable_trait} = $self->immutable_trait || $self->_throw_exception( NoImmutableTraitSpecifiedForClass => class_name => $self->name, params => \%args ); my $meta = $self->meta; my $meta_attr = $meta->find_attribute_by_name("immutable_trait"); my $class_name; if ( $meta_attr and $trait eq $meta_attr->default ) { # if the trait is the same as the default we try and pick a # predictable name for the immutable metaclass $class_name = 'Class::MOP::Class::Immutable::' . ref($self); } else { $class_name = join '::', 'Class::MOP::Class::Immutable::CustomTrait', $trait, 'ForMetaClass', ref($self); } return $class_name if Class::MOP::does_metaclass_exist($class_name); # If the metaclass is a subclass of CMOP::Class which has had # metaclass roles applied (via Moose), then we want to make sure # that we preserve that anonymous class (see Fey::ORM for an # example of where this matters). my $meta_name = $meta->_real_ref_name; my $immutable_meta = $meta_name->create( $class_name, superclasses => [ ref $self ], ); Class::MOP::MiniTrait::apply( $immutable_meta, $trait ); $immutable_meta->make_immutable( inline_constructor => 0, inline_accessors => 0, ); return $class_name; } sub _remove_inlined_code { my $self = shift; $self->remove_method( $_->name ) for $self->_inlined_methods; delete $self->{__immutable}{inlined_methods}; } sub _inlined_methods { @{ $_[0]{__immutable}{inlined_methods} || [] } } sub _add_inlined_method { my ( $self, $method ) = @_; push @{ $self->{__immutable}{inlined_methods} ||= [] }, $method; } sub _initialize_immutable { my ( $self, %args ) = @_; $self->{__immutable}{options} = \%args; $self->_install_inlined_code(%args); } sub _install_inlined_code { my ( $self, %args ) = @_; # FIXME $self->_inline_accessors(%args) if $args{inline_accessors}; $self->_inline_constructor(%args) if $args{inline_constructor}; $self->_inline_destructor(%args) if $args{inline_destructor}; } sub _rebless_as_mutable { my $self = shift; bless $self, $self->_get_mutable_metaclass_name; return $self; } sub _inline_accessors { my $self = shift; foreach my $attr_name ( $self->get_attribute_list ) { $self->get_attribute($attr_name)->install_accessors(1); } } sub _inline_constructor { my ( $self, %args ) = @_; my $name = $args{constructor_name}; # A class may not even have a constructor, and that's okay. return unless defined $name; if ( $self->has_method($name) && !$args{replace_constructor} ) { my $class = $self->name; warn "Not inlining a constructor for $class since it defines" . " its own constructor.\n" . "If you are certain you don't need to inline your" . " constructor, specify inline_constructor => 0 in your" . " call to $class->meta->make_immutable\n"; return; } my $constructor_class = $args{constructor_class}; { local $@; use_package_optimistically($constructor_class); } my $constructor = $constructor_class->new( options => \%args, metaclass => $self, is_inline => 1, package_name => $self->name, name => $name, definition_context => { description => "constructor " . $self->name . "::" . $name, file => $args{file}, line => $args{line}, }, ); if ( $args{replace_constructor} or $constructor->can_be_inlined ) { $self->add_method( $name => $constructor ); $self->_add_inlined_method($constructor); } } sub _inline_destructor { my ( $self, %args ) = @_; ( exists $args{destructor_class} && defined $args{destructor_class} ) || $self->_throw_exception( NoDestructorClassSpecified => class_name => $self->name, params => \%args, ); if ( $self->has_method('DESTROY') && ! $args{replace_destructor} ) { my $class = $self->name; warn "Not inlining a destructor for $class since it defines" . " its own destructor.\n"; return; } my $destructor_class = $args{destructor_class}; { local $@; use_package_optimistically($destructor_class); } return unless $destructor_class->is_needed($self); my $destructor = $destructor_class->new( options => \%args, metaclass => $self, package_name => $self->name, name => 'DESTROY', definition_context => { description => "destructor " . $self->name . "::DESTROY", file => $args{file}, line => $args{line}, }, ); if ( $args{replace_destructor} or $destructor->can_be_inlined ) { $self->add_method( 'DESTROY' => $destructor ); $self->_add_inlined_method($destructor); } } 1; # ABSTRACT: Class Meta Object __END__ =pod =encoding UTF-8 =head1 NAME Class::MOP::Class - Class Meta Object =head1 VERSION version 2.2200 =head1 SYNOPSIS # assuming that class Foo # has been defined, you can # use this for introspection ... # add a method to Foo ... Foo->meta->add_method( 'bar' => sub {...} ) # get a list of all the classes searched # the method dispatcher in the correct order Foo->meta->class_precedence_list() # remove a method from Foo Foo->meta->remove_method('bar'); # or use this to actually create classes ... Class::MOP::Class->create( 'Bar' => ( version => '0.01', superclasses => ['Foo'], attributes => [ Class::MOP::Attribute->new('$bar'), Class::MOP::Attribute->new('$baz'), ], methods => { calculate_bar => sub {...}, construct_baz => sub {...} } ) ); =head1 DESCRIPTION The Class Protocol is the largest and most complex part of the Class::MOP meta-object protocol. It controls the introspection and manipulation of Perl 5 classes, and it can create them as well. The best way to understand what this module can do is to read the documentation for each of its methods. =head1 INHERITANCE C is a subclass of L. =head1 METHODS =head2 Class construction These methods all create new C objects. These objects can represent existing classes or they can be used to create new classes from scratch. The metaclass object for a given class is a singleton. If you attempt to create a metaclass for the same class twice, you will just get the existing object. =over 4 =item B<< Class::MOP::Class->create($package_name, %options) >> This method creates a new C object with the given package name. It accepts a number of options: =over 8 =item * version An optional version number for the newly created package. =item * authority An optional authority for the newly created package. See L for more details. =item * superclasses An optional array reference of superclass names. =item * methods An optional hash reference of methods for the class. The keys of the hash reference are method names and values are subroutine references. =item * attributes An optional array reference of L objects. =item * meta_name Specifies the name to install the C method for this class under. If it is not passed, C is assumed, and if C is explicitly given, no meta method will be installed. =item * weaken If true, the metaclass that is stored in the global cache will be a weak reference. Classes created in this way are destroyed once the metaclass they are attached to goes out of scope, and will be removed from Perl's internal symbol table. All instances of a class with a weakened metaclass keep a special reference to the metaclass object, which prevents the metaclass from going out of scope while any instances exist. This only works if the instance is based on a hash reference, however. =back =item B<< Class::MOP::Class->create_anon_class(%options) >> This method works just like C<< Class::MOP::Class->create >> but it creates an "anonymous" class. In fact, the class does have a name, but that name is a unique name generated internally by this module. It accepts the same C, C, and C parameters that C accepts. It also accepts a C option. If this is C, then the anonymous class will be cached based on its superclasses and roles. If an existing anonymous class in the cache has the same superclasses and roles, it will be reused. Anonymous classes default to C<< weaken => 1 >> if cache is C, although this can be overridden. =item B<< Class::MOP::Class->initialize($package_name, %options) >> This method will initialize a C object for the named package. Unlike C, this method I create a new class. The purpose of this method is to retrieve a C object for introspecting an existing class. If an existing C object exists for the named package, it will be returned, and any options provided will be ignored! If the object does not yet exist, it will be created. The valid options that can be passed to this method are C, C, C, and C. These are all optional, and default to the appropriate class in the C distribution. =back =head2 Object instance construction and cloning These methods are all related to creating and/or cloning object instances. =over 4 =item B<< $metaclass->clone_object($instance, %params) >> This method clones an existing object instance. Any parameters you provide are will override existing attribute values in the object. This is a convenience method for cloning an object instance, then blessing it into the appropriate package. You could implement a clone method in your class, using this method: sub clone { my ($self, %params) = @_; $self->meta->clone_object($self, %params); } =item B<< $metaclass->rebless_instance($instance, %params) >> This method changes the class of C<$instance> to the metaclass's class. You can only rebless an instance into a subclass of its current class. If you pass any additional parameters, these will be treated like constructor parameters and used to initialize the object's attributes. Any existing attributes that are already set will be overwritten. Before reblessing the instance, this method will call C on the instance's current metaclass. This method will be passed the instance, the new metaclass, and any parameters specified to C. By default, C does nothing; it is merely a hook. =item B<< $metaclass->rebless_instance_back($instance) >> Does the same thing as C, except that you can only rebless an instance into one of its superclasses. Any attributes that do not exist in the superclass will be deinitialized. This is a much more dangerous operation than C, especially when multiple inheritance is involved, so use this carefully! =item B<< $metaclass->new_object(%params) >> This method is used to create a new object of the metaclass's class. Any parameters you provide are used to initialize the instance's attributes. A special C<__INSTANCE__> key can be passed to provide an already generated instance, rather than having Class::MOP generate it for you. This is mostly useful for using Class::MOP with foreign classes which generate instances using their own constructors. =item B<< $metaclass->instance_metaclass >> Returns the class name of the instance metaclass. See L for more information on the instance metaclass. =item B<< $metaclass->get_meta_instance >> Returns an instance of the C to be used in the construction of a new instance of the class. =back =head2 Informational predicates These are a few predicate methods for asking information about the class itself. =over 4 =item B<< $metaclass->is_anon_class >> This returns true if the class was created by calling C<< Class::MOP::Class->create_anon_class >>. =item B<< $metaclass->is_mutable >> This returns true if the class is still mutable. =item B<< $metaclass->is_immutable >> This returns true if the class has been made immutable. =item B<< $metaclass->is_pristine >> A class is I pristine if it has non-inherited attributes or if it has any generated methods. =back =head2 Inheritance Relationships =over 4 =item B<< $metaclass->superclasses(@superclasses) >> This is a read-write accessor which represents the superclass relationships of the metaclass's class. This is basically sugar around getting and setting C<@ISA>. =item B<< $metaclass->class_precedence_list >> This returns a list of all of the class's ancestor classes. The classes are returned in method dispatch order. =item B<< $metaclass->linearized_isa >> This returns a list based on C but with all duplicates removed. =item B<< $metaclass->subclasses >> This returns a list of all subclasses for this class, even indirect subclasses. =item B<< $metaclass->direct_subclasses >> This returns a list of immediate subclasses for this class, which does not include indirect subclasses. =back =head2 Method introspection and creation These methods allow you to introspect a class's methods, as well as add, remove, or change methods. Determining what is truly a method in a Perl 5 class requires some heuristics (aka guessing). Methods defined outside the package with a fully qualified name (C) will be included. Similarly, methods named with a fully qualified name using L or L are also included. However, we attempt to ignore imported functions. Ultimately, we are using heuristics to determine what truly is a method in a class, and these heuristics may get the wrong answer in some edge cases. However, for most "normal" cases the heuristics work correctly. =over 4 =item B<< $metaclass->get_method($method_name) >> This will return a L for the specified C<$method_name>. If the class does not have the specified method, it returns C =item B<< $metaclass->has_method($method_name) >> Returns a boolean indicating whether or not the class defines the named method. It does not include methods inherited from parent classes. =item B<< $metaclass->get_method_list >> This will return a list of method I for all methods defined in this class. =item B<< $metaclass->add_method($method_name, $method) >> This method takes a method name and a subroutine reference, and adds the method to the class. The subroutine reference can be a L, and you are strongly encouraged to pass a meta method object instead of a code reference. If you do so, that object gets stored as part of the class's method map directly. If not, the meta information will have to be recreated later, and may be incorrect. If you provide a method object, this method will clone that object if the object's package name does not match the class name. This lets us track the original source of any methods added from other classes (notably Moose roles). =item B<< $metaclass->remove_method($method_name) >> Remove the named method from the class. This method returns the L object for the method. =item B<< $metaclass->method_metaclass >> Returns the class name of the method metaclass, see L for more information on the method metaclass. =item B<< $metaclass->wrapped_method_metaclass >> Returns the class name of the wrapped method metaclass, see L for more information on the wrapped method metaclass. =item B<< $metaclass->get_all_methods >> This will traverse the inheritance hierarchy and return a list of all the L objects for this class and its parents. =item B<< $metaclass->find_method_by_name($method_name) >> This will return a L for the specified C<$method_name>. If the class does not have the specified method, it returns C Unlike C, this method I look for the named method in superclasses. =item B<< $metaclass->get_all_method_names >> This will return a list of method I for all of this class's methods, including inherited methods. =item B<< $metaclass->find_all_methods_by_name($method_name) >> This method looks for the named method in the class and all of its parents. It returns every matching method it finds in the inheritance tree, so it returns a list of methods. Each method is returned as a hash reference with three keys. The keys are C, C, and C. The C key has a L object as its value. The list of methods is distinct. =item B<< $metaclass->find_next_method_by_name($method_name) >> This method returns the first method in any superclass matching the given name. It is effectively the method that C would dispatch to. =back =head2 Attribute introspection and creation Because Perl 5 does not have a core concept of attributes in classes, we can only return information about attributes which have been added via this class's methods. We cannot discover information about attributes which are defined in terms of "regular" Perl 5 methods. =over 4 =item B<< $metaclass->get_attribute($attribute_name) >> This will return a L for the specified C<$attribute_name>. If the class does not have the specified attribute, it returns C. NOTE that get_attribute does not search superclasses, for that you need to use C. =item B<< $metaclass->has_attribute($attribute_name) >> Returns a boolean indicating whether or not the class defines the named attribute. It does not include attributes inherited from parent classes. =item B<< $metaclass->get_attribute_list >> This will return a list of attributes I for all attributes defined in this class. Note that this operates on the current class only, it does not traverse the inheritance hierarchy. =item B<< $metaclass->get_all_attributes >> This will traverse the inheritance hierarchy and return a list of all the L objects for this class and its parents. =item B<< $metaclass->find_attribute_by_name($attribute_name) >> This will return a L for the specified C<$attribute_name>. If the class does not have the specified attribute, it returns C. Unlike C, this attribute I look for the named attribute in superclasses. =item B<< $metaclass->add_attribute(...) >> This method accepts either an existing L object or parameters suitable for passing to that class's C method. The attribute provided will be added to the class. Any accessor methods defined by the attribute will be added to the class when the attribute is added. If an attribute of the same name already exists, the old attribute will be removed first. =item B<< $metaclass->remove_attribute($attribute_name) >> This will remove the named attribute from the class, and L object. Removing an attribute also removes any accessor methods defined by the attribute. However, note that removing an attribute will only affect I object instances created for this class, not existing instances. =item B<< $metaclass->attribute_metaclass >> Returns the class name of the attribute metaclass for this class. By default, this is L. =back =head2 Overload introspection and creation These methods provide an API to the core L functionality. =over 4 =item B<< $metaclass->is_overloaded >> Returns true if overloading is enabled for this class. Corresponds to L. =item B<< $metaclass->get_overloaded_operator($op) >> Returns the L object corresponding to the operator named C<$op>, if one exists for this class. =item B<< $metaclass->has_overloaded_operator($op) >> Returns whether or not the operator C<$op> is overloaded for this class. =item B<< $metaclass->get_overload_list >> Returns a list of operator names which have been overloaded (see L for the list of valid operator names). =item B<< $metaclass->get_all_overloaded_operators >> Returns a list of L objects corresponding to the operators that have been overloaded. =item B<< $metaclass->add_overloaded_operator($op, $impl) >> Overloads the operator C<$op> for this class. The C<$impl> can be a coderef, a method name, or a L object. Corresponds to C<< use overload $op => $impl; >> =item B<< $metaclass->remove_overloaded_operator($op) >> Remove overloading for operator C<$op>. Corresponds to C<< no overload $op; >> =item B<< $metaclass->get_overload_fallback_value >> Returns the overload C setting for the package. =item B<< $metaclass->set_overload_fallback_value($fallback) >> Sets the overload C setting for the package. =back =head2 Class Immutability Making a class immutable "freezes" the class definition. You can no longer call methods which alter the class, such as adding or removing methods or attributes. Making a class immutable lets us optimize the class by inlining some methods, and also allows us to optimize some methods on the metaclass object itself. After immutabilization, the metaclass object will cache most informational methods that returns information about methods or attributes. Methods which would alter the class, such as C and C, will throw an error on an immutable metaclass object. The immutabilization system in L takes much greater advantage of the inlining features than Class::MOP itself does. =over 4 =item B<< $metaclass->make_immutable(%options) >> This method will create an immutable transformer and use it to make the class and its metaclass object immutable, and returns true (you should not rely on the details of this value apart from its truth). This method accepts the following options: =over 8 =item * inline_accessors =item * inline_constructor =item * inline_destructor These are all booleans indicating whether the specified method(s) should be inlined. By default, accessors and the constructor are inlined, but not the destructor. =item * immutable_trait The name of a class which will be used as a parent class for the metaclass object being made immutable. This "trait" implements the post-immutability functionality of the metaclass (but not the transformation itself). This defaults to L. =item * constructor_name This is the constructor method name. This defaults to "new". =item * constructor_class The name of the method metaclass for constructors. It will be used to generate the inlined constructor. This defaults to "Class::MOP::Method::Constructor". =item * replace_constructor This is a boolean indicating whether an existing constructor should be replaced when inlining a constructor. This defaults to false. =item * destructor_class The name of the method metaclass for destructors. It will be used to generate the inlined destructor. This defaults to "Class::MOP::Method::Denstructor". =item * replace_destructor This is a boolean indicating whether an existing destructor should be replaced when inlining a destructor. This defaults to false. =back =item B<< $metaclass->immutable_options >> Returns a hash of the options used when making the class immutable, including both defaults and anything supplied by the user in the call to C<< $metaclass->make_immutable >>. This is useful if you need to temporarily make a class mutable and then restore immutability as it was before. =item B<< $metaclass->make_mutable >> Calling this method reverse the immutabilization transformation. =back =head2 Method Modifiers Method modifiers are hooks which allow a method to be wrapped with I, I and I method modifiers. Every time a method is called, its modifiers are also called. A class can modify its own methods, as well as methods defined in parent classes. =head3 How method modifiers work? Method modifiers work by wrapping the original method and then replacing it in the class's symbol table. The wrappers will handle calling all the modifiers in the appropriate order and preserving the calling context for the original method. The return values of C and C modifiers are ignored. This is because their purpose is B to filter the input and output of the primary method (this is done with an I modifier). This may seem like an odd restriction to some, but doing this allows for simple code to be added at the beginning or end of a method call without altering the function of the wrapped method or placing any extra responsibility on the code of the modifier. Of course if you have more complex needs, you can use the C modifier which allows you to change both the parameters passed to the wrapped method, as well as its return value. Before and around modifiers are called in last-defined-first-called order, while after modifiers are called in first-defined-first-called order. So the call tree might looks something like this: before 2 before 1 around 2 around 1 primary around 1 around 2 after 1 after 2 =head3 What is the performance impact? Of course there is a performance cost associated with method modifiers, but we have made every effort to make that cost directly proportional to the number of modifier features you use. The wrapping method does its best to B do as much work as it absolutely needs to. In order to do this we have moved some of the performance costs to set-up time, where they are easier to amortize. All this said, our benchmarks have indicated the following: simple wrapper with no modifiers 100% slower simple wrapper with simple before modifier 400% slower simple wrapper with simple after modifier 450% slower simple wrapper with simple around modifier 500-550% slower simple wrapper with all 3 modifiers 1100% slower These numbers may seem daunting, but you must remember, every feature comes with some cost. To put things in perspective, just doing a simple C which does nothing but extract the name of the method called and return it costs about 400% over a normal method call. =over 4 =item B<< $metaclass->add_before_method_modifier($method_name, $code) >> This wraps the specified method with the supplied subroutine reference. The modifier will be called as a method itself, and will receive the same arguments as are passed to the method. When the modifier exits, the wrapped method will be called. The return value of the modifier will be ignored. =item B<< $metaclass->add_after_method_modifier($method_name, $code) >> This wraps the specified method with the supplied subroutine reference. The modifier will be called as a method itself, and will receive the same arguments as are passed to the method. When the wrapped methods exits, the modifier will be called. The return value of the modifier will be ignored. =item B<< $metaclass->add_around_method_modifier($method_name, $code) >> This wraps the specified method with the supplied subroutine reference. The first argument passed to the modifier will be a subroutine reference to the wrapped method. The second argument is the object, and after that come any arguments passed when the method is called. The around modifier can choose to call the original method, as well as what arguments to pass if it does so. The return value of the modifier is what will be seen by the caller. =back =head2 Introspection =over 4 =item B<< Class::MOP::Class->meta >> This will return a L instance for this class. It should also be noted that L will actually bootstrap this module by installing a number of attribute meta-objects into its metaclass. =back =head1 AUTHORS =over 4 =item * Stevan Little =item * Dave Rolsky =item * Jesse Luehrs =item * Shawn M Moore =item * יובל קוג'מן (Yuval Kogman) =item * Karen Etheridge =item * Florian Ragwitz =item * Hans Dieter Pearcey =item * Chris Prather =item * Matt S Trout =back =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2006 by Infinity Interactive, Inc. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Moose-2.2200/lib/Class/MOP/Class/000770 000766 000024 00000000000 14137574636 016464 5ustar00etherstaff000000 000000 Moose-2.2200/lib/Class/MOP/Overload.pm000640 000766 000024 00000016205 14137574636 017533 0ustar00etherstaff000000 000000 package Class::MOP::Overload; our $VERSION = '2.2200'; use strict; use warnings; use overload (); use Scalar::Util qw( blessed weaken ); use Try::Tiny; use parent 'Class::MOP::Object'; my %Operators = ( map { $_ => 1 } grep { $_ ne 'fallback' } map { split /\s+/ } values %overload::ops ); sub new { my ( $class, %params ) = @_; unless ( defined $params{operator} ) { $class->_throw_exception('OverloadRequiresAnOperator'); } unless ( $Operators{ $params{operator} } ) { $class->_throw_exception( 'InvalidOverloadOperator', operator => $params{operator}, ); } unless ( defined $params{method_name} || $params{coderef} ) { $class->_throw_exception( 'OverloadRequiresAMethodNameOrCoderef', operator => $params{operator}, ); } if ( $params{coderef} ) { unless ( defined $params{coderef_package} && defined $params{coderef_name} ) { $class->_throw_exception('OverloadRequiresNamesForCoderef'); } } if ( $params{method} && !try { $params{method}->isa('Class::MOP::Method') } ) { $class->_throw_exception('OverloadRequiresAMetaMethod'); } if ( $params{associated_metaclass} && !try { $params{associated_metaclass}->isa('Class::MOP::Module') } ) { $class->_throw_exception('OverloadRequiresAMetaClass'); } my @optional_attrs = qw( method_name coderef coderef_package coderef_name method associated_metaclass ); return bless { operator => $params{operator}, map { defined $params{$_} ? ( $_ => $params{$_} ) : () } @optional_attrs }, $class; } sub operator { $_[0]->{operator} } sub method_name { $_[0]->{method_name} } sub has_method_name { exists $_[0]->{method_name} } sub method { $_[0]->{method} } sub has_method { exists $_[0]->{method} } sub coderef { $_[0]->{coderef} } sub has_coderef { exists $_[0]->{coderef} } sub coderef_package { $_[0]->{coderef_package} } sub has_coderef_package { exists $_[0]->{coderef_package} } sub coderef_name { $_[0]->{coderef_name} } sub has_coderef_name { exists $_[0]->{coderef_name} } sub associated_metaclass { $_[0]->{associated_metaclass} } sub is_anonymous { my $self = shift; return $self->has_coderef && $self->coderef_name eq '__ANON__'; } sub attach_to_class { my ( $self, $class ) = @_; $self->{associated_metaclass} = $class; weaken $self->{associated_metaclass}; } sub clone { my $self = shift; my $clone = bless { %{$self}, @_ }, blessed($self); weaken $clone->{associated_metaclass} if $clone->{associated_metaclass}; $clone->_set_original_overload($self); return $clone; } sub original_overload { $_[0]->{original_overload} } sub _set_original_overload { $_[0]->{original_overload} = $_[1] } sub _is_equal_to { my $self = shift; my $other = shift; if ( $self->has_coderef ) { return unless $other->has_coderef; return $self->coderef == $other->coderef; } else { return $self->method_name eq $other->method_name; } } 1; # ABSTRACT: Overload Meta Object __END__ =pod =encoding UTF-8 =head1 NAME Class::MOP::Overload - Overload Meta Object =head1 VERSION version 2.2200 =head1 SYNOPSIS my $meta = Class->meta; my $overload = $meta->get_overloaded_operator('+'); if ( $overload->has_method_name ) { print 'Method for + is ', $overload->method_name, "\n"; } else { print 'Overloading for + is implemented by ', $overload->coderef_name, " sub\n"; } =head1 DESCRIPTION This class provides meta information for overloading in classes and roles. =head1 INHERITANCE C is a subclass of L. =head1 METHODS =head2 Class::MOP::Overload->new(%options) This method creates a new C object. It accepts a number of options: =over 4 =item * operator This is a string that matches an operator known by the L module, such as C<""> or C<+>. This is required. =item * method_name The name of the method which implements the overloading. Note that this does not need to actually correspond to a real method, since it's okay to declare a not-yet-implemented overloading. Either this or the C option must be passed. =item * method A L object for the method which implements the overloading. This is optional. =item * coderef A coderef which implements the overloading. Either this or the C option must be passed. =item * coderef_package The package where the coderef was defined. This is required if C is passed. =item * coderef_name The name of the coderef. This can be "__ANON__". This is required if C is passed. =item * associated_metaclass A L object for the associated class or role. This is optional. =back =head2 $overload->operator Returns the operator for this overload object. =head2 $overload->method_name Returns the method name that implements overloading, if it has one. =head2 $overload->has_method_name Returns true if the object has a method name. =head2 $overload->method Returns the L that implements overloading, if it has one. =head2 $overload->has_method Returns true if the object has a method. =head2 $overload->coderef Returns the coderef that implements overloading, if it has one. =head2 $overload->has_coderef Returns true if the object has a coderef. =head2 $overload->coderef_package Returns the package for the coderef that implements overloading, if it has one. =head2 $overload->has_coderef Returns true if the object has a coderef package. =head2 $overload->coderef_name Returns the sub name for the coderef that implements overloading, if it has one. =head2 $overload->has_coderef_name Returns true if the object has a coderef name. =head2 $overload->is_anonymous Returns true if the overloading is implemented by an anonymous coderef. =head2 $overload->associated_metaclass Returns the L (class or role) that is associated with the overload object. =head2 $overload->clone Clones the overloading object, setting C in the process. =head2 $overload->original_overload For cloned objects, this returns the L object from which they were cloned. This can be used to determine the source of an overloading in a class that came from a role, for example. =head1 AUTHORS =over 4 =item * Stevan Little =item * Dave Rolsky =item * Jesse Luehrs =item * Shawn M Moore =item * יובל קוג'מן (Yuval Kogman) =item * Karen Etheridge =item * Florian Ragwitz =item * Hans Dieter Pearcey =item * Chris Prather =item * Matt S Trout =back =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2006 by Infinity Interactive, Inc. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Moose-2.2200/lib/Class/MOP/Module.pm000640 000766 000024 00000007705 14137574636 017212 0ustar00etherstaff000000 000000 package Class::MOP::Module; our $VERSION = '2.2200'; use strict; use warnings; use parent 'Class::MOP::Package'; sub _new { my $class = shift; return Class::MOP::Class->initialize($class)->new_object(@_) if $class ne __PACKAGE__; my $params = @_ == 1 ? $_[0] : {@_}; return bless { # Need to quote package to avoid a problem with PPI mis-parsing this # as a package statement. # from Class::MOP::Package 'package' => $params->{package}, namespace => \undef, # attributes version => \undef, authority => \undef } => $class; } sub version { my $self = shift; ${$self->get_or_add_package_symbol('$VERSION')}; } sub authority { my $self = shift; ${$self->get_or_add_package_symbol('$AUTHORITY')}; } sub identifier { my $self = shift; join '-' => ( $self->name, ($self->version || ()), ($self->authority || ()), ); } sub create { my $class = shift; my @args = @_; unshift @args, 'package' if @args % 2 == 1; my %options = @args; my $package = delete $options{package}; my $version = delete $options{version}; my $authority = delete $options{authority}; my $meta = $class->SUPER::create($package => %options); $meta->_instantiate_module($version, $authority); return $meta; } sub _anon_package_prefix { 'Class::MOP::Module::__ANON__::SERIAL::' } sub _anon_cache_key { my $class = shift; my %options = @_; $class->_throw_exception( PackagesAndModulesAreNotCachable => class_name => $class, params => \%options, is_module => 1 ); } sub _instantiate_module { my($self, $version, $authority) = @_; my $package_name = $self->name; $self->add_package_symbol('$VERSION' => $version) if defined $version; $self->add_package_symbol('$AUTHORITY' => $authority) if defined $authority; return; } 1; # ABSTRACT: Module Meta Object __END__ =pod =encoding UTF-8 =head1 NAME Class::MOP::Module - Module Meta Object =head1 VERSION version 2.2200 =head1 DESCRIPTION A module is essentially a L with metadata, in our case the version and authority. =head1 INHERITANCE B is a subclass of L. =head1 METHODS =head2 Class::MOP::Module->create($package, %options) Overrides C from L to provide these additional options: =over 4 =item C A version number, to be installed in the C<$VERSION> package global variable. =item C An authority, to be installed in the C<$AUTHORITY> package global variable. This is a legacy field and its use is not recommended. =back =head2 $metamodule->version This is a read-only attribute which returns the C<$VERSION> of the package, if one exists. =head2 $metamodule->authority This is a read-only attribute which returns the C<$AUTHORITY> of the package, if one exists. =head2 $metamodule->identifier This constructs a string which combines the name, version and authority. =head2 Class::MOP::Module->meta This will return a L instance for this class. =head1 AUTHORS =over 4 =item * Stevan Little =item * Dave Rolsky =item * Jesse Luehrs =item * Shawn M Moore =item * יובל קוג'מן (Yuval Kogman) =item * Karen Etheridge =item * Florian Ragwitz =item * Hans Dieter Pearcey =item * Chris Prather =item * Matt S Trout =back =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2006 by Infinity Interactive, Inc. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Moose-2.2200/lib/Class/MOP/Method/000770 000766 000024 00000000000 14137574636 016637 5ustar00etherstaff000000 000000 Moose-2.2200/lib/Class/MOP/Method/Generated.pm000640 000766 000024 00000005137 14137574636 021100 0ustar00etherstaff000000 000000 package Class::MOP::Method::Generated; our $VERSION = '2.2200'; use strict; use warnings; use Eval::Closure; use parent 'Class::MOP::Method'; ## accessors sub new { $_[0]->_throw_exception( CannotCallAnAbstractBaseMethod => package_name => __PACKAGE__ ); } sub _initialize_body { $_[0]->_throw_exception( NoBodyToInitializeInAnAbstractBaseClass => package_name => __PACKAGE__ ); } sub _generate_description { my ( $self, $context ) = @_; $context ||= $self->definition_context; my $desc = "generated method"; my $origin = "unknown origin"; if (defined $context) { if (defined $context->{description}) { $desc = $context->{description}; } if (defined $context->{file} || defined $context->{line}) { $origin = "defined at " . (defined $context->{file} ? $context->{file} : "") . " line " . (defined $context->{line} ? $context->{line} : ""); } } return "$desc ($origin)"; } sub _compile_code { my ( $self, @args ) = @_; unshift @args, 'source' if @args % 2; my %args = @args; my $context = delete $args{context}; my $environment = $self->can('_eval_environment') ? $self->_eval_environment : {}; return eval_closure( environment => $environment, description => $self->_generate_description($context), %args, ); } 1; # ABSTRACT: Abstract base class for generated methods __END__ =pod =encoding UTF-8 =head1 NAME Class::MOP::Method::Generated - Abstract base class for generated methods =head1 VERSION version 2.2200 =head1 DESCRIPTION This is a C subclass which is subclassed by C and C. It is not intended to be used directly. =head1 AUTHORS =over 4 =item * Stevan Little =item * Dave Rolsky =item * Jesse Luehrs =item * Shawn M Moore =item * יובל קוג'מן (Yuval Kogman) =item * Karen Etheridge =item * Florian Ragwitz =item * Hans Dieter Pearcey =item * Chris Prather =item * Matt S Trout =back =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2006 by Infinity Interactive, Inc. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Moose-2.2200/lib/Class/MOP/Method/Accessor.pm000640 000766 000024 00000024001 14137574636 020733 0ustar00etherstaff000000 000000 package Class::MOP::Method::Accessor; our $VERSION = '2.2200'; use strict; use warnings; use Scalar::Util 'blessed', 'weaken'; use Try::Tiny; use parent 'Class::MOP::Method::Generated'; sub new { my $class = shift; my %options = @_; (exists $options{attribute}) || $class->_throw_exception( MustSupplyAnAttributeToConstructWith => params => \%options, class => $class, ); (exists $options{accessor_type}) || $class->_throw_exception( MustSupplyAnAccessorTypeToConstructWith => params => \%options, class => $class, ); (blessed($options{attribute}) && $options{attribute}->isa('Class::MOP::Attribute')) || $class->_throw_exception( MustSupplyAClassMOPAttributeInstance => params => \%options, class => $class ); ($options{package_name} && $options{name}) || $class->_throw_exception( MustSupplyPackageNameAndName => params => \%options, class => $class ); my $self = $class->_new(\%options); # we don't want this creating # a cycle in the code, if not # needed weaken($self->{'attribute'}); $self->_initialize_body; return $self; } sub _new { my $class = shift; return Class::MOP::Class->initialize($class)->new_object(@_) if $class ne __PACKAGE__; my $params = @_ == 1 ? $_[0] : {@_}; return bless { # inherited from Class::MOP::Method body => $params->{body}, associated_metaclass => $params->{associated_metaclass}, package_name => $params->{package_name}, name => $params->{name}, original_method => $params->{original_method}, # inherit from Class::MOP::Generated is_inline => $params->{is_inline} || 0, definition_context => $params->{definition_context}, # defined in this class attribute => $params->{attribute}, accessor_type => $params->{accessor_type}, } => $class; } ## accessors sub associated_attribute { (shift)->{'attribute'} } sub accessor_type { (shift)->{'accessor_type'} } ## factory sub _initialize_body { my $self = shift; my $method_name = join "_" => ( '_generate', $self->accessor_type, 'method', ($self->is_inline ? 'inline' : ()) ); $self->{'body'} = $self->$method_name(); } ## generators sub _generate_accessor_method { my $self = shift; my $attr = $self->associated_attribute; return sub { if (@_ >= 2) { $attr->set_value($_[0], $_[1]); } $attr->get_value($_[0]); }; } sub _generate_accessor_method_inline { my $self = shift; my $attr = $self->associated_attribute; return try { $self->_compile_code([ 'sub {', 'if (@_ > 1) {', $attr->_inline_set_value('$_[0]', '$_[1]'), '}', $attr->_inline_get_value('$_[0]'), '}', ]); } catch { $self->_throw_exception( CouldNotGenerateInlineAttributeMethod => instance => $self, error => $_, option => "accessor" ); }; } sub _generate_reader_method { my $self = shift; my $attr = $self->associated_attribute; my $class = $attr->associated_class; return sub { $self->_throw_exception( CannotAssignValueToReadOnlyAccessor => class_name => $class->name, value => $_[1], attribute => $attr ) if @_ > 1; $attr->get_value($_[0]); }; } sub _generate_reader_method_inline { my $self = shift; my $attr = $self->associated_attribute; my $attr_name = $attr->name; return try { $self->_compile_code([ 'sub {', 'if (@_ > 1) {', $self->_inline_throw_exception( CannotAssignValueToReadOnlyAccessor => 'class_name => ref $_[0],'. 'value => $_[1],'. "attribute_name => '".$attr_name."'", ) . ';', '}', $attr->_inline_get_value('$_[0]'), '}', ]); } catch { $self->_throw_exception( CouldNotGenerateInlineAttributeMethod => instance => $self, error => $_, option => "reader" ); }; } sub _generate_writer_method { my $self = shift; my $attr = $self->associated_attribute; return sub { $attr->set_value($_[0], $_[1]); }; } sub _generate_writer_method_inline { my $self = shift; my $attr = $self->associated_attribute; return try { $self->_compile_code([ 'sub {', $attr->_inline_set_value('$_[0]', '$_[1]'), '}', ]); } catch { $self->_throw_exception( CouldNotGenerateInlineAttributeMethod => instance => $self, error => $_, option => "writer" ); }; } sub _generate_predicate_method { my $self = shift; my $attr = $self->associated_attribute; return sub { $attr->has_value($_[0]) }; } sub _generate_predicate_method_inline { my $self = shift; my $attr = $self->associated_attribute; return try { $self->_compile_code([ 'sub {', $attr->_inline_has_value('$_[0]'), '}', ]); } catch { $self->_throw_exception( CouldNotGenerateInlineAttributeMethod => instance => $self, error => $_, option => "predicate" ); }; } sub _generate_clearer_method { my $self = shift; my $attr = $self->associated_attribute; return sub { $attr->clear_value($_[0]) }; } sub _generate_clearer_method_inline { my $self = shift; my $attr = $self->associated_attribute; return try { $self->_compile_code([ 'sub {', $attr->_inline_clear_value('$_[0]'), '}', ]); } catch { $self->_throw_exception( CouldNotGenerateInlineAttributeMethod => instance => $self, error => $_, option => "clearer" ); }; } 1; # ABSTRACT: Method Meta Object for accessors __END__ =pod =encoding UTF-8 =head1 NAME Class::MOP::Method::Accessor - Method Meta Object for accessors =head1 VERSION version 2.2200 =head1 SYNOPSIS use Class::MOP::Method::Accessor; my $reader = Class::MOP::Method::Accessor->new( attribute => $attribute, is_inline => 1, accessor_type => 'reader', ); $reader->body->execute($instance); # call the reader method =head1 DESCRIPTION This is a subclass of C which is used by C to generate accessor code. It handles generation of readers, writers, predicates and clearers. For each type of method, it can either create a subroutine reference, or actually inline code by generating a string and C'ing it. =head1 METHODS =over 4 =item B<< Class::MOP::Method::Accessor->new(%options) >> This returns a new C based on the C<%options> provided. =over 4 =item * attribute This is the C for which accessors are being generated. This option is required. =item * accessor_type This is a string which should be one of "reader", "writer", "accessor", "predicate", or "clearer". This is the type of method being generated. This option is required. =item * is_inline This indicates whether or not the accessor should be inlined. This defaults to false. =item * name The method name (without a package name). This is required. =item * package_name The package name for the method. This is required. =back =item B<< $metamethod->accessor_type >> Returns the accessor type which was passed to C. =item B<< $metamethod->is_inline >> Returns a boolean indicating whether or not the accessor is inlined. =item B<< $metamethod->associated_attribute >> This returns the L object which was passed to C. =item B<< $metamethod->body >> The method itself is I when the accessor object is constructed. =back =head1 AUTHORS =over 4 =item * Stevan Little =item * Dave Rolsky =item * Jesse Luehrs =item * Shawn M Moore =item * יובל קוג'מן (Yuval Kogman) =item * Karen Etheridge =item * Florian Ragwitz =item * Hans Dieter Pearcey =item * Chris Prather =item * Matt S Trout =back =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2006 by Infinity Interactive, Inc. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Moose-2.2200/lib/Class/MOP/Method/Constructor.pm000640 000766 000024 00000012352 14137574636 021524 0ustar00etherstaff000000 000000 package Class::MOP::Method::Constructor; our $VERSION = '2.2200'; use strict; use warnings; use Scalar::Util 'blessed', 'weaken'; use Try::Tiny; use parent 'Class::MOP::Method::Inlined'; sub new { my $class = shift; my %options = @_; (blessed $options{metaclass} && $options{metaclass}->isa('Class::MOP::Class')) || $class->_throw_exception( MustSupplyAMetaclass => params => \%options, class => $class ) if $options{is_inline}; ($options{package_name} && $options{name}) || $class->_throw_exception( MustSupplyPackageNameAndName => params => \%options, class => $class ); my $self = $class->_new(\%options); # we don't want this creating # a cycle in the code, if not # needed weaken($self->{'associated_metaclass'}); $self->_initialize_body; return $self; } sub _new { my $class = shift; return Class::MOP::Class->initialize($class)->new_object(@_) if $class ne __PACKAGE__; my $params = @_ == 1 ? $_[0] : {@_}; return bless { # inherited from Class::MOP::Method body => $params->{body}, # associated_metaclass => $params->{associated_metaclass}, # overridden package_name => $params->{package_name}, name => $params->{name}, original_method => $params->{original_method}, # inherited from Class::MOP::Generated is_inline => $params->{is_inline} || 0, definition_context => $params->{definition_context}, # inherited from Class::MOP::Inlined _expected_method_class => $params->{_expected_method_class}, # defined in this subclass options => $params->{options} || {}, associated_metaclass => $params->{metaclass}, }, $class; } ## accessors sub options { (shift)->{'options'} } sub associated_metaclass { (shift)->{'associated_metaclass'} } ## method sub _initialize_body { my $self = shift; my $method_name = '_generate_constructor_method'; $method_name .= '_inline' if $self->is_inline; $self->{'body'} = $self->$method_name; } sub _eval_environment { my $self = shift; return $self->associated_metaclass->_eval_environment; } sub _generate_constructor_method { return sub { Class::MOP::Class->initialize(shift)->new_object(@_) } } sub _generate_constructor_method_inline { my $self = shift; my $meta = $self->associated_metaclass; my @source = ( 'sub {', $meta->_inline_new_object, '}', ); warn join("\n", @source) if $self->options->{debug}; my $code = try { $self->_compile_code(\@source); } catch { my $source = join("\n", @source); $self->_throw_exception( CouldNotEvalConstructor => constructor_method => $self, source => $source, error => $_ ); }; return $code; } 1; # ABSTRACT: Method Meta Object for constructors __END__ =pod =encoding UTF-8 =head1 NAME Class::MOP::Method::Constructor - Method Meta Object for constructors =head1 VERSION version 2.2200 =head1 SYNOPSIS use Class::MOP::Method::Constructor; my $constructor = Class::MOP::Method::Constructor->new( metaclass => $metaclass, options => { debug => 1, # this is all for now }, ); # calling the constructor ... $constructor->body->execute($metaclass->name, %params); =head1 DESCRIPTION This is a subclass of L which generates constructor methods. =head1 METHODS =over 4 =item B<< Class::MOP::Method::Constructor->new(%options) >> This creates a new constructor object. It accepts a hash reference of options. =over 8 =item * metaclass This should be a L object. It is required. =item * name The method name (without a package name). This is required. =item * package_name The package name for the method. This is required. =item * is_inline This indicates whether or not the constructor should be inlined. This defaults to false. =back =item B<< $metamethod->is_inline >> Returns a boolean indicating whether or not the constructor is inlined. =item B<< $metamethod->associated_metaclass >> This returns the L object for the method. =back =head1 AUTHORS =over 4 =item * Stevan Little =item * Dave Rolsky =item * Jesse Luehrs =item * Shawn M Moore =item * יובל קוג'מן (Yuval Kogman) =item * Karen Etheridge =item * Florian Ragwitz =item * Hans Dieter Pearcey =item * Chris Prather =item * Matt S Trout =back =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2006 by Infinity Interactive, Inc. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Moose-2.2200/lib/Class/MOP/Method/Wrapped.pm000640 000766 000024 00000021005 14137574636 020574 0ustar00etherstaff000000 000000 package Class::MOP::Method::Wrapped; our $VERSION = '2.2200'; use strict; use warnings; use Scalar::Util 'blessed'; use Sub::Util 1.40 'set_subname'; use parent 'Class::MOP::Method'; # NOTE: # this ugly beast is the result of trying # to micro optimize this as much as possible # while not completely loosing maintainability. # At this point it's "fast enough", after all # you can't get something for nothing :) my $_build_wrapped_method = sub { my $modifier_table = shift; my ($before, $after, $around) = ( $modifier_table->{before}, $modifier_table->{after}, $modifier_table->{around}, ); if (@$before && @$after) { $modifier_table->{cache} = sub { for my $c (@$before) { $c->(@_) }; my @rval; ((defined wantarray) ? ((wantarray) ? (@rval = $around->{cache}->(@_)) : ($rval[0] = $around->{cache}->(@_))) : $around->{cache}->(@_)); for my $c (@$after) { $c->(@_) }; return unless defined wantarray; return wantarray ? @rval : $rval[0]; } } elsif (@$before) { $modifier_table->{cache} = sub { for my $c (@$before) { $c->(@_) }; return $around->{cache}->(@_); } } elsif (@$after) { $modifier_table->{cache} = sub { my @rval; ((defined wantarray) ? ((wantarray) ? (@rval = $around->{cache}->(@_)) : ($rval[0] = $around->{cache}->(@_))) : $around->{cache}->(@_)); for my $c (@$after) { $c->(@_) }; return unless defined wantarray; return wantarray ? @rval : $rval[0]; } } else { $modifier_table->{cache} = $around->{cache}; } }; sub wrap { my ( $class, $code, %params ) = @_; (blessed($code) && $code->isa('Class::MOP::Method')) || $class->_throw_exception( CanOnlyWrapBlessedCode => params => \%params, class => $class, code => $code ); my $modifier_table = { cache => undef, orig => $code->body, before => [], after => [], around => { cache => $code->body, methods => [], }, }; $_build_wrapped_method->($modifier_table); # get these from the original unless explicitly overridden my $pkg_name = $params{package_name} || $code->package_name; my $method_name = $params{name} || $code->name; return $class->SUPER::wrap( sub { my $wrapped = set_subname( "${pkg_name}::_wrapped_${method_name}" => $modifier_table->{cache} ); return $wrapped->(@_) ; }, package_name => $pkg_name, name => $method_name, original_method => $code, modifier_table => $modifier_table, ); } sub _new { my $class = shift; return Class::MOP::Class->initialize($class)->new_object(@_) if $class ne __PACKAGE__; my $params = @_ == 1 ? $_[0] : {@_}; return bless { # inherited from Class::MOP::Method 'body' => $params->{body}, 'associated_metaclass' => $params->{associated_metaclass}, 'package_name' => $params->{package_name}, 'name' => $params->{name}, 'original_method' => $params->{original_method}, # defined in this class 'modifier_table' => $params->{modifier_table} } => $class; } sub get_original_method { my $code = shift; $code->original_method; } sub add_before_modifier { my $code = shift; my $modifier = shift; unshift @{$code->{'modifier_table'}->{before}} => $modifier; $_build_wrapped_method->($code->{'modifier_table'}); } sub before_modifiers { my $code = shift; return @{$code->{'modifier_table'}->{before}}; } sub add_after_modifier { my $code = shift; my $modifier = shift; push @{$code->{'modifier_table'}->{after}} => $modifier; $_build_wrapped_method->($code->{'modifier_table'}); } sub after_modifiers { my $code = shift; return @{$code->{'modifier_table'}->{after}}; } { # NOTE: # this is another possible candidate for # optimization as well. There is an overhead # associated with the currying that, if # eliminated might make around modifiers # more manageable. my $compile_around_method = sub {{ my $f1 = pop; return $f1 unless @_; my $f2 = pop; push @_, sub { $f2->( $f1, @_ ) }; redo; }}; sub add_around_modifier { my $code = shift; my $modifier = shift; unshift @{$code->{'modifier_table'}->{around}->{methods}} => $modifier; $code->{'modifier_table'}->{around}->{cache} = $compile_around_method->( @{$code->{'modifier_table'}->{around}->{methods}}, $code->{'modifier_table'}->{orig} ); $_build_wrapped_method->($code->{'modifier_table'}); } } sub around_modifiers { my $code = shift; return @{$code->{'modifier_table'}->{around}->{methods}}; } sub _make_compatible_with { my $self = shift; my ($other) = @_; # XXX: this is pretty gross. the issue here is that CMOP::Method::Wrapped # objects are subclasses of CMOP::Method, but when we get to moose, they'll # need to be compatible with Moose::Meta::Method, which isn't possible. the # right solution here is to make ::Wrapped into a role that gets applied to # whatever the method_metaclass happens to be and get rid of # wrapped_method_metaclass entirely, but that's not going to happen until # we ditch cmop and get roles into the bootstrapping, so. i'm not # maintaining the previous behavior of turning them into instances of the # new method_metaclass because that's equally broken, and at least this way # any issues will at least be detectable and potentially fixable. -doy return $self unless $other->_is_compatible_with($self->_real_ref_name); return $self->SUPER::_make_compatible_with(@_); } 1; # ABSTRACT: Method Meta Object for methods with before/after/around modifiers __END__ =pod =encoding UTF-8 =head1 NAME Class::MOP::Method::Wrapped - Method Meta Object for methods with before/after/around modifiers =head1 VERSION version 2.2200 =head1 DESCRIPTION This is a L subclass which implements before, after, and around method modifiers. =head1 METHODS =head2 Class::MOP::Method::Wrapped->wrap($metamethod, %options) This is the constructor. It accepts a L object and a hash of options. The options are: =over 4 =item * name The method name (without a package name). This will be taken from the provided L object if it is not provided. =item * package_name The package name for the method. This will be taken from the provided L object if it is not provided. =item * associated_metaclass An optional L object. This is the metaclass for the method's class. =back =head2 $metamethod->get_original_method This returns the L object that was passed to the constructor. =head2 $metamethod->add_before_modifier($code) =head2 $metamethod->add_after_modifier($code) =head2 $metamethod->add_around_modifier($code) These methods all take a subroutine reference and apply it as a modifier to the original method. =head2 $metamethod->before_modifiers =head2 $metamethod->after_modifiers =head2 $metamethod->around_modifiers These methods all return a list of subroutine references which are acting as the specified type of modifier. =head1 AUTHORS =over 4 =item * Stevan Little =item * Dave Rolsky =item * Jesse Luehrs =item * Shawn M Moore =item * יובל קוג'מן (Yuval Kogman) =item * Karen Etheridge =item * Florian Ragwitz =item * Hans Dieter Pearcey =item * Chris Prather =item * Matt S Trout =back =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2006 by Infinity Interactive, Inc. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Moose-2.2200/lib/Class/MOP/Method/Inlined.pm000640 000766 000024 00000010166 14137574636 020562 0ustar00etherstaff000000 000000 package Class::MOP::Method::Inlined; our $VERSION = '2.2200'; use strict; use warnings; use Scalar::Util 'refaddr'; use parent 'Class::MOP::Method::Generated'; sub _uninlined_body { my $self = shift; my $super_method = $self->associated_metaclass->find_next_method_by_name( $self->name ) or return; if ( $super_method->isa(__PACKAGE__) ) { return $super_method->_uninlined_body; } else { return $super_method->body; } } sub can_be_inlined { my $self = shift; my $metaclass = $self->associated_metaclass; my $class = $metaclass->name; # If we don't find an inherited method, this is a rather weird # case where we have no method in the inheritance chain even # though we're expecting one to be there my $inherited_method = $metaclass->find_next_method_by_name( $self->name ); if ( $inherited_method && $inherited_method->isa('Class::MOP::Method::Wrapped') ) { warn "Not inlining '" . $self->name . "' for $class since it " . "has method modifiers which would be lost if it were inlined\n"; return 0; } my $expected_class = $self->_expected_method_class or return 1; # if we are shadowing a method we first verify that it is # compatible with the definition we are replacing it with my $expected_method = $expected_class->can( $self->name ); if ( ! $expected_method ) { warn "Not inlining '" . $self->name . "' for $class since ${expected_class}::" . $self->name . " is not defined\n"; return 0; } my $actual_method = $class->can( $self->name ) or return 1; # the method is what we wanted (probably Moose::Object::new) return 1 if refaddr($expected_method) == refaddr($actual_method); # otherwise we have to check that the actual method is an inlined # version of what we're expecting if ( $inherited_method->isa(__PACKAGE__) ) { if ( $inherited_method->_uninlined_body && refaddr( $inherited_method->_uninlined_body ) == refaddr($expected_method) ) { return 1; } } elsif ( refaddr( $inherited_method->body ) == refaddr($expected_method) ) { return 1; } my $warning = "Not inlining '" . $self->name . "' for $class since it is not" . " inheriting the default ${expected_class}::" . $self->name . "\n"; if ( $self->isa("Class::MOP::Method::Constructor") ) { # FIXME kludge, refactor warning generation to a method $warning .= "If you are certain you don't need to inline your" . " constructor, specify inline_constructor => 0 in your" . " call to $class->meta->make_immutable\n"; } warn $warning; return 0; } 1; # ABSTRACT: Method base class for methods which have been inlined __END__ =pod =encoding UTF-8 =head1 NAME Class::MOP::Method::Inlined - Method base class for methods which have been inlined =head1 VERSION version 2.2200 =head1 DESCRIPTION This is a L subclass for methods which can be inlined. =head1 METHODS =head2 $metamethod->can_be_inlined This method returns true if the method in question can be inlined in the associated metaclass. If it cannot be inlined, it spits out a warning and returns false. =head1 AUTHORS =over 4 =item * Stevan Little =item * Dave Rolsky =item * Jesse Luehrs =item * Shawn M Moore =item * יובל קוג'מן (Yuval Kogman) =item * Karen Etheridge =item * Florian Ragwitz =item * Hans Dieter Pearcey =item * Chris Prather =item * Matt S Trout =back =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2006 by Infinity Interactive, Inc. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Moose-2.2200/lib/Class/MOP/Method/Meta.pm000640 000766 000024 00000010221 14137574636 020056 0ustar00etherstaff000000 000000 package Class::MOP::Method::Meta; our $VERSION = '2.2200'; use strict; use warnings; use Carp 'confess'; use Scalar::Util 'blessed', 'weaken'; use constant DEBUG_NO_META => $ENV{DEBUG_NO_META} ? 1 : 0; use parent 'Class::MOP::Method'; sub _is_caller_mop_internal { my $self = shift; my ($caller) = @_; return $caller =~ /^(?:Class::MOP|metaclass)(?:::|$)/; } sub _generate_meta_method { my $method_self = shift; my $metaclass = shift; weaken($metaclass); sub { # this will be compiled out if the env var wasn't set if (DEBUG_NO_META) { confess "'meta' method called by MOP internals" # it's okay to call meta methods on metaclasses, since we # explicitly ask for them if !$_[0]->isa('Class::MOP::Object') && !$_[0]->isa('Class::MOP::Mixin') # it's okay if the test itself calls ->meta, we only care about # if the mop internals call ->meta && $method_self->_is_caller_mop_internal(scalar caller); } # we must re-initialize so that it # works as expected in subclasses, # since metaclass instances are # singletons, this is not really a # big deal anyway. $metaclass->initialize(blessed($_[0]) || $_[0]) }; } sub wrap { my ($class, @args) = @_; unshift @args, 'body' if @args % 2 == 1; my %params = @args; $class->_throw_exception( CannotOverrideBodyOfMetaMethods => params => \%params, class => $class ) if $params{body}; my $metaclass_class = $params{associated_metaclass}->meta; $params{body} = $class->_generate_meta_method($metaclass_class); return $class->SUPER::wrap(%params); } sub _make_compatible_with { my $self = shift; my ($other) = @_; # XXX: this is pretty gross. the issue here is that CMOP::Method::Meta # objects are subclasses of CMOP::Method, but when we get to moose, they'll # need to be compatible with Moose::Meta::Method, which isn't possible. the # right solution here is to make ::Meta into a role that gets applied to # whatever the method_metaclass happens to be and get rid of # _meta_method_metaclass entirely, but that's not going to happen until # we ditch cmop and get roles into the bootstrapping, so. i'm not # maintaining the previous behavior of turning them into instances of the # new method_metaclass because that's equally broken, and at least this way # any issues will at least be detectable and potentially fixable. -doy return $self unless $other->_is_compatible_with($self->_real_ref_name); return $self->SUPER::_make_compatible_with(@_); } 1; # ABSTRACT: Method Meta Object for C methods __END__ =pod =encoding UTF-8 =head1 NAME Class::MOP::Method::Meta - Method Meta Object for C methods =head1 VERSION version 2.2200 =head1 DESCRIPTION This is a L subclass which represents C methods installed into classes by Class::MOP. =head1 METHODS =over 4 =item B<< Class::MOP::Method::Wrapped->wrap($metamethod, %options) >> This is the constructor. It accepts a L object and a hash of options. The options accepted are identical to the ones accepted by L, except that C cannot be passed (it will be generated automatically). =back =head1 AUTHORS =over 4 =item * Stevan Little =item * Dave Rolsky =item * Jesse Luehrs =item * Shawn M Moore =item * יובל קוג'מן (Yuval Kogman) =item * Karen Etheridge =item * Florian Ragwitz =item * Hans Dieter Pearcey =item * Chris Prather =item * Matt S Trout =back =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2006 by Infinity Interactive, Inc. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Moose-2.2200/lib/Class/MOP/Class/Immutable/000770 000766 000024 00000000000 14137574636 020403 5ustar00etherstaff000000 000000 Moose-2.2200/lib/Class/MOP/Class/Immutable/Trait.pm000640 000766 000024 00000007010 14137574636 022021 0ustar00etherstaff000000 000000 package Class::MOP::Class::Immutable::Trait; our $VERSION = '2.2200'; use strict; use warnings; use MRO::Compat; use Module::Runtime 'use_module'; # the original class of the metaclass instance sub _get_mutable_metaclass_name { $_[0]{__immutable}{original_class} } sub is_mutable { 0 } sub is_immutable { 1 } sub _immutable_metaclass { ref $_[1] } sub _immutable_read_only { my $name = shift; __throw_exception( CallingReadOnlyMethodOnAnImmutableInstance => method_name => $name ); } sub _immutable_cannot_call { my $name = shift; __throw_exception( CallingMethodOnAnImmutableInstance => method_name => $name ); } for my $name (qw/superclasses/) { no strict 'refs'; *{__PACKAGE__."::$name"} = sub { my $orig = shift; my $self = shift; _immutable_read_only($name) if @_; $self->$orig; }; } for my $name (qw/add_method alias_method remove_method add_attribute remove_attribute remove_package_symbol add_package_symbol/) { no strict 'refs'; *{__PACKAGE__."::$name"} = sub { _immutable_cannot_call($name) }; } sub class_precedence_list { my $orig = shift; my $self = shift; @{ $self->{__immutable}{class_precedence_list} ||= [ $self->$orig ] }; } sub linearized_isa { my $orig = shift; my $self = shift; @{ $self->{__immutable}{linearized_isa} ||= [ $self->$orig ] }; } sub get_all_methods { my $orig = shift; my $self = shift; @{ $self->{__immutable}{get_all_methods} ||= [ $self->$orig ] }; } sub get_all_method_names { my $orig = shift; my $self = shift; @{ $self->{__immutable}{get_all_method_names} ||= [ $self->$orig ] }; } sub get_all_attributes { my $orig = shift; my $self = shift; @{ $self->{__immutable}{get_all_attributes} ||= [ $self->$orig ] }; } sub get_meta_instance { my $orig = shift; my $self = shift; $self->{__immutable}{get_meta_instance} ||= $self->$orig; } sub _method_map { my $orig = shift; my $self = shift; $self->{__immutable}{_method_map} ||= $self->$orig; } # private method, for this file only - # if we declare a method here, it will behave differently depending on what # class this trait is applied to, so we won't have a reliable parameter list. sub __throw_exception { my ($exception_type, @args_to_exception) = @_; die use_module( "Moose::Exception::$exception_type" )->new( @args_to_exception ); } 1; # ABSTRACT: Implements immutability for metaclass objects __END__ =pod =encoding UTF-8 =head1 NAME Class::MOP::Class::Immutable::Trait - Implements immutability for metaclass objects =head1 VERSION version 2.2200 =head1 DESCRIPTION This class provides a pseudo-trait that is applied to immutable metaclass objects. In reality, it is simply a parent class. It implements caching and read-only-ness for various metaclass methods. =head1 AUTHORS =over 4 =item * Stevan Little =item * Dave Rolsky =item * Jesse Luehrs =item * Shawn M Moore =item * יובל קוג'מן (Yuval Kogman) =item * Karen Etheridge =item * Florian Ragwitz =item * Hans Dieter Pearcey =item * Chris Prather =item * Matt S Trout =back =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2006 by Infinity Interactive, Inc. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Moose-2.2200/lib/Class/MOP/Mixin/AttributeCore.pm000640 000766 000024 00000005305 14137574636 021617 0ustar00etherstaff000000 000000 package Class::MOP::Mixin::AttributeCore; our $VERSION = '2.2200'; use strict; use warnings; use Scalar::Util 'blessed'; use parent 'Class::MOP::Mixin'; sub has_accessor { defined $_[0]->{'accessor'} } sub has_reader { defined $_[0]->{'reader'} } sub has_writer { defined $_[0]->{'writer'} } sub has_predicate { defined $_[0]->{'predicate'} } sub has_clearer { defined $_[0]->{'clearer'} } sub has_builder { defined $_[0]->{'builder'} } sub has_init_arg { defined $_[0]->{'init_arg'} } sub has_default { exists $_[0]->{'default'} } sub has_initializer { defined $_[0]->{'initializer'} } sub has_insertion_order { defined $_[0]->{'insertion_order'} } sub _set_insertion_order { $_[0]->{'insertion_order'} = $_[1] } sub has_read_method { $_[0]->has_reader || $_[0]->has_accessor } sub has_write_method { $_[0]->has_writer || $_[0]->has_accessor } sub is_default_a_coderef { # Uber hack because it is called from CMOP::Attribute constructor as # $class->is_default_a_coderef(\%options) my ($value) = ref $_[0] ? $_[0]->{'default'} : $_[1]->{'default'}; return unless ref($value); return ref($value) eq 'CODE' || ( blessed($value) && $value->isa('Class::MOP::Method') ); } sub default { my ( $self, $instance ) = @_; if ( defined $instance && $self->is_default_a_coderef ) { # if the default is a CODE ref, then we pass in the instance and # default can return a value based on that instance. Somewhat crude, # but works. return $self->{'default'}->($instance); } $self->{'default'}; } 1; # ABSTRACT: Core attributes shared by attribute metaclasses __END__ =pod =encoding UTF-8 =head1 NAME Class::MOP::Mixin::AttributeCore - Core attributes shared by attribute metaclasses =head1 VERSION version 2.2200 =head1 DESCRIPTION This class implements the core attributes (aka properties) shared by all attributes. See the L documentation for API details. =head1 AUTHORS =over 4 =item * Stevan Little =item * Dave Rolsky =item * Jesse Luehrs =item * Shawn M Moore =item * יובל קוג'מן (Yuval Kogman) =item * Karen Etheridge =item * Florian Ragwitz =item * Hans Dieter Pearcey =item * Chris Prather =item * Matt S Trout =back =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2006 by Infinity Interactive, Inc. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Moose-2.2200/lib/Class/MOP/Mixin/HasMethods.pm000640 000766 000024 00000017276 14137574636 021114 0ustar00etherstaff000000 000000 package Class::MOP::Mixin::HasMethods; our $VERSION = '2.2200'; use strict; use warnings; use Class::MOP::Method::Meta; use Scalar::Util 'blessed', 'reftype'; use Sub::Util 1.40 'set_subname'; use parent 'Class::MOP::Mixin'; sub _meta_method_class { 'Class::MOP::Method::Meta' } sub _add_meta_method { my $self = shift; my ($name) = @_; my $existing_method = $self->can('find_method_by_name') ? $self->find_method_by_name($name) : $self->get_method($name); return if $existing_method && $existing_method->isa($self->_meta_method_class); $self->add_method( $name => $self->_meta_method_class->wrap( name => $name, package_name => $self->name, associated_metaclass => $self, ) ); } sub wrap_method_body { my ( $self, %args ) = @_; ( $args{body} && 'CODE' eq reftype $args{body} ) || $self->_throw_exception( CodeBlockMustBeACodeRef => instance => $self, params => \%args ); $self->method_metaclass->wrap( package_name => $self->name, %args, ); } sub add_method { my ( $self, $method_name, $method ) = @_; ( defined $method_name && length $method_name ) || $self->_throw_exception( MustDefineAMethodName => instance => $self ); my $package_name = $self->name; my $body; if ( blessed($method) && $method->isa('Class::MOP::Method') ) { $body = $method->body; if ( $method->package_name ne $package_name ) { $method = $method->clone( package_name => $package_name, name => $method_name, ); } $method->attach_to_class($self); } else { # If a raw code reference is supplied, its method object is not created. # The method object won't be created until required. $body = $method; } $self->_method_map->{$method_name} = $method; my ($current_package, $current_name) = Class::MOP::get_code_info($body); set_subname($package_name . '::' . $method_name, $body) unless defined $current_name && $current_name !~ /^__ANON__/; $self->add_package_symbol("&$method_name", $body); # we added the method to the method map too, so it's still valid $self->update_package_cache_flag; } sub _code_is_mine { my ( $self, $code ) = @_; my ( $code_package, $code_name ) = Class::MOP::get_code_info($code); return ( $code_package && $code_package eq $self->name ) || ( $code_package eq 'constant' && $code_name eq '__ANON__' ); } sub has_method { my ( $self, $method_name ) = @_; ( defined $method_name && length $method_name ) || $self->_throw_exception( MustDefineAMethodName => instance => $self ); my $method = $self->_get_maybe_raw_method($method_name); return if not $method; return defined($self->_method_map->{$method_name} = $method); } sub get_method { my ( $self, $method_name ) = @_; ( defined $method_name && length $method_name ) || $self->_throw_exception( MustDefineAMethodName => instance => $self ); my $method = $self->_get_maybe_raw_method($method_name); return if not $method; return $method if blessed($method) && $method->isa('Class::MOP::Method'); return $self->_method_map->{$method_name} = $self->wrap_method_body( body => $method, name => $method_name, associated_metaclass => $self, ); } sub _get_maybe_raw_method { my ( $self, $method_name ) = @_; my $map_entry = $self->_method_map->{$method_name}; return $map_entry if defined $map_entry; my $code = $self->get_package_symbol("&$method_name"); return unless $code && $self->_code_is_mine($code); return $code; } sub remove_method { my ( $self, $method_name ) = @_; ( defined $method_name && length $method_name ) || $self->_throw_exception( MustDefineAMethodName => instance => $self ); my $removed_method = delete $self->_method_map->{$method_name}; $self->remove_package_symbol("&$method_name"); $removed_method->detach_from_class if blessed($removed_method) && $removed_method->isa('Class::MOP::Method'); # still valid, since we just removed the method from the map $self->update_package_cache_flag; return $removed_method; } sub get_method_list { my $self = shift; return keys %{ $self->_full_method_map }; } sub _get_local_methods { my $self = shift; return values %{ $self->_full_method_map }; } sub _restore_metamethods_from { my $self = shift; my ($old_meta) = @_; my $package_name = $self->name; # Check if Perl debugger is enabled my $debugger_enabled = ($^P & 0x10); my $debug_method_info; for my $method ($old_meta->_get_local_methods) { my $method_name = $method->name; # Track DB::sub information for this method if debugger is enabled. # This contains original method filename and line numbers. $debug_method_info = ''; if ($debugger_enabled) { $debug_method_info = $DB::sub{$package_name . "::" . $method_name} } $method->_make_compatible_with($self->method_metaclass); $self->add_method($method_name => $method); # Restore method debug information, which can be clobbered by add_method. # Note that we handle this here instead of in add_method, because we # only want to preserve the original debug info in cases where we are # restoring a method, not overwriting a method. if ($debugger_enabled && $debug_method_info) { $DB::sub{$package_name . "::" . $method_name} = $debug_method_info; } } } sub reset_package_cache_flag { (shift)->{'_package_cache_flag'} = undef } sub update_package_cache_flag { my $self = shift; # NOTE: # we can manually update the cache number # since we are actually adding the method # to our cache as well. This avoids us # having to regenerate the method_map. # - SL $self->{'_package_cache_flag'} = Class::MOP::check_package_cache_flag($self->name); } sub _full_method_map { my $self = shift; my $pkg_gen = Class::MOP::check_package_cache_flag($self->name); if (($self->{_package_cache_flag_full} || -1) != $pkg_gen) { # forcibly reify all method map entries $self->get_method($_) for $self->list_all_package_symbols('CODE'); $self->{_package_cache_flag_full} = $pkg_gen; } return $self->_method_map; } 1; # ABSTRACT: Methods for metaclasses which have methods __END__ =pod =encoding UTF-8 =head1 NAME Class::MOP::Mixin::HasMethods - Methods for metaclasses which have methods =head1 VERSION version 2.2200 =head1 DESCRIPTION This class implements methods for metaclasses which have methods (L and L). See L for API details. =head1 AUTHORS =over 4 =item * Stevan Little =item * Dave Rolsky =item * Jesse Luehrs =item * Shawn M Moore =item * יובל קוג'מן (Yuval Kogman) =item * Karen Etheridge =item * Florian Ragwitz =item * Hans Dieter Pearcey =item * Chris Prather =item * Matt S Trout =back =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2006 by Infinity Interactive, Inc. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Moose-2.2200/lib/Class/MOP/Mixin/HasAttributes.pm000640 000766 000024 00000007415 14137574636 021631 0ustar00etherstaff000000 000000 package Class::MOP::Mixin::HasAttributes; our $VERSION = '2.2200'; use strict; use warnings; use Scalar::Util 'blessed'; use parent 'Class::MOP::Mixin'; sub add_attribute { my $self = shift; my $attribute = blessed( $_[0] ) ? $_[0] : $self->attribute_metaclass->new(@_); ( $attribute->isa('Class::MOP::Mixin::AttributeCore') ) || $self->_throw_exception( AttributeMustBeAnClassMOPMixinAttributeCoreOrSubclass => attribute => $attribute, class_name => $self->name, ); $self->_attach_attribute($attribute); my $attr_name = $attribute->name; $self->remove_attribute($attr_name) if $self->has_attribute($attr_name); my $order = ( scalar keys %{ $self->_attribute_map } ); $attribute->_set_insertion_order($order); $self->_attribute_map->{$attr_name} = $attribute; # This method is called to allow for installing accessors. Ideally, we'd # use method overriding, but then the subclass would be responsible for # making the attribute, which would end up with lots of code # duplication. Even more ideally, we'd use augment/inner, but this is # Class::MOP! $self->_post_add_attribute($attribute) if $self->can('_post_add_attribute'); return $attribute; } sub has_attribute { my ( $self, $attribute_name ) = @_; ( defined $attribute_name ) || $self->_throw_exception( MustDefineAnAttributeName => class_name => $self->name ); exists $self->_attribute_map->{$attribute_name}; } sub get_attribute { my ( $self, $attribute_name ) = @_; ( defined $attribute_name ) || $self->_throw_exception( MustDefineAnAttributeName => class_name => $self->name ); return $self->_attribute_map->{$attribute_name}; } sub remove_attribute { my ( $self, $attribute_name ) = @_; ( defined $attribute_name ) || $self->_throw_exception( MustDefineAnAttributeName => class_name => $self->name ); my $removed_attribute = $self->_attribute_map->{$attribute_name}; return unless defined $removed_attribute; delete $self->_attribute_map->{$attribute_name}; return $removed_attribute; } sub get_attribute_list { my $self = shift; keys %{ $self->_attribute_map }; } sub _restore_metaattributes_from { my $self = shift; my ($old_meta) = @_; for my $attr (sort { $a->insertion_order <=> $b->insertion_order } map { $old_meta->get_attribute($_) } $old_meta->get_attribute_list) { $attr->_make_compatible_with($self->attribute_metaclass); $self->add_attribute($attr); } } 1; # ABSTRACT: Methods for metaclasses which have attributes __END__ =pod =encoding UTF-8 =head1 NAME Class::MOP::Mixin::HasAttributes - Methods for metaclasses which have attributes =head1 VERSION version 2.2200 =head1 DESCRIPTION This class implements methods for metaclasses which have attributes (L and L). See L for API details. =head1 AUTHORS =over 4 =item * Stevan Little =item * Dave Rolsky =item * Jesse Luehrs =item * Shawn M Moore =item * יובל קוג'מן (Yuval Kogman) =item * Karen Etheridge =item * Florian Ragwitz =item * Hans Dieter Pearcey =item * Chris Prather =item * Matt S Trout =back =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2006 by Infinity Interactive, Inc. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Moose-2.2200/lib/Class/MOP/Mixin/HasOverloads.pm000640 000766 000024 00000012230 14137574636 021430 0ustar00etherstaff000000 000000 package Class::MOP::Mixin::HasOverloads; our $VERSION = '2.2200'; use strict; use warnings; use Class::MOP::Overload; use Devel::OverloadInfo 0.005 'overload_info', 'overload_op_info'; use Scalar::Util 'blessed'; use overload (); use parent 'Class::MOP::Mixin'; sub is_overloaded { my $self = shift; Devel::OverloadInfo::is_overloaded($self->name); } sub get_overload_list { my $self = shift; my $info = $self->_overload_info; return grep { $_ ne 'fallback' } keys %{$info} } sub get_all_overloaded_operators { my $self = shift; return map { $self->_overload_for($_) } $self->get_overload_list; } sub has_overloaded_operator { my $self = shift; my ($op) = @_; return defined $self->_overload_info_for($op); } sub _overload_map { $_[0]->{_overload_map} ||= {}; } sub get_overloaded_operator { my $self = shift; my ($op) = @_; return $self->_overload_map->{$op} ||= $self->_overload_for($op); } use constant _SET_FALLBACK_EACH_TIME => "$]" < 5.120; sub add_overloaded_operator { my $self = shift; my ( $op, $overload ) = @_; my %p = ( associated_metaclass => $self ); if ( !ref $overload ) { %p = ( %p, operator => $op, method_name => $overload, associated_metaclass => $self, ); $p{method} = $self->get_method($overload) if $self->has_method($overload); $overload = Class::MOP::Overload->new(%p); } elsif ( !blessed $overload) { my ($coderef_package, $coderef_name) = Class::MOP::get_code_info($overload); $overload = Class::MOP::Overload->new( operator => $op, coderef => $overload, coderef_name => $coderef_name, coderef_package => $coderef_package, %p, ); } $overload->attach_to_class($self); $self->_overload_map->{$op} = $overload; my %overload = ( $op => $overload->has_coderef ? $overload->coderef : $overload->method_name ); # Perl 5.10 and earlier appear to have a bug where setting a new # overloading operator wipes out the fallback value unless we pass it each # time. if (_SET_FALLBACK_EACH_TIME) { $overload{fallback} = $self->get_overload_fallback_value; } $self->name->overload::OVERLOAD(%overload); } sub remove_overloaded_operator { my $self = shift; my ($op) = @_; delete $self->_overload_map->{$op}; # overload.pm provides no api for this - but the problem that makes this # necessary has been fixed in 5.18 $self->get_or_add_package_symbol('%OVERLOAD')->{dummy}++ if "$]" < 5.017000; $self->remove_package_symbol('&(' . $op); } sub get_overload_fallback_value { my $self = shift; return ($self->_overload_info_for('fallback') || {})->{value}; } sub set_overload_fallback_value { my $self = shift; my $value = shift; $self->name->overload::OVERLOAD( fallback => $value ); } # We could cache this but we'd need some logic to clear it at all the right # times, which seems more tedious than it's worth. sub _overload_info { my $self = shift; return overload_info( $self->name ) || {}; } sub _overload_info_for { my $self = shift; my $op = shift; return overload_op_info( $self->name, $op ); } sub _overload_for { my $self = shift; my $op = shift; my $map = $self->_overload_map; return $map->{$op} if $map->{$op}; my $info = $self->_overload_info_for($op); return unless $info; my %p = ( operator => $op, associated_metaclass => $self, ); if ( $info->{code} && !$info->{method_name} ) { $p{coderef} = $info->{code}; @p{ 'coderef_package', 'coderef_name' } = $info->{code_name} =~ /(.+)::([^:]+)/; } else { $p{method_name} = $info->{method_name}; if ( $self->has_method( $p{method_name} ) ) { $p{method} = $self->get_method( $p{method_name} ); } } return $map->{$op} = Class::MOP::Overload->new(%p); } 1; # ABSTRACT: Methods for metaclasses which have overloads __END__ =pod =encoding UTF-8 =head1 NAME Class::MOP::Mixin::HasOverloads - Methods for metaclasses which have overloads =head1 VERSION version 2.2200 =head1 DESCRIPTION This class implements methods for metaclasses which have overloads (L and L). See L for API details. =head1 AUTHORS =over 4 =item * Stevan Little =item * Dave Rolsky =item * Jesse Luehrs =item * Shawn M Moore =item * יובל קוג'מן (Yuval Kogman) =item * Karen Etheridge =item * Florian Ragwitz =item * Hans Dieter Pearcey =item * Chris Prather =item * Matt S Trout =back =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2006 by Infinity Interactive, Inc. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Moose-2.2200/lib/Test/Moose.pm000640 000766 000024 00000010104 14137574636 016251 0ustar00etherstaff000000 000000 package Test::Moose; our $VERSION = '2.2200'; use strict; use warnings; use Sub::Exporter; use Test::Builder; use List::Util 1.33 'all'; use Moose::Util 'does_role', 'find_meta'; my @exports = qw[ meta_ok does_ok has_attribute_ok with_immutable ]; Sub::Exporter::setup_exporter({ exports => \@exports, groups => { default => \@exports } }); ## the test builder instance ... my $Test = Test::Builder->new; ## exported functions sub meta_ok ($;$) { my ($class_or_obj, $message) = @_; $message ||= "The object has a meta"; if (find_meta($class_or_obj)) { return $Test->ok(1, $message) } else { return $Test->ok(0, $message); } } sub does_ok ($$;$) { my ($class_or_obj, $does, $message) = @_; $message ||= "The object does $does"; if (does_role($class_or_obj, $does)) { return $Test->ok(1, $message) } else { return $Test->ok(0, $message); } } sub has_attribute_ok ($$;$) { my ($class_or_obj, $attr_name, $message) = @_; $message ||= "The object does has an attribute named $attr_name"; my $meta = find_meta($class_or_obj); if ($meta->find_attribute_by_name($attr_name)) { return $Test->ok(1, $message) } else { return $Test->ok(0, $message); } } sub with_immutable (&@) { my $block = shift; my $before = $Test->current_test; $block->(0); Class::MOP::class_of($_)->make_immutable for @_; $block->(1); my $num_tests = $Test->current_test - $before; my $all_passed = all { $_ } ($Test->summary)[-$num_tests..-1]; return $all_passed; } 1; # ABSTRACT: Test functions for Moose specific features __END__ =pod =encoding UTF-8 =head1 NAME Test::Moose - Test functions for Moose specific features =head1 VERSION version 2.2200 =head1 SYNOPSIS use Test::More plan => 1; use Test::Moose; meta_ok($class_or_obj, "... Foo has a ->meta"); does_ok($class_or_obj, $role, "... Foo does the Baz role"); has_attribute_ok($class_or_obj, $attr_name, "... Foo has the 'bar' attribute"); =head1 DESCRIPTION This module provides some useful test functions for Moose based classes. It is an experimental first release, so comments and suggestions are very welcome. =head1 EXPORTED FUNCTIONS =head2 meta_ok ($class_or_object) Tests if a class or object has a metaclass. =head2 does_ok ($class_or_object, $role, ?$message) Tests if a class or object does a certain role, similar to what C does for the C method. =head2 has_attribute_ok($class_or_object, $attr_name, ?$message) Tests if a class or object has a certain attribute, similar to what C does for the methods. =head2 with_immutable { CODE } @class_names Runs B (which should contain normal tests) twice, and make each class in C<@class_names> immutable in between the two runs. The B block is called with a single boolean argument indicating whether or not the classes have been made immutable yet. =head1 TODO =over 4 =item Convert the Moose test suite to use this module. =item Here is a list of possible functions to write =over 4 =item immutability predicates =item anon-class predicates =item discovering original method from modified method =item attribute metaclass predicates (attribute_isa?) =back =back =head1 SEE ALSO =over 4 =item L =back =head1 BUGS See L for details on reporting bugs. =head1 AUTHORS =over 4 =item * Stevan Little =item * Dave Rolsky =item * Jesse Luehrs =item * Shawn M Moore =item * יובל קוג'מן (Yuval Kogman) =item * Karen Etheridge =item * Florian Ragwitz =item * Hans Dieter Pearcey =item * Chris Prather =item * Matt S Trout =back =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2006 by Infinity Interactive, Inc. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Moose-2.2200/lib/Moose/Exception.pm000640 000766 000024 00000010567 14137574636 017305 0ustar00etherstaff000000 000000 package Moose::Exception; our $VERSION = '2.2200'; use Moose; use Devel::StackTrace 2.03; has 'trace' => ( is => 'ro', isa => 'Devel::StackTrace', builder => '_build_trace', lazy => 1, documentation => "This attribute is read-only and isa L. ". 'It is lazy & dependent on $exception->message.' ); has 'message' => ( is => 'ro', isa => 'Defined', builder => '_build_message', lazy => 1, documentation => "This attribute is read-only and isa Defined. ". "It is lazy and has a default value 'Error'." ); use overload( q{""} => 'as_string', bool => sub () { 1 }, fallback => 1, ); sub _build_trace { my $self = shift; # skip frames that are method calls on the exception object, which include # the object itself in the arguments (but Devel::LeakTrace really ought to # be weakening all references in its frames) my $skip = 0; while (my @c = caller(++$skip)) { last if ($c[3] =~ /^(.*)::new$/ || $c[3] =~ /^\S+ (.*)::new \(defined at /) && $self->isa($1); } $skip++; Devel::StackTrace->new( message => $self->message, indent => 1, skip_frames => $skip, no_refs => 1, ); } sub _build_message { "Error"; } sub BUILD { my $self = shift; $self->trace; } sub as_string { my $self = shift; if ( $ENV{MOOSE_FULL_EXCEPTION} ) { return $self->trace->as_string; } my @frames; my $last_frame; my $in_moose = 1; for my $frame ( $self->trace->frames ) { if ( $in_moose && $frame->package =~ /^(?:Moose|Class::MOP)(?::|$)/ ) { $last_frame = $frame; next; } elsif ($last_frame) { push @frames, $last_frame; undef $last_frame; } $in_moose = 0; push @frames, $frame; } # This would be a somewhat pathological case, but who knows return $self->trace->as_string unless @frames; my $message = ( shift @frames )->as_string( 1, {} ) . "\n"; $message .= join q{}, map { $_->as_string( 0, {} ) . "\n" } @frames; return $message; } __PACKAGE__->meta->make_immutable; 1; # ABSTRACT: Superclass for Moose internal exceptions __END__ =pod =encoding UTF-8 =head1 NAME Moose::Exception - Superclass for Moose internal exceptions =head1 VERSION version 2.2200 =head1 DESCRIPTION This class contains attributes which are common to all Moose internal exception classes. =head1 WARNING WARNING WARNING If you're writing your own exception classes, you should instead prefer the L role or the L superclass - this is effectively a cut-down internal fork of the latter, and not designed for use in user code. Of course if you're writing metaclass traits, it would then make sense to subclass the relevant Moose exceptions - but only then. =head1 METHODS =head2 $exception->message This attribute contains the exception message. Every subclass of L is expected to override C<_build_message> method in order to construct this value. =head2 $exception->trace This attribute contains the stack trace for the given exception. It returns a L object. =head2 $exception->as_string This method returns a stringified form of the exception, including a stack trace. By default, this method skips Moose-internal stack frames until it sees a caller outside of the Moose core. If the C environment variable is true, these frames are included. =head1 SEE ALSO =over 4 =item * L =back =head1 AUTHORS =over 4 =item * Stevan Little =item * Dave Rolsky =item * Jesse Luehrs =item * Shawn M Moore =item * יובל קוג'מן (Yuval Kogman) =item * Karen Etheridge =item * Florian Ragwitz =item * Hans Dieter Pearcey =item * Chris Prather =item * Matt S Trout =back =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2006 by Infinity Interactive, Inc. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Moose-2.2200/lib/Moose/Intro.pod000644 000766 000024 00000002140 14137574636 016600 0ustar00etherstaff000000 000000 # PODNAME: Moose::Intro # ABSTRACT: Expanded into Moose::Manual, so go read that __END__ =pod =encoding UTF-8 =head1 NAME Moose::Intro - Expanded into Moose::Manual, so go read that =head1 VERSION version 2.2200 =head1 DESCRIPTION The intro has been replaced by L. This POD document still exists for the benefit of anyone out there who might've linked to it in the past. =head1 AUTHORS =over 4 =item * Stevan Little =item * Dave Rolsky =item * Jesse Luehrs =item * Shawn M Moore =item * יובל קוג'מן (Yuval Kogman) =item * Karen Etheridge =item * Florian Ragwitz =item * Hans Dieter Pearcey =item * Chris Prather =item * Matt S Trout =back =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2006 by Infinity Interactive, Inc. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Moose-2.2200/lib/Moose/Object.pm000640 000766 000024 00000014610 14137574636 016546 0ustar00etherstaff000000 000000 package Moose::Object; our $VERSION = '2.2200'; use strict; use warnings; use Carp (); use Devel::GlobalDestruction (); use MRO::Compat (); use Scalar::Util (); use Try::Tiny (); use Moose::Util (); use if ( not our $__mx_is_compiled ), 'Moose::Meta::Class'; use if ( not our $__mx_is_compiled ), metaclass => 'Moose::Meta::Class'; sub new { my $class = shift; my $real_class = Scalar::Util::blessed($class) || $class; my $params = $real_class->BUILDARGS(@_); return Class::MOP::Class->initialize($real_class)->new_object($params); } sub BUILDARGS { my $class = shift; if ( scalar @_ == 1 ) { unless ( defined $_[0] && ref $_[0] eq 'HASH' ) { Moose::Util::throw_exception( "SingleParamsToNewMustBeHashRef" ); } return { %{ $_[0] } }; } elsif ( @_ % 2 ) { Carp::carp( "The new() method for $class expects a hash reference or a key/value list." . " You passed an odd number of arguments" ); return { @_, undef }; } else { return { @_ }; } } sub BUILDALL { # NOTE: we ask Perl if we even # need to do this first, to avoid # extra meta level calls return unless $_[0]->can('BUILD'); my ($self, $params) = @_; return if $params->{__no_BUILD__}; foreach my $method (reverse Class::MOP::class_of($self)->find_all_methods_by_name('BUILD')) { $method->{code}->execute($self, $params); } } sub DEMOLISHALL { my $self = shift; my ($in_global_destruction) = @_; # NOTE: we ask Perl if we even # need to do this first, to avoid # extra meta level calls return unless $self->can('DEMOLISH'); my @isa; if ( my $meta = Class::MOP::class_of($self ) ) { @isa = $meta->linearized_isa; } else { # We cannot count on being able to retrieve a previously made # metaclass, _or_ being able to make a new one during global # destruction. However, we should still be able to use mro at # that time (at least tests suggest so ;) my $class_name = ref $self; @isa = @{ mro::get_linear_isa($class_name) } } foreach my $class (@isa) { no strict 'refs'; my $demolish = *{"${class}::DEMOLISH"}{CODE}; $self->$demolish($in_global_destruction) if defined $demolish; } } sub DESTROY { my $self = shift; local $?; # < doy> if the destructor is being called because an exception is thrown, then $@ will be set # < doy> but if DEMOLISH does an eval which succeeds, that will clear $@ # < doy> which is broken # < doy> try::tiny implicitly localizes $@ in the try block, which fixes that Try::Tiny::try { $self->DEMOLISHALL(Devel::GlobalDestruction::in_global_destruction); } Try::Tiny::catch { die $_; }; return; } # support for UNIVERSAL::DOES ... BEGIN { my $does = UNIVERSAL->can("DOES") ? "SUPER::DOES" : "isa"; eval 'sub DOES { my ( $self, $class_or_role_name ) = @_; return $self->'.$does.'($class_or_role_name) || $self->does($class_or_role_name); }'; } # new does() methods will be created # as appropriate see Moose::Meta::Role sub does { my ($self, $role_name) = @_; my $class = Scalar::Util::blessed($self) || $self; my $meta = Class::MOP::Class->initialize($class); (defined $role_name) || Moose::Util::throw_exception( DoesRequiresRoleName => class_name => $meta->name ); return 1 if $meta->can('does_role') && $meta->does_role($role_name); return 0; } sub dump { my $self = shift; require Data::Dumper; local $Data::Dumper::Maxdepth = shift if @_; Data::Dumper::Dumper $self; } 1; # ABSTRACT: The base object for Moose __END__ =pod =encoding UTF-8 =head1 NAME Moose::Object - The base object for Moose =head1 VERSION version 2.2200 =head1 DESCRIPTION This class is the default base class for all Moose-using classes. When you C in this class, your class will inherit from this class. It provides a default constructor and destructor, which run all of the C and C methods in the inheritance hierarchy, respectively. You don't actually I to inherit from this in order to use Moose, but it makes it easier to take advantage of all of Moose's features. =head1 METHODS =head2 Moose::Object->new(%params|$params) This method calls C<< $class->BUILDARGS(@_) >>, and then creates a new instance of the appropriate class. Once the instance is created, it calls C<< $instance->BUILD($params) >> for each C method in the inheritance hierarchy. =head2 Moose::Object->BUILDARGS(%params|$params) The default implementation of this method accepts a hash or hash reference of named parameters. If it receives a single argument that I a hash reference it throws an error. You can override this method in your class to handle other types of options passed to the constructor. This method should always return a hash reference of named options. =head2 $object->does($role_name) This returns true if the object does the given role. =head2 $object->DOES($class_or_role_name) This is a Moose role-aware implementation of L. This is effectively the same as writing: $object->does($name) || $object->isa($name) This method will work with Perl 5.8, which did not implement C. =head2 $object->dump($maxdepth) =for stopwords ing This is a handy utility for Ling an object. By default, there is no maximum depth. =head2 $object->DESTROY A default destructor is provided, which calls C<< $instance->DEMOLISH($in_global_destruction) >> for each C method in the inheritance hierarchy. =head1 BUGS See L for details on reporting bugs. =head1 AUTHORS =over 4 =item * Stevan Little =item * Dave Rolsky =item * Jesse Luehrs =item * Shawn M Moore =item * יובל קוג'מן (Yuval Kogman) =item * Karen Etheridge =item * Florian Ragwitz =item * Hans Dieter Pearcey =item * Chris Prather =item * Matt S Trout =back =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2006 by Infinity Interactive, Inc. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Moose-2.2200/lib/Moose/Util/000770 000766 000024 00000000000 14137574636 015716 5ustar00etherstaff000000 000000 Moose-2.2200/lib/Moose/Deprecated.pm000640 000766 000024 00000003075 14137574636 017403 0ustar00etherstaff000000 000000 package Moose::Deprecated; our $VERSION = '2.2200'; use strict; use warnings; use Package::DeprecationManager 0.07 -deprecations => { 'non-arrayref form of enum' => '2.1100', 'non-arrayref form of duck_type' => '2.1100', }, -ignore => [qr/^(?:Class::MOP|Moose)(?:::)?/], ; 1; # ABSTRACT: Manages deprecation warnings for Moose __END__ =pod =encoding UTF-8 =head1 NAME Moose::Deprecated - Manages deprecation warnings for Moose =head1 VERSION version 2.2200 =head1 DESCRIPTION use Moose::Deprecated -api_version => $version; =head1 FUNCTIONS This module manages deprecation warnings for features that have been deprecated in Moose. If you specify C<< -api_version => $version >>, you can use deprecated features without warnings. Note that this special treatment is limited to the package that loads C. =head1 AUTHORS =over 4 =item * Stevan Little =item * Dave Rolsky =item * Jesse Luehrs =item * Shawn M Moore =item * יובל קוג'מן (Yuval Kogman) =item * Karen Etheridge =item * Florian Ragwitz =item * Hans Dieter Pearcey =item * Chris Prather =item * Matt S Trout =back =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2006 by Infinity Interactive, Inc. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Moose-2.2200/lib/Moose/Exporter.pm000640 000766 000024 00000072570 14137574636 017161 0ustar00etherstaff000000 000000 package Moose::Exporter; our $VERSION = '2.2200'; use strict; use warnings; use Class::Load qw(is_class_loaded); use Class::MOP; use List::Util 1.45 qw( uniq ); use Moose::Util::MetaRole; use Scalar::Util 1.40 qw(reftype); use Sub::Exporter 0.980; use Sub::Util 1.40 qw(set_subname); use Moose::Util 'throw_exception'; my %EXPORT_SPEC; sub setup_import_methods { my ( $class, %args ) = @_; $args{exporting_package} ||= caller(); $class->build_import_methods( %args, install => [qw(import unimport init_meta)] ); } # A reminder to intrepid Moose hackers # there may be more than one level of exporter # don't make doy cry. -- perigrin sub build_import_methods { my ( $class, %args ) = @_; my $exporting_package = $args{exporting_package} ||= caller(); my $meta_lookup = $args{meta_lookup} || sub { Class::MOP::class_of(shift) }; $EXPORT_SPEC{$exporting_package} = \%args; my @exports_from = $class->_follow_also($exporting_package); my $export_recorder = {}; my $is_reexport = {}; my $exports = $class->_make_sub_exporter_params( [ $exporting_package, @exports_from ], $export_recorder, $is_reexport, $args{meta_lookup}, # so that we don't pass through the default ); my $exporter = $class->_make_exporter( $exports, $is_reexport, $meta_lookup, ); my %methods; $methods{import} = $class->_make_import_sub( $exporting_package, $exporter, \@exports_from, $is_reexport, $meta_lookup, ); $methods{unimport} = $class->_make_unimport_sub( $exporting_package, $exports, $export_recorder, $is_reexport, $meta_lookup, ); $methods{init_meta} = $class->_make_init_meta( $exporting_package, \%args, $meta_lookup, ); my $package = Class::MOP::Package->initialize($exporting_package); for my $to_install ( @{ $args{install} || [] } ) { my $symbol = '&' . $to_install; next unless $methods{$to_install} && !$package->has_package_symbol($symbol); $package->add_package_symbol( $symbol, set_subname( $exporting_package . '::' . $to_install => $methods{$to_install} ) ); } return ( $methods{import}, $methods{unimport}, $methods{init_meta} ); } sub _make_exporter { my ($class, $exports, $is_reexport, $meta_lookup) = @_; return Sub::Exporter::build_exporter( { exports => $exports, groups => { default => [':all'] }, installer => sub { my ($arg, $to_export) = @_; my $meta = $meta_lookup->($arg->{into}); goto &Sub::Exporter::default_installer unless $meta; # don't overwrite existing symbols with our magically flagged # version of it if we would install the same sub that's already # in the importer my @filtered_to_export; my %installed; for (my $i = 0; $i < @{ $to_export }; $i += 2) { my ($as, $cv) = @{ $to_export }[$i, $i + 1]; next if !ref($as) && $meta->has_package_symbol('&' . $as) && $meta->get_package_symbol('&' . $as) == $cv; push @filtered_to_export, $as, $cv; $installed{$as} = 1 unless ref $as; } Sub::Exporter::default_installer($arg, \@filtered_to_export); for my $name ( keys %{$is_reexport} ) { no strict 'refs'; no warnings 'once'; next unless exists $installed{$name}; _flag_as_reexport( \*{ join q{::}, $arg->{into}, $name } ); } }, } ); } sub _follow_also { my $class = shift; my $exporting_package = shift; _die_if_cycle_found_in_also_list_for_package($exporting_package); return uniq( _follow_also_real($exporting_package) ); } sub _follow_also_real { my $exporting_package = shift; my @also = _also_list_for_package($exporting_package); return map { $_, _follow_also_real($_) } @also; } sub _also_list_for_package { my $package = shift; if ( !exists $EXPORT_SPEC{$package} ) { my $loaded = is_class_loaded($package); throw_exception( PackageDoesNotUseMooseExporter => package => $package, is_loaded => $loaded ); } my $also = $EXPORT_SPEC{$package}{also}; return unless defined $also; return ref $also ? @$also : $also; } # this is no Tarjan algorithm, but for the list sizes expected, # brute force will probably be fine (and more maintainable) sub _die_if_cycle_found_in_also_list_for_package { my $package = shift; _die_if_also_list_cycles_back_to_existing_stack( [ _also_list_for_package($package) ], [$package], ); } sub _die_if_also_list_cycles_back_to_existing_stack { my ( $also_list, $existing_stack ) = @_; return unless @$also_list && @$existing_stack; for my $also_member (@$also_list) { for my $stack_member (@$existing_stack) { next unless $also_member eq $stack_member; throw_exception( CircularReferenceInAlso => also_parameter => $also_member, stack => $existing_stack ); } _die_if_also_list_cycles_back_to_existing_stack( [ _also_list_for_package($also_member) ], [ $also_member, @$existing_stack ], ); } } sub _parse_trait_aliases { my $class = shift; my ($package, $aliases) = @_; my @ret; for my $alias (@$aliases) { my $name; if (ref($alias)) { reftype($alias) eq 'ARRAY' or throw_exception( InvalidArgumentsToTraitAliases => class_name => $class, package_name => $package, alias => $alias ); ($alias, $name) = @$alias; } else { ($name = $alias) =~ s/.*:://; } push @ret, set_subname( "${package}::${name}" => sub () {$alias} ); } return @ret; } sub _make_sub_exporter_params { my $class = shift; my $packages = shift; my $export_recorder = shift; my $is_reexport = shift; my $meta_lookup_override = shift; my %exports; my $current_meta_lookup; for my $package ( @{$packages} ) { my $args = $EXPORT_SPEC{$package} or die "The $package package does not use Moose::Exporter\n"; $current_meta_lookup = $meta_lookup_override || $args->{meta_lookup}; $meta_lookup_override = $current_meta_lookup; my $meta_lookup = $current_meta_lookup || sub { Class::MOP::class_of(shift) }; for my $name ( @{ $args->{with_meta} } ) { my $sub = $class->_sub_from_package( $package, $name ) or next; my $fq_name = $package . '::' . $name; $exports{$name} = $class->_make_wrapped_sub_with_meta( $fq_name, $sub, $export_recorder, $meta_lookup, ) unless exists $exports{$name}; } for my $name ( @{ $args->{with_caller} } ) { my $sub = $class->_sub_from_package( $package, $name ) or next; my $fq_name = $package . '::' . $name; $exports{$name} = $class->_make_wrapped_sub( $fq_name, $sub, $export_recorder, ) unless exists $exports{$name}; } my @extra_exports = $class->_parse_trait_aliases( $package, $args->{trait_aliases}, ); for my $name ( @{ $args->{as_is} }, @extra_exports ) { my ( $sub, $coderef_name ); if ( ref $name ) { $sub = $name; my $coderef_pkg; ( $coderef_pkg, $coderef_name ) = Class::MOP::get_code_info($name); if ( $coderef_pkg ne $package ) { $is_reexport->{$coderef_name} = 1; } } elsif ( $name =~ /^(.*)::([^:]+)$/ ) { $sub = $class->_sub_from_package( "$1", "$2" ) or next; $coderef_name = "$2"; if ( $1 ne $package ) { $is_reexport->{$coderef_name} = 1; } } else { $sub = $class->_sub_from_package( $package, $name ) or next; $coderef_name = $name; } $export_recorder->{$sub} = 1; $exports{$coderef_name} = sub { $sub } unless exists $exports{$coderef_name}; } } return \%exports; } sub _sub_from_package { my $sclass = shift; my $package = shift; my $name = shift; my $sub = do { no strict 'refs'; \&{ $package . '::' . $name }; }; return $sub if defined &$sub; Carp::cluck "Trying to export undefined sub ${package}::${name}"; return; } our $CALLER; sub _make_wrapped_sub { my $self = shift; my $fq_name = shift; my $sub = shift; my $export_recorder = shift; # We need to set the package at import time, so that when # package Foo imports has(), we capture "Foo" as the # package. This lets other packages call Foo::has() and get # the right package. This is done for backwards compatibility # with existing production code, not because this is a good # idea ;) return sub { my $caller = $CALLER; my $wrapper = $self->_curry_wrapper( $sub, $fq_name, $caller ); my $sub = set_subname( $fq_name => $wrapper ); $export_recorder->{$sub} = 1; return $sub; }; } sub _make_wrapped_sub_with_meta { my $self = shift; my $fq_name = shift; my $sub = shift; my $export_recorder = shift; my $meta_lookup = shift; return sub { my $caller = $CALLER; my $wrapper = $self->_late_curry_wrapper( $sub, $fq_name, $meta_lookup => $caller ); my $sub = set_subname( $fq_name => $wrapper ); $export_recorder->{$sub} = 1; return $sub; }; } sub _curry_wrapper { my $class = shift; my $sub = shift; my $fq_name = shift; my @extra = @_; my $wrapper = sub { $sub->( @extra, @_ ) }; if ( my $proto = prototype $sub ) { # XXX - Perl's prototype sucks. Use & to make set_prototype # ignore the fact that we're passing "private variables" &Scalar::Util::set_prototype( $wrapper, $proto ); } return $wrapper; } sub _late_curry_wrapper { my $class = shift; my $sub = shift; my $fq_name = shift; my $extra = shift; my @ex_args = @_; my $wrapper = sub { # resolve curried arguments at runtime via this closure my @curry = ( $extra->(@ex_args) ); return $sub->( @curry, @_ ); }; if ( my $proto = prototype $sub ) { # XXX - Perl's prototype sucks. Use & to make set_prototype # ignore the fact that we're passing "private variables" &Scalar::Util::set_prototype( $wrapper, $proto ); } return $wrapper; } sub _make_import_sub { shift; my $exporting_package = shift; my $exporter = shift; my $exports_from = shift; my $is_reexport = shift; my $meta_lookup = shift; return sub { # I think we could use Sub::Exporter's collector feature # to do this, but that would be rather gross, since that # feature isn't really designed to return a value to the # caller of the exporter sub. # # Also, this makes sure we preserve backwards compat for # _get_caller, so it always sees the arguments in the # expected order. my $traits; ( $traits, @_ ) = _strip_traits(@_); my $metaclass; ( $metaclass, @_ ) = _strip_metaclass(@_); $metaclass = Moose::Util::resolve_metaclass_alias( 'Class' => $metaclass ) if defined $metaclass && length $metaclass; my $meta_name; ( $meta_name, @_ ) = _strip_meta_name(@_); # Normally we could look at $_[0], but in some weird cases # (involving goto &Moose::import), $_[0] ends as something # else (like Squirrel). my $class = $exporting_package; $CALLER = _get_caller(@_); # this works because both pragmas set $^H (see perldoc # perlvar) which affects the current compilation - # i.e. the file who use'd us - which is why we don't need # to do anything special to make it affect that file # rather than this one (which is already compiled) strict->import; warnings->import; my $did_init_meta; for my $c ( grep { $_->can('init_meta') } $class, @{$exports_from} ) { # init_meta can apply a role, which when loaded uses # Moose::Exporter, which in turn sets $CALLER, so we need # to protect against that. local $CALLER = $CALLER; $c->init_meta( for_class => $CALLER, metaclass => $metaclass, meta_name => $meta_name, ); $did_init_meta = 1; } { # The metaroles will use Moose::Role, which in turn uses # Moose::Exporter, which in turn sets $CALLER, so we need # to protect against that. local $CALLER = $CALLER; _apply_metaroles( $CALLER, [$class, @$exports_from], $meta_lookup ); } if ( $did_init_meta && @{$traits} ) { # The traits will use Moose::Role, which in turn uses # Moose::Exporter, which in turn sets $CALLER, so we need # to protect against that. local $CALLER = $CALLER; _apply_meta_traits( $CALLER, $traits, $meta_lookup ); } elsif ( @{$traits} ) { throw_exception( ClassDoesNotHaveInitMeta => class_name => $class, traits => $traits ); } my ( undef, @args ) = @_; my $extra = shift @args if ref $args[0] eq 'HASH'; $extra ||= {}; if ( !$extra->{into} ) { $extra->{into_level} ||= 0; $extra->{into_level}++; } $class->$exporter( $extra, @args ); }; } sub _strip_option { my $option_name = shift; my $default = shift; for my $i ( 0 .. $#_ - 1 ) { if (($_[$i] || '') eq $option_name) { (undef, my $value) = splice @_, $i, 2; return ( $value, @_ ); } } return ( $default, @_ ); } sub _strip_traits { my ($traits, @other) = _strip_option('-traits', [], @_); $traits = ref $traits ? $traits : [ $traits ]; return ( $traits, @other ); } sub _strip_metaclass { _strip_option('-metaclass', undef, @_); } sub _strip_meta_name { _strip_option('-meta_name', 'meta', @_); } sub _apply_metaroles { my ($class, $exports_from, $meta_lookup) = @_; my $metaroles = _collect_metaroles($exports_from); my $base_class_roles = delete $metaroles->{base_class_roles}; my $meta = $meta_lookup->($class); # for instance, Moose.pm uses Moose::Util::TypeConstraints return unless $meta; Moose::Util::MetaRole::apply_metaroles( for => $meta, %$metaroles, ) if keys %$metaroles; Moose::Util::MetaRole::apply_base_class_roles( for => $meta, roles => $base_class_roles, ) if $meta->isa('Class::MOP::Class') && $base_class_roles && @$base_class_roles; } sub _collect_metaroles { my ($exports_from) = @_; my @old_style_role_types = map { "${_}_roles" } qw( metaclass attribute_metaclass method_metaclass wrapped_method_metaclass instance_metaclass constructor_class destructor_class error_class ); my %class_metaroles; my %role_metaroles; my @base_class_roles; my %old_style_roles; for my $exporter (@$exports_from) { my $data = $EXPORT_SPEC{$exporter}; if (exists $data->{class_metaroles}) { for my $type (keys %{ $data->{class_metaroles} }) { push @{ $class_metaroles{$type} ||= [] }, @{ $data->{class_metaroles}{$type} }; } } if (exists $data->{role_metaroles}) { for my $type (keys %{ $data->{role_metaroles} }) { push @{ $role_metaroles{$type} ||= [] }, @{ $data->{role_metaroles}{$type} }; } } if (exists $data->{base_class_roles}) { push @base_class_roles, @{ $data->{base_class_roles} }; } for my $type (@old_style_role_types) { if (exists $data->{$type}) { push @{ $old_style_roles{$type} ||= [] }, @{ $data->{$type} }; } } } return { (keys(%class_metaroles) ? (class_metaroles => \%class_metaroles) : ()), (keys(%role_metaroles) ? (role_metaroles => \%role_metaroles) : ()), (@base_class_roles ? (base_class_roles => \@base_class_roles) : ()), %old_style_roles, }; } sub _apply_meta_traits { my ( $class, $traits, $meta_lookup ) = @_; return unless @{$traits}; my $meta = $meta_lookup->($class); my $type = $meta->isa('Moose::Meta::Role') ? 'Role' : $meta->isa('Class::MOP::Class') ? 'Class' : confess('Cannot determine metaclass type for ' . 'trait application. Meta isa ' . ref $meta); my @resolved_traits = map { ref $_ ? $_ : Moose::Util::resolve_metatrait_alias( $type => $_ ) } @$traits; return unless @resolved_traits; my %args = ( for => $class ); if ( $meta->isa('Moose::Meta::Role') ) { $args{role_metaroles} = { role => \@resolved_traits }; } else { $args{class_metaroles} = { class => \@resolved_traits }; } Moose::Util::MetaRole::apply_metaroles(%args); } sub _get_caller { # 1 extra level because it's called by import so there's a layer # of indirection my $offset = 1; return ( ref $_[1] && defined $_[1]->{into} ) ? $_[1]->{into} : ( ref $_[1] && defined $_[1]->{into_level} ) ? caller( $offset + $_[1]->{into_level} ) : caller($offset); } sub _make_unimport_sub { shift; my $exporting_package = shift; my $exports = shift; my $export_recorder = shift; my $is_reexport = shift; my $meta_lookup = shift; return sub { my $caller = _get_caller(@_); Moose::Exporter->_remove_keywords( $caller, [ keys %{$exports} ], $export_recorder, $is_reexport, ); }; } sub _remove_keywords { shift; my $package = shift; my $keywords = shift; my $recorded_exports = shift; my $is_reexport = shift; no strict 'refs'; foreach my $name ( @{$keywords} ) { if ( defined &{ $package . '::' . $name } ) { my $sub = \&{ $package . '::' . $name }; # make sure it is from us next unless $recorded_exports->{$sub}; if ( $is_reexport->{$name} ) { no strict 'refs'; next unless _export_is_flagged( \*{ join q{::} => $package, $name } ); } # and if it is from us, then undef the slot delete ${ $package . '::' }{$name}; } } } # maintain this for now for backcompat # make sure to return a sub to install in the same circumstances as previously # but this functionality now happens at the end of ->import sub _make_init_meta { shift; my $class = shift; my $args = shift; my $meta_lookup = shift; my %old_style_roles; for my $role ( map {"${_}_roles"} qw( metaclass attribute_metaclass method_metaclass wrapped_method_metaclass instance_metaclass constructor_class destructor_class error_class ) ) { $old_style_roles{$role} = $args->{$role} if exists $args->{$role}; } my %base_class_roles; %base_class_roles = ( roles => $args->{base_class_roles} ) if exists $args->{base_class_roles}; my %new_style_roles = map { $_ => $args->{$_} } grep { exists $args->{$_} } qw( class_metaroles role_metaroles ); return unless %new_style_roles || %old_style_roles || %base_class_roles; return sub { shift; my %opts = @_; $meta_lookup->($opts{for_class}); }; } sub import { strict->import; warnings->import; } 1; # ABSTRACT: make an import() and unimport() just like Moose.pm __END__ =pod =encoding UTF-8 =head1 NAME Moose::Exporter - make an import() and unimport() just like Moose.pm =head1 VERSION version 2.2200 =head1 SYNOPSIS package MyApp::Moose; use Moose (); use Moose::Exporter; use Some::Random (); Moose::Exporter->setup_import_methods( with_meta => [ 'has_rw', 'sugar2' ], as_is => [ 'sugar3', \&Some::Random::thing, 'Some::Random::other_thing' ], also => 'Moose', ); sub has_rw { my ( $meta, $name, %options ) = @_; $meta->add_attribute( $name, is => 'rw', %options, ); } # then later ... package MyApp::User; use MyApp::Moose; has 'name' => ( is => 'ro' ); has_rw 'size'; thing; other_thing; no MyApp::Moose; =head1 DESCRIPTION This module encapsulates the exporting of sugar functions in a C-like manner. It does this by building custom C and C methods for your module, based on a spec you provide. It also lets you "stack" Moose-alike modules so you can export Moose's sugar as well as your own, along with sugar from any random C module, as long as they all use C. This feature exists to let you bundle a set of MooseX modules into a policy module that developers can use directly instead of using Moose itself. To simplify writing exporter modules, C also imports C and C into your exporter module, as well as into modules that use it. =head1 METHODS This module provides two public methods: =head2 Moose::Exporter->setup_import_methods(...) When you call this method, C builds custom C and C methods for your module. The C method will export the functions you specify, and can also re-export functions exported by some other module (like C). If you pass any parameters for L, the C method will also call L and L as needed, after making sure the metaclass is initialized. The C method cleans the caller's namespace of all the exported functions. This includes any functions you re-export from other packages. However, if the consumer of your package also imports those functions from the original package, they will I be cleaned. Note that if any of these methods already exist, they will not be overridden, you will have to use C to get the coderef that would be installed. This method accepts the following parameters: =over 4 =item * with_meta => [ ... ] This list of function I will be wrapped and then exported. The wrapper will pass the metaclass object for the caller as its first argument. Many sugar functions will need to use this metaclass object to do something to the calling package. =item * as_is => [ ... ] This list of function names or sub references will be exported as-is. You can identify a subroutine by reference, which is handy to re-export some other module's functions directly by reference (C<\&Some::Package::function>). If you do export some other package's function, this function will never be removed by the C method. The reason for this is we cannot know if the caller I explicitly imported the sub themselves, and therefore wants to keep it. =item * trait_aliases => [ ... ] This is a list of package names which should have shortened aliases exported, similar to the functionality of L. Each element in the list can be either a package name, in which case the export will be named as the last namespace component of the package, or an arrayref, whose first element is the package to alias to, and second element is the alias to export. =item * also => $name or \@names This is a list of modules which contain functions that the caller wants to export. These modules must also use C. The most common use case will be to export the functions from C. Functions specified by C or C take precedence over functions exported by modules specified by C, so that a module can selectively override functions exported by another module. C also makes sure all these functions get removed when C is called. =item * meta_lookup => sub { ... } This is a function which will be called to provide the metaclass to be operated upon by the exporter. This is an advanced feature intended for use by package generator modules in the vein of L in order to simplify reusing sugar from other modules that use C. This function is used, for example, to select the metaclass to bind to functions that are exported using the C option. This function will receive one parameter: the class name into which the sugar is being exported. The default implementation is: sub { Class::MOP::class_of(shift) } Accordingly, this function is expected to return a metaclass. =back You can also provide parameters for L and L. Specifically, valid parameters are "class_metaroles", "role_metaroles", and "base_class_roles". =head2 Moose::Exporter->build_import_methods(...) Returns three code refs, one for C, one for C and one for C. Accepts the additional C option, which accepts an arrayref of method names to install into your exporting package. The valid options are C and C. Calling C is equivalent to calling C with C<< install => [qw(import unimport)] >> except that it doesn't also return the methods. The C method is built using L. This means that it can take a hashref of the form C<< { into => $package } >> to specify the package it operates on. Used by C. =head1 IMPORTING AND init_meta If you want to set an alternative base object class or metaclass class, see above for details on how this module can call L for you. If you want to do something that is not supported by this module, simply define an C method in your class. The C method that C generates for you will call this method (if it exists). It will always pass the caller to this method via the C parameter. Most of the time, your C method will probably just call C<< Moose->init_meta >> to do the real work: sub init_meta { shift; # our class name return Moose->init_meta( @_, metaclass => 'My::Metaclass' ); } =head1 METACLASS TRAITS The C method generated by C will allow the user of your module to specify metaclass traits in a C<-traits> parameter passed as part of the import: use Moose -traits => 'My::Meta::Trait'; use Moose -traits => [ 'My::Meta::Trait', 'My::Other::Trait' ]; These traits will be applied to the caller's metaclass instance. Providing traits for an exporting class that does not create a metaclass for the caller is an error. =head1 BUGS See L for details on reporting bugs. =head1 AUTHORS =over 4 =item * Stevan Little =item * Dave Rolsky =item * Jesse Luehrs =item * Shawn M Moore =item * יובל קוג'מן (Yuval Kogman) =item * Karen Etheridge =item * Florian Ragwitz =item * Hans Dieter Pearcey =item * Chris Prather =item * Matt S Trout =back =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2006 by Infinity Interactive, Inc. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Moose-2.2200/lib/Moose/Util.pm000640 000766 000024 00000047312 14137574636 016262 0ustar00etherstaff000000 000000 package Moose::Util; our $VERSION = '2.2200'; use strict; use warnings; use Module::Runtime 0.014 'use_package_optimistically', 'module_notional_filename'; use Data::OptList; use Sub::Exporter; use Scalar::Util 'blessed'; use List::Util 1.33 qw(first any all); use overload (); use Try::Tiny; my @exports = qw[ find_meta is_role does_role search_class_by_role ensure_all_roles apply_all_roles with_traits get_all_init_args get_all_attribute_values resolve_metatrait_alias resolve_metaclass_alias add_method_modifier english_list meta_attribute_alias meta_class_alias throw_exception ]; Sub::Exporter::setup_exporter({ exports => \@exports, groups => { all => \@exports } }); # Things that need to ->import from Moose::Util # should be loaded after Moose::Util defines ->import require Class::MOP; sub throw_exception { my ($class_name, @args_to_exception) = @_; my $class = "Moose::Exception::$class_name"; _load_user_class( $class ); die $class->new( @args_to_exception ); } ## some utils for the utils ... sub find_meta { Class::MOP::class_of(@_) } ## the functions ... sub is_role { my $package_or_obj = shift; my $meta = find_meta($package_or_obj); return if not $meta; return $meta->isa('Moose::Meta::Role'); } sub does_role { my ($class_or_obj, $role) = @_; if (try { $class_or_obj->isa('Moose::Object') }) { return $class_or_obj->does($role); } my $meta = find_meta($class_or_obj); return unless defined $meta; return unless $meta->can('does_role'); return 1 if $meta->does_role($role); return; } sub search_class_by_role { my ($class_or_obj, $role) = @_; my $meta = find_meta($class_or_obj); return unless defined $meta; my $role_name = blessed $role ? $role->name : $role; foreach my $class ($meta->class_precedence_list) { my $_meta = find_meta($class); next unless defined $_meta; foreach my $role (@{ $_meta->roles || [] }) { return $class if $role->name eq $role_name; } } return; } # this can possibly behave in unexpected ways because the roles being composed # before being applied could differ from call to call; I'm not sure if or how # to document this possible quirk. sub ensure_all_roles { my $applicant = shift; _apply_all_roles($applicant, sub { !does_role($applicant, $_) }, @_); } sub apply_all_roles { my $applicant = shift; _apply_all_roles($applicant, undef, @_); } sub _apply_all_roles { my $applicant = shift; my $role_filter = shift; unless (@_) { require Moose; throw_exception( MustSpecifyAtleastOneRoleToApplicant => applicant => $applicant ); } # If @_ contains role meta objects, mkopt will think that they're values, # because they're references. In other words (roleobj1, roleobj2, # roleobj3) will become [ [ roleobj1, roleobj2 ], [ roleobj3, undef ] ] # -- this is no good. We'll preprocess @_ first to eliminate the potential # bug. # -- rjbs, 2011-04-08 my $roles = Data::OptList::mkopt( [@_], { moniker => 'role', name_test => sub { ! ref $_[0] or blessed($_[0]) && $_[0]->isa('Moose::Meta::Role') } }); my @role_metas; foreach my $role (@$roles) { my $meta; if ( blessed $role->[0] ) { $meta = $role->[0]; } else { _load_user_class( $role->[0] , $role->[1] ); $meta = find_meta( $role->[0] ); } unless ($meta && $meta->isa('Moose::Meta::Role') ) { throw_exception( CanOnlyConsumeRole => role_name => $role->[0] ); } push @role_metas, [ $meta, $role->[1] ]; } if ( defined $role_filter ) { @role_metas = grep { local $_ = $_->[0]; $role_filter->() } @role_metas; } return unless @role_metas; _load_user_class($applicant) unless blessed($applicant) || Class::MOP::class_of($applicant); my $meta = ( blessed $applicant ? $applicant : Moose::Meta::Class->initialize($applicant) ); if ( scalar @role_metas == 1 ) { my ( $role, $params ) = @{ $role_metas[0] }; $role->apply( $meta, ( defined $params ? %$params : () ) ); } else { Moose::Meta::Role->combine(@role_metas)->apply($meta); } } sub with_traits { my ($class, @roles) = @_; return $class unless @roles; return Moose::Meta::Class->create_anon_class( superclasses => [$class], roles => \@roles, cache => 1, )->name; } # instance deconstruction ... sub get_all_attribute_values { my ($class, $instance) = @_; return +{ map { $_->name => $_->get_value($instance) } grep { $_->has_value($instance) } $class->get_all_attributes }; } sub get_all_init_args { my ($class, $instance) = @_; return +{ map { $_->init_arg => $_->get_value($instance) } grep { $_->has_value($instance) } grep { defined($_->init_arg) } $class->get_all_attributes }; } sub resolve_metatrait_alias { return resolve_metaclass_alias( @_, trait => 1 ); } sub _build_alias_package_name { my ($type, $name, $trait) = @_; return 'Moose::Meta::' . $type . '::Custom::' . ( $trait ? 'Trait::' : '' ) . $name; } { my %cache; sub resolve_metaclass_alias { my ( $type, $metaclass_name, %options ) = @_; my $cache_key = $type . q{ } . ( $options{trait} ? '-Trait' : '' ); return $cache{$cache_key}{$metaclass_name} if $cache{$cache_key}{$metaclass_name}; my $possible_full_name = _build_alias_package_name( $type, $metaclass_name, $options{trait} ); my @possible = ($possible_full_name, $metaclass_name); for my $package (@possible) { use_package_optimistically($package); if ($package->can('register_implementation')) { return $cache{$cache_key}{$metaclass_name} = $package->register_implementation; } elsif (find_meta($package)) { return $cache{$cache_key}{$metaclass_name} = $package; } } throw_exception( CannotLocatePackageInINC => possible_packages => _english_list_or(@possible), INC => \@INC, type => $type, metaclass_name => $metaclass_name, params => \%options ); } } sub add_method_modifier { my ( $class_or_obj, $modifier_name, $args ) = @_; my $meta = $class_or_obj->can('add_before_method_modifier') ? $class_or_obj : find_meta($class_or_obj); my $code = pop @{$args}; my $add_modifier_method = 'add_' . $modifier_name . '_method_modifier'; if ( my $method_modifier_type = ref( $args->[0] ) ) { if ( $method_modifier_type eq 'Regexp' ) { my @all_methods = $meta->get_all_methods; my @matched_methods = grep { $_->name =~ $args->[0] } @all_methods; $meta->$add_modifier_method( $_->name, $code ) for @matched_methods; } elsif ($method_modifier_type eq 'ARRAY') { $meta->$add_modifier_method( $_, $code ) for @{$args->[0]}; } else { throw_exception( IllegalMethodTypeToAddMethodModifier => class_or_object => $class_or_obj, modifier_name => $modifier_name, params => $args ); } } else { $meta->$add_modifier_method( $_, $code ) for @{$args}; } } sub english_list { _english_list_and(@_); } sub _english_list_and { _english_list('and', \@_); } sub _english_list_or { _english_list('or', \@_); } sub _english_list { my ($conjunction, $items) = @_; my @items = sort @$items; return $items[0] if @items == 1; return "$items[0] $conjunction $items[1]" if @items == 2; my $tail = pop @items; my $list = join ', ', @items; $list .= ", $conjunction " . $tail; return $list; } sub _caller_info { my $level = @_ ? ($_[0] + 1) : 2; my %info; @info{qw(package file line)} = caller($level); return %info; } sub _create_alias { my ($type, $name, $trait, $for) = @_; my $package = _build_alias_package_name($type, $name, $trait); Class::MOP::Class->initialize($package)->add_method( register_implementation => sub { $for } ); } sub meta_attribute_alias { my ($to, $from) = @_; $from ||= caller; my $meta = Class::MOP::class_of($from); my $trait = $meta->isa('Moose::Meta::Role'); _create_alias('Attribute', $to, $trait, $from); } sub meta_class_alias { my ($to, $from) = @_; $from ||= caller; my $meta = Class::MOP::class_of($from); my $trait = $meta->isa('Moose::Meta::Role'); _create_alias('Class', $to, $trait, $from); } sub _load_user_class { my ($class, $opts) = @_; &use_package_optimistically( $class, $opts && $opts->{-version} ? $opts->{-version} : () ); } # XXX - this should be added to Params::Util sub _STRINGLIKE0 ($) { return 0 if !defined $_[0]; return 1 if !ref $_[0]; return 1 if overload::OverloadedStringify($_[0]); return 0; } sub _reconcile_roles_for_metaclass { my ($class_meta_name, $super_meta_name) = @_; my @role_differences = _role_differences( $class_meta_name, $super_meta_name, ); # handle the case where we need to fix compatibility between a class and # its parent, but all roles in the class are already also done by the # parent # see t/metaclasses/metaclass_compat_no_fixing_bug.t return $super_meta_name unless @role_differences; return Moose::Meta::Class->create_anon_class( superclasses => [$super_meta_name], roles => [map { $_->name } @role_differences], cache => 1, )->name; } sub _role_differences { my ($class_meta_name, $super_meta_name) = @_; my @super_role_metas = map { $_->isa('Moose::Meta::Role::Composite') ? (@{ $_->get_roles }) : ($_) } $super_meta_name->meta->can('_roles_with_inheritance') ? $super_meta_name->meta->_roles_with_inheritance : $super_meta_name->meta->can('roles') ? @{ $super_meta_name->meta->roles } : (); my @role_metas = map { $_->isa('Moose::Meta::Role::Composite') ? (@{ $_->get_roles }) : ($_) } $class_meta_name->meta->can('_roles_with_inheritance') ? $class_meta_name->meta->_roles_with_inheritance : $class_meta_name->meta->can('roles') ? @{ $class_meta_name->meta->roles } : (); my @differences; for my $role_meta (@role_metas) { push @differences, $role_meta unless any { $_->name eq $role_meta->name } @super_role_metas; } return @differences; } sub _classes_differ_by_roles_only { my ( $self_meta_name, $super_meta_name ) = @_; my $common_base_name = _find_common_base( $self_meta_name, $super_meta_name ); return unless defined $common_base_name; my @super_meta_name_ancestor_names = _get_ancestors_until( $super_meta_name, $common_base_name ); my @class_meta_name_ancestor_names = _get_ancestors_until( $self_meta_name, $common_base_name ); return unless all { _is_role_only_subclass($_) } @super_meta_name_ancestor_names, @class_meta_name_ancestor_names; return 1; } sub _find_common_base { my ($meta1, $meta2) = map { Class::MOP::class_of($_) } @_; return unless defined $meta1 && defined $meta2; # FIXME? This doesn't account for multiple inheritance (not sure # if it needs to though). For example, if somewhere in $meta1's # history it inherits from both ClassA and ClassB, and $meta2 # inherits from ClassB & ClassA, does it matter? And what crazy # fool would do that anyway? my %meta1_parents = map { $_ => 1 } $meta1->linearized_isa; return first { $meta1_parents{$_} } $meta2->linearized_isa; } sub _get_ancestors_until { my ($start_name, $until_name) = @_; my @ancestor_names; for my $ancestor_name (Class::MOP::class_of($start_name)->linearized_isa) { last if $ancestor_name eq $until_name; push @ancestor_names, $ancestor_name; } return @ancestor_names; } sub _is_role_only_subclass { my ($meta_name) = @_; my $meta = Class::MOP::Class->initialize($meta_name); my @parent_names = $meta->superclasses; # XXX: don't feel like messing with multiple inheritance here... what would # that even do? return unless @parent_names == 1; my ($parent_name) = @parent_names; my $parent_meta = Class::MOP::Class->initialize($parent_name); # only get the roles attached to this particular class, don't look at # superclasses my @roles = $meta->can('calculate_all_roles') ? $meta->calculate_all_roles : (); # it's obviously not a role-only subclass if it doesn't do any roles return unless @roles; # loop over all methods that are a part of the current class # (not inherited) for my $method ( $meta->_get_local_methods ) { # always ignore meta next if $method->isa('Class::MOP::Method::Meta'); # we'll deal with attributes below next if $method->can('associated_attribute'); # if the method comes from a role we consumed, ignore it next if $meta->can('does_role') && $meta->does_role($method->original_package_name); # FIXME - this really isn't right. Just because a modifier is # defined in a role doesn't mean it isn't _also_ defined in the # subclass. next if $method->isa('Class::MOP::Method::Wrapped') && ( (!scalar($method->around_modifiers) || any { $_->has_around_method_modifiers($method->name) } @roles) && (!scalar($method->before_modifiers) || any { $_->has_before_method_modifiers($method->name) } @roles) && (!scalar($method->after_modifiers) || any { $_->has_after_method_modifiers($method->name) } @roles) ); return 0; } # loop over all attributes that are a part of the current class # (not inherited) # FIXME - this really isn't right. Just because an attribute is # defined in a role doesn't mean it isn't _also_ defined in the # subclass. for my $attr (map { $meta->get_attribute($_) } $meta->get_attribute_list) { next if any { $_->has_attribute($attr->name) } @roles; return 0; } return 1; } sub _is_package_loaded { my ($package) = @_; defined $INC{module_notional_filename($package)}; } 1; # ABSTRACT: Utilities for working with Moose classes __END__ =pod =encoding UTF-8 =head1 NAME Moose::Util - Utilities for working with Moose classes =head1 VERSION version 2.2200 =head1 SYNOPSIS use Moose::Util qw/find_meta does_role search_class_by_role/; my $meta = find_meta($object) || die "No metaclass found"; if (does_role($object, $role)) { print "The object can do $role!\n"; } my $class = search_class_by_role($object, 'FooRole'); print "Nearest class with 'FooRole' is $class\n"; =head1 DESCRIPTION This module provides a set of utility functions. Many of these functions are intended for use in Moose itself or MooseX modules, but some of them may be useful for use in your own code. =head1 EXPORTED FUNCTIONS =head2 find_meta($class_or_obj) This method takes a class name or object and attempts to find a metaclass for the class, if one exists. It will B create one if it does not yet exist. =head2 is_role($package_or_obj) Returns true if the provided package name or object is a L. =head2 does_role($class_or_obj, $role_or_obj) Returns true if C<$class_or_obj> does the given C<$role_or_obj>. The role can be provided as a name or a L object. The class must already have a metaclass for this to work. If it doesn't, this function simply returns false. =head2 search_class_by_role($class_or_obj, $role_or_obj) Returns the first class in the class's precedence list that does C<$role_or_obj>, if any. The role can be either a name or a L object. The class must already have a metaclass for this to work. =head2 apply_all_roles($applicant, @roles) This function applies one or more roles to the given C<$applicant>. The applicant can be a role name, class name, or object. The C<$applicant> must already have a metaclass object. The list of C<@roles> should a list of names or L objects, each of which can be followed by an optional hash reference of options (C<-excludes> and C<-alias>). =head2 ensure_all_roles($applicant, @roles) This function is similar to C, but only applies roles that C<$applicant> does not already consume. =head2 with_traits($class_name, @role_names) This function creates a new class from C<$class_name> with each of C<@role_names> applied. It returns the name of the new class. =head2 get_all_attribute_values($meta, $instance) Returns a hash reference containing all of the C<$instance>'s attributes. The keys are attribute names. =head2 get_all_init_args($meta, $instance) Returns a hash reference containing all of the C values for the instance's attributes. The values are the associated attribute values. If an attribute does not have a defined C, it is skipped. This could be useful in cloning an object. =head2 resolve_metaclass_alias($category, $name, %options) =head2 resolve_metatrait_alias($category, $name, %options) Resolves a short name to a full class name. Short names are often used when specifying the C or C option for an attribute: has foo => ( metaclass => "Bar", ); The name resolution mechanism is covered in L. =head2 meta_class_alias($to[, $from]) =head2 meta_attribute_alias($to[, $from]) Create an alias from the class C<$from> (or the current package, if C<$from> is unspecified), so that L works properly. =head2 english_list(@items) Given a list of scalars, turns them into a proper list in English ("one and two", "one, two, three, and four"). This is used to help us make nicer error messages. =head2 throw_exception( $class_name, %arguments_to_exception) Calls die with an object of Moose::Exception::$class_name, with %arguments_to_exception passed as arguments. =head1 TODO Here is a list of possible functions to write =over 4 =item discovering original method from modified method =item search for origin class of a method or attribute =back =head1 BUGS See L for details on reporting bugs. =head1 AUTHORS =over 4 =item * Stevan Little =item * Dave Rolsky =item * Jesse Luehrs =item * Shawn M Moore =item * יובל קוג'מן (Yuval Kogman) =item * Karen Etheridge =item * Florian Ragwitz =item * Hans Dieter Pearcey =item * Chris Prather =item * Matt S Trout =back =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2006 by Infinity Interactive, Inc. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Moose-2.2200/lib/Moose/Spec/000770 000766 000024 00000000000 14137574636 015673 5ustar00etherstaff000000 000000 Moose-2.2200/lib/Moose/Meta/000770 000766 000024 00000000000 14137574636 015667 5ustar00etherstaff000000 000000 Moose-2.2200/lib/Moose/Role.pm000640 000766 000024 00000023274 14137574636 016247 0ustar00etherstaff000000 000000 use strict; use warnings; package Moose::Role; our $VERSION = '2.2200'; use Scalar::Util (); use Carp (); use Class::Load 'is_class_loaded'; use Module::Runtime 'module_notional_filename'; use Sub::Exporter; use Moose (); use Moose::Util 'throw_exception'; use Moose::Exporter; use Moose::Meta::Role; use Moose::Util::TypeConstraints; sub extends { throw_exception("RolesDoNotSupportExtends"); } sub with { Moose::Util::apply_all_roles( shift, @_ ); } sub requires { my $meta = shift; throw_exception( MustSpecifyAtleastOneMethod => role_name => $meta->name ) unless @_; $meta->add_required_methods(@_); } sub excludes { my $meta = shift; throw_exception( MustSpecifyAtleastOneRole => role_name => $meta->name ) unless @_; $meta->add_excluded_roles(@_); } sub has { my $meta = shift; my $name = shift; throw_exception( InvalidHasProvidedInARole => role_name => $meta->name, attribute_name => $name, ) if @_ == 1; my %context = Moose::Util::_caller_info; $context{context} = 'has declaration'; $context{type} = 'role'; my %options = ( definition_context => \%context, @_ ); my $attrs = ( ref($name) eq 'ARRAY' ) ? $name : [ ($name) ]; $meta->add_attribute( $_, %options ) for @$attrs; } sub _add_method_modifier { my $type = shift; my $meta = shift; if ( ref($_[0]) eq 'Regexp' ) { throw_exception( RolesDoNotSupportRegexReferencesForMethodModifiers => modifier_type => $type, role_name => $meta->name, ); } Moose::Util::add_method_modifier($meta, $type, \@_); } sub before { _add_method_modifier('before', @_) } sub after { _add_method_modifier('after', @_) } sub around { _add_method_modifier('around', @_) } # see Moose.pm for discussion sub super { return unless $Moose::SUPER_BODY; $Moose::SUPER_BODY->(@Moose::SUPER_ARGS); } sub override { my $meta = shift; my ( $name, $code ) = @_; $meta->add_override_method_modifier( $name, $code ); } sub inner { throw_exception("RolesDoNotSupportInner"); } sub augment { throw_exception("RolesDoNotSupportAugment"); } Moose::Exporter->setup_import_methods( with_meta => [ qw( with requires excludes has before after around override ) ], as_is => [ qw( extends super inner augment ), 'Carp::confess', 'Scalar::Util::blessed', ], ); sub init_meta { shift; my %args = @_; my $role = $args{for_class}; unless ($role) { require Moose; throw_exception( InitMetaRequiresClass => params => \%args ); } my $metaclass = $args{metaclass} || "Moose::Meta::Role"; my $meta_name = exists $args{meta_name} ? $args{meta_name} : 'meta'; throw_exception( MetaclassNotLoaded => class_name => $metaclass ) unless is_class_loaded($metaclass); throw_exception( MetaclassMustBeASubclassOfMooseMetaRole => role_name => $metaclass ) unless $metaclass->isa('Moose::Meta::Role'); # make a subtype for each Moose role role_type $role unless find_type_constraint($role); my $meta; if ( $meta = Class::MOP::get_metaclass_by_name($role) ) { unless ( $meta->isa("Moose::Meta::Role") ) { if ( $meta->isa('Moose::Meta::Class') ) { throw_exception( MetaclassIsAClassNotASubclassOfGivenMetaclass => class_name => $role, metaclass => $metaclass, ); } else { throw_exception( MetaclassIsNotASubclassOfGivenMetaclass => class_name => $role, metaclass => $metaclass, ); } } } else { $meta = $metaclass->initialize($role); my $filename = module_notional_filename($meta->name); $INC{$filename} = '(set by Moose)' unless exists $INC{$filename}; } if (defined $meta_name) { # also check for inherited non moose 'meta' method? my $existing = $meta->get_method($meta_name); if ($existing && !$existing->isa('Class::MOP::Method::Meta')) { Carp::cluck "Moose::Role is overwriting an existing method named " . "$meta_name in role $role with a method " . "which returns the class's metaclass. If this is " . "actually what you want, you should remove the " . "existing method, otherwise, you should rename or " . "disable this generated method using the " . "'-meta_name' option to 'use Moose::Role'."; } $meta->_add_meta_method($meta_name); } return $meta; } 1; # ABSTRACT: The Moose Role __END__ =pod =encoding UTF-8 =head1 NAME Moose::Role - The Moose Role =head1 VERSION version 2.2200 =head1 SYNOPSIS package Eq; use Moose::Role; # automatically turns on strict and warnings requires 'equal'; sub no_equal { my ($self, $other) = @_; !$self->equal($other); } # ... then in your classes package Currency; use Moose; # automatically turns on strict and warnings with 'Eq'; sub equal { my ($self, $other) = @_; $self->as_float == $other->as_float; } # ... and also package Comparator; use Moose; has compare_to => ( is => 'ro', does => 'Eq', handles => 'Eq', ); # ... which allows my $currency1 = Currency->new(...); my $currency2 = Currency->new(...); Comparator->new(compare_to => $currency1)->equal($currency2); =head1 DESCRIPTION The concept of roles is documented in L. This document serves as API documentation. =head1 EXPORTED FUNCTIONS Moose::Role currently supports all of the functions that L exports, but differs slightly in how some items are handled (see L below for details). Moose::Role also offers two role-specific keyword exports: =head2 requires (@method_names) Roles can require that certain methods are implemented by any class which C the role. Note that attribute accessors also count as methods for the purposes of satisfying the requirements of a role. =head2 excludes (@role_names) Roles can C other roles, in effect saying "I can never be combined with these C<@role_names>". This is a feature which should not be used lightly. =head2 no Moose::Role Moose::Role offers a way to remove the keywords it exports, through the C method. You simply have to say C at the bottom of your code for this to work. =head1 METACLASS When you use Moose::Role, you can specify traits which will be applied to your role metaclass: use Moose::Role -traits => 'My::Trait'; This is very similar to the attribute traits feature. When you do this, your class's C object will have the specified traits applied to it. See L for more details. All role metaclasses (note, not the role itself) extend L. You can test if a package is a role or not using L. =head1 APPLYING ROLES In addition to being applied to a class using the 'with' syntax (see L) and using the L 'apply_all_roles' method, roles may also be applied to an instance of a class using L 'apply_all_roles' or the role's metaclass: MyApp::Test::SomeRole->meta->apply( $instance ); Doing this creates a new, mutable, anonymous subclass, applies the role to that, and reblesses. In a debugger, for example, you will see class names of the form C< Moose::Meta::Class::__ANON__::SERIAL::6 >, which means that doing a 'ref' on your instance may not return what you expect. See L for 'DOES'. Additional params may be added to the new instance by providing 'rebless_params'. See L. =head1 CAVEATS Role support has only a few caveats: =over 4 =item * Roles cannot use the C keyword; it will throw an exception for now. The same is true of the C and C keywords (not sure those really make sense for roles). All other Moose keywords will be I so that they can be applied to the consuming class. =item * Role composition does its best to B be order-sensitive when it comes to conflict resolution and requirements detection. However, it is order-sensitive when it comes to method modifiers. All before/around/after modifiers are included whenever a role is composed into a class, and then applied in the order in which the roles are used. This also means that there is no conflict for before/around/after modifiers. In most cases, this will be a non-issue; however, it is something to keep in mind when using method modifiers in a role. You should never assume any ordering. =back =head1 BUGS See L for details on reporting bugs. =head1 AUTHORS =over 4 =item * Stevan Little =item * Dave Rolsky =item * Jesse Luehrs =item * Shawn M Moore =item * יובל קוג'מן (Yuval Kogman) =item * Karen Etheridge =item * Florian Ragwitz =item * Hans Dieter Pearcey =item * Chris Prather =item * Matt S Trout =back =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2006 by Infinity Interactive, Inc. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Moose-2.2200/lib/Moose/Cookbook/000770 000766 000024 00000000000 14137574636 016547 5ustar00etherstaff000000 000000 Moose-2.2200/lib/Moose/Cookbook.pod000644 000766 000024 00000016536 14137574636 017271 0ustar00etherstaff000000 000000 # PODNAME: Moose::Cookbook # ABSTRACT: How to cook a Moose __END__ =pod =encoding UTF-8 =head1 NAME Moose::Cookbook - How to cook a Moose =head1 VERSION version 2.2200 =head1 DESCRIPTION The Moose cookbook is a series of recipes showing various Moose features. Most recipes present some code demonstrating some feature, and then explain the details of the code. You should probably read the L first. The manual explains Moose concepts without being too code-heavy. =head1 RECIPES =head2 Basic Moose These recipes will give you a good overview of Moose's capabilities, starting with simple attribute declaration, and moving on to more powerful features like laziness, types, type coercion, method modifiers, and more. =over 4 =item L A simple Moose-based class. Demonstrates basic Moose attributes and subclassing. =item L A slightly more complex Moose class. Demonstrates using a method modifier in a subclass. =item L Demonstrates several attribute features, including types, weak references, predicates ("does this object have a foo?"), defaults, laziness, and triggers. =item L Introduces the creation and use of custom types, a C method, and the use of C in a subclass. This recipe also shows how to model a set of classes that could be used to model companies, people, employees, etc. =item L This recipe covers more subtype creation, including the use of type coercions. =item L Making a class immutable greatly increases the speed of accessors and object construction. =item L - Builder methods and lazy_build The builder feature provides an inheritable and role-composable way to provide a default attribute value. =item L Demonstrates using operator overloading, coercion, and subtypes to model how eye color is determined during reproduction. =item L This recipe demonstrates the use of C and C to hook into object construction. =item L In this recipe, we make a Moose-based subclass of L, a module which does not use Moose itself. =item L Demonstrates the use of C method modifiers, a way of turning the usual method overriding style "inside-out". =back =head2 Moose Roles These recipes will show you how to use Moose roles. =over 4 =item L Demonstrates roles, which are also sometimes known as traits or mix-ins. Roles provide a method of code re-use which is orthogonal to subclassing. =item L Sometimes you just want to include part of a role in your class. Sometimes you want the whole role but one of its methods conflicts with one in your class. With method exclusion and aliasing, you can work around these problems. =item L In this recipe, we apply a role to an existing object instance. =back =head2 Meta Moose These recipes show you how to write your own meta classes, which lets you extend the object system provided by Moose. =over 4 =item L If you're wondering what all this "meta" stuff is, and why you should care about it, read this "recipe". =item L Extending Moose's attribute metaclass is a great way to add functionality. However, attributes can only have one metaclass. Applying roles to the attribute metaclass lets you provide composable attribute functionality. =item L This recipe takes the class metaclass we saw in the previous recipe and reimplements it as a metaclass trait. =item L This recipe shows a custom method metaclass that implements making a method private. =item L This recipe shows an example of how you create your own meta-instance class. The meta-instance determines the internal structure of object instances and provide access to attribute slots. In this particular instance, we use a blessed glob reference as the instance instead of a blessed hash reference. =item Hooking into immutabilization (TODO) Moose has a feature known as "immutabilization". By calling C<< __PACKAGE__->meta()->make_immutable() >> after defining your class (attributes, roles, etc), you tell Moose to optimize things like object creation, attribute access, and so on. If you are creating your own metaclasses, you may need to hook into the immutabilization system. This cuts across a number of spots, including the metaclass class, meta method classes, and possibly the meta-instance class as well. This recipe shows you how to write extensions which immutabilize properly. =back =head2 Extending Moose These recipes cover some more ways to extend Moose, and will be useful if you plan to write your own C module. =over 4 =item L There are quite a few ways to extend Moose. This recipe provides an overview of each method, and provides recommendations for when each is appropriate. =item L Many base object class extensions can be implemented as roles. This example shows how to provide a base object class debugging role that is applied to any class that uses a notional C module. =item L This recipe shows how to provide a replacement for C. You may want to do this as part of the API for a C module, especially if you want to default to a new metaclass class or base object class. =back =head1 SNACKS =over 4 =item L =item L =back =head1 Legacy Recipes These cover topics that are no longer considered best practice. We've kept them in case in you encounter these usages in the wild. =over 4 =item L =item L =item L =back =head1 SEE ALSO =over 4 =item L =back =head1 AUTHORS =over 4 =item * Stevan Little =item * Dave Rolsky =item * Jesse Luehrs =item * Shawn M Moore =item * יובל קוג'מן (Yuval Kogman) =item * Karen Etheridge =item * Florian Ragwitz =item * Hans Dieter Pearcey =item * Chris Prather =item * Matt S Trout =back =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2006 by Infinity Interactive, Inc. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Moose-2.2200/lib/Moose/Manual/000770 000766 000024 00000000000 14137574636 016216 5ustar00etherstaff000000 000000 Moose-2.2200/lib/Moose/Conflicts.pm000644 000766 000024 00000007140 14137574636 017270 0ustar00etherstaff000000 000000 package # hide from PAUSE Moose::Conflicts; use strict; use warnings; # this module was generated with Dist::Zilla::Plugin::Conflicts 0.19 use Dist::CheckConflicts -dist => 'Moose', -conflicts => { 'Catalyst' => '5.90049999', 'Config::MVP' => '2.200004', 'Devel::REPL' => '1.003020', 'Dist::Zilla' => '5.043', 'Dist::Zilla::Plugin::Git' => '2.016', 'Fey' => '0.36', 'Fey::ORM' => '0.42', 'File::ChangeNotify' => '0.15', 'HTTP::Throwable' => '0.017', 'KiokuDB' => '0.51', 'Markdent' => '0.16', 'Mason' => '2.18', 'Moose::Autobox' => '0.15', 'MooseX::ABC' => '0.05', 'MooseX::Aliases' => '0.08', 'MooseX::AlwaysCoerce' => '0.13', 'MooseX::App' => '1.22', 'MooseX::Attribute::Deflator' => '2.1.7', 'MooseX::Attribute::Dependent' => '1.1.3', 'MooseX::Attribute::Prototype' => '0.10', 'MooseX::AttributeHelpers' => '0.22', 'MooseX::AttributeIndexes' => '1.0.0', 'MooseX::AttributeInflate' => '0.02', 'MooseX::CascadeClearing' => '0.03', 'MooseX::ClassAttribute' => '0.26', 'MooseX::Constructor::AllErrors' => '0.021', 'MooseX::Declare' => '0.35', 'MooseX::FollowPBP' => '0.02', 'MooseX::Getopt' => '0.56', 'MooseX::InstanceTracking' => '0.04', 'MooseX::LazyRequire' => '0.06', 'MooseX::Meta::Attribute::Index' => '0.04', 'MooseX::Meta::Attribute::Lvalue' => '0.05', 'MooseX::Method::Signatures' => '0.44', 'MooseX::MethodAttributes' => '0.22', 'MooseX::NonMoose' => '0.24', 'MooseX::Object::Pluggable' => '0.0011', 'MooseX::POE' => '0.214', 'MooseX::Params::Validate' => '0.05', 'MooseX::PrivateSetters' => '0.03', 'MooseX::Role::Cmd' => '0.06', 'MooseX::Role::Parameterized' => '1.00', 'MooseX::Role::WithOverloading' => '0.14', 'MooseX::Runnable' => '0.03', 'MooseX::Scaffold' => '0.05', 'MooseX::SemiAffordanceAccessor' => '0.05', 'MooseX::SetOnce' => '0.100473', 'MooseX::Singleton' => '0.25', 'MooseX::SlurpyConstructor' => '1.1', 'MooseX::Storage' => '0.42', 'MooseX::StrictConstructor' => '0.12', 'MooseX::Traits' => '0.11', 'MooseX::Types' => '0.19', 'MooseX::Types::Parameterizable' => '0.05', 'MooseX::Types::Set::Object' => '0.03', 'MooseX::Types::Signal' => '1.101930', 'MooseX::UndefTolerant' => '0.11', 'Net::Twitter' => '4.01041', 'PRANG' => '0.14', 'Pod::Elemental' => '0.093280', 'Pod::Weaver' => '3.101638', 'Reaction' => '0.002003', 'Test::Able' => '0.10', 'Test::CleanNamespaces' => '0.03', 'Test::Moose::More' => '0.022', 'Test::TempDir' => '0.05', 'Throwable' => '0.102080', 'namespace::autoclean' => '0.08', }, -also => [ qw( Carp Class::Load Class::Load::XS Data::OptList Devel::GlobalDestruction Devel::OverloadInfo Devel::StackTrace Dist::CheckConflicts Eval::Closure List::Util MRO::Compat Module::Runtime Module::Runtime::Conflicts Package::DeprecationManager Package::Stash Package::Stash::XS Params::Util Scalar::Util Sub::Exporter Sub::Name Sub::Util Try::Tiny parent strict warnings ) ], ; 1; # ABSTRACT: Provide information on conflicts for Moose # Dist::Zilla: -PodWeaver Moose-2.2200/lib/Moose/Unsweetened.pod000644 000766 000024 00000002212 14137574636 017773 0ustar00etherstaff000000 000000 # PODNAME: Moose::Unsweetened # ABSTRACT: Moved to Moose::Manual::Unsweetened, so go read that __END__ =pod =encoding UTF-8 =head1 NAME Moose::Unsweetened - Moved to Moose::Manual::Unsweetened, so go read that =head1 VERSION version 2.2200 =head1 DESCRIPTION This document has been moved to L. This POD document still exists for the benefit of anyone out there who might've linked to it in the past. =head1 AUTHORS =over 4 =item * Stevan Little =item * Dave Rolsky =item * Jesse Luehrs =item * Shawn M Moore =item * יובל קוג'מן (Yuval Kogman) =item * Karen Etheridge =item * Florian Ragwitz =item * Hans Dieter Pearcey =item * Chris Prather =item * Matt S Trout =back =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2006 by Infinity Interactive, Inc. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Moose-2.2200/lib/Moose/Manual.pod000644 000766 000024 00000020600 14137574636 016723 0ustar00etherstaff000000 000000 # PODNAME: Moose::Manual # ABSTRACT: What is Moose, and how do I use it? __END__ =pod =encoding UTF-8 =head1 NAME Moose::Manual - What is Moose, and how do I use it? =head1 VERSION version 2.2200 =head1 WHAT IS MOOSE? Moose is a I object system for Perl 5. Consider any modern object-oriented language (which Perl 5 definitely isn't). It provides keywords for attribute declaration, object construction, inheritance, and maybe more. These keywords are part of the language, and you don't care how they are implemented. Moose aims to do the same thing for Perl 5 OO. We can't actually create new keywords, but we do offer "sugar" that looks a lot like them. More importantly, with Moose, you I, without needing to know about blessed hashrefs, accessor methods, and so on. With Moose, you can concentrate on the I structure of your classes, focusing on "what" rather than "how". A class definition with Moose reads like a list of very concise English sentences. Moose is built on top of C, a meta-object protocol (aka MOP). Using the MOP, Moose provides complete introspection for all Moose-using classes. This means you can ask classes about their attributes, parents, children, methods, etc., all using a well-defined API. The MOP abstracts away the symbol table, looking at C<@ISA> vars, and all the other crufty Perl tricks we know and love(?). Moose is based in large part on the Perl 6 object system, as well as drawing on the best ideas from CLOS, Smalltalk, and many other languages. =head1 WHY MOOSE? Moose makes Perl 5 OO both simpler and more powerful. It encapsulates Perl 5 power tools in high-level declarative APIs which are easy to use. Best of all, you don't need to be a wizard to use it. But if you want to dig about in the guts, Moose lets you do that too, by using and extending its powerful introspection API. =head1 AN EXAMPLE package Person; use Moose; has 'first_name' => ( is => 'rw', isa => 'Str', ); has 'last_name' => ( is => 'rw', isa => 'Str', ); no Moose; __PACKAGE__->meta->make_immutable; This is a I class definition! package User; use DateTime; use Moose; extends 'Person'; has 'password' => ( is => 'rw', isa => 'Str', ); has 'last_login' => ( is => 'rw', isa => 'DateTime', handles => { 'date_of_last_login' => 'date' }, ); sub login { my $self = shift; my $pw = shift; return 0 if $pw ne $self->password; $self->last_login( DateTime->now() ); return 1; } no Moose; __PACKAGE__->meta->make_immutable; When ready to instantiate your class in an application, use it in the "traditional" Perl manner: use User; my $user = User->new( first_name => 'Example', last_name => 'User', password => 'letmein', ); $user->login('letmein'); say $user->date_of_last_login; We'll leave the line-by-line explanation of this code to other documentation, but you can see how Moose reduces common OO idioms to simple declarative constructs. =head1 TABLE OF CONTENTS This manual consists of a number of documents. =over 4 =item L Introduces Moose concepts, and contrasts them against "old school" Perl 5 OO. =item L Shows two example classes, each written first with Moose and then with "plain old Perl 5". =item L How do you make use of Moose in your classes? Now that I'm a Moose, how do I subclass something? =item L Attributes are a core part of the Moose OO system. An attribute is a piece of data that an object has. Moose has a lot of attribute-related features! =item L Delegation is a powerful way to make use of attributes which are themselves objects. =item L Learn how objects are built in Moose, and in particular about the C and C methods. Also covers object destruction with C. =item L A method modifier lets you say "before calling method X, do this first", or "wrap method X in this code". Method modifiers are particularly handy in roles and with attribute accessors. =item L A role is something a class does (like "Debuggable" or "Printable"). Roles provide a way of adding behavior to classes that is orthogonal to inheritance. =item L Moose's type system lets you strictly define what values an attribute can contain. =item L Moose's meta API system lets you ask classes about their parents, children, methods, attributes, etc. =item L This document describes a few of the most useful Moose extensions on CPAN. =item L Moose has a lot of features, and there's definitely more than one way to do it. However, we think that picking a subset of these features and using them consistently makes everyone's life easier. =item L Frequently asked questions about Moose. =item L Links to various tutorials, videos, blogs, presentations, interviews, etc... =item L Interested in hacking on Moose? Read this. =item L This document details backwards-incompatibilities and other major changes to Moose. =back =head1 JUSTIFICATION If you're still asking yourself "Why do I need this?", then this section is for you. =over 4 =item Another object system!?!? Yes, we know there are many, many ways to build objects in Perl 5, many of them based on inside-out objects and other such things. Moose is different because it is not a new object system for Perl 5, but instead an extension of the existing object system. Moose is built on top of L, which is a metaclass system for Perl 5. This means that Moose not only makes building normal Perl 5 objects better, but it also provides the power of metaclass programming. =item Is this for real? Or is this just an experiment? Moose is I on the prototypes and experiments Stevan did for the Perl 6 meta-model. However, Moose is B an experiment or prototype; it is for B. =item Is this ready for use in production? Yes. Moose has been used successfully in production environments by many people and companies. There are Moose applications which have been in production with little or no issue now for years. We consider it highly stable and we are committed to keeping it stable. Of course, in the end, you need to make this call yourself. If you have any questions or concerns, please feel free to email Stevan or the moose@perl.org list, or just stop by irc.perl.org#moose and ask away. =item Is Moose just Perl 6 in Perl 5? No. While Moose is very much inspired by Perl 6, it is not itself Perl 6. Instead, it is an OO system for Perl 5. Stevan built Moose because he was tired of writing the same old boring Perl 5 OO code, and drooling over Perl 6 OO. So instead of switching to Ruby, he wrote Moose :) =item Wait, I modern, I thought it was just I? Stevan read Larry Wall's talk from the 1999 Linux World entitled "Perl, the first postmodern computer language" in which he talks about how he picked the features for Perl because he thought they were cool and he threw out the ones that he thought sucked. This got him thinking about how we have done the same thing in Moose. For Moose, we have "borrowed" features from Perl 6, CLOS (LISP), Smalltalk, Java, BETA, OCaml, Ruby and more, and the bits we didn't like (cause they sucked) we tossed aside. So for this reason (and a few others) Stevan has re-dubbed Moose a I object system. Nuff Said. =back =head1 AUTHORS =over 4 =item * Stevan Little =item * Dave Rolsky =item * Jesse Luehrs =item * Shawn M Moore =item * יובל קוג'מן (Yuval Kogman) =item * Karen Etheridge =item * Florian Ragwitz =item * Hans Dieter Pearcey =item * Chris Prather =item * Matt S Trout =back =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2006 by Infinity Interactive, Inc. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Moose-2.2200/lib/Moose/Exception/000770 000766 000024 00000000000 14137574636 016737 5ustar00etherstaff000000 000000 Moose-2.2200/lib/Moose/Exception/MustSpecifyAtleastOneRole.pm000640 000766 000024 00000000400 14137574636 024343 0ustar00etherstaff000000 000000 package Moose::Exception::MustSpecifyAtleastOneRole; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Role'; sub _build_message { "Must specify at least one role"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/InstanceMustBeABlessedReference.pm000640 000766 000024 00000000711 14137574636 025401 0ustar00etherstaff000000 000000 package Moose::Exception::InstanceMustBeABlessedReference; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::ParamsHash', 'Moose::Exception::Role::Class'; has 'instance' => ( is => 'ro', isa => 'Any', required => 1 ); sub _build_message { my $self = shift; "The __INSTANCE__ parameter must be a blessed reference, not ". $self->instance; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/MetaclassIsNotASubclassOfGivenMetaclass.pm000640 000766 000024 00000001017 14137574636 027100 0ustar00etherstaff000000 000000 package Moose::Exception::MetaclassIsNotASubclassOfGivenMetaclass; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Class'; use Moose::Util 'find_meta'; has 'metaclass' => ( is => 'ro', isa => 'Str', required => 1 ); sub _build_message { my $self = shift; my $class = find_meta( $self->class_name ); $self->class_name." already has a metaclass, but it does not inherit ".$self->metaclass." ($class)."; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/CannotOverrideBodyOfMetaMethods.pm000640 000766 000024 00000000564 14137574636 025461 0ustar00etherstaff000000 000000 package Moose::Exception::CannotOverrideBodyOfMetaMethods; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::ParamsHash'; has 'class' => ( is => 'ro', isa => 'Str', required => 1 ); sub _build_message { "Overriding the body of meta methods is not allowed"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/InvalidBaseTypeGivenToCreateParameterizedTypeConstraint.pm000640 000766 000024 00000000525 14137574636 032365 0ustar00etherstaff000000 000000 package Moose::Exception::InvalidBaseTypeGivenToCreateParameterizedTypeConstraint; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::TypeConstraint'; sub _build_message { my $self = shift; "Could not locate the base type (".$self->type_name.")"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/MetaclassNotLoaded.pm000640 000766 000024 00000000532 14137574636 023002 0ustar00etherstaff000000 000000 package Moose::Exception::MetaclassNotLoaded; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Class'; sub _build_message { my $self = shift; "The Metaclass ".$self->class_name." must be loaded. (Perhaps you forgot to 'use ".$self->class_name."'?)"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/RequiredMethodsImportedByClass.pm000640 000766 000024 00000002604 14137574636 025367 0ustar00etherstaff000000 000000 package Moose::Exception::RequiredMethodsImportedByClass; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Class', 'Moose::Exception::Role::Role'; has 'missing_methods' => ( traits => ['Array'], is => 'ro', isa => 'ArrayRef[Moose::Meta::Role::Method::Required]', handles => { method_count => 'count', get_method_at => 'get', get_all_methods => 'elements', }, required => 1 ); has 'imported_method' => ( is => 'ro', isa => 'Moose::Meta::Role::Method::Required', required => 1 ); sub _build_message { my $self = shift; my $noun = $self->method_count == 1 ? 'method' : 'methods'; my $list = Moose::Util::english_list( map { q{'} . $_ . q{'} } $self->get_all_methods ); my ($class, $role, $method) = ($self->class_name, $self->role_name, $self->imported_method); my ($class_quoted, $role_quoted) = ("'".$class."'","'".$role."'"); "$role_quoted requires the $noun $list " . "to be implemented by $class_quoted. " . "If you imported functions intending to use them as " . "methods, you need to explicitly mark them as such, via " . "$class->meta->add_method($method" . " => \\&$method)"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/MetaclassMustBeASubclassOfMooseMetaClass.pm000640 000766 000024 00000000524 14137574636 027217 0ustar00etherstaff000000 000000 package Moose::Exception::MetaclassMustBeASubclassOfMooseMetaClass; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Class'; sub _build_message { my $self = shift; "The Metaclass ".$self->class_name." must be a subclass of Moose::Meta::Class." } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/DelegationToARoleWhichIsNotLoaded.pm000640 000766 000024 00000000724 14137574636 025651 0ustar00etherstaff000000 000000 package Moose::Exception::DelegationToARoleWhichIsNotLoaded; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Attribute'; has 'role_name' => ( is => 'ro', isa => 'Str', required => 1, ); sub _build_message { my $self = shift; "The ".$self->attribute->name." attribute is trying to delegate to a role which has not been loaded - ".$self->role_name; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/CannotAssignValueToReadOnlyAccessor.pm000640 000766 000024 00000000676 14137574636 026315 0ustar00etherstaff000000 000000 package Moose::Exception::CannotAssignValueToReadOnlyAccessor; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Class', 'Moose::Exception::Role::EitherAttributeOrAttributeName'; has 'value' => ( is => 'ro', isa => 'Any', required => 1 ); sub _build_message { my $self = shift; "Cannot assign a value to a read-only accessor"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/AttributeExtensionIsNotSupportedInRoles.pm000640 000766 000024 00000000563 14137574636 027317 0ustar00etherstaff000000 000000 package Moose::Exception::AttributeExtensionIsNotSupportedInRoles; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Role'; has 'attribute_name' => ( is => 'ro', isa => 'Str', required => 1, ); sub _build_message { "has '+attr' is not supported in roles"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/UndefinedHashKeysPassedToMethod.pm000640 000766 000024 00000000720 14137574636 025440 0ustar00etherstaff000000 000000 package Moose::Exception::UndefinedHashKeysPassedToMethod; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; has 'hash_keys' => ( is => 'ro', isa => 'ArrayRef', required => 1 ); has 'method_name' => ( is => 'ro', isa => 'Str', required => 1 ); sub _build_message { my $self = shift; "Hash keys passed to ".$self->method_name." must be defined"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/LazyAttributeNeedsADefault.pm000640 000766 000024 00000000571 14137574636 024467 0ustar00etherstaff000000 000000 package Moose::Exception::LazyAttributeNeedsADefault; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::EitherAttributeOrAttributeName'; sub _build_message { my $self = shift; "You cannot have a lazy attribute (".$self->attribute_name.") without specifying a default value for it"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/OverrideConflictInComposition.pm000640 000766 000024 00000002113 14137574636 025245 0ustar00etherstaff000000 000000 package Moose::Exception::OverrideConflictInComposition; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Role'; has 'role_being_applied_name' => ( is => 'ro', isa => 'Str', required => 1 ); has 'method_name' => ( is => 'ro', isa => 'Str', required => 1 ); has 'two_overrides_found' => ( is => 'ro', isa => 'Bool', required => 1, default => 0 ); sub _build_message { my $self = shift; if( $self->two_overrides_found ) { return "Role '" . $self->role_being_applied_name . "' has encountered an 'override' method conflict " . "during composition (Two 'override' methods of the same name encountered). " . "This is a fatal error."; } else { return "Role '".$self->role_being_applied_name."' has encountered an 'override' method conflict ". "during composition (A local method of the same name as been found). ". "This is a fatal error."; } } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/WrapTakesACodeRefToBless.pm000640 000766 000024 00000001004 14137574636 024015 0ustar00etherstaff000000 000000 package Moose::Exception::WrapTakesACodeRefToBless; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::ParamsHash'; has 'code' => ( is => 'ro', isa => 'Any', required => 1 ); has 'class' => ( is => 'ro', isa => 'Str', required => 1 ); sub _build_message { my $self = shift; "You must supply a CODE reference to bless, not (" . ( $self->code ? $self->code : 'undef' ) . ")"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/MustPassAHashOfOptions.pm000640 000766 000024 00000000530 14137574636 023617 0ustar00etherstaff000000 000000 package Moose::Exception::MustPassAHashOfOptions; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::ParamsHash'; has 'class' => ( is => 'ro', isa => 'Str', required => 1 ); sub _build_message { "You must pass a hash of options"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/CannotRegisterUnnamedTypeConstraint.pm000640 000766 000024 00000000360 14137574636 026441 0ustar00etherstaff000000 000000 package Moose::Exception::CannotRegisterUnnamedTypeConstraint; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; sub _build_message { "can't register an unnamed type constraint"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/AttributeIsRequired.pm000640 000766 000024 00000002057 14137574636 023240 0ustar00etherstaff000000 000000 package Moose::Exception::AttributeIsRequired; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Class'; has 'attribute_name' => ( is => 'ro', isa => 'Str', required => 1, documentation => "This attribute can be used for fetching attribute instance:\n". " my \$class = Moose::Util::find_meta( \$exception->class_name );\n". " my \$attribute = \$class->get_attribute( \$exception->attribute_name );\n", ); has 'attribute_init_arg' => ( is => 'ro', isa => 'Str', ); has 'params' => ( is => 'ro', isa => 'HashRef', predicate => 'has_params', ); sub _build_message { my $self = shift; my $name = $self->attribute_name; my $msg = "Attribute ($name)"; my $init_arg = $self->attribute_init_arg; if ( defined $init_arg && $name ne $init_arg ) { $msg .= ", passed as ($init_arg),"; } $msg .= ' is required'; return $msg; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/CannotInlineTypeConstraintCheck.pm000640 000766 000024 00000000505 14137574636 025522 0ustar00etherstaff000000 000000 package Moose::Exception::CannotInlineTypeConstraintCheck; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::TypeConstraint'; sub _build_message { my $self = shift; 'Cannot inline a type constraint check for ' . $self->type_name; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/MustDefineAMethodName.pm000640 000766 000024 00000000377 14137574636 023411 0ustar00etherstaff000000 000000 package Moose::Exception::MustDefineAMethodName; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Instance'; sub _build_message { "You must define a method name"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/TypeConstraintIsAlreadyCreated.pm000640 000766 000024 00000001472 14137574636 025354 0ustar00etherstaff000000 000000 package Moose::Exception::TypeConstraintIsAlreadyCreated; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::TypeConstraint'; use Moose::Util::TypeConstraints 'find_type_constraint'; has 'package_defined_in' => ( is => 'ro', isa => 'Str', required => 1, ); sub _build_message { my $self = shift; my $type_name = $self->type_name; my $type = find_type_constraint( $type_name ); my $type_package_defined_in = $type->_package_defined_in; my $package_defined_in = $self->package_defined_in; return "The type constraint '$type_name' has already been created in $type_package_defined_in and cannot be created again in $package_defined_in"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/AutoDeRefNeedsArrayRefOrHashRef.pm000640 000766 000024 00000000577 14137574636 025300 0ustar00etherstaff000000 000000 package Moose::Exception::AutoDeRefNeedsArrayRefOrHashRef; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::InvalidAttributeOptions'; sub _build_message { my $self = shift; "You cannot auto-dereference anything other than a ArrayRef or HashRef on attribute (".$self->attribute_name.")"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/CannotOverrideNoSuperMethod.pm000640 000766 000024 00000000771 14137574636 024700 0ustar00etherstaff000000 000000 package Moose::Exception::CannotOverrideNoSuperMethod; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::ParamsHash'; has 'method_name' => ( is => 'ro', isa => 'Str', required => 1 ); has 'class' => ( is => 'ro', isa => 'Str', required => 1 ); sub _build_message { my $self = shift; "You cannot override '".$self->method_name."' because it has no super method"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/MethodExpectedAMetaclassObject.pm000640 000766 000024 00000000656 14137574636 025272 0ustar00etherstaff000000 000000 package Moose::Exception::MethodExpectedAMetaclassObject; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; has 'class' => ( is => 'ro', isa => 'Str', required => 1 ); has 'metaclass' => ( is => 'ro', isa => 'Any', required => 1 ); sub _build_message { "The is_needed method expected a metaclass object as its arugment"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/AttributeValueIsNotDefined.pm000640 000766 000024 00000001060 14137574636 024465 0ustar00etherstaff000000 000000 package Moose::Exception::AttributeValueIsNotDefined; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Instance', 'Moose::Exception::Role::Attribute'; has 'method' => ( is => 'ro', isa => 'Moose::Meta::Method::Delegation', required => 1, ); sub _build_message { my $self = shift; "Cannot delegate ".$self->method->name." to " .$self->method->delegate_to_method." because the value of " . $self->attribute->name . " is not defined"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/CannotOverrideALocalMethod.pm000640 000766 000024 00000000712 14137574636 024433 0ustar00etherstaff000000 000000 package Moose::Exception::CannotOverrideALocalMethod; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Role'; has 'method_name' => ( is => 'ro', isa => 'Str', required => 1, ); sub _build_message { my $self = shift; "Cannot add an override of method '".$self->method_name."' because there is a local version of '".$self->method_name."'"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/RolesDoNotSupportAugment.pm000640 000766 000024 00000000332 14137574636 024240 0ustar00etherstaff000000 000000 package Moose::Exception::RolesDoNotSupportAugment; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; sub _build_message { "Roles cannot support 'augment'"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/ParameterIsNotSubtypeOfParent.pm000640 000766 000024 00000001162 14137574636 025204 0ustar00etherstaff000000 000000 package Moose::Exception::ParameterIsNotSubtypeOfParent; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::TypeConstraint'; use Moose::Util::TypeConstraints qw/find_type_constraint/; has 'type_parameter' => ( is => 'ro', isa => 'Str', required => 1 ); sub _build_message { my $self = shift; my $type_parameter = $self->type_parameter; my $type = find_type_constraint( $self->type_name ); my $parent = $type->parent->type_parameter; return "$type_parameter is not a subtype of $parent"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/CreateTakesHashRefOfMethods.pm000640 000766 000024 00000000420 14137574636 024535 0ustar00etherstaff000000 000000 package Moose::Exception::CreateTakesHashRefOfMethods; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::RoleForCreate'; sub _build_message { "You must pass a HASH ref of methods"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/Role/000770 000766 000024 00000000000 14137574636 017640 5ustar00etherstaff000000 000000 Moose-2.2200/lib/Moose/Exception/OverloadRequiresAMetaMethod.pm000640 000766 000024 00000000506 14137574636 024641 0ustar00etherstaff000000 000000 package Moose::Exception::OverloadRequiresAMetaMethod; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; sub _build_message { my $self = shift; 'If you provide a method parameter to the Moose::Meta::Overload constructor it must be a Class::MOP::Method object'; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/MOPAttributeNewNeedsAttributeName.pm000640 000766 000024 00000000555 14137574636 025736 0ustar00etherstaff000000 000000 package Moose::Exception::MOPAttributeNewNeedsAttributeName; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::ParamsHash'; has 'class' => ( is => 'ro', isa => 'Str', required => 1 ); sub _build_message { "You must provide a name for the attribute"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/InvalidArgPassedToMooseUtilMetaRole.pm000640 000766 000024 00000002225 14137574636 026252 0ustar00etherstaff000000 000000 package Moose::Exception::InvalidArgPassedToMooseUtilMetaRole; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; has 'argument' => ( is => 'ro', isa => 'Any', required => 1 ); sub _build_message { my $self = shift; my $error = 'When using Moose::Util::MetaRole, you must pass a Moose class name,' . ' role name, metaclass object, or metarole object.'; my $arg = $self->argument; my $found = blessed $arg ? $arg : Class::MOP::class_of($arg); my $error2; if ( defined $found && blessed $found ) { $error2 = " You passed ".$arg.", and we resolved this to a " . ( blessed $found ) . ' object.'; } elsif ( !defined $found ) { $error2 = " You passed ".( defined $arg ? $arg : "undef" ).", and this did not resolve to a metaclass or metarole." . ' Maybe you need to call Moose->init_meta to initialize the metaclass first?'; } else { $error2 = " You passed an undef." . ' Maybe you need to call Moose->init_meta to initialize the metaclass first?'; } $error.$error2; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/ValidationFailedForInlineTypeConstraint.pm000640 000766 000024 00000001750 14137574636 027213 0ustar00etherstaff000000 000000 package Moose::Exception::ValidationFailedForInlineTypeConstraint; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Class'; has 'type_constraint_message' => ( is => 'ro', isa => 'Str', required => 1 ); has 'attribute_name' => ( is => 'ro', isa => 'Str', required => 1 ); has 'value' => ( is => 'ro', isa => 'Any', required => 1 ); has 'new_member' => ( is => 'ro', isa => 'Bool', default => 0, predicate => 'is_a_new_member' ); sub _build_message { my $self = shift; my $line1; if( $self->new_member ) { $line1 = "A new member value for ".$self->attribute_name." does not pass its type constraint because: " } else { $line1 = "Attribute (".$self->attribute_name.") does not pass the type constraint because: "; } return $line1 . $self->type_constraint_message; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/CouldNotCreateWriter.pm000640 000766 000024 00000001044 14137574636 023343 0ustar00etherstaff000000 000000 package Moose::Exception::CouldNotCreateWriter; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::EitherAttributeOrAttributeName', 'Moose::Exception::Role::Instance'; has 'error' => ( is => 'ro', isa => 'Str', required => 1 ); sub _build_message { my $self = shift; my $error = $self->error; my $attribute_name = $self->attribute_name; return "Could not create writer for '$attribute_name' " . "because $error"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/ApplyTakesABlessedInstance.pm000640 000766 000024 00000000534 14137574636 024443 0ustar00etherstaff000000 000000 package Moose::Exception::ApplyTakesABlessedInstance; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Role'; has 'param' => ( is => 'ro', isa => 'Any', required => 1, ); sub _build_message { "You must pass in an blessed instance"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/CannotAugmentIfLocalMethodPresent.pm000640 000766 000024 00000000516 14137574636 025775 0ustar00etherstaff000000 000000 package Moose::Exception::CannotAugmentIfLocalMethodPresent; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Class', 'Moose::Exception::Role::Method'; sub _build_message { "Cannot add an augment method if a local method is already present"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/CouldNotCreateMethod.pm000640 000766 000024 00000001160 14137574636 023306 0ustar00etherstaff000000 000000 package Moose::Exception::CouldNotCreateMethod; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Attribute'; has 'option_name' => ( is => 'ro', isa => 'Str', required => 1 ); has 'option_value' => ( is => 'ro', isa => 'Any', required => 1 ); has 'error' => ( is => 'ro', isa => 'Str', required => 1 ); sub _build_message { my $self = shift; "Could not create the '".$self->option_name."' method for " . $self->attribute->name . " because : ".$self->error; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/DelegationToATypeWhichIsNotAClass.pm000640 000766 000024 00000000631 14137574636 025644 0ustar00etherstaff000000 000000 package Moose::Exception::DelegationToATypeWhichIsNotAClass; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Attribute'; sub _build_message { my $self = shift; "The ".$self->attribute->name." attribute is trying to delegate to a type (".$self->attribute->type_constraint->name.") that is not backed by a class"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/CannotLocatePackageInINC.pm000640 000766 000024 00000001377 14137574636 023753 0ustar00etherstaff000000 000000 package Moose::Exception::CannotLocatePackageInINC; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::ParamsHash'; has 'INC' => ( is => 'ro', isa => 'ArrayRef', required => 1 ); has 'possible_packages' => ( is => 'ro', isa => 'Str', required => 1 ); has 'metaclass_name' => ( is => 'ro', isa => 'Str', required => 1 ); has 'type' => ( is => 'ro', isa => 'Str', required => 1, ); sub _build_message { my $self = shift; my $possible_packages = $self->possible_packages; my @inc = @{$self->INC}; return "Can't locate $possible_packages in \@INC (\@INC contains: @INC)." } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/CanOnlyWrapBlessedCode.pm000640 000766 000024 00000000646 14137574636 023574 0ustar00etherstaff000000 000000 package Moose::Exception::CanOnlyWrapBlessedCode; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::ParamsHash'; has 'class' => ( is => 'ro', isa => 'Str', required => 1 ); has 'code' => ( is => 'ro', isa => 'Any', required => 1 ); sub _build_message { "Can only wrap blessed CODE"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/Legacy.pm000640 000766 000024 00000000212 14137574636 020473 0ustar00etherstaff000000 000000 package Moose::Exception::Legacy; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/OverloadConflictInSummation.pm000640 000766 000024 00000003001 14137574636 024707 0ustar00etherstaff000000 000000 package Moose::Exception::OverloadConflictInSummation; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; use Moose::Util 'find_meta'; has 'role_application' => ( is => 'ro', isa => 'Moose::Meta::Role::Application::RoleSummation', required => 1 ); has 'role_names' => ( traits => ['Array'], is => 'bare', isa => 'ArrayRef[Str]', handles => { role_names => 'elements', }, required => 1, documentation => "This attribute is an ArrayRef containing role names, if you want metaobjects\n" . "associated with these role names, then call method roles on the exception object.\n", ); has 'overloaded_op' => ( is => 'ro', isa => 'Str', required => 1, ); sub roles { my $self = shift; my @role_names = $self->role_names; my @roles = map { find_meta($_) } @role_names; return @roles; } sub _build_message { my $self = shift; my @roles = $self->role_names; my $role_names = join "|", @roles; my $op = $self->overloaded_op; if ( $op eq 'fallback' ) { return 'We have encountered an overloading conflict for the fallback ' . 'during composition. This is a fatal error.'; } else { return "Role '$role_names' has encountered an overloading conflict " . "during composition. The two roles both overload the '$op' operator. " . 'This is a fatal error.'; } } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/CouldNotLocateTypeConstraintForUnion.pm000640 000766 000024 00000000522 14137574636 026541 0ustar00etherstaff000000 000000 package Moose::Exception::CouldNotLocateTypeConstraintForUnion; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::TypeConstraint'; sub _build_message { my $self = shift; "Could not locate type constraint (".$self->type_name.") for the union"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/MustSpecifyAtleastOneRoleToApplicant.pm000640 000766 000024 00000000563 14137574636 026514 0ustar00etherstaff000000 000000 package Moose::Exception::MustSpecifyAtleastOneRoleToApplicant; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; has 'applicant' => ( is => 'ro', isa => 'Any', required => 1, ); sub _build_message { my $self = shift; "Must specify at least one role to apply to ".$self->applicant; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/UnableToCanonicalizeNonRolePackage.pm000640 000766 000024 00000000721 14137574636 026076 0ustar00etherstaff000000 000000 package Moose::Exception::UnableToCanonicalizeNonRolePackage; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Attribute'; has 'handles' => ( is => 'ro', isa => 'Str', required => 1, ); sub _build_message { my $self = shift; "Unable to canonicalize the 'handles' option with ".$self->handles." because its metaclass is not a Moose::Meta::Role"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/ClassNamesDoNotMatch.pm000640 000766 000024 00000000736 14137574636 023254 0ustar00etherstaff000000 000000 package Moose::Exception::ClassNamesDoNotMatch; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; has class_name => ( is => 'ro', isa => 'Str', required => 1, ); has class => ( is => 'ro', isa => 'Class::MOP::Class', required => 1, ); sub _build_message { my $self = shift; "class_name (".$self-> class_name.") does not match class->name (".$self->class->name.")"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/IsaLacksDoesMethod.pm000640 000766 000024 00000000534 14137574636 022744 0ustar00etherstaff000000 000000 package Moose::Exception::IsaLacksDoesMethod; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::InvalidAttributeOptions'; sub _build_message { my $self = shift; "Cannot have an isa option which cannot ->does() on attribute (".$self->attribute_name.")"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/UnionTakesAtleastTwoTypeNames.pm000640 000766 000024 00000000367 14137574636 025220 0ustar00etherstaff000000 000000 package Moose::Exception::UnionTakesAtleastTwoTypeNames; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; sub _build_message { "You must pass in at least 2 type names to make a union"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/CreateMOPClassTakesArrayRefOfSuperclasses.pm000640 000766 000024 00000000455 14137574636 027353 0ustar00etherstaff000000 000000 package Moose::Exception::CreateMOPClassTakesArrayRefOfSuperclasses; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::RoleForCreateMOPClass'; sub _build_message { "You must pass an ARRAY ref of superclasses"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/UnableToRecognizeDelegateMetaclass.pm000640 000766 000024 00000000713 14137574636 026144 0ustar00etherstaff000000 000000 package Moose::Exception::UnableToRecognizeDelegateMetaclass; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Attribute'; has 'delegate_metaclass' => ( is => 'ro', isa => 'Any', required => 1 ); sub _build_message { my $self = shift; my $meta = $self->delegate_metaclass; return "Unable to recognize the delegate metaclass '$meta'"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/CreateTakesHashRefOfAttributes.pm000640 000766 000024 00000000426 14137574636 025266 0ustar00etherstaff000000 000000 package Moose::Exception::CreateTakesHashRefOfAttributes; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::RoleForCreate'; sub _build_message { "You must pass a HASH ref of attributes"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/RolesDoNotSupportExtends.pm000640 000766 000024 00000000404 14137574636 024252 0ustar00etherstaff000000 000000 package Moose::Exception::RolesDoNotSupportExtends; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; sub _build_message { "Roles do not support 'extends' (you can use 'with' to specialize a role)"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/CouldNotGenerateInlineAttributeMethod.pm000640 000766 000024 00000001005 14137574636 026656 0ustar00etherstaff000000 000000 package Moose::Exception::CouldNotGenerateInlineAttributeMethod; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Instance'; has 'option' => ( is => 'ro', isa => 'Str', required => 1 ); has 'error' => ( is => 'ro', isa => 'Str|Moose::Exception', required => 1 ); sub _build_message { my $self = shift; "Could not generate inline ".$self->option." because : ".$self->error; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/CannotAddAdditionalTypeCoercionsToUnion.pm000640 000766 000024 00000000613 14137574636 027143 0ustar00etherstaff000000 000000 package Moose::Exception::CannotAddAdditionalTypeCoercionsToUnion; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; has 'type_coercion_union_object' => ( is => 'ro', isa => 'Moose::Meta::TypeCoercion::Union', required => 1 ); sub _build_message { return "Cannot add additional type coercions to Union types"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/BothBuilderAndDefaultAreNotAllowed.pm000640 000766 000024 00000000565 14137574636 026056 0ustar00etherstaff000000 000000 package Moose::Exception::BothBuilderAndDefaultAreNotAllowed; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::ParamsHash'; has 'class' => ( is => 'ro', isa => 'Str', required => 1 ); sub _build_message { "Setting both default and builder is not allowed."; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/MethodNameNotGiven.pm000640 000766 000024 00000000401 14137574636 022762 0ustar00etherstaff000000 000000 package Moose::Exception::MethodNameNotGiven; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Class'; sub _build_message { "You must define a method name to find"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/BadOptionFormat.pm000640 000766 000024 00000000731 14137574636 022325 0ustar00etherstaff000000 000000 package Moose::Exception::BadOptionFormat; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Attribute'; has 'option_name' => ( is => 'ro', isa => 'Str', required => 1 ); has 'option_value' => ( is => 'ro', isa => 'Any', required => 1 ); sub _build_message { "bad accessor/reader/writer/predicate/clearer format, must be a HASH ref"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/OverloadRequiresNamesForCoderef.pm000640 000766 000024 00000000546 14137574636 025517 0ustar00etherstaff000000 000000 package Moose::Exception::OverloadRequiresNamesForCoderef; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; sub _build_message { my $self = shift; 'If you provide a coderef parameter to the Moose::Meta::Overload constructor you must also provide coderef_package and coderef_name parameters'; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/CouldNotEvalConstructor.pm000640 000766 000024 00000001177 14137574636 024107 0ustar00etherstaff000000 000000 package Moose::Exception::CouldNotEvalConstructor; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; has 'constructor_method' => ( is => 'ro', isa => 'Class::MOP::Method::Constructor', required => 1 ); has 'source' => ( is => 'ro', isa => 'Str', required => 1 ); has 'error' => ( is => 'ro', isa => 'Str', required => 1 ); sub _build_message { my $self = shift; my $error = $self->error; my $source = $self->source; return "Could not eval the constructor :\n\n$source\n\nbecause :\n\n$error"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/CannotInitializeMooseMetaRoleComposite.pm000640 000766 000024 00000001123 14137574636 027054 0ustar00etherstaff000000 000000 package Moose::Exception::CannotInitializeMooseMetaRoleComposite; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; has 'role_composite' => ( is => 'ro', isa => 'Moose::Meta::Role::Composite', required => 1 ); has 'old_meta' => ( is => 'ro', isa => 'Any', required => 1 ); has 'args' => ( is => 'ro', isa => 'ArrayRef', required => 1 ); sub _build_message { 'Moose::Meta::Role::Composite instances can only be reinitialized from an existing metaclass instance'; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/CannotUseLazyBuildAndDefaultSimultaneously.pm000640 000766 000024 00000000565 14137574636 027727 0ustar00etherstaff000000 000000 package Moose::Exception::CannotUseLazyBuildAndDefaultSimultaneously; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::InvalidAttributeOptions'; sub _build_message { my $self = shift; "You can not use lazy_build and default for the same attribute (".$self->attribute_name.")"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/MetaclassIsARoleNotASubclassOfGivenMetaclass.pm000640 000766 000024 00000001263 14137574636 030026 0ustar00etherstaff000000 000000 package Moose::Exception::MetaclassIsARoleNotASubclassOfGivenMetaclass; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Role'; use Moose::Util 'find_meta'; has 'metaclass' => ( is => 'ro', isa => 'Str', required => 1 ); sub _build_message { my $self = shift; my $role_name = $self->role_name; my $role = find_meta( $role_name ); my $metaclass = $self->metaclass; return "$role_name already has a metaclass, but it does not inherit $metaclass ($role). " ."You cannot make the same thing a role and a class. Remove either Moose or Moose::Role."; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/HandlesMustBeAHashRef.pm000640 000766 000024 00000000634 14137574636 023337 0ustar00etherstaff000000 000000 package Moose::Exception::HandlesMustBeAHashRef; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Instance'; has 'given_handles' => ( is => 'ro', isa => 'Any', required => 1 ); sub _build_message { my $self = shift; "The 'handles' option must be a HASH reference, not ".$self->given_handles; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/AttributeValueIsNotAnObject.pm000640 000766 000024 00000001255 14137574636 024622 0ustar00etherstaff000000 000000 package Moose::Exception::AttributeValueIsNotAnObject; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Instance', 'Moose::Exception::Role::Attribute'; has 'method' => ( is => 'ro', isa => 'Moose::Meta::Method::Delegation', required => 1, ); has 'given_value' => ( is => 'ro', isa => 'Any', required => 1, ); sub _build_message { my $self = shift; "Cannot delegate ".$self->method->name." to " .$self->method->delegate_to_method." because the value of " . $self->attribute->name . " is not an object (got '".$self->given_value."')"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/MustSupplyAnAttributeToConstructWith.pm000640 000766 000024 00000000565 14137574636 026656 0ustar00etherstaff000000 000000 package Moose::Exception::MustSupplyAnAttributeToConstructWith; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::ParamsHash'; has 'class' => ( is => 'ro', isa => 'Str', required => 1 ); sub _build_message { "You must supply an attribute to construct with"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/CannotCreateMethodAliasLocalMethodIsPresentInClass.pm000640 000766 000024 00000000746 14137574636 031212 0ustar00etherstaff000000 000000 package Moose::Exception::CannotCreateMethodAliasLocalMethodIsPresentInClass; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Role', 'Moose::Exception::Role::Method', 'Moose::Exception::Role::Class'; has 'aliased_method_name' => ( is => 'ro', isa => 'Str', required => 1 ); sub _build_message { "Cannot create a method alias if a local method of the same name exists"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/CannotDelegateLocalMethodIsPresent.pm000640 000766 000024 00000000601 14137574636 026117 0ustar00etherstaff000000 000000 package Moose::Exception::CannotDelegateLocalMethodIsPresent; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Attribute', 'Moose::Exception::Role::Method'; sub _build_message { my $self = shift; "You cannot overwrite a locally defined method (".$self->method->name.") with a delegation"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/ExtendsMissingArgs.pm000640 000766 000024 00000000372 14137574636 023057 0ustar00etherstaff000000 000000 package Moose::Exception::ExtendsMissingArgs; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Class'; sub _build_message { "Must derive at least one class"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/IncompatibleMetaclassOfSuperclass.pm000640 000766 000024 00000001416 14137574636 026073 0ustar00etherstaff000000 000000 package Moose::Exception::IncompatibleMetaclassOfSuperclass; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Class'; has [qw/superclass_name superclass_meta_type class_meta_type/] => ( is => 'ro', isa => 'Str', required => 1, ); sub _build_message { my $self = shift; my $class_name = $self->class_name; my $class_meta_type = $self->class_meta_type; my $superclass_name = $self->superclass_name; my $supermeta_type = $self->superclass_meta_type; return "The metaclass of $class_name ($class_meta_type)" . " is not compatible with the metaclass of its superclass, " . "$superclass_name ($supermeta_type)"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/MethodModifierNeedsMethodName.pm000640 000766 000024 00000000405 14137574636 025113 0ustar00etherstaff000000 000000 package Moose::Exception::MethodModifierNeedsMethodName; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Class'; sub _build_message { "You must pass in a method name"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/CoercionAlreadyExists.pm000640 000766 000024 00000000627 14137574636 023544 0ustar00etherstaff000000 000000 package Moose::Exception::CoercionAlreadyExists; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Instance'; has 'constraint_name' => ( is => 'ro', isa => 'Str', required => 1 ); sub _build_message { my $self = shift; "A coercion action already exists for '".$self->constraint_name."'"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/CannotCallAnAbstractBaseMethod.pm000640 000766 000024 00000000603 14137574636 025210 0ustar00etherstaff000000 000000 package Moose::Exception::CannotCallAnAbstractBaseMethod; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; has 'package_name' => ( is => 'ro', isa => 'Str', required => 1 ); sub _build_message { my $self = shift; $self->package_name. " is an abstract base class, you must provide a constructor."; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/BuilderMethodNotSupportedForAttribute.pm000640 000766 000024 00000000667 14137574636 026756 0ustar00etherstaff000000 000000 package Moose::Exception::BuilderMethodNotSupportedForAttribute; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Attribute', 'Moose::Exception::Role::Instance'; sub _build_message { my $self = shift; blessed($self->instance)." does not support builder method '". $self->attribute->builder ."' for attribute '" . $self->attribute->name . "'"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/OperatorIsRequired.pm000640 000766 000024 00000000511 14137574636 023061 0ustar00etherstaff000000 000000 package Moose::Exception::OperatorIsRequired; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::ParamsHash'; has 'class' => ( is => 'ro', isa => 'Str', required => 1 ); sub _build_message { "operator is required"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/NoBodyToInitializeInAnAbstractBaseClass.pm000640 000766 000024 00000000606 14137574636 027030 0ustar00etherstaff000000 000000 package Moose::Exception::NoBodyToInitializeInAnAbstractBaseClass; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; has 'package_name' => ( is => 'ro', isa => 'Str', required => 1 ); sub _build_message { my $self = shift; "No body to initialize, " .$self->package_name. " is an abstract base class"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/CodeBlockMustBeACodeRef.pm000640 000766 000024 00000000462 14137574636 023574 0ustar00etherstaff000000 000000 package Moose::Exception::CodeBlockMustBeACodeRef; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::ParamsHash', 'Moose::Exception::Role::Instance'; sub _build_message { "Your code block must be a CODE reference"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/CannotCreateMethodAliasLocalMethodIsPresent.pm000640 000766 000024 00000001044 14137574636 027725 0ustar00etherstaff000000 000000 package Moose::Exception::CannotCreateMethodAliasLocalMethodIsPresent; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Role', 'Moose::Exception::Role::Method'; has 'role_being_applied_name' => ( is => 'ro', isa => 'Str', required => 1 ); has 'aliased_method_name' => ( is => 'ro', isa => 'Str', required => 1 ); sub _build_message { "Cannot create a method alias if a local method of the same name exists"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/MustSupplyAClassMOPAttributeInstance.pm000640 000766 000024 00000000617 14137574636 026461 0ustar00etherstaff000000 000000 package Moose::Exception::MustSupplyAClassMOPAttributeInstance; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::ParamsHash'; has 'class' => ( is => 'ro', isa => 'Str', required => 1 ); sub _build_message { "You must supply an attribute which is a 'Class::MOP::Attribute' instance"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/MethodExpectsFewerArgs.pm000640 000766 000024 00000001044 14137574636 023655 0ustar00etherstaff000000 000000 package Moose::Exception::MethodExpectsFewerArgs; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; has 'method_name' => ( is => 'ro', isa => 'Str', required => 1, ); has 'maximum_args' => ( is => 'ro', isa => 'Int', required => 1, ); sub _build_message { my $self = shift; my $max = $self->maximum_args; "Cannot call ".$self->method_name." with ". ( $max ? "more than $max" : 'any'). " argument".( $max == 1 ? '' : 's' ); } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/IsaDoesNotDoTheRole.pm000640 000766 000024 00000000571 14137574636 023055 0ustar00etherstaff000000 000000 package Moose::Exception::IsaDoesNotDoTheRole; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::InvalidAttributeOptions'; sub _build_message { my $self = shift; "Cannot have an isa option and a does option if the isa does not do the does on attribute (".$self->attribute_name.")"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/InvalidOverloadOperator.pm000640 000766 000024 00000000706 14137574636 024075 0ustar00etherstaff000000 000000 package Moose::Exception::InvalidOverloadOperator; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; has operator => ( is => 'ro', isa => 'Defined', required => 1, ); sub _build_message { my $self = shift; 'The operator parameter you passed to the Moose::Meta::Overload constructor (' . $self->operator() . ') was not a valid overloading operator'; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/DefaultToMatchOnTypeMustBeCodeRef.pm000640 000766 000024 00000001124 14137574636 025645 0ustar00etherstaff000000 000000 package Moose::Exception::DefaultToMatchOnTypeMustBeCodeRef; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; has 'to_match' => ( is => 'ro', isa => 'Any', required => 1 ); has 'default_action' => ( is => 'ro', isa => 'Any', required => 1 ); has 'cases_to_be_matched' => ( is => 'ro', isa => 'ArrayRef', required => 1 ); sub _build_message { my $self = shift; my $default = $self->default_action; return "Default case must be a CODE ref, not $default"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/InvalidArgumentsToTraitAliases.pm000640 000766 000024 00000001167 14137574636 025366 0ustar00etherstaff000000 000000 package Moose::Exception::InvalidArgumentsToTraitAliases; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Class'; use Scalar::Util qw(reftype); has 'alias' => ( is => 'ro', isa => 'Any', required => 1 ); has 'package_name' => ( is => 'ro', isa => 'Str', required => 1 ); sub _build_message { my $self = shift; my $alias = $self->alias; my $reftype_alias = reftype($alias); return "$reftype_alias references are not " . "valid arguments to the 'trait_aliases' option"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/CannotCalculateNativeType.pm000640 000766 000024 00000000463 14137574636 024350 0ustar00etherstaff000000 000000 package Moose::Exception::CannotCalculateNativeType; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Instance'; sub _build_message { my $self = shift; "Cannot calculate native type for " . ref $self->instance; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/MustSupplyADelegateToMethod.pm000640 000766 000024 00000000615 14137574636 024643 0ustar00etherstaff000000 000000 package Moose::Exception::MustSupplyADelegateToMethod; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::ParamsHash'; has 'class' => ( is => 'ro', isa => 'Str', required => 1 ); sub _build_message { "You must supply a delegate_to_method which is a method name or a CODE reference"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/OnlyInstancesCanBeCloned.pm000640 000766 000024 00000000703 14137574636 024103 0ustar00etherstaff000000 000000 package Moose::Exception::OnlyInstancesCanBeCloned; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Class', 'Moose::Exception::Role::ParamsHash'; has 'instance' => ( is => 'ro', isa => 'Any', required => 1, ); sub _build_message { my $self = shift; "You can only clone instances, (".$self->instance.") is not a blessed instance"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/AccessorMustReadWrite.pm000640 000766 000024 00000000530 14137574636 023514 0ustar00etherstaff000000 000000 package Moose::Exception::AccessorMustReadWrite; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::InvalidAttributeOptions'; sub _build_message { my $self = shift; "Cannot define an accessor name on a read-only attribute, accessors are read/write"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/CreateMOPClassTakesArrayRefOfAttributes.pm000640 000766 000024 00000000451 14137574636 027021 0ustar00etherstaff000000 000000 package Moose::Exception::CreateMOPClassTakesArrayRefOfAttributes; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::RoleForCreateMOPClass'; sub _build_message { "You must pass an ARRAY ref of attributes"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/MustProvideANameForTheAttribute.pm000640 000766 000024 00000000553 14137574636 025456 0ustar00etherstaff000000 000000 package Moose::Exception::MustProvideANameForTheAttribute; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::ParamsHash'; has 'class' => ( is => 'ro', isa => 'Str', required => 1 ); sub _build_message { "You must provide a name for the attribute"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/AddRoleToARoleTakesAMooseMetaRole.pm000640 000766 000024 00000000566 14137574636 025570 0ustar00etherstaff000000 000000 package Moose::Exception::AddRoleToARoleTakesAMooseMetaRole; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Role'; has 'role_to_be_added' => ( is => 'ro', isa => 'Any', required => 1, ); sub _build_message { "Roles must be instances of Moose::Meta::Role"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/RolesInCreateTakesAnArrayRef.pm000640 000766 000024 00000000444 14137574636 024700 0ustar00etherstaff000000 000000 package Moose::Exception::RolesInCreateTakesAnArrayRef; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::ParamsHash'; sub _build_message { my $self = shift; "You must pass an ARRAY ref of roles"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/RoleExclusionConflict.pm000640 000766 000024 00000001217 14137574636 023552 0ustar00etherstaff000000 000000 package Moose::Exception::RoleExclusionConflict; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Role'; has 'roles' => ( is => 'ro', isa => 'ArrayRef', required => 1, ); sub _build_message { my $self = shift; my @roles_array = @{$self->roles}; my $role_noun = "Role".( @roles_array == 1 ? '' : 's'); my $all_roles = join(', ', @roles_array); my $verb = "exclude".( @roles_array == 1 ? 's' : '' ); my $role_name = $self->role_name; return "Conflict detected: $role_noun $all_roles $verb role '$role_name'"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/InitMetaRequiresClass.pm000640 000766 000024 00000000430 14137574636 023511 0ustar00etherstaff000000 000000 package Moose::Exception::InitMetaRequiresClass; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::ParamsHash'; sub _build_message { "Cannot call init_meta without specifying a for_class"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/CouldNotFindTypeConstraintToCoerceFrom.pm000640 000766 000024 00000000665 14137574636 027012 0ustar00etherstaff000000 000000 package Moose::Exception::CouldNotFindTypeConstraintToCoerceFrom; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Instance'; has 'constraint_name' => ( is => 'ro', isa => 'Str', required => 1 ); sub _build_message { my $self = shift; "Could not find the type constraint (".$self->constraint_name.") to coerce from"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/ClassDoesNotHaveInitMeta.pm000640 000766 000024 00000000702 14137574636 024073 0ustar00etherstaff000000 000000 package Moose::Exception::ClassDoesNotHaveInitMeta; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Class'; has 'traits' => ( is => 'ro', isa => 'ArrayRef', required => 1 ); sub _build_message { my $self = shift; my $class = $self->class_name; return "Cannot provide traits when $class does not have an init_meta() method"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/CanOnlyConsumeRole.pm000640 000766 000024 00000000550 14137574636 023013 0ustar00etherstaff000000 000000 package Moose::Exception::CanOnlyConsumeRole; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; has 'role_name' => ( is => 'ro', isa => 'Str', required => 1, ); sub _build_message { my $self = shift; "You can only consume roles, ".$self->role_name." is not a Moose role"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/MustPassEvenNumberOfArguments.pm000640 000766 000024 00000000725 14137574636 025221 0ustar00etherstaff000000 000000 package Moose::Exception::MustPassEvenNumberOfArguments; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; has 'args' => ( is => 'ro', isa => 'ArrayRef', required => 1 ); has 'method_name' => ( is => 'ro', isa => 'Str', required => 1 ); sub _build_message { my $self = shift; "You must pass an even number of arguments to ".$self->method_name; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/PackagesAndModulesAreNotCachable.pm000640 000766 000024 00000001041 14137574636 025476 0ustar00etherstaff000000 000000 package Moose::Exception::PackagesAndModulesAreNotCachable; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Class', 'Moose::Exception::Role::ParamsHash'; has 'is_module' => ( is => 'ro', isa => 'Bool', required => 1 ); sub _build_message { my $self = shift; my $is_module = $self->is_module; if( $is_module ) { return "Modules are not cacheable"; } else { return "Packages are not cacheable"; } } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/MustDefineAnOverloadOperator.pm000640 000766 000024 00000000415 14137574636 025026 0ustar00etherstaff000000 000000 package Moose::Exception::MustDefineAnOverloadOperator; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Instance'; sub _build_message { "You must define an overload operator"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/InvalidArgumentToMethod.pm000640 000766 000024 00000001747 14137574636 024042 0ustar00etherstaff000000 000000 package Moose::Exception::InvalidArgumentToMethod; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; has 'argument' => ( is => 'ro', isa => 'Any', required => 1 ); has [qw(type type_of_argument method_name)] => ( is => 'ro', isa => 'Str', required => 1 ); has 'ordinal' => ( is => 'ro', isa => 'Str', predicate => 'is_ordinal_set' ); has 'argument_noun' => ( is => 'ro', isa => 'Str', default => 'argument' ); sub _build_message { my $self = shift; my $article = ( $self->type_of_argument =~ /^[aeiou]/ ? 'an ' : 'a '); my $arg_noun = $self->argument_noun; if( $self->is_ordinal_set ) { "The ".$self->ordinal." $arg_noun passed to ".$self->method_name." must be ".$article.$self->type_of_argument; } else { "The $arg_noun passed to ".$self->method_name." must be ".$article.$self->type_of_argument; } } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/AttributeMustBeAnClassMOPMixinAttributeCoreOrSubclass.pm000640 000766 000024 00000000655 14137574636 031711 0ustar00etherstaff000000 000000 package Moose::Exception::AttributeMustBeAnClassMOPMixinAttributeCoreOrSubclass; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Class'; has 'attribute' => ( is => 'ro', isa => 'Any', required => 1 ); sub _build_message { "Your attribute must be an instance of Class::MOP::Mixin::AttributeCore (or a subclass)"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/MustPassEvenNumberOfAttributeOptions.pm000640 000766 000024 00000000671 14137574636 026573 0ustar00etherstaff000000 000000 package Moose::Exception::MustPassEvenNumberOfAttributeOptions; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; has 'options' => ( is => 'ro', isa => 'ArrayRef', required => 1 ); has 'attribute_name' => ( is => 'ro', isa => 'Str', required => 1, ); sub _build_message { return 'You must pass an even number of attribute options'; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/CreateMOPClassTakesHashRefOfMethods.pm000640 000766 000024 00000000441 14137574636 026102 0ustar00etherstaff000000 000000 package Moose::Exception::CreateMOPClassTakesHashRefOfMethods; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::RoleForCreateMOPClass'; sub _build_message { "You must pass an HASH ref of methods"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/AddRoleTakesAMooseMetaRoleInstance.pm000640 000766 000024 00000000570 14137574636 026022 0ustar00etherstaff000000 000000 package Moose::Exception::AddRoleTakesAMooseMetaRoleInstance; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Class'; has 'role_to_be_added' => ( is => 'ro', isa => 'Any', required => 1, ); sub _build_message { "Roles must be instances of Moose::Meta::Role"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/MustSpecifyAtleastOneMethod.pm000640 000766 000024 00000000404 14137574636 024666 0ustar00etherstaff000000 000000 package Moose::Exception::MustSpecifyAtleastOneMethod; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Role'; sub _build_message { "Must specify at least one method"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/NoConstraintCheckForTypeConstraint.pm000640 000766 000024 00000000537 14137574636 026236 0ustar00etherstaff000000 000000 package Moose::Exception::NoConstraintCheckForTypeConstraint; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::TypeConstraint'; sub _build_message { my $self = shift; "Could not compile type constraint '".$self->type_name."' because no constraint check"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/RoleDoesTheExcludedRole.pm000640 000766 000024 00000001162 14137574636 023751 0ustar00etherstaff000000 000000 package Moose::Exception::RoleDoesTheExcludedRole; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Role'; has 'excluded_role_name' => ( is => 'ro', isa => 'Str', required => 1 ); has 'second_role_name' => ( is => 'ro', isa => 'Str', required => 1 ); sub _build_message { my $self = shift; my $role_name = $self->role_name; my $excluded_role_name = $self->excluded_role_name; return "The role $role_name does the excluded role '$excluded_role_name'"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/SingleParamsToNewMustBeHashRef.pm000640 000766 000024 00000000357 14137574636 025224 0ustar00etherstaff000000 000000 package Moose::Exception::SingleParamsToNewMustBeHashRef; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; sub _build_message { "Single parameters to new() must be a HASH ref"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/ClassDoesTheExcludedRole.pm000640 000766 000024 00000001070 14137574636 024113 0ustar00etherstaff000000 000000 package Moose::Exception::ClassDoesTheExcludedRole; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Role', 'Moose::Exception::Role::Class'; has 'excluded_role_name' => ( is => 'ro', isa => 'Str', required => 1 ); sub _build_message { my $self = shift; my $excluded_role_name = $self->excluded_role_name; my $class_name = $self->class_name; return "The class $class_name does the excluded role '$excluded_role_name'"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/AddParameterizableTypeTakesParameterizableType.pm000640 000766 000024 00000000621 14137574636 030537 0ustar00etherstaff000000 000000 package Moose::Exception::AddParameterizableTypeTakesParameterizableType; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; has 'type_name' => ( is => 'ro', isa => 'Str', required => 1 ); sub _build_message { my $self = shift; "Type must be a Moose::Meta::TypeConstraint::Parameterizable not ".$self->type_name; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/CanReblessOnlyIntoASuperclass.pm000640 000766 000024 00000000676 14137574636 025170 0ustar00etherstaff000000 000000 package Moose::Exception::CanReblessOnlyIntoASuperclass; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Class', 'Moose::Exception::Role::Instance', 'Moose::Exception::Role::InstanceClass'; sub _build_message { my $self = shift; "You may rebless only into a superclass of (".blessed( $self->instance )."), of which (". $self->class_name .") isn't." } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/CoercingWithoutCoercions.pm000640 000766 000024 00000000402 14137574636 024252 0ustar00etherstaff000000 000000 package Moose::Exception::CoercingWithoutCoercions; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::TypeConstraint'; sub _build_message { my $self = shift; "Cannot coerce without a type coercion"; } 1; Moose-2.2200/lib/Moose/Exception/CannotAutoDerefWithoutIsa.pm000640 000766 000024 00000000564 14137574636 024343 0ustar00etherstaff000000 000000 package Moose::Exception::CannotAutoDerefWithoutIsa; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::InvalidAttributeOptions'; sub _build_message { my $self = shift; "You cannot auto-dereference without specifying a type constraint on attribute (".$self->attribute_name.")"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/CannotFindType.pm000640 000766 000024 00000000546 14137574636 022166 0ustar00etherstaff000000 000000 package Moose::Exception::CannotFindType; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; has 'type_name' => ( is => 'ro', isa => 'Str', required => 1 ); sub _build_message { my $self = shift; "Cannot find type '".$self->type_name."', perhaps you forgot to load it"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/BuilderMethodNotSupportedForInlineAttribute.pm000640 000766 000024 00000001131 14137574636 030100 0ustar00etherstaff000000 000000 package Moose::Exception::BuilderMethodNotSupportedForInlineAttribute; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Instance', 'Moose::Exception::Role::Class'; has 'attribute_name' => ( is => 'ro', isa => 'Str', required => 1 ); has 'builder' => ( is => 'ro', isa => 'Str', required => 1 ); sub _build_message { my $self = shift; $self->class_name." does not support builder method '". $self->builder ."' for attribute '" . $self->attribute_name . "'"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/CallingReadOnlyMethodOnAnImmutableInstance.pm000640 000766 000024 00000000623 14137574636 027546 0ustar00etherstaff000000 000000 package Moose::Exception::CallingReadOnlyMethodOnAnImmutableInstance; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; has 'method_name' => ( is => 'ro', isa => 'Str', required => 1 ); sub _build_message { my $self = shift; "The '".$self->method_name."' method is read-only when called on an immutable instance"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/MustPassAPackageNameOrAnExistingClassMOPPackageInstance.pm000640 000766 000024 00000000642 14137574636 032031 0ustar00etherstaff000000 000000 package Moose::Exception::MustPassAPackageNameOrAnExistingClassMOPPackageInstance; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::ParamsHash'; has 'class' => ( is => 'ro', isa => 'Any', required => 1 ); sub _build_message { "You must pass a package name or an existing Class::MOP::Package instance"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/MustPassAMooseMetaRoleInstanceOrSubclass.pm000640 000766 000024 00000000655 14137574636 027304 0ustar00etherstaff000000 000000 package Moose::Exception::MustPassAMooseMetaRoleInstanceOrSubclass; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; has 'class' => ( is => 'ro', isa => 'Str', required => 1 ); has 'role' => ( is => 'ro', isa => 'Any', required => 1 ); sub _build_message { "You must pass a Moose::Meta::Role instance (or a subclass)"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/EnumCalledWithAnArrayRefAndAdditionalArgs.pm000640 000766 000024 00000000764 14137574636 027314 0ustar00etherstaff000000 000000 package Moose::Exception::EnumCalledWithAnArrayRefAndAdditionalArgs; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; has 'array' => ( is => 'ro', isa => 'ArrayRef', required => 1 ); has 'args' => ( is => 'ro', isa => 'ArrayRef', required => 1 ); sub _build_message { "enum called with an array reference and additional arguments. Did you mean to parenthesize the enum call's parameters?"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/CannotFindDelegateMetaclass.pm000640 000766 000024 00000000503 14137574636 024605 0ustar00etherstaff000000 000000 package Moose::Exception::CannotFindDelegateMetaclass; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Attribute'; sub _build_message { my $self = shift; "Cannot find delegate metaclass for attribute ".$self->attribute->name; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/RolesDoNotSupportInner.pm000640 000766 000024 00000000326 14137574636 023716 0ustar00etherstaff000000 000000 package Moose::Exception::RolesDoNotSupportInner; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; sub _build_message { "Roles cannot support 'inner'"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/TriggerMustBeACodeRef.pm000640 000766 000024 00000000512 14137574636 023346 0ustar00etherstaff000000 000000 package Moose::Exception::TriggerMustBeACodeRef; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::InvalidAttributeOptions'; sub _build_message { my $self = shift; "Trigger must be a CODE ref on attribute (".$self->attribute_name.")"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/ConflictDetectedInCheckRoleExclusionsInToClass.pm000640 000766 000024 00000000703 14137574636 030403 0ustar00etherstaff000000 000000 package Moose::Exception::ConflictDetectedInCheckRoleExclusionsInToClass; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Class', 'Moose::Exception::Role::Role'; sub _build_message { my $self = shift; my $class_name = $self->class_name; my $role_name = $self->role_name; return "Conflict detected: $class_name excludes role '$role_name'"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/NeedsTypeConstraintUnionForTypeCoercionUnion.pm000640 000766 000024 00000001221 14137574636 030252 0ustar00etherstaff000000 000000 package Moose::Exception::NeedsTypeConstraintUnionForTypeCoercionUnion; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::TypeConstraint'; # use Moose::Util::TypeConstraints 'find_type_constraint'; has 'type_coercion_union_object' => ( is => 'ro', isa => 'Moose::Meta::TypeCoercion::Union', required => 1 ); sub _build_message { my $self = shift; my $type_constraint = $self->type_name; return "You can only create a Moose::Meta::TypeCoercion::Union for a " . "Moose::Meta::TypeConstraint::Union, not a $type_constraint" } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/MustSupplyPackageNameAndName.pm000640 000766 000024 00000000611 14137574636 024740 0ustar00etherstaff000000 000000 package Moose::Exception::MustSupplyPackageNameAndName; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::ParamsHash'; has 'class' => ( is => 'ro', isa => 'Str', required => 1 ); sub _build_message { my $self = shift; "You must supply the package_name and name parameters"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/CannotAutoDereferenceTypeConstraint.pm000640 000766 000024 00000000635 14137574636 026412 0ustar00etherstaff000000 000000 package Moose::Exception::CannotAutoDereferenceTypeConstraint; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Attribute', 'Moose::Exception::Role::Instance', 'Moose::Exception::Role::TypeConstraint'; sub _build_message { my $self = shift; "Can not auto de-reference the type constraint '" . $self->type_name . "'"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/CannotMakeMetaclassCompatible.pm000640 000766 000024 00000000764 14137574636 025160 0ustar00etherstaff000000 000000 package Moose::Exception::CannotMakeMetaclassCompatible; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Class'; has 'superclass_name' => ( is => 'ro', isa => 'Str', required => 1 ); sub _build_message { my $self = shift; my $class_name = $self->class_name; my $superclass = $self->superclass_name; return "Can't make $class_name compatible with metaclass $superclass"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/EnumValuesMustBeString.pm000640 000766 000024 00000000776 14137574636 023701 0ustar00etherstaff000000 000000 package Moose::Exception::EnumValuesMustBeString; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::ParamsHash'; has 'class' => ( is => 'ro', isa => 'Str', required => 1 ); has 'value' => ( is => 'ro', isa => 'Any', required => 1 ); sub _build_message { my $self = shift; "Enum values must be strings, not ".( defined $self->value ? "'".$self->value."'" : "undef" ); } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/UnableToCanonicalizeHandles.pm000640 000766 000024 00000000626 14137574636 024630 0ustar00etherstaff000000 000000 package Moose::Exception::UnableToCanonicalizeHandles; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Attribute'; has 'handles' => ( is => 'ro', isa => 'Any', required => 1, ); sub _build_message { my $self = shift; "Unable to canonicalize the 'handles' option with ".$self->handles; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/InvalidRoleApplication.pm000640 000766 000024 00000000611 14137574636 023666 0ustar00etherstaff000000 000000 package Moose::Exception::InvalidRoleApplication; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Class'; has 'application' => ( is => 'ro', isa => "Any", required => 1, ); sub _build_message { "Role applications must be instances of Moose::Meta::Role::Application::ToClass"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/RoleNameRequiredForMooseMetaRole.pm000640 000766 000024 00000000420 14137574636 025576 0ustar00etherstaff000000 000000 package Moose::Exception::RoleNameRequiredForMooseMetaRole; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Role'; sub _build_message { "You must supply a role name to look for"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/CoercionNeedsTypeConstraint.pm000640 000766 000024 00000000563 14137574636 024727 0ustar00etherstaff000000 000000 package Moose::Exception::CoercionNeedsTypeConstraint; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::InvalidAttributeOptions'; sub _build_message { my $self = shift; "You cannot have coercion without specifying a type constraint on attribute (".$self->attribute_name.")"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/OverloadRequiresAMetaClass.pm000640 000766 000024 00000000524 14137574636 024466 0ustar00etherstaff000000 000000 package Moose::Exception::OverloadRequiresAMetaClass; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; sub _build_message { my $self = shift; 'If you provide an associated_metaclass parameter to the Moose::Meta::Overload constructor it must be a Class::MOP::Module object'; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/PackageDoesNotUseMooseExporter.pm000640 000766 000024 00000001073 14137574636 025335 0ustar00etherstaff000000 000000 package Moose::Exception::PackageDoesNotUseMooseExporter; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; has 'package' => ( is => 'ro', isa => 'Str', required => 1 ); has 'is_loaded' => ( is => 'ro', isa => 'Bool', required => 1 ); sub _build_message { my $self = shift; my $package = $self->package; return "Package in also ($package) does not seem to " . "use Moose::Exporter" . ( $self->is_loaded ? "" : " (is it loaded?)" ); } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/NoAttributeFoundInSuperClass.pm000640 000766 000024 00000000633 14137574636 025026 0ustar00etherstaff000000 000000 package Moose::Exception::NoAttributeFoundInSuperClass; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Class', 'Moose::Exception::Role::InvalidAttributeOptions'; sub _build_message { my $self = shift; "Could not find an attribute by the name of '".$self->attribute_name."' to inherit from in ".$self->class_name; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/InvalidTypeConstraint.pm000640 000766 000024 00000000711 14137574636 023570 0ustar00etherstaff000000 000000 package Moose::Exception::InvalidTypeConstraint; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; has 'registry_object' => ( is => 'ro', isa => 'Moose::Meta::TypeConstraint::Registry', required => 1 ); has 'type' => ( is => 'ro', isa => 'Any', required => 1 ); sub _build_message { return "No type supplied / type is not a valid type constraint"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/MustSupplyAnAccessorTypeToConstructWith.pm000640 000766 000024 00000000574 14137574636 027317 0ustar00etherstaff000000 000000 package Moose::Exception::MustSupplyAnAccessorTypeToConstructWith; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::ParamsHash'; has 'class' => ( is => 'ro', isa => 'Str', required => 1 ); sub _build_message { "You must supply an accessor_type to construct with"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/UnionCalledWithAnArrayRefAndAdditionalArgs.pm000640 000766 000024 00000000674 14137574636 027500 0ustar00etherstaff000000 000000 package Moose::Exception::UnionCalledWithAnArrayRefAndAdditionalArgs; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; has 'array' => ( is => 'ro', isa => 'ArrayRef', required => 1 ); has 'args' => ( is => 'ro', isa => 'ArrayRef', required => 1 ); sub _build_message { "union called with an array reference and additional arguments"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/MustSupplyAMooseMetaAttributeInstance.pm000640 000766 000024 00000000621 14137574636 026724 0ustar00etherstaff000000 000000 package Moose::Exception::MustSupplyAMooseMetaAttributeInstance; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::ParamsHash'; has 'class' => ( is => 'ro', isa => 'Str', required => 1 ); sub _build_message { "You must supply an attribute which is a 'Moose::Meta::Attribute' instance"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/RequiredAttributeNeedsADefault.pm000640 000766 000024 00000000573 14137574636 025332 0ustar00etherstaff000000 000000 package Moose::Exception::RequiredAttributeNeedsADefault; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::InvalidAttributeOptions'; sub _build_message { my $self = shift; "You cannot have a required attribute (".$self->attribute_name.") without a default, builder, or an init_arg"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/MethodExpectsMoreArgs.pm000640 000766 000024 00000000776 14137574636 023522 0ustar00etherstaff000000 000000 package Moose::Exception::MethodExpectsMoreArgs; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; has 'method_name' => ( is => 'ro', isa => 'Str', required => 1 ); has 'minimum_args' => ( is => 'ro', isa => 'Int', required => 1 ); sub _build_message { my $self = shift; "Cannot call ".$self->method_name." without at least ".$self->minimum_args." argument".($self->minimum_args == 1 ? '' : 's'); } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/RequiredAttributeLacksInitialization.pm000640 000766 000024 00000000620 14137574636 026624 0ustar00etherstaff000000 000000 package Moose::Exception::RequiredAttributeLacksInitialization; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::ParamsHash'; has 'class' => ( is => 'ro', isa => 'Str', required => 1 ); sub _build_message { "A required attribute must have either 'init_arg', 'builder', or 'default'"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/RequiredMethodsNotImplementedByClass.pm000640 000766 000024 00000001654 14137574636 026534 0ustar00etherstaff000000 000000 package Moose::Exception::RequiredMethodsNotImplementedByClass; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Class', 'Moose::Exception::Role::Role'; has 'missing_methods' => ( traits => ['Array'], is => 'ro', isa => 'ArrayRef[Moose::Meta::Role::Method::Required]', handles => { method_count => 'count', get_method_at => 'get', get_all_methods => 'elements', }, required => 1 ); sub _build_message { my $self = shift; my $noun = $self->method_count == 1 ? 'method' : 'methods'; my $list = Moose::Util::english_list( map { q{'} . $_ . q{'} } $self->get_all_methods ); my ($role_name, $class_name) = ($self->role_name, $self->class_name); return "'$role_name' requires the $noun $list " . "to be implemented by '$class_name'"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/CannotAugmentNoSuperMethod.pm000640 000766 000024 00000000767 14137574636 024526 0ustar00etherstaff000000 000000 package Moose::Exception::CannotAugmentNoSuperMethod; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::ParamsHash'; has 'class' => ( is => 'ro', isa => 'Str', required => 1 ); has 'method_name' => ( is => 'ro', isa => 'Str', required => 1 ); sub _build_message { my $self = shift; "You cannot augment '".$self->method_name."' because it has no super method"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/CouldNotEvalDestructor.pm000640 000766 000024 00000001203 14137574636 023706 0ustar00etherstaff000000 000000 package Moose::Exception::CouldNotEvalDestructor; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; has 'method_destructor_object' => ( is => 'ro', isa => 'Moose::Meta::Method::Destructor', required => 1 ); has 'source' => ( is => 'ro', isa => 'Str', required => 1 ); has 'error' => ( is => 'ro', isa => 'Str', required => 1 ); sub _build_message { my $self = shift; my $error = $self->error; my $source = $self->source; return "Could not eval the destructor :\n\n$source\n\nbecause :\n\n$error"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/OverloadRequiresAnOperator.pm000640 000766 000024 00000000453 14137574636 024564 0ustar00etherstaff000000 000000 package Moose::Exception::OverloadRequiresAnOperator; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; sub _build_message { my $self = shift; 'You must provide an operator parameter when constructing a Moose::Meta::Overload object'; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/CouldNotParseType.pm000640 000766 000024 00000001053 14137574636 022657 0ustar00etherstaff000000 000000 package Moose::Exception::CouldNotParseType; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; has 'type' => ( is => 'ro', isa => 'Str', required => 1 ); has 'position' => ( is => 'ro', isa => 'Int', required => 1 ); sub _build_message { my $self = shift; my $type = $self->type; my $length = length($type); my $position = $self->position; return "'$type' didn't parse (parse-pos=$position" . " and str-length=$length)"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/NoDestructorClassSpecified.pm000640 000766 000024 00000000532 14137574636 024531 0ustar00etherstaff000000 000000 package Moose::Exception::NoDestructorClassSpecified; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Class', 'Moose::Exception::Role::ParamsHash'; sub _build_message { "The 'inline_destructor' option is present, but no destructor class was specified"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/CannotCoerceAWeakRef.pm000640 000766 000024 00000000542 14137574636 023206 0ustar00etherstaff000000 000000 package Moose::Exception::CannotCoerceAWeakRef; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::InvalidAttributeOptions'; sub _build_message { my $self = shift; "You cannot have a weak reference to a coerced value on attribute (".$self->attribute_name.")"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/CannotDelegateWithoutIsa.pm000640 000766 000024 00000000457 14137574636 024200 0ustar00etherstaff000000 000000 package Moose::Exception::CannotDelegateWithoutIsa; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Attribute'; sub _build_message { "Cannot delegate methods based on a Regexp without a type constraint (isa)"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/CannotApplyBaseClassRolesToRole.pm000640 000766 000024 00000000517 14137574636 025442 0ustar00etherstaff000000 000000 package Moose::Exception::CannotApplyBaseClassRolesToRole; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::ParamsHash', 'Moose::Exception::Role::Role'; sub _build_message { "You can only apply base class roles to a Moose class, not a role."; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/CannotFindTypeGivenToMatchOnType.pm000640 000766 000024 00000001041 14137574636 025565 0ustar00etherstaff000000 000000 package Moose::Exception::CannotFindTypeGivenToMatchOnType; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; has 'to_match' => ( is => 'ro', isa => 'Any', required => 1 ); has 'action' => ( is => 'ro', isa => 'Any', required => 1 ); has 'type' => ( is => 'ro', isa => 'Any', required => 1 ); sub _build_message { my $self = shift; my $type = $self->type; return "Cannot find or parse the type '$type'" } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/CanExtendOnlyClasses.pm000640 000766 000024 00000000526 14137574636 023330 0ustar00etherstaff000000 000000 package Moose::Exception::CanExtendOnlyClasses; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Role'; sub _build_message { my $self = shift; my $role_name = $self->role_name; return "You cannot inherit from a Moose Role ($role_name)"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/MustHaveAtLeastOneValueToEnumerate.pm000640 000766 000024 00000000572 14137574636 026122 0ustar00etherstaff000000 000000 package Moose::Exception::MustHaveAtLeastOneValueToEnumerate; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::ParamsHash'; has 'class' => ( is => 'ro', isa => 'Str', required => 1 ); sub _build_message { "You must have at least one value to enumerate through"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/InvalidValueForIs.pm000640 000766 000024 00000000553 14137574636 022625 0ustar00etherstaff000000 000000 package Moose::Exception::InvalidValueForIs; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::InvalidAttributeOptions'; sub _build_message { my $self = shift; "I do not understand this option (is => ".$self->params->{is}.") on attribute (".$self->attribute_name.")"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/NeitherAttributeNorAttributeNameIsGiven.pm000640 000766 000024 00000000377 14137574636 027216 0ustar00etherstaff000000 000000 package Moose::Exception::NeitherAttributeNorAttributeNameIsGiven; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; sub _build_message { "You need to give attribute or attribute_name or both"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/NeitherClassNorClassNameIsGiven.pm000640 000766 000024 00000000357 14137574636 025420 0ustar00etherstaff000000 000000 package Moose::Exception::NeitherClassNorClassNameIsGiven; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; sub _build_message { "You need to give class or class_name or both"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/ValidationFailedForTypeConstraint.pm000640 000766 000024 00000001344 14137574636 026053 0ustar00etherstaff000000 000000 package Moose::Exception::ValidationFailedForTypeConstraint; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Attribute'; has 'value' => ( is => 'ro', isa => 'Any', required => 1, ); has 'type' => ( is => 'ro', isa => Moose::Util::TypeConstraints->duck_type(["get_message", "name"]), required => 1 ); sub _build_message { my $self = shift; my $error = $self->type->get_message( $self->value ); return $error unless $self->is_attribute_set; my $attribute_name = $self->attribute->name; return "Attribute ($attribute_name) does not pass the type constraint because: $error"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/AttributeConflictInSummation.pm000640 000766 000024 00000001376 14137574636 025114 0ustar00etherstaff000000 000000 package Moose::Exception::AttributeConflictInSummation; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Role', 'Moose::Exception::Role::AttributeName'; has 'second_role_name' => ( is => 'ro', isa => 'Str', required => 1, ); sub _build_message { my $self = shift; my $role1 = $self->role_name; my $role2 = $self->second_role_name; my $attr_name = $self->attribute_name; return "We have encountered an attribute conflict with '$attr_name'" . " during role composition. " . " This attribute is defined in both $role1 and $role2." . " This is a fatal error and cannot be disambiguated."; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/MethodNameConflictInRoles.pm000640 000766 000024 00000002503 14137574636 024273 0ustar00etherstaff000000 000000 package Moose::Exception::MethodNameConflictInRoles; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Class'; has 'conflict' => ( traits => ['Array'], is => 'ro', isa => 'ArrayRef[Moose::Meta::Role::Method::Conflicting]', handles => { conflict_methods_count => 'count', get_method_at => 'get', get_all_methods => 'elements', }, required => 1 ); sub _get_method_names { my $self = shift; return ( $self->conflict_methods_count == 1 ? "'".$self->get_method_at(0)->name."'": Moose::Util::english_list( map { q{'} . $_->name . q{'} } $self->get_all_methods ) ); } sub _build_message { my $self = shift; my $count = $self->conflict_methods_count; my $roles = $self->get_method_at(0)->roles_as_english_list; if( $count == 1 ) { "Due to a method name conflict in roles " .$roles.", the method ".$self->_get_method_names ." must be implemented or excluded by '".$self->class_name."'"; } else { "Due to method name conflicts in roles " .$roles.", the methods ".$self->_get_method_names ." must be implemented or excluded by '".$self->class_name."'"; } } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/InvalidHandleValue.pm000640 000766 000024 00000000652 14137574636 022776 0ustar00etherstaff000000 000000 package Moose::Exception::InvalidHandleValue; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Instance'; has 'handle_value' => ( is => 'ro', isa => 'Any', required => 1 ); sub _build_message { my $self = shift; "All values passed to handles must be strings or ARRAY references, not ".$self->handle_value; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/TypeParameterMustBeMooseMetaType.pm000640 000766 000024 00000000437 14137574636 025656 0ustar00etherstaff000000 000000 package Moose::Exception::TypeParameterMustBeMooseMetaType; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::TypeConstraint'; sub _build_message { "The type parameter must be a Moose meta type"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/CannotGenerateInlineConstraint.pm000640 000766 000024 00000001535 14137574636 025401 0ustar00etherstaff000000 000000 package Moose::Exception::CannotGenerateInlineConstraint; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::TypeConstraint'; has 'parameterizable_type_object_name' => ( is => 'ro', isa => 'Str', required => 1, documentation => "This attribute can be used for fetching parameterizable type constraint(Moose::Meta::TypeConstraint::Parameterizable):\n". " my \$type_constraint = Moose::Util::TypeConstraints::find_type_constraint( \$exception->type_name );\n", ); has 'value' => ( is => 'ro', isa => 'Str', required => 1 ); sub _build_message { my $self = shift; my $type = $self->type_name; return "Can't generate an inline constraint for $type, since none was defined"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/MustSupplyArrayRefAsCurriedArguments.pm000640 000766 000024 00000000523 14137574636 026565 0ustar00etherstaff000000 000000 package Moose::Exception::MustSupplyArrayRefAsCurriedArguments; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::ParamsHash', 'Moose::Exception::Role::Class'; sub _build_message { "You must supply a curried_arguments which is an ARRAY reference"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/WrongTypeConstraintGiven.pm000640 000766 000024 00000000771 14137574636 024275 0ustar00etherstaff000000 000000 package Moose::Exception::WrongTypeConstraintGiven; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::ParamsHash'; has [qw/required_type given_type attribute_name/] => ( is => 'ro', isa => 'Str', required => 1 ); sub _build_message { my $self = shift; "The type constraint for ".$self->attribute_name." must be a subtype of " .$self->required_type." but it's a ".$self->given_type; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/MetaclassIsAClassNotASubclassOfGivenMetaclass.pm000640 000766 000024 00000001165 14137574636 030173 0ustar00etherstaff000000 000000 package Moose::Exception::MetaclassIsAClassNotASubclassOfGivenMetaclass; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Class'; use Moose::Util 'find_meta'; has 'metaclass' => ( is => 'ro', isa => 'Str', required => 1 ); sub _build_message { my $self = shift; my $class = find_meta( $self->class_name ); $self->class_name." already has a metaclass, but it does not inherit ".$self->metaclass. " ($class). You cannot make the same thing a role and a class. Remove either Moose or Moose::Role."; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/MetaclassMustBeASubclassOfMooseMetaRole.pm000640 000766 000024 00000000520 14137574636 027047 0ustar00etherstaff000000 000000 package Moose::Exception::MetaclassMustBeASubclassOfMooseMetaRole; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Role'; sub _build_message { my $self = shift; "The Metaclass ".$self->role_name." must be a subclass of Moose::Meta::Role." } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/NoCasesMatched.pm000640 000766 000024 00000000720 14137574636 022114 0ustar00etherstaff000000 000000 package Moose::Exception::NoCasesMatched; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; has 'to_match' => ( is => 'ro', isa => 'Any', required => 1 ); has 'cases_to_be_matched' => ( is => 'ro', isa => 'ArrayRef', required => 1 ); sub _build_message { my $self = shift; my $to_match = $self->to_match; return "No cases matched for $to_match"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/MetaclassMustBeDerivedFromClassMOPClass.pm000640 000766 000024 00000000606 14137574636 027011 0ustar00etherstaff000000 000000 package Moose::Exception::MetaclassMustBeDerivedFromClassMOPClass; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; has 'class_name' => ( is => 'ro', isa => 'Str', required => 1 ); sub _build_message { my $self = shift; "The metaclass (".$self->class_name.") must be derived from Class::MOP::Class"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/TypeConstraintCannotBeUsedForAParameterizableType.pm000640 000766 000024 00000001570 14137574636 031162 0ustar00etherstaff000000 000000 package Moose::Exception::TypeConstraintCannotBeUsedForAParameterizableType; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::TypeConstraint'; has 'parent_type_name' => ( is => 'ro', isa => 'Str', required => 1, documentation => "This attribute can be used for fetching type constraint(Moose::Meta::TypeConstraint):\n". " my \$type_constraint = Moose::Util::TypeConstraints::find_type_constraint( \$exception->parent_type_name );\n", ); sub _build_message { my $self = shift; my $type_name = $self->type_name; my $parent_type_name = $self->parent_type_name; "The $type_name constraint cannot be used, because " . "$parent_type_name doesn't subtype or coerce from a parameterizable type."; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/CannotFixMetaclassCompatibility.pm000640 000766 000024 00000001035 14137574636 025553 0ustar00etherstaff000000 000000 package Moose::Exception::CannotFixMetaclassCompatibility; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Class'; has 'superclass' => ( is => 'ro', isa => 'Object', required => 1 ); has 'metaclass_type' => ( is => 'ro', isa => 'Str', ); sub _build_message { my $self = shift; my $class_name = $self->class_name; "Can't fix metaclass incompatibility for $class_name because it is not pristine."; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/InstanceBlessedIntoWrongClass.pm000640 000766 000024 00000000731 14137574636 025200 0ustar00etherstaff000000 000000 package Moose::Exception::InstanceBlessedIntoWrongClass; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::ParamsHash', 'Moose::Exception::Role::Class', 'Moose::Exception::Role::Instance'; sub _build_message { my $self = shift; "Objects passed as the __INSTANCE__ parameter must already be blessed into the correct class, but ".$self->instance." is not a " . $self->class_name; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/CreateTakesArrayRefOfRoles.pm000640 000766 000024 00000000417 14137574636 024417 0ustar00etherstaff000000 000000 package Moose::Exception::CreateTakesArrayRefOfRoles; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::RoleForCreate'; sub _build_message { "You must pass an ARRAY ref of roles"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/MustDefineAnAttributeName.pm000640 000766 000024 00000000404 14137574636 024301 0ustar00etherstaff000000 000000 package Moose::Exception::MustDefineAnAttributeName; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Class'; sub _build_message { "You must define an attribute name"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/IllegalInheritedOptions.pm000640 000766 000024 00000000726 14137574636 024062 0ustar00etherstaff000000 000000 package Moose::Exception::IllegalInheritedOptions; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::ParamsHash'; has 'illegal_options' => ( is => 'ro', traits => ['Array'], handles => { _join_options => 'join', }, required => 1, ); sub _build_message { my $self = shift; "Illegal inherited options => (".$self->_join_options(', ').")"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/CannotOverrideLocalMethodIsPresent.pm000640 000766 000024 00000000520 14137574636 026164 0ustar00etherstaff000000 000000 package Moose::Exception::CannotOverrideLocalMethodIsPresent; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Class', 'Moose::Exception::Role::Method'; sub _build_message { "Cannot add an override method if a local method is already present"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/ReferencesAreNotAllowedAsDefault.pm000640 000766 000024 00000001125 14137574636 025566 0ustar00etherstaff000000 000000 package Moose::Exception::ReferencesAreNotAllowedAsDefault; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::ParamsHash'; has 'class' => ( is => 'ro', isa => 'Str', required => 1 ); has 'attribute_name' => ( is => 'ro', isa => 'Str', required => 1 ); sub _build_message { my $self = shift; "References are not allowed as default values, you must wrap the default of '". $self->attribute_name."' in a CODE reference (ex: sub { [] } and not [])"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/InvalidNameForType.pm000640 000766 000024 00000000555 14137574636 023001 0ustar00etherstaff000000 000000 package Moose::Exception::InvalidNameForType; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; has 'name' => ( is => 'ro', isa => 'Str', required => 1, ); sub _build_message { my $self = shift; $self->name." contains invalid characters for a type name. Names can contain alphanumeric characters, ':', and '.'"; } 1; Moose-2.2200/lib/Moose/Exception/IllegalMethodTypeToAddMethodModifier.pm000640 000766 000024 00000001145 14137574636 026405 0ustar00etherstaff000000 000000 package Moose::Exception::IllegalMethodTypeToAddMethodModifier; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; has 'class_or_object' => ( is => 'ro', isa => "Any", required => 1, ); has 'params' => ( is => 'ro', isa => 'ArrayRef', required => 1, ); has 'modifier_name' => ( is => 'ro', isa => 'Str', required => 1 ); sub _build_message { my $self = shift; "Methods passed to ".$self->modifier_name." must be provided as a list, arrayref or regex, not ".$self->params->[0]; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/DelegationToAClassWhichIsNotLoaded.pm000640 000766 000024 00000000730 14137574636 026012 0ustar00etherstaff000000 000000 package Moose::Exception::DelegationToAClassWhichIsNotLoaded; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Attribute'; has 'class_name' => ( is => 'ro', isa => 'Str', required => 1, ); sub _build_message { my $self = shift; "The ".$self->attribute->name." attribute is trying to delegate to a class which has not been loaded - ".$self->class_name; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/RoleNameRequired.pm000640 000766 000024 00000000401 14137574636 022472 0ustar00etherstaff000000 000000 package Moose::Exception::RoleNameRequired; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Class'; sub _build_message { "You must supply a role name to look for"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/OverloadRequiresAMetaOverload.pm000640 000766 000024 00000000527 14137574636 025177 0ustar00etherstaff000000 000000 package Moose::Exception::OverloadRequiresAMetaOverload; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; sub _build_message { my $self = shift; 'If you provide an original_overload parameter to the Moose::Meta::Overload constructor it must be a Moose::Meta::Overload object'; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/MethodNameNotFoundInInheritanceHierarchy.pm000640 000766 000024 00000000707 14137574636 027276 0ustar00etherstaff000000 000000 package Moose::Exception::MethodNameNotFoundInInheritanceHierarchy; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Class'; has 'method_name' => ( is => 'ro', isa => 'Str', required => 1 ); sub _build_message { my $self = shift; "The method '".$self->method_name."' was not found in the inheritance hierarchy for ".$self->class_name; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/NeitherRoleNorRoleNameIsGiven.pm000640 000766 000024 00000000353 14137574636 025104 0ustar00etherstaff000000 000000 package Moose::Exception::NeitherRoleNorRoleNameIsGiven; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; sub _build_message { "You need to give role or role_name or both"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/AttachToClassNeedsAClassMOPClassInstanceOrASubclass.pm000640 000766 000024 00000000617 14137574636 031174 0ustar00etherstaff000000 000000 package Moose::Exception::AttachToClassNeedsAClassMOPClassInstanceOrASubclass; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Attribute'; has 'class' => ( is => 'ro', isa => 'Any', required => 1 ); sub _build_message { "You must pass a Class::MOP::Class instance (or a subclass)"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/CannotCallAnAbstractMethod.pm000640 000766 000024 00000000315 14137574636 024415 0ustar00etherstaff000000 000000 package Moose::Exception::CannotCallAnAbstractMethod; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; sub _build_message { "Abstract method"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/AttributeConflictInRoles.pm000640 000766 000024 00000001474 14137574636 024223 0ustar00etherstaff000000 000000 package Moose::Exception::AttributeConflictInRoles; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Role'; has 'second_role_name' => ( is => 'ro', isa => 'Str', required => 1 ); has 'attribute_name' => ( is => 'ro', isa => 'Str', required => 1 ); sub _build_message { my $self = shift; my $role_name = $self->role_name; my $second_role_name = $self->second_role_name; my $attribute_name = $self->attribute_name; "Role '$role_name' has encountered an attribute conflict" . " while being composed into '$second_role_name'." . " This is a fatal error and cannot be disambiguated." . " The conflicting attribute is named '$attribute_name'."; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/NoParentGivenToSubtype.pm000640 000766 000024 00000000515 14137574636 023673 0ustar00etherstaff000000 000000 package Moose::Exception::NoParentGivenToSubtype; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; has 'name' => ( is => 'ro', isa => 'Str', required => 1 ); sub _build_message { "A subtype cannot consist solely of a name, it must have a parent"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/CircularReferenceInAlso.pm000640 000766 000024 00000001175 14137574636 023771 0ustar00etherstaff000000 000000 package Moose::Exception::CircularReferenceInAlso; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; has 'also_parameter' => ( is => 'ro', isa => 'Str', required => 1 ); has 'stack' => ( is => 'ro', isa => 'ArrayRef', required => 1 ); sub _build_message { my $self = shift; my $also_member = $self->also_parameter; my @stack = @{$self->stack}; my $existing_stack = join( ', ', @stack); return "Circular reference in 'also' parameter to Moose::Exporter between " ."$existing_stack and $also_member"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/AttributeNamesDoNotMatch.pm000640 000766 000024 00000000776 14137574636 024156 0ustar00etherstaff000000 000000 package Moose::Exception::AttributeNamesDoNotMatch; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; has attribute_name => ( is => 'ro', isa => 'Str', required => 1, ); has attribute => ( is => 'ro', isa => 'Class::MOP::Attribute', required => 1, ); sub _build_message { my $self = shift; "attribute_name (".$self-> attribute_name.") does not match attribute->name (".$self->attribute->name.")"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/OverloadRequiresAMethodNameOrCoderef.pm000640 000766 000024 00000000502 14137574636 026420 0ustar00etherstaff000000 000000 package Moose::Exception::OverloadRequiresAMethodNameOrCoderef; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; sub _build_message { my $self = shift; 'You must provide a method_name or coderef parameter when constructing a Moose::Meta::Overload object'; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/MetaclassTypeIncompatible.pm000640 000766 000024 00000002111 14137574636 024374 0ustar00etherstaff000000 000000 package Moose::Exception::MetaclassTypeIncompatible; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Class'; use Moose::Util 'find_meta'; has [qw(superclass_name metaclass_type)] => ( is => 'ro', isa => 'Str', required => 1 ); sub _build_message { my $self = shift; my $class_name = $self->class_name; my $superclass_name = $self->superclass_name; my $metaclass_type = $self->metaclass_type; my $metaclass_type_name = $metaclass_type; $metaclass_type_name =~ s/_(?:meta)?class$//; $metaclass_type_name =~ s/_/ /g; my $class = find_meta( $class_name ); my $self_metaclass_type = $class->$metaclass_type; my $super_meta = Class::MOP::get_metaclass_by_name($superclass_name); my $super_metatype = $super_meta->$metaclass_type; return "The $metaclass_type metaclass for $class_name" . " ($self_metaclass_type) is not compatible with the $metaclass_type_name" . " metaclass of its superclass, $superclass_name ($super_metatype)"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/BuilderDoesNotExist.pm000640 000766 000024 00000000637 14137574636 023201 0ustar00etherstaff000000 000000 package Moose::Exception::BuilderDoesNotExist; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Attribute', 'Moose::Exception::Role::Instance'; sub _build_message { my $self = shift; blessed($self->instance)." does not support builder method '".$self->attribute->builder."' for attribute '".$self->attribute->name."'"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/ConstructClassInstanceTakesPackageName.pm000640 000766 000024 00000000346 14137574636 027003 0ustar00etherstaff000000 000000 package Moose::Exception::ConstructClassInstanceTakesPackageName; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; sub _build_message { "You must pass a package name"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/RolesListMustBeInstancesOfMooseMetaRole.pm000640 000766 000024 00000000775 14137574636 027136 0ustar00etherstaff000000 000000 package Moose::Exception::RolesListMustBeInstancesOfMooseMetaRole; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::ParamsHash'; has 'class' => ( is => 'ro', isa => 'Str', required => 1 ); has 'role' => ( is => 'ro', isa => 'Any', required => 1 ); sub _build_message { my $self = shift; "The list of roles must be instances of Moose::Meta::Role, not ".$self->role; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/ConflictDetectedInCheckRoleExclusions.pm000640 000766 000024 00000001042 14137574636 026620 0ustar00etherstaff000000 000000 package Moose::Exception::ConflictDetectedInCheckRoleExclusions; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Role'; has 'excluded_role_name' => ( is => 'ro', isa => 'Str', required => 1 ); sub _build_message { my $self = shift; my $role_name = $self->role_name; my $excluded_role_name = $self->excluded_role_name; return "Conflict detected: $role_name excludes role '$excluded_role_name'"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/NeitherTypeNorTypeNameIsGiven.pm000640 000766 000024 00000000353 14137574636 025144 0ustar00etherstaff000000 000000 package Moose::Exception::NeitherTypeNorTypeNameIsGiven; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; sub _build_message { "You need to give type or type_name or both"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/RolesDoNotSupportRegexReferencesForMethodModifiers.pm000640 000766 000024 00000000712 14137574636 031370 0ustar00etherstaff000000 000000 package Moose::Exception::RolesDoNotSupportRegexReferencesForMethodModifiers; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Role'; has 'modifier_type' => ( is => 'ro', isa => 'Str', required => 1 ); sub _build_message { my $self = shift; "Roles do not currently support regex references for ".$self->modifier_type." method modifiers"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/MessageParameterMustBeCodeRef.pm000640 000766 000024 00000000551 14137574636 025072 0ustar00etherstaff000000 000000 package Moose::Exception::MessageParameterMustBeCodeRef; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::ParamsHash'; has 'class' => ( is => 'ro', isa => 'Str', required => 1 ); sub _build_message { "The 'message' parameter must be a coderef"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/BuilderMustBeAMethodName.pm000640 000766 000024 00000000570 14137574636 024047 0ustar00etherstaff000000 000000 package Moose::Exception::BuilderMustBeAMethodName; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::ParamsHash'; has 'class' => ( is => 'ro', isa => 'Str', required => 1 ); sub _build_message { "builder must be a defined scalar value which is a method name"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/CannotCoerceAttributeWhichHasNoCoercion.pm000640 000766 000024 00000000737 14137574636 027130 0ustar00etherstaff000000 000000 package Moose::Exception::CannotCoerceAttributeWhichHasNoCoercion; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::InvalidAttributeOptions', 'Moose::Exception::Role::TypeConstraint'; sub _build_message { my $self = shift; my $name = $self->attribute_name; my $type = $self->type_name; return "You cannot coerce an attribute ($name) unless its type ($type) has a coercion"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/NoImmutableTraitSpecifiedForClass.pm000640 000766 000024 00000000635 14137574636 025771 0ustar00etherstaff000000 000000 package Moose::Exception::NoImmutableTraitSpecifiedForClass; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Class', 'Moose::Exception::Role::ParamsHash'; use Moose::Util 'find_meta'; sub _build_message { my $self = shift; my $class = find_meta( $self->class_name ); "no immutable trait specified for $class"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/CallingMethodOnAnImmutableInstance.pm000640 000766 000024 00000000603 14137574636 026106 0ustar00etherstaff000000 000000 package Moose::Exception::CallingMethodOnAnImmutableInstance; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; has 'method_name' => ( is => 'ro', isa => 'Str', required => 1 ); sub _build_message { my $self = shift; "The '".$self->method_name."' method cannot be called on an immutable instance"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/CloneObjectExpectsAnInstanceOfMetaclass.pm000640 000766 000024 00000000676 14137574636 027116 0ustar00etherstaff000000 000000 package Moose::Exception::CloneObjectExpectsAnInstanceOfMetaclass; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Class'; has 'instance' => ( is => 'ro', isa => 'Any', required => 1, ); sub _build_message { my $self = shift; "You must pass an instance of the metaclass (" .$self->class_name. "), not (".$self->instance.")"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/InvalidTypeGivenToCreateParameterizedTypeConstraint.pm000640 000766 000024 00000000526 14137574636 031573 0ustar00etherstaff000000 000000 package Moose::Exception::InvalidTypeGivenToCreateParameterizedTypeConstraint; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::TypeConstraint'; sub _build_message { my $self = shift; "Could not parse type name (".$self->type_name.") correctly"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/CanReblessOnlyIntoASubclass.pm000640 000766 000024 00000001013 14137574636 024605 0ustar00etherstaff000000 000000 package Moose::Exception::CanReblessOnlyIntoASubclass; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::ParamsHash', 'Moose::Exception::Role::Class', 'Moose::Exception::Role::Instance', 'Moose::Exception::Role::InstanceClass'; sub _build_message { my $self = shift; my $instance_class = $self->instance_class; "You may rebless only into a subclass of ($instance_class), of which (". $self->class_name .") isn't." } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/InitializeTakesUnBlessedPackageName.pm000640 000766 000024 00000000530 14137574636 026245 0ustar00etherstaff000000 000000 package Moose::Exception::InitializeTakesUnBlessedPackageName; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; has 'package_name' => ( is => 'ro', isa => 'Any', required => 1, ); sub _build_message { "You must pass a package name and it cannot be blessed"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/MatchActionMustBeACodeRef.pm000640 000766 000024 00000001003 14137574636 024131 0ustar00etherstaff000000 000000 package Moose::Exception::MatchActionMustBeACodeRef; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::TypeConstraint'; has 'to_match' => ( is => 'ro', isa => 'Any', required => 1, ); has 'action' => ( is => 'ro', isa => 'Any', required => 1 ); sub _build_message { my $self = shift; my $action = $self->action; return "Match action must be a CODE ref, not $action"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/MustSupplyAMetaclass.pm000640 000766 000024 00000000605 14137574636 023400 0ustar00etherstaff000000 000000 package Moose::Exception::MustSupplyAMetaclass; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::ParamsHash'; has 'class' => ( is => 'ro', isa => 'Str', required => 1 ); sub _build_message { my $self = shift; "You must pass a metaclass instance if you want to inline"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/InvalidHasProvidedInARole.pm000640 000766 000024 00000000552 14137574636 024227 0ustar00etherstaff000000 000000 package Moose::Exception::InvalidHasProvidedInARole; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Role'; has 'attribute_name' => ( is => 'ro', isa => 'Str', required => 1, ); sub _build_message { "Usage: has 'name' => ( key => value, ... )"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/OverrideConflictInSummation.pm000640 000766 000024 00000003230 14137574636 024717 0ustar00etherstaff000000 000000 package Moose::Exception::OverrideConflictInSummation; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; use Moose::Util 'find_meta'; has 'role_application' => ( is => 'ro', isa => 'Moose::Meta::Role::Application::RoleSummation', required => 1 ); has 'role_names' => ( traits => ['Array'], is => 'bare', isa => 'ArrayRef[Str]', handles => { role_names => 'elements', }, required => 1, documentation => "This attribute is an ArrayRef containing role names, if you want metaobjects\n". "associated with these role names, then call method roles on the exception object.\n", ); has 'method_name' => ( is => 'ro', isa => 'Str', required => 1 ); has 'two_overrides_found' => ( is => 'ro', isa => 'Bool', required => 1, default => 0 ); sub roles { my $self = shift; my @role_names = $self->role_names; my @roles = map { find_meta($_) } @role_names; return @roles; } sub _build_message { my $self = shift; my @roles = $self->role_names; my $role_names = join "|", @roles; if( $self->two_overrides_found ) { return "We have encountered an 'override' method conflict ". "during composition (Two 'override' methods of the same name encountered). ". "This is a fatal error."; } else { return "Role '$role_names' has encountered an 'override' method conflict " . "during composition (A local method of the same name has been found). This " . "is a fatal error." ; } } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/DoesRequiresRoleName.pm000640 000766 000024 00000000403 14137574636 023326 0ustar00etherstaff000000 000000 package Moose::Exception::DoesRequiresRoleName; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Class'; sub _build_message { "You must supply a role name to does()"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/CannotAddAsAnAttributeToARole.pm000640 000766 000024 00000000634 14137574636 025007 0ustar00etherstaff000000 000000 package Moose::Exception::CannotAddAsAnAttributeToARole; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::Role'; has 'attribute_class' => ( is => 'ro', isa => 'Str', required => 1, ); sub _build_message { my $self = shift; "Cannot add a ".$self->attribute_class." as an attribute to a role"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/CannotCreateHigherOrderTypeWithoutATypeParameter.pm000640 000766 000024 00000000501 14137574636 031013 0ustar00etherstaff000000 000000 package Moose::Exception::CannotCreateHigherOrderTypeWithoutATypeParameter; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::TypeConstraint'; sub _build_message { "You cannot create a Higher Order type without a type parameter"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/PackageNameAndNameParamsNotGivenToWrap.pm000640 000766 000024 00000000724 14137574636 026632 0ustar00etherstaff000000 000000 package Moose::Exception::PackageNameAndNameParamsNotGivenToWrap; our $VERSION = '2.2200'; use Moose; extends 'Moose::Exception'; with 'Moose::Exception::Role::ParamsHash'; has 'code' => ( is => 'ro', isa => 'CodeRef', required => 1 ); has 'class' => ( is => 'ro', isa => 'Str', required => 1 ); sub _build_message { "You must supply the package_name and name parameters"; } __PACKAGE__->meta->make_immutable; 1; Moose-2.2200/lib/Moose/Exception/Role/RoleForCreate.pm000640 000766 000024 00000000350 14137574636 022667 0ustar00etherstaff000000 000000 package Moose::Exception::Role::RoleForCreate; our $VERSION = '2.2200'; use Moose::Role; with 'Moose::Exception::Role::ParamsHash'; has 'attribute_class' => ( is => 'ro', isa => 'Str', required => 1, ); 1; Moose-2.2200/lib/Moose/Exception/Role/Instance.pm000640 000766 000024 00000000264 14137574636 021743 0ustar00etherstaff000000 000000 package Moose::Exception::Role::Instance; our $VERSION = '2.2200'; use Moose::Role; has 'instance' => ( is => 'ro', isa => 'Object', required => 1, ); 1; Moose-2.2200/lib/Moose/Exception/Role/RoleForCreateMOPClass.pm000640 000766 000024 00000000346 14137574636 024236 0ustar00etherstaff000000 000000 package Moose::Exception::Role::RoleForCreateMOPClass; our $VERSION = '2.2200'; use Moose::Role; with 'Moose::Exception::Role::ParamsHash'; has 'class' => ( is => 'ro', isa => 'Str', required => 1, ); 1; Moose-2.2200/lib/Moose/Exception/Role/Attribute.pm000640 000766 000024 00000000330 14137574636 022134 0ustar00etherstaff000000 000000 package Moose::Exception::Role::Attribute; our $VERSION = '2.2200'; use Moose::Role; has 'attribute' => ( is => 'ro', isa => 'Class::MOP::Attribute', predicate => 'is_attribute_set' ); 1; Moose-2.2200/lib/Moose/Exception/Role/InvalidAttributeOptions.pm000640 000766 000024 00000000361 14137574636 025023 0ustar00etherstaff000000 000000 package Moose::Exception::Role::InvalidAttributeOptions; our $VERSION = '2.2200'; use Moose::Role; with 'Moose::Exception::Role::ParamsHash'; has 'attribute_name' => ( is => 'ro', isa => 'Str', required => 1, ); 1; Moose-2.2200/lib/Moose/Exception/Role/Role.pm000640 000766 000024 00000000657 14137574636 021106 0ustar00etherstaff000000 000000 package Moose::Exception::Role::Role; our $VERSION = '2.2200'; # use Moose::Util 'throw_exception'; use Moose::Role; has 'role_name' => ( is => 'ro', isa => 'Str', required => 1, documentation => "This attribute can be used for fetching the class's metaclass instance:\n". " my \$metaclass_instance = Moose::Util::find_meta( \$exception->role_name );\n", ); 1; Moose-2.2200/lib/Moose/Exception/Role/InstanceClass.pm000640 000766 000024 00000000274 14137574636 022732 0ustar00etherstaff000000 000000 package Moose::Exception::Role::InstanceClass; our $VERSION = '2.2200'; use Moose::Role; has 'instance_class' => ( is => 'ro', isa => 'Str', required => 1, ); 1; Moose-2.2200/lib/Moose/Exception/Role/TypeConstraint.pm000640 000766 000024 00000000673 14137574636 023171 0ustar00etherstaff000000 000000 package Moose::Exception::Role::TypeConstraint; our $VERSION = '2.2200'; use Moose::Role; has 'type_name' => ( is => 'ro', isa => 'Str', required => 1, documentation => "This attribute can be used for fetching type constraint(Moose::Meta::TypeConstraint):\n". " my \$type_constraint = Moose::Util::TypeConstraints::find_type_constraint( \$exception->type_name );\n", ); 1; Moose-2.2200/lib/Moose/Exception/Role/ParamsHash.pm000640 000766 000024 00000000265 14137574636 022227 0ustar00etherstaff000000 000000 package Moose::Exception::Role::ParamsHash; our $VERSION = '2.2200'; use Moose::Role; has 'params' => ( is => 'ro', isa => 'HashRef', required => 1, ); 1; Moose-2.2200/lib/Moose/Exception/Role/EitherAttributeOrAttributeName.pm000640 000766 000024 00000002063 14137574636 026270 0ustar00etherstaff000000 000000 package Moose::Exception::Role::EitherAttributeOrAttributeName; our $VERSION = '2.2200'; use Moose::Util 'throw_exception'; use Moose::Role; has 'attribute_name' => ( is => 'ro', isa => 'Str', lazy_build => 1 ); has 'attribute' => ( is => 'ro', isa => 'Class::MOP::Attribute', predicate => 'has_attribute' ); has 'params' => ( is => 'ro', isa => 'HashRef', predicate => 'has_params', ); sub _build_attribute_name { my $self = shift; if( !$self->has_attribute ) { throw_exception("NeitherAttributeNorAttributeNameIsGiven"); } return $self->attribute->name; } after "BUILD" => sub { my $self = $_[0]; if( $self->has_attribute_name && $self->has_attribute && ( $self->attribute->name ne $self->attribute_name ) ) { throw_exception( AttributeNamesDoNotMatch => attribute_name => $self->attribute_name, attribute => $self->attribute ); } }; 1; Moose-2.2200/lib/Moose/Exception/Role/Method.pm000640 000766 000024 00000000275 14137574636 021421 0ustar00etherstaff000000 000000 package Moose::Exception::Role::Method; our $VERSION = '2.2200'; use Moose::Role; has 'method' => ( is => 'ro', isa => 'Moose::Meta::Method', required => 1, ); 1; Moose-2.2200/lib/Moose/Exception/Role/AttributeName.pm000640 000766 000024 00000000273 14137574636 022743 0ustar00etherstaff000000 000000 package Moose::Exception::Role::AttributeName; our $VERSION = '2.2200'; use Moose::Role; has 'attribute_name' => ( is => 'ro', isa => 'Str', required => 1 ); 1; Moose-2.2200/lib/Moose/Exception/Role/Class.pm000640 000766 000024 00000000600 14137574636 021236 0ustar00etherstaff000000 000000 package Moose::Exception::Role::Class; our $VERSION = '2.2200'; use Moose::Role; has 'class_name' => ( is => 'ro', isa => 'Str', required => 1, documentation => "This attribute can be used for fetching metaclass instance:\n". " my \$metaclass_instance = Moose::Util::find_meta( \$exception->class_name );\n", ); 1; Moose-2.2200/lib/Moose/Manual/Classes.pod000644 000766 000024 00000013007 14137574636 020323 0ustar00etherstaff000000 000000 # PODNAME: Moose::Manual::Classes # ABSTRACT: Making your classes use Moose (and subclassing) __END__ =pod =encoding UTF-8 =head1 NAME Moose::Manual::Classes - Making your classes use Moose (and subclassing) =head1 VERSION version 2.2200 =head1 USING MOOSE Using Moose is very simple, you just C: package Person; use Moose; That's it, you've made a class with Moose! There's actually a lot going on here under the hood, so let's step through it. When you load L, a bunch of sugar functions are exported into your class, such as C, C, C, and more. These functions are what you use to define your class. For example, you might define an attribute ... package Person; use Moose; has 'ssn' => ( is => 'rw' ); Attributes are described in the L documentation. Loading Moose also enables the C and C pragmas in your class. When you load Moose, your class will become a subclass of L. The L class provides a default constructor and destructor, as well as object construction helper methods. You can read more about this in the L document. As a convenience, Moose creates a new class type for your class. See the L document to learn more about types. It also creates a L object for your class. This metaclass object is now available by calling a C method on your class, for example C<< Person->meta >>. The metaclass object provides an introspection API for your class. It is also used by Moose itself under the hood to add attributes, define parent classes, and so on. In fact, all of Moose's sugar does the real work by calling methods on this metaclass object (and other meta API objects). =head1 SUBCLASSING Moose provides a simple sugar function for declaring your parent classes, C: package User; use Moose; extends 'Person'; has 'username' => ( is => 'rw' ); Note that each call to C will I your parents. For multiple inheritance you must provide all the parents at once, C. When you call C Moose will try to load any classes you pass. You can use Moose to extend a non-Moose parent. However, when you do this, you will inherit the parent class's constructor (assuming it is also called C). In that case, you will have to take care of initializing attributes manually, either in the parent's constructor, or in your subclass, and you will lose a lot of Moose magic. See the L module on CPAN if you're interested in extending non-Moose parent classes with Moose child classes. =head1 CLEANING UP MOOSE DROPPINGS Moose exports a number of functions into your class. It's a good idea to remove these sugar functions from your class's namespace, so that C<< Person->can('has') >> will no longer return true. There are several ways to do this. We recommend using L, a CPAN module. Not only will it remove Moose exports, it will also remove any other exports. package Person; use namespace::autoclean; use Moose; If you absolutely can't use a CPAN module (but can use Moose?), you can write C at the end of your class. This will remove any Moose exports in your class. package Person; use Moose; has 'ssn' => ( is => 'rw' ); no Moose; =head1 MAKING IT FASTER Moose has a feature called "immutabilization" that you can use to greatly speed up your classes at runtime. However, using it incurs a cost when your class is first being loaded. When you make your class immutable you tell Moose that you will not be changing it in the future. You will not be adding any more attributes, methods, roles, etc. This allows Moose to generate code specific to your class. In particular, it creates an "inline" constructor, making object construction much faster. To make your class immutable you simply call C on your class's metaclass object. __PACKAGE__->meta->make_immutable; =head2 Immutabilization and C If you override C in your class, then the immutabilization code will not be able to provide an optimized constructor for your class. Instead, you should use a C method, which will be called from the inlined constructor. Alternately, if you really need to provide a different C, you can also provide your own immutabilization method. Doing so requires extending the Moose metaclasses, and is well beyond the scope of this manual. =head1 INSTANTIATING CLASSES When you're ready to use Moose classes in an application, reference them in your code in the regular Perl OO way by including a C directive at the top of the file where the objects should be created. use Person; my $person = Person->new( # attribute values at instantiation # go here ssn => '123456789', ); =head1 AUTHORS =over 4 =item * Stevan Little =item * Dave Rolsky =item * Jesse Luehrs =item * Shawn M Moore =item * יובל קוג'מן (Yuval Kogman) =item * Karen Etheridge =item * Florian Ragwitz =item * Hans Dieter Pearcey =item * Chris Prather =item * Matt S Trout =back =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2006 by Infinity Interactive, Inc. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Moose-2.2200/lib/Moose/Manual/BestPractices.pod000644 000766 000024 00000020710 14137574636 021460 0ustar00etherstaff000000 000000 # PODNAME: Moose::Manual::BestPractices # ABSTRACT: Get the most out of Moose __END__ =pod =encoding UTF-8 =head1 NAME Moose::Manual::BestPractices - Get the most out of Moose =head1 VERSION version 2.2200 =head1 RECOMMENDATIONS Moose has a lot of features, and there's definitely more than one way to do it. However, we think that picking a subset of these features and using them consistently makes everyone's life easier. Of course, as with any list of "best practices", these are really just opinions. Feel free to ignore us. =head2 C and immutabilize We recommend that you remove the Moose sugar and end your Moose class definitions by making your class immutable. package Person; use Moose; use namespace::autoclean; # extends, roles, attributes, etc. # methods __PACKAGE__->meta->make_immutable; 1; The C bit is simply good code hygiene, as it removes imported symbols from your class's namespace at the end of your package's compile cycle, including Moose keywords. Once the class has been built, these keywords are not needed. (This is preferred to placing C at the end of your package). The C call allows Moose to speed up a lot of things, most notably object construction. The trade-off is that you can no longer change the class definition. =head2 Never override C Overriding C is a very bad practice. Instead, you should use a C or C methods to do the same thing. When you override C, Moose can no longer inline a constructor when your class is immutabilized. There are two good reasons to override C. One, you are writing a MooseX extension that provides its own L subclass I a subclass of L to inline the constructor. Two, you are subclassing a non-Moose parent. If you know how to do that, you know when to ignore this best practice ;) =head2 Always call the original/parent C If you C the C method in your class, make sure to play nice and call C to handle cases you're not checking for explicitly. The default C method in L handles both a list and hashref of named parameters correctly, and also checks for a I single argument. =head2 Provide defaults whenever possible, otherwise use C When your class provides defaults, this makes constructing new objects simpler. If you cannot provide a default, consider making the attribute C. If you don't do either, an attribute can simply be left unset, increasing the complexity of your object, because it has more possible states that you or the user of your class must account for. =head2 Use C instead of C most of the time Builders can be inherited, they have explicit names, and they're just plain cleaner. However, I use a default when the default is a non-reference, I when the default is simply an empty reference of some sort. Also, keep your builder methods private. =head2 Be C Lazy is good, and often solves initialization ordering problems. It's also good for deferring work that may never have to be done. Make your attributes C unless they're C or have trivial defaults. =head2 Consider keeping clearers and predicates private Does everyone I need to be able to clear an attribute? Probably not. Don't expose this functionality outside your class by default. Predicates are less problematic, but there's no reason to make your public API bigger than it has to be. =head2 Avoid C As described above, you rarely actually need a clearer or a predicate. C adds both to your public API, which exposes you to use cases that you must now test for. It's much better to avoid adding them until you really need them - use explicit C and C options instead. =head2 Default to read-only, and consider keeping writers private Making attributes mutable just means more complexity to account for in your program. The alternative to mutable state is to encourage users of your class to simply make new objects as needed. If you I make an attribute read-write, consider making the writer a separate private method. Narrower APIs are easy to maintain, and mutable state is trouble. In order to declare such attributes, provide a private C parameter: has pizza => ( is => 'ro', isa => 'Pizza', writer => '_pizza', ); =head2 Think twice before changing an attribute's type in a subclass Down this path lies great confusion. If the attribute is an object itself, at least make sure that it has the same interface as the type of object in the parent class. =head2 Don't use the C feature Don't know what we're talking about? That's fine. =head2 Use L traits instead of C The C feature is a bit troublesome. Directly exposing a complex attribute is ugly. Instead, consider using L traits to define an API that only exposes the necessary pieces of functionality. =head2 Always call C in the most specific subclass When using C and C, we recommend that you call C in the most specific subclass of your hierarchy. This makes it possible to subclass further and extend the hierarchy without changing the parents. =head2 Namespace your types Use some sort of namespacing convention for type names. We recommend something like "MyApp::Type::Foo". We also recommend considering L. =head2 Do not coerce Moose built-ins directly If you define a coercion for a Moose built-in like C, this will affect every application in the Perl interpreter that uses this type. # very naughty! coerce 'ArrayRef' => from Str => via { [ split /,/ ] }; Instead, create a subtype and coerce that: subtype 'My::ArrayRef' => as 'ArrayRef'; coerce 'My::ArrayRef' => from 'Str' => via { [ split /,/ ] }; =head2 Do not coerce class names directly Just as with Moose built-in types, a class type is global for the entire interpreter. If you add a coercion for that class name, it can have magical side effects elsewhere: # also very naughty! coerce 'HTTP::Headers' => from 'HashRef' => via { HTTP::Headers->new( %{$_} ) }; Instead, we can create an "empty" subtype for the coercion: subtype 'My::HTTP::Headers' => as class_type('HTTP::Headers'); coerce 'My::HTTP::Headers' => from 'HashRef' => via { HTTP::Headers->new( %{$_} ) }; =head2 Use coercion instead of unions Consider using a type coercion instead of a type union. This was covered in L. =head2 Define all your types in one module Define all your types and coercions in one module. This was also covered in L. =head1 BENEFITS OF BEST PRACTICES Following these practices has a number of benefits. It helps ensure that your code will play nice with others, making it more reusable and easier to extend. Following an accepted set of idioms will make maintenance easier, especially when someone else has to maintain your code. It will also make it easier to get support from other Moose users, since your code will be easier to digest quickly. Some of these practices are designed to help Moose do the right thing, especially when it comes to immutabilization. This means your code will be faster when immutabilized. Many of these practices also help get the most out of meta programming. If you used an overridden C to do type coercion by hand, rather than defining a real coercion, there is no introspectable metadata. This sort of thing is particularly problematic for MooseX extensions which rely on introspection to do the right thing. =head1 AUTHORS =over 4 =item * Stevan Little =item * Dave Rolsky =item * Jesse Luehrs =item * Shawn M Moore =item * יובל קוג'מן (Yuval Kogman) =item * Karen Etheridge =item * Florian Ragwitz =item * Hans Dieter Pearcey =item * Chris Prather =item * Matt S Trout =back =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2006 by Infinity Interactive, Inc. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Moose-2.2200/lib/Moose/Manual/Attributes.pod000600 000766 000024 00000050713 14137574636 021051 0ustar00etherstaff000000 000000 # PODNAME: Moose::Manual::Attributes # ABSTRACT: Object attributes with Moose __END__ =pod =encoding UTF-8 =head1 NAME Moose::Manual::Attributes - Object attributes with Moose =head1 VERSION version 2.2200 =head1 INTRODUCTION Moose attributes have many properties, and attributes are probably the single most powerful and flexible part of Moose. You can create a powerful class simply by declaring attributes. In fact, it's possible to have classes that consist solely of attribute declarations. An attribute is a property that every member of a class has. For example, we might say that "every C object has a first name and last name". Attributes can be optional, so that we can say "some C objects have a social security number (and some don't)". At its simplest, an attribute can be thought of as a named value (as in a hash) that can be read and set. However, attributes can also have defaults, type constraints, delegation and much more. In other languages, attributes are also referred to as slots or properties. =head1 ATTRIBUTE OPTIONS Use the C function to declare an attribute: package Person; use Moose; has 'first_name' => ( is => 'rw' ); This says that all C objects have an optional read-write "first_name" attribute. =head2 Read-write vs. read-only The options passed to C define the properties of the attribute. There are many options, but in the simplest form you just need to set C, which can be either C (read-only) or C (read-write). When an attribute is C, you can change it by passing a value to its accessor. When an attribute is C, you may only read the current value of the attribute through its accessor. You can, however, set the attribute when creating the object by passing it to the constructor. In fact, you could even omit C, but that gives you an attribute that has no accessor. This can be useful with other attribute options, such as C. However, if your attribute generates I accessors, Moose will issue a warning, because that usually means the programmer forgot to say the attribute is read-only or read-write. If you really mean to have no accessors, you can silence this warning by setting C to C. =head2 Accessor methods Each attribute has one or more accessor methods. An accessor lets you read and write the value of that attribute for an object. By default, the accessor method has the same name as the attribute. If you declared your attribute as C then your accessor will be read-only. If you declared it as C, you get a read-write accessor. Simple. Given our C example above, we now have a single C accessor that can read or write a C object's C attribute's value. If you want, you can also explicitly specify the method names to be used for reading and writing an attribute's value. This is particularly handy when you'd like an attribute to be publicly readable, but only privately settable. For example: has 'weight' => ( is => 'ro', writer => '_set_weight', ); This might be useful if weight is calculated based on other methods. For example, every time the C method is called, we might adjust weight. This lets us hide the implementation details of weight changes, but still provide the weight value to users of the class. Some people might prefer to have distinct methods for reading and writing. In I, Damian Conway recommends that reader methods start with "get_" and writer methods start with "set_". We can do exactly that by providing names for both the C and C methods: has 'weight' => ( is => 'rw', reader => 'get_weight', writer => 'set_weight', ); If you're thinking that doing this over and over would be insanely tedious, you're right! Fortunately, Moose provides a powerful extension system that lets you override the default naming conventions. See L for more details. =head2 Predicate and clearer methods Moose allows you to explicitly distinguish between a false or undefined attribute value and an attribute which has not been set. If you want to access this information, you must define clearer and predicate methods for an attribute. A predicate method tells you whether or not a given attribute is currently set. Note that an attribute can be explicitly set to C or some other false value, but the predicate will return true. The clearer method unsets the attribute. This is I the same as setting the value to C, but you can only distinguish between them if you define a predicate method! Here's some code to illustrate the relationship between an accessor, predicate, and clearer method. package Person; use Moose; has 'ssn' => ( is => 'rw', clearer => 'clear_ssn', predicate => 'has_ssn', ); ... my $person = Person->new(); $person->has_ssn; # false $person->ssn(undef); $person->ssn; # returns undef $person->has_ssn; # true $person->clear_ssn; $person->ssn; # returns undef $person->has_ssn; # false $person->ssn('123-45-6789'); $person->ssn; # returns '123-45-6789' $person->has_ssn; # true my $person2 = Person->new( ssn => '111-22-3333'); $person2->has_ssn; # true By default, Moose does not make a predicate or clearer for you. You must explicitly provide names for them, and then Moose will create the methods for you. =head2 Required or not? By default, all attributes are optional, and do not need to be provided at object construction time. If you want to make an attribute required, simply set the C option to true: has 'name' => ( is => 'ro', required => 1, ); There are a couple caveats worth mentioning in regards to what "required" actually means. Basically, all it says is that this attribute (C) must be provided to the constructor or it must have either a default or a builder. It does not say anything about its value, so it could be C. If you define a clearer method on a required attribute, the clearer I work, so even a required attribute can be unset after object construction. This means that if you do make an attribute required, providing a clearer doesn't make much sense. In some cases, it might be handy to have a I C and C for a required attribute. =head2 Default and builder methods Attributes can have default values, and Moose provides two ways to specify that default. In the simplest form, you simply provide a non-reference scalar value for the C option: has 'size' => ( is => 'ro', default => 'medium', predicate => 'has_size', ); If the size attribute is not provided to the constructor, then it ends up being set to C: my $person = Person->new(); $person->size; # medium $person->has_size; # true You can also provide a subroutine reference for C. This reference will be called as a method on the object. has 'size' => ( is => 'ro', default => sub { ( 'small', 'medium', 'large' )[ int( rand 3 ) ] }, predicate => 'has_size', ); This is a trivial example, but it illustrates the point that the subroutine will be called for every new object created. When you provide a C subroutine reference, it is called as a method on the object, with no additional parameters: has 'size' => ( is => 'ro', default => sub { my $self = shift; return $self->height > 200 ? 'large' : 'average'; }, ); When the C is called during object construction, it may be called before other attributes have been set. If your default is dependent on other parts of the object's state, you can make the attribute C. Laziness is covered in the next section. If you want to use a reference of any sort as the default value, you must return it from a subroutine. has 'mapping' => ( is => 'ro', default => sub { {} }, ); This is necessary because otherwise Perl would instantiate the reference exactly once, and it would be shared by all objects: has 'mapping' => ( is => 'ro', default => {}, # wrong! ); Moose will throw an error if you pass a bare non-subroutine reference as the default. If Moose allowed this then the default mapping attribute could easily end up shared across many objects. Instead, wrap it in a subroutine reference as we saw above. This is a bit awkward, but it's just the way Perl works. As an alternative to using a subroutine reference, you can supply a C method for your attribute: has 'size' => ( is => 'ro', builder => '_build_size', predicate => 'has_size', ); sub _build_size { return ( 'small', 'medium', 'large' )[ int( rand 3 ) ]; } This has several advantages. First, it moves a chunk of code to its own named method, which improves readability and code organization. Second, because this is a I method, it can be subclassed or provided by a role. We strongly recommend that you use a C instead of a C for anything beyond the most trivial default. A C, just like a C, is called as a method on the object with no additional parameters. =head3 Builders allow subclassing Because the C is called I, it goes through Perl's method resolution. This means that builder methods are both inheritable and overridable. If we subclass our C class, we can override C<_build_size>: package Lilliputian; use Moose; extends 'Person'; sub _build_size { return 'small' } =head3 Builders work well with roles Because builders are called by name, they work well with roles. For example, a role could provide an attribute but require that the consuming class provide the C: package HasSize; use Moose::Role; requires '_build_size'; has 'size' => ( is => 'ro', lazy => 1, builder => '_build_size', ); package Lilliputian; use Moose; with 'HasSize'; sub _build_size { return 'small' } Roles are covered in L. =head2 Laziness Moose lets you defer attribute population by making an attribute C: has 'size' => ( is => 'ro', lazy => 1, builder => '_build_size', ); When C is true, the default is not generated until the reader method is called, rather than at object construction time. There are several reasons you might choose to do this. First, if the default value for this attribute depends on some other attributes, then the attribute I be C. During object construction, defaults are not generated in a predictable order, so you cannot count on some other attribute being populated when generating a default. Second, there's often no reason to calculate a default before it's needed. Making an attribute C lets you defer the cost until the attribute is needed. If the attribute is I needed, you save some CPU time. We recommend that you make any attribute with a builder or non-trivial default C as a matter of course. =head3 Lazy defaults and C<$_> Please note that a lazy default or builder can be called anywhere, even inside a C or C. This means that if your default sub or builder changes C<$_>, something weird could happen. You can prevent this by adding C inside your default or builder. =head2 Constructor parameters (C) By default, each attribute can be passed by name to the class's constructor. On occasion, you may want to use a different name for the constructor parameter. You may also want to make an attribute unsettable via the constructor. You can do either of these things with the C option: has 'bigness' => ( is => 'ro', init_arg => 'size', ); Now we have an attribute named "bigness", but we pass C to the constructor. Even more useful is the ability to disable setting an attribute via the constructor. This is particularly handy for private attributes: has '_genetic_code' => ( is => 'ro', lazy => 1, builder => '_build_genetic_code', init_arg => undef, ); By setting the C to C, we make it impossible to set this attribute when creating a new object. =head2 Weak references Moose has built-in support for weak references. If you set the C option to a true value, then it will call C whenever the attribute is set: has 'parent' => ( is => 'rw', weak_ref => 1, ); $node->parent($parent_node); This is very useful when you're building objects that may contain circular references. When the object in a weak reference goes out of scope, the attribute's value will become C "behind the scenes". This is done by the Perl interpreter directly, so Moose does not see this change. This means that triggers don't fire, coercions aren't applied, etc. The attribute is not cleared, so a predicate method for that attribute will still return true. Similarly, when the attribute is next accessed, a default value will not be generated. =head2 Triggers A C is a subroutine that is called whenever the attribute is set: has 'size' => ( is => 'rw', trigger => \&_size_set, ); sub _size_set { my ( $self, $size, $old_size ) = @_; my $msg = $self->name; if ( @_ > 2 ) { $msg .= " - old size was $old_size"; } $msg .= " - size is now $size"; warn $msg; } The trigger is called I an attribute's value is set. It is called as a method on the object, and receives the new and old values as its arguments. If the attribute had not previously been set at all, then only the new value is passed. This lets you distinguish between the case where the attribute had no value versus when the old value was C. This differs from an C method modifier in two ways. First, a trigger is only called when the attribute is set, as opposed to whenever the accessor method is called (for reading or writing). Second, it is also called when an attribute's value is passed to the constructor. However, triggers are I called when an attribute is populated from a C or C. =head2 Attribute types Attributes can be restricted to only accept certain types: has 'first_name' => ( is => 'ro', isa => 'Str', ); This says that the C attribute must be a string. Moose also provides a shortcut for specifying that an attribute only accepts objects that do a certain role: has 'weapon' => ( is => 'rw', does => 'MyApp::Weapon', ); See the L documentation for a complete discussion of Moose's type system. =head2 Delegation An attribute can define methods which simply delegate to its value: has 'hair_color' => ( is => 'ro', isa => 'Graphics::Color::RGB', handles => { hair_color_hex => 'as_hex_string' }, ); This adds a new method, C. When someone calls C, internally, the object just calls C<< $self->hair_color->as_hex_string >>. See L for documentation on how to set up delegation methods. =head2 Attribute traits and metaclasses One of Moose's best features is that it can be extended in all sorts of ways through the use of metaclass traits and custom metaclasses. You can apply one or more traits to an attribute: use MooseX::MetaDescription; has 'size' => ( is => 'ro', traits => ['MooseX::MetaDescription::Meta::Trait'], description => { html_widget => 'text_input', serialize_as => 'element', }, ); The advantage of traits is that you can mix more than one of them together easily (in fact, a trait is just a role under the hood). There are a number of MooseX modules on CPAN which provide useful attribute metaclasses and traits. See L for some examples. You can also write your own metaclasses and traits. See the "Meta" and "Extending" recipes in L for examples. =head2 Native Delegations Native delegations allow you to delegate to standard Perl data structures as if they were objects. For example, we can pretend that an array reference has methods like C, C, C, C, and more. has 'options' => ( traits => ['Array'], is => 'ro', isa => 'ArrayRef[Str]', default => sub { [] }, handles => { all_options => 'elements', add_option => 'push', map_options => 'map', option_count => 'count', sorted_options => 'sort', }, ); See L for more details. =head1 ATTRIBUTE INHERITANCE By default, a child inherits all of its parent class(es)' attributes as-is. However, you can change most aspects of the inherited attribute in the child class. You cannot change any of its associated method names (reader, writer, predicate, etc). To change some aspects of an attribute, you simply prepend a plus sign (C<+>) to its name: package LazyPerson; use Moose; extends 'Person'; has '+first_name' => ( lazy => 1, default => 'Bill', ); Now the C attribute in C is lazy, and defaults to C<'Bill'>. We recommend that you exercise caution when changing the type (C) of an inherited attribute. =head2 Attribute Inheritance and Method Modifiers When an inherited attribute is defined, that creates an entirely new set of accessors for the attribute (reader, writer, predicate, etc.). This is necessary because these may be what was changed when inheriting the attribute. As a consequence, any method modifiers defined on the attribute's accessors in an ancestor class will effectively be ignored, because the new accessors live in the child class and do not see the modifiers from the parent class. =head1 MULTIPLE ATTRIBUTE SHORTCUTS If you have a number of attributes that differ only by name, you can declare them all at once: package Point; use Moose; has [ 'x', 'y' ] => ( is => 'ro', isa => 'Int' ); Also, because C is just a function call, you can call it in a loop: for my $name ( qw( x y ) ) { my $builder = '_build_' . $name; has $name => ( is => 'ro', isa => 'Int', builder => $builder ); } =head1 MORE ON ATTRIBUTES Moose attributes are a big topic, and this document glosses over a few aspects. We recommend that you read the L and L documents to get a more complete understanding of attribute features. =head1 A FEW MORE OPTIONS Moose has lots of attribute options. The ones listed below are superseded by some more modern features, but are covered for the sake of completeness. =head2 The C option You can provide a piece of documentation as a string for an attribute: has 'first_name' => ( is => 'rw', documentation => q{The person's first (personal) name}, ); Moose does absolutely nothing with this information other than store it. =head2 The C option If your attribute is an array reference or hash reference, the C option will make Moose dereference the value when it is returned from the reader method I: my %map = $object->mapping; This option only works if your attribute is explicitly typed as an C or C. When the reader is called in I context, the reference itself is returned. However, we recommend that you use L traits for these types of attributes, which gives you much more control over how they are accessed and manipulated. See also L. =head2 Initializer Moose provides an attribute option called C. This is called when the attribute's value is being set in the constructor, and lets you change the value before it is set. =head1 AUTHORS =over 4 =item * Stevan Little =item * Dave Rolsky =item * Jesse Luehrs =item * Shawn M Moore =item * יובל קוג'מן (Yuval Kogman) =item * Karen Etheridge =item * Florian Ragwitz =item * Hans Dieter Pearcey =item * Chris Prather =item * Matt S Trout =back =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2006 by Infinity Interactive, Inc. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Moose-2.2200/lib/Moose/Manual/Roles.pod000600 000766 000024 00000035051 14137574636 020005 0ustar00etherstaff000000 000000 # PODNAME: Moose::Manual::Roles # ABSTRACT: Roles, an alternative to deep hierarchies and base classes __END__ =pod =encoding UTF-8 =head1 NAME Moose::Manual::Roles - Roles, an alternative to deep hierarchies and base classes =head1 VERSION version 2.2200 =head1 WHAT IS A ROLE? A role encapsulates some piece of behavior or state that can be shared between classes. It is something that classes I. It is important to understand that I. You cannot inherit from a role, and a role cannot be instantiated. We sometimes say that roles are I, either by classes or other roles. Instead, a role is I into a class. In practical terms, this means that all of the methods, method modifiers, and attributes defined in a role are added directly to (we sometimes say "flattened into") the class that consumes the role. These attributes and methods then appear as if they were defined in the class itself. A subclass of the consuming class will inherit all of these methods and attributes. Moose roles are similar to mixins or interfaces in other languages and are based on the L for the Smalltalk-80 dialect Squeak. Besides defining their own methods and attributes, roles can also require that the consuming class define certain methods of its own. You could have a role that consisted only of a list of required methods, in which case the role would be very much like a Java interface. Note that attribute accessors also count as methods for the purposes of satisfying the requirements of a role. =head1 A SIMPLE ROLE Creating a role looks a lot like creating a Moose class: package Breakable; use Moose::Role; has 'is_broken' => ( is => 'rw', isa => 'Bool', ); sub break { my $self = shift; print "I broke\n"; $self->is_broken(1); } Except for our use of L, this looks just like a class definition with Moose. However, this is not a class, and it cannot be instantiated. Instead, its attributes and methods will be composed into classes which use the role: package Car; use Moose; with 'Breakable'; has 'engine' => ( is => 'ro', isa => 'Engine', ); The C function composes roles into a class. Once that is done, the C class has an C attribute and a C method. The C class also C: my $car = Car->new( engine => Engine->new ); print $car->is_broken ? 'Busted' : 'Still working'; $car->break; print $car->is_broken ? 'Busted' : 'Still working'; $car->does('Breakable'); # true This prints: Still working I broke Busted We could use this same role in a C class: package Bone; use Moose; with 'Breakable'; has 'marrow' => ( is => 'ro', isa => 'Marrow', ); See also L for an example. It's possible to compose existing roles into new roles. For example, we can have a C class which applies both the C and C roles to any class which consumes it: package HandleWithCare; use Moose::Role; with 'Breakable', 'Package'; =head1 REQUIRED METHODS As mentioned previously, a role can require that consuming classes provide one or more methods. Using our C example, let's make it require that consuming classes implement their own C methods: package Breakable; use Moose::Role; requires 'break'; has 'is_broken' => ( is => 'rw', isa => 'Bool', ); after 'break' => sub { my $self = shift; $self->is_broken(1); }; If we try to consume this role in a class that does not have a C method, we will get an exception. You can see that we added a method modifier on C. We want classes that consume this role to implement their own logic for breaking, but we make sure that the C attribute is always set to true when C is called. package Car use Moose; with 'Breakable'; has 'engine' => ( is => 'ro', isa => 'Engine', ); sub break { my $self = shift; if ( $self->is_moving ) { $self->stop; } } =head2 Roles Versus Abstract Base Classes If you are familiar with the concept of abstract base classes in other languages, you may be tempted to use roles in the same way. You I define an "interface-only" role, one that contains I a list of required methods. However, any class which consumes this role must implement all of the required methods, either directly or through inheritance from a parent. You cannot delay the method requirement check so that they can be implemented by future subclasses. Because the role defines the required methods directly, adding a base class to the mix would not achieve anything. We recommend that you simply consume the interface role in each class which implements that interface. =head1 CONSUMING ROLES Roles are consumed using the C function. Most of the time, you should only use one C, even if you are consuming multiple roles. If you consume roles using multiple C statements Moose cannot detect method conflicts between those roles. Roles can be consumed by classes or by other roles. When a class consumes a role which in turn consumes other roles, the class gets all of the roles applied at once. =head2 Required Methods Provided by Attributes As mentioned before, a role's required method may also be satisfied by an attribute accessor. However, the call to C which defines an attribute happens at runtime. This means that you must define the attribute I consuming the role, or else the role will not see the generated accessor. These attributes are L. package Breakable; use Moose::Role; requires 'stress'; ######## package Car; use Moose; has 'stress' => ( is => 'ro', isa => 'Int', ); with 'Breakable'; In general, we recommend that you always consume roles I declaring all your attributes. It may also be the case that a class wants to consume two roles where one role has an attribute providing a required method for another. For example: package Breakable; use Moose::Role; requires 'stress'; ######## package Stressable; use Moose::Role; has 'stress' => ( is => 'ro', isa => 'Int', ); ######## package Car; use Moose; # XXX - this will not work with 'Breakable', 'Stressable'; However, this won't work. The problem is that the accessor methods created for the C attribute won't be present in the class when the required method checks are done. There are two possible workarounds. The recommended one is to use "stub" subroutine(s) in the role providing the accessor(s): package Stressable; use Moose::Role; sub stress; has 'stress' => ( is => 'ro', isa => 'Int', ); The C line is called a "forward" declaration in the Perl documentation. It creates what is called a "stub" subroutine, a declaration without a body. This is good enough to satisfy the required method checks done by Moose. The stub will not interfere with the creation of a real subroutine later. The other alternative is to use two separate calls to C in the consuming class: package Car; use Moose; # Not recommended with 'Stressable'; with 'Breakable'; Each C is run as it is seen. The first call will consume just the C role, which will add the C attribute to the C package, which in turn will create an accessor method named C. Then when the C role is consumed, the method it requires already exists. However, as mentioned earlier, multiple C declarations are not recommended, because method conflicts between the roles cannot be seen. In the example above, if both C and C contained methods of the same name, what would happen is that the version in C would I override the one in C. =head1 USING METHOD MODIFIERS Method modifiers and roles are a very powerful combination. Often, a role will combine method modifiers and required methods. We already saw one example with our C example. Method modifiers increase the complexity of roles, because they make the role application order relevant. If a class uses multiple roles, each of which modify the same method, those modifiers will be applied in the same order as the roles are used: package MovieCar; use Moose; extends 'Car'; with 'Breakable', 'ExplodesOnBreakage'; Assuming that the new C role I has an C modifier on C, the C modifiers will run one after the other. The modifier from C will run first, then the one from C. =head1 METHOD CONFLICTS If a class composes multiple roles, and those roles have methods of the same name, we will have a conflict. In that case, the composing class is required to provide its I method of the same name. package Breakdancer; use Moose::Role; sub break { } If we compose both C and C in a class, we must provide our own C method: package FragileDancer; use Moose; with 'Breakable', 'Breakdancer'; sub break { ... } A role can be a collection of other roles: package Break::Bundle; use Moose::Role; with ('Breakable', 'Breakdancer'); When a role consumes another a role, the I role's methods silently win in any conflict, and the consumed role's methods are simply ignored. =head1 METHOD EXCLUSION AND ALIASING If we want our C class to be able to call the methods from both its roles, we can alias the methods: package FragileDancer; use Moose; with 'Breakable' => { -alias => { break => 'break_bone' } }, 'Breakdancer' => { -alias => { break => 'break_dance' } }; However, aliasing a method simply makes a I of the method with the new name. We also need to exclude the original name: with 'Breakable' => { -alias => { break => 'break_bone' }, -excludes => 'break', }, 'Breakdancer' => { -alias => { break => 'break_dance' }, -excludes => 'break', }; The excludes parameter prevents the C method from being composed into the C class, so we don't have a conflict. This means that C does not need to implement its own C method. This is useful, but it's worth noting that this breaks the contract implicit in consuming a role. Our C class does both the C and C, but does not provide a C method. If some API expects an object that does one of those roles, it probably expects it to implement that method. In some use cases we might alias and exclude methods from roles, but then provide a method of the same name in the class itself. Also see L for an example. =head1 OVERLOADING When a Moose role uses overloading, that overloading is composed into any classes that consume the role. This includes the setting of the C value for that role's overloading. Just as with methods and attributes, when a role consumes another role, that other role's overloading settings are applied to the role. Just as with methods, there can be conflicts with overloading implementations between multiple roles when they are all consumed by a class. If two roles both provide different overloading implementations for a given operator, that is a conflict. If two roles both implement overloading and have different C values, that is also considered a conflict. These conflicts are detected when multiple roles are being composed into a class together. When a role consumes another role, the consuming role's overloading fallback and operator implementations silently "win" the conflict. =head1 ROLE EXCLUSION A role can say that it cannot be combined with some other role. This should be used with great caution, since it limits the re-usability of the role. package Breakable; use Moose::Role; excludes 'BreakDancer'; =head1 ADDING A ROLE TO AN OBJECT INSTANCE You may want to add a role to an object instance, rather than to a class. For example, you may want to add debug tracing to one instance of an object while debugging a particular bug. Another use case might be to dynamically change objects based on a user's configuration, as a plugin system. The best way to do this is to use the C function from L: use Moose::Util qw( apply_all_roles ); my $car = Car->new; apply_all_roles( $car, 'Breakable' ); This function can apply more than one role at a time, and will do so using the normal Moose role combination system. We recommend using this function to apply roles to an object. This is what Moose uses internally when you call C. =head2 Handling required attributes for roles. Application of some roles will require additional parameters being specified to satisfy them, for example: { package Car; use Moose; } { package Breakable; use Moose::Role; has 'breakable_parts' => ( is => 'ro', required => 1 ); } my $car = Car->new; # next line dies with: Attribute (breakable_parts) is required apply_all_roles( $car, 'Breakable' ); This will require passing the additional parameters at application time as follows: apply_all_roles( $car, 'Breakable' => { rebless_params => { # Parameters to 'Breakable' breakable_parts => [qw( tires wheels windscreen )], } }); Obviously, this interface is better simplified as a method on C: sub make_breakable { my ( $self, %params ) = @_; apply_all_roles($self, 'Breakable', { rebless_params => \%params }); } my $car = Car->new(); $car->make_breakable( breakable_parts => [qw( tires wheels windscreen )] ); =head1 AUTHORS =over 4 =item * Stevan Little =item * Dave Rolsky =item * Jesse Luehrs =item * Shawn M Moore =item * יובל קוג'מן (Yuval Kogman) =item * Karen Etheridge =item * Florian Ragwitz =item * Hans Dieter Pearcey =item * Chris Prather =item * Matt S Trout =back =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2006 by Infinity Interactive, Inc. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Moose-2.2200/lib/Moose/Manual/Concepts.pod000644 000766 000024 00000030550 14137574636 020506 0ustar00etherstaff000000 000000 # PODNAME: Moose::Manual::Concepts # ABSTRACT: Moose OO concepts __END__ =pod =encoding UTF-8 =head1 NAME Moose::Manual::Concepts - Moose OO concepts =head1 VERSION version 2.2200 =head1 MOOSE CONCEPTS (VS "OLD SCHOOL" Perl) In the past, you may not have thought too much about the difference between packages and classes, attributes and methods, constructors and methods, etc. With Moose, these are all conceptually separate, though under the hood they're implemented with plain old Perl. Our meta-object protocol (aka MOP) provides well-defined introspection features for each of those concepts, and Moose in turn provides distinct sugar for each of them. Moose also introduces additional concepts such as roles, method modifiers, and declarative delegation. Knowing what these concepts mean in Moose-speak, and how they used to be done in old school Perl 5 OO is a good way to start learning to use Moose. =head2 Class When you say "use Moose" in a package, you are making your package a class. At its simplest, a class will consist simply of attributes and/or methods. It can also include roles, method modifiers, and more. A class I zero or more B. A class I zero or more B. A class I zero or more superclasses (aka parent classes). A class inherits from its superclass(es). A class I zero or more B. These modifiers can apply to its own methods or methods that are inherited from its ancestors. A class I (and I) zero or more B. A class I a B and a B. These are provided for you "for free" by Moose. The B accepts named parameters corresponding to the class's attributes and uses them to initialize an B. A class I a B, which in turn has B, B, and B. This metaclass I the class. A class is usually analogous to a category of nouns, like "People" or "Users". package Person; use Moose; # now it's a Moose class! =head2 Attribute An attribute is a property of the class that defines it. It I has a name, and it I a number of other properties. These properties can include a read/write flag, a B, accessor method names, B, a default value, and more. Attributes I methods, but defining them causes various accessor methods to be created. At a minimum, a normal attribute will have a reader accessor method. Many attributes have other methods, such as a writer method, a clearer method, or a predicate method ("has it been set?"). An attribute may also define B, which will create additional methods based on the delegation mapping. By default, Moose stores attributes in the object instance, which is a hashref, I! It is best to think of Moose attributes as "properties" of the I B. These properties are accessed through well-defined accessor methods. An attribute is something that the class's members have. For example, People have first and last names. Users have passwords and last login datetimes. has 'first_name' => ( is => 'rw', isa => 'Str', ); =head2 Method A B is very straightforward. Any subroutine you define in your class is a method. B correspond to verbs, and are what your objects can do. For example, a User can login. sub login { ... } =head2 Role A role is something that a class I. We also say that classes I roles. For example, a Machine class might do the Breakable role, and so could a Bone class. A role is used to define some concept that cuts across multiple unrelated classes, like "breakability", or "has a color". A role I zero or more B. A role I zero or more B. A role I zero or more B. A role I zero or more B. A required method is not implemented by the role. Required methods are a way for the role to declare "to use this role you must implement this method". A role I zero or more B. An excluded role is a role that the role doing the excluding says it cannot be combined with. Roles are I into classes (or other roles). When a role is composed into a class, its attributes and methods are "flattened" into the class. Roles I show up in the inheritance hierarchy. When a role is composed, its attributes and methods appear as if they were defined I. Role are somewhat like mixins or interfaces in other OO languages. package Breakable; use Moose::Role; requires 'break'; has 'is_broken' => ( is => 'rw', isa => 'Bool', ); after 'break' => sub { my $self = shift; $self->is_broken(1); }; =head2 Method modifiers A B is a hook that is called when a named method is called. For example, you could say "before calling C, call this modifier first". Modifiers come in different flavors like "before", "after", "around", and "augment", and you can apply more than one modifier to a single method. Method modifiers are often used as an alternative to overriding a method in a parent class. They are also used in roles as a way of modifying methods in the consuming class. Under the hood, a method modifier is just a plain old Perl subroutine that gets called before or after (or around, etc.) some named method. before 'login' => sub { my $self = shift; my $pw = shift; warn "Called login() with $pw\n"; }; =head2 Type Moose also comes with a (miniature) type system. This allows you to define types for attributes. Moose has a set of built-in types based on the types Perl provides in its core, such as C, C, C, C, etc. In addition, every class name in your application can also be used as a type name. Finally, you can define your own types with their own constraints. For example, you could define a C type, a subtype of C which only allows positive numbers. =head2 Delegation Moose attributes provide declarative syntax for defining delegations. A delegation is a method which in turn calls some method on an attribute to do its real work. =head2 Constructor A constructor creates an B for the class. In old school Perl, this was usually done by defining a method called C which in turn called C on a reference. With Moose, this C method is created for you, and it simply does the right thing. You should never need to define your own constructor! Sometimes you want to do something whenever an object is created. In those cases, you can provide a C method in your class. Moose will call this for you after creating a new object. =head2 Destructor This is a special method called when an object instance goes out of scope. You can specialize what your class does in this method if you need to, but you usually don't. With old school Perl 5, this is the C method, but with Moose it is the C method. =head2 Object instance An object instance is a specific noun in the class's "category". For example, one specific Person or User. An instance is created by the class's B. An instance has values for its attributes. For example, a specific person has a first and last name. In old school Perl 5, this is often a blessed hash reference. With Moose, you should never need to know what your object instance actually is. (Okay, it's usually a blessed hashref with Moose, too.) =head2 Moose vs old school summary =over 4 =item * Class A package with no introspection other than mucking about in the symbol table. With Moose, you get well-defined declaration and introspection. =item * Attributes Hand-written accessor methods, symbol table hackery, or a helper module like C. With Moose, these are declaratively defined, and distinct from methods. =item * Method These are pretty much the same in Moose as in old school Perl. =item * Roles C or C, or maybe C. With Moose, they're part of the core feature set, and are introspectable like everything else. =item * Method Modifiers Could only be done through serious symbol table wizardry, and you probably never saw this before (at least in Perl 5). =item * Type Hand-written parameter checking in your C method and accessors. With Moose, you define types declaratively, and then use them by name with your attributes. =item * Delegation C or C, but probably even more hand-written code. With Moose, this is also declarative. =item * Constructor A C method which calls C on a reference. Comes for free when you define a class with Moose. =item * Destructor A C method. With Moose, this is called C. =item * Object Instance A blessed reference, usually a hash reference. With Moose, this is an opaque thing which has a bunch of attributes and methods, as defined by its class. =item * Immutabilization Moose comes with a feature called "immutabilization". When you make your class immutable, it means you're done adding methods, attributes, roles, etc. This lets Moose optimize your class with a bunch of extremely dirty in-place code generation tricks that speed up things like object construction and so on. =back =head1 META WHAT? A metaclass is a class that describes classes. With Moose, every class you define gets a C method. The C method returns a L object, which has an introspection API that can tell you about the class it represents. my $meta = User->meta(); for my $attribute ( $meta->get_all_attributes ) { print $attribute->name(), "\n"; if ( $attribute->has_type_constraint ) { print " type: ", $attribute->type_constraint->name, "\n"; } } for my $method ( $meta->get_all_methods ) { print $method->name, "\n"; } Almost every concept we defined earlier has a meta class, so we have L, L, L, L, L, L, and so on. =head1 BUT I NEED TO DO IT MY WAY! One of the great things about Moose is that if you dig down and find that it does something the "wrong way", you can change it by extending a metaclass. For example, you can have arrayref based objects, you can make your constructors strict (no unknown parameters allowed!), you can define a naming scheme for attribute accessors, you can make a class a Singleton, and much, much more. Many of these extensions require surprisingly small amounts of code, and once you've done it once, you'll never have to hand-code "your way of doing things" again. Instead you'll just load your favorite extensions. package MyWay::User; use Moose; use MooseX::StrictConstructor; use MooseX::MyWay; has ...; =head1 WHAT NEXT? So you're sold on Moose. Time to learn how to really use it. If you want to see how Moose would translate directly into old school Perl 5 OO code, check out L. This might be helpful for quickly wrapping your brain around some aspects of "the Moose way". Or you can skip that and jump straight to L and the rest of the L. After that we recommend that you start with the L. If you work your way through all the recipes under the basics section, you should have a pretty good sense of how Moose works, and all of its basic OO features. After that, check out the Role recipes. If you're really curious, go on and read the Meta and Extending recipes, but those are mostly there for people who want to be Moose wizards and extend Moose itself. =head1 AUTHORS =over 4 =item * Stevan Little =item * Dave Rolsky =item * Jesse Luehrs =item * Shawn M Moore =item * יובל קוג'מן (Yuval Kogman) =item * Karen Etheridge =item * Florian Ragwitz =item * Hans Dieter Pearcey =item * Chris Prather =item * Matt S Trout =back =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2006 by Infinity Interactive, Inc. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Moose-2.2200/lib/Moose/Manual/MethodModifiers.pod000600 000766 000024 00000027212 14137574636 022003 0ustar00etherstaff000000 000000 # PODNAME: Moose::Manual::MethodModifiers # ABSTRACT: Moose's method modifiers __END__ =pod =encoding UTF-8 =head1 NAME Moose::Manual::MethodModifiers - Moose's method modifiers =head1 VERSION version 2.2200 =head1 WHAT IS A METHOD MODIFIER? Moose provides a feature called "method modifiers". You can also think of these as "hooks" or "advice". It's probably easiest to understand this feature with a few examples: package Example; use Moose; sub foo { print " foo\n"; } before 'foo' => sub { print "about to call foo\n"; }; after 'foo' => sub { print "just called foo\n"; }; around 'foo' => sub { my $orig = shift; my $self = shift; print " I'm around foo\n"; $self->$orig(@_); print " I'm still around foo\n"; }; Now if I call C<< Example->new->foo >> I'll get the following output: about to call foo I'm around foo foo I'm still around foo just called foo You probably could have figured that out from the names "before", "after", and "around". Also, as you can see, the before modifiers come before around modifiers, and after modifiers come last. When there are multiple modifiers of the same type, the before and around modifiers run from the last added to the first, and after modifiers run from first added to last: before 2 before 1 around 2 around 1 primary around 1 around 2 after 1 after 2 =head1 WHY USE THEM? Method modifiers have many uses. They are often used in roles to alter the behavior of methods in the classes that consume the role. See L for more information about roles. Since modifiers are mostly useful in roles, some of the examples below are a bit artificial. They're intended to give you an idea of how modifiers work, but may not be the most natural usage. =head1 BEFORE, AFTER, AND AROUND Method modifiers can be used to add behavior to methods without modifying the definition of those methods. =head2 Before and after Modifiers Method modifiers can be used to add behavior to a method that Moose generates for you, such as an attribute accessor: has 'size' => ( is => 'rw' ); before 'size' => sub { my $self = shift; if (@_) { Carp::cluck('Someone is setting size'); } }; Another use for the before modifier would be to do some sort of prechecking on a method call. For example: before 'size' => sub { my $self = shift; die 'Cannot set size while the person is growing' if @_ && $self->is_growing; }; This lets us implement logical checks that don't make sense as type constraints. In particular, they're useful for defining logical rules about an object's state changes. Similarly, an after modifier could be used for logging an action that was taken. Note that the return values of both before and after modifiers are ignored. =head2 Around modifiers An around modifier is more powerful than either a before or after modifier. It can modify the arguments being passed to the original method, and you can even decide to simply not call the original method at all. You can also modify the return value with an around modifier. An around modifier receives the original method as its first argument, I the object, and finally any arguments passed to the method. around 'size' => sub { my $orig = shift; my $self = shift; return $self->$orig() unless @_; my $size = shift; $size = $size / 2 if $self->likes_small_things(); return $self->$orig($size); }; =head2 Wrapping multiple methods at once C, C, and C can also modify multiple methods at once. The simplest example of this is passing them as a list: before [qw(foo bar baz)] => sub { warn "something is being called!"; }; This will add a C modifier to each of the C, C, and C methods in the current class, just as though a separate call to C was made for each of them. The list can be passed either as a bare list, or as an arrayref. Note that the name of the function being modified isn't passed in in any way; this syntax is only intended for cases where the function being modified doesn't actually matter. If the function name does matter, use something like this: for my $func (qw(foo bar baz)) { before $func => sub { warn "$func was called!"; }; } =head2 Using regular expressions to select methods to wrap In addition, you can specify a regular expression to indicate the methods to wrap, like so: after qr/^command_/ => sub { warn "got a command"; }; This will match the regular expression against each method name returned by L, and add a modifier to each one that matches. The same caveats apply as above. Using regular expressions to determine methods to wrap is quite a bit more powerful than the previous alternatives, but it's also quite a bit more dangerous. Bear in mind that if your regular expression matches certain Perl and Moose reserved method names with a special meaning to Moose or Perl, such as C, C, C, C, C, etc, this could cause unintended (and hard to debug) problems and is best avoided. =head2 Execution order of method modifiers and inheritance When both a superclass and an inheriting class have the same method modifiers, the method modifiers of the inheriting class are wrapped around the method modifiers of the superclass, as the following example illustrates: Here is the parent class: package Superclass; use Moose; sub rant { printf " RANTING!\n" } before 'rant' => sub { printf " In %s before\n", __PACKAGE__ }; after 'rant' => sub { printf " In %s after\n", __PACKAGE__ }; around 'rant' => sub { my $orig = shift; my $self = shift; printf " In %s around before calling original\n", __PACKAGE__; $self->$orig; printf " In %s around after calling original\n", __PACKAGE__; }; 1; And the child class: package Subclass; use Moose; extends 'Superclass'; before 'rant' => sub { printf "In %s before\n", __PACKAGE__ }; after 'rant' => sub { printf "In %s after\n", __PACKAGE__ }; around 'rant' => sub { my $orig = shift; my $self = shift; printf " In %s around before calling original\n", __PACKAGE__; $self->$orig; printf " In %s around after calling original\n", __PACKAGE__; }; 1; And here's the output when we call the wrapped method (C<< Child->rant >>): % perl -MSubclass -e 'Subclass->new->rant' In Subclass before In Subclass around before calling original In Superclass before In Superclass around before calling original RANTING! In Superclass around after calling original In Superclass after In Subclass around after calling original In Subclass after =head1 INNER AND AUGMENT Augment and inner are two halves of the same feature. The augment modifier provides a sort of inverted subclassing. You provide part of the implementation in a superclass, and then document that subclasses are expected to provide the rest. The superclass calls C, which then calls the C modifier in the subclass: package Document; use Moose; sub as_xml { my $self = shift; my $xml = "\n"; $xml .= inner(); $xml .= "\n"; return $xml; } Using C in this method makes it possible for one or more subclasses to then augment this method with their own specific implementation: package Report; use Moose; extends 'Document'; augment 'as_xml' => sub { my $self = shift; my $xml = " \n"; $xml .= inner(); $xml .= " \n"; return $xml; }; When we call C on a Report object, we get something like this: But we also called C in C, so we can continue subclassing and adding more content inside the document: package Report::IncomeAndExpenses; use Moose; extends 'Report'; augment 'as_xml' => sub { my $self = shift; my $xml = ' ' . $self->income . ''; $xml .= "\n"; $xml .= ' ' . $self->expenses . ''; $xml .= "\n"; $xml .= inner() || q{}; return $xml; }; Now our report has some content: $10 $8 What makes this combination of C and C special is that it allows us to have methods which are called from parent (least specific) to child (most specific). This inverts the normal inheritance pattern. Note that in C we call C again. If the object is an instance of C then this call is a no-op, and just returns false. It's a good idea to always call C to allow for future subclassing. =head1 OVERRIDE AND SUPER Finally, Moose provides some simple sugar for Perl's built-in method overriding scheme. If you want to override a method from a parent class, you can do this with C: package Employee; use Moose; extends 'Person'; has 'job_title' => ( is => 'rw' ); override 'display_name' => sub { my $self = shift; return super() . q{, } . $self->job_title(); }; The call to C is almost the same as calling C<< $self->SUPER::display_name >>. The difference is that the arguments passed to the superclass's method will always be the same as the ones passed to the method modifier, and cannot be changed. All arguments passed to C are ignored, as are any changes made to C<@_> before C is called. =head1 SEMI-COLONS Because all of these method modifiers are implemented as Perl functions, you must always end the modifier declaration with a semi-colon: after 'foo' => sub { }; =head1 EXCEPTIONS AND STACK TRACES An exception thrown in a C modifier will prevent the method it modifies from being called at all. An exception in an C modifier may prevent the modified method from being called, depending on how the C modifier is structured. An exception in an C modifier obviously cannot prevent the method it wraps from being called. Both C and C are similar to C in that they can decide whether or not to call the method they modify before or after throwing an exception. From the caller's perspective, an exception in a method modifier will look like the method it called threw an exception. However, method modifiers are just standard Perl subroutines. This means that they end up on the stack in stack traces as an additional frame. =head1 CAVEATS These method modification features do not work well with multiple inheritance, due to how method resolution is performed in Perl. Experiment with a test program to ensure your class hierarchy works as expected, or more preferably, don't use multiple inheritance (roles can help with this)! =head1 AUTHORS =over 4 =item * Stevan Little =item * Dave Rolsky =item * Jesse Luehrs =item * Shawn M Moore =item * יובל קוג'מן (Yuval Kogman) =item * Karen Etheridge =item * Florian Ragwitz =item * Hans Dieter Pearcey =item * Chris Prather =item * Matt S Trout =back =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2006 by Infinity Interactive, Inc. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Moose-2.2200/lib/Moose/Manual/Contributing.pod000640 000766 000024 00000046221 14137574636 021375 0ustar00etherstaff000000 000000 # PODNAME: Moose::Manual::Contributing # ABSTRACT: How to get involved in Moose __END__ =pod =encoding UTF-8 =head1 NAME Moose::Manual::Contributing - How to get involved in Moose =head1 VERSION version 2.2200 =for comment CONTRIBUTING.pod is generated from lib/Moose/Manual/Contributing.pod =head1 GETTING INVOLVED Moose is an open project, and we are always willing to accept bug fixes, more tests, and documentation patches. Commit bits are given out freely and it's easy to get started! =head2 Get the Code If you just want to get your feet wet and check out the code, you can do so from the comfort of your web browser by going to the official repository on GitHub: L. However, if you know how to use git and would rather have a local copy (because, why wouldn't you?!), then you can clone it: git clone git@github.com:moose/Moose.git If, at some point, you think you'd like to contribute a patch, please see L. I Your contribution is very important to us. If, for some reason, you would prefer not to use Git/GitHub, come talk to us at #moose on irc.perl.org and we can work something out.> =head2 People As Moose has matured, some structure has emerged in the process. =over =item Cabal - people who can release moose These people are the ones who have co-maint on Moose itself and can create a release. They're listed under L in the Moose documentation. They are responsible for reviewing branches, and are the only people who are allowed to push to stable branches. Cabal members are listed in L and can often be found on irc in the L channel. =item Contributors - people creating a topic or branch You! =back =head2 New Features Moose already has a fairly large feature set, and we are currently B looking to add any major new features to it. If you have an idea for a new feature in Moose, you are encouraged to create a MooseX module first. At this stage, no new features will even be considered for addition into the core without first being vetted as a MooseX module, unless it is absolutely 100% impossible to implement the feature outside the core. If you think it is 100% impossible, please come discuss it with us on IRC or via e-mail. Your feature may need a small hook in the core, or a refactoring of some core modules, and we are definitely open to that. Moose was built from the ground up with the idea of being highly extensible, and quite often the feature requests we see can be implemented through small extensions. Try it, it's much easier than you might think. =head2 Branch Layout The repository is divided into several branches to make maintenance easier for everyone involved. The branches below are ordered by level of stability. =over =item stable/* The branch from which releases are cut. When making a new major release, the release manager makes a new C branch at the current position of C. The version used in the stable branch should not include the last two digits of the version number. For minor releases, patches will be committed to C, and backported (cherry-picked) to the appropriate stable branch as needed. A stable branch is only updated by someone from the Cabal during a release. =item master The main development branch. All new code should be written against this branch. This branch contains code that has been reviewed, and will be included in the next major release. Commits which are judged to not break backwards compatibility may be backported into C to be included in the next minor release. =item topic/* Small personal branches that are still in progress. They can be freely rebased. They contain targeted features that may span a handful of commits. Any change or bugfix should be created in a topic branch. =item rfc/* Topic branches that are completed and waiting on review. A Cabal member will look over branches in this namespace, and either merge them to C if they are acceptable, or move them back to a different namespace otherwise. This namespace is being phased out now that we are using GitHub's pull requests in our L. =item attic/* Branches which have been reviewed, and rejected. They remain in the repository in case we later change our mind, or in case parts of them are still useful. =item abandoned/* Topic branches which have had no activity for a long period of time will be moved here, to keep the main areas clean. =back Larger, longer term branches can also be created in the root namespace (i.e. at the same level as master and stable). This may be appropriate if multiple people are intending to work on the branch. These branches should not be rebased without checking with other developers first. =head1 WORKFLOWS =head2 Getting Started So, you've cloned the main Moose repository to your local machine (see L) and you're ready to do some hacking. We couldn't be happier to welcome you to our community! Of course, to ensure that your first experience is as productive and satisfying as possible, you should probably take some time to read over this entire POD document. Doing so will give you a full understanding of how Moose developers and maintainers work together and what they expect from one another. Done? Great! Next, assuming you have a GitHub account, go to L and B (see L). This will put an exact replica of the Moose repository into your GitHub account, which will serve as a place to publish your patches for the Moose maintainers to review and incorporate. Once your fork has been created, switch to your local working repository directory and update your C remote's push URL. This allows you to use a single remote (C) to both pull in the latest code from GitHub and also push your work to your own fork: # Replace YOUR_USERNAME below with your GitHub username git remote set-url --push origin git@github.com:YOUR_USERNAME/moose.git You can verify your work: $ git remote -v origin git@github.com:moose/Moose.git (fetch) origin git@github.com:YOUR_USERNAME/moose.git (push) Now, you're ready for action! From now on, you just follow the L to publish your work and B to the Moose Cabal. =head2 Development Workflow The general gist of the B is: =over 4 =item 1. Update your local repository with the latest commits from the official repository =item 2. Create a new topic branch, based on the master branch =item 3. Hack away =item 4. Commit and push the topic branch to your forked repository =item 5. Submit a pull request through GitHub for that branch =back What follows is a more detailed rundown of that workflow. Please make sure to review and follow the steps in the previous section, L, if you have not done so already. =head3 Update Your Repository Update your local copy of the master branch from the remote: git checkout master git pull --rebase =head3 Create Your Topic Branch Now, create a new topic branch based on your master branch. It's useful to use concise, descriptive branch names such as: pod-syntax-contrib, feat-autodelegation, patch-23-role-comp, etc. However, we'll just call ours C for demonstration purposes: git checkout -b topic/my-feature =head3 Hack. Commit. Repeat. While you're hacking, the most important thing to remember is that your topic branch is yours to do with as you like. Nothing you do there will affect anyone else at this point. Commit as often as little or as often as you need to and don't let perfection get in the way of progress. However, don't try to do too much as the easiest changes to integrate are small and focused. If it's been a while since you created your topic branch, it's often a good idea to periodically rebase your branch off of the upstream master to reduce your work later on: git fetch # or, git remote update git rebase origin/master # or, git pull --rebase origin master You should also feel free to publish (using C if necessary) your branch to your GitHub fork if you simply need feedback from others. (Note: actual collaboration takes a bit more finesse and a lot less C<--force> however). =head3 Clean Up Your Branch Finally, when your development is done, it's time to prepare your branch for review. Even the smallest branches can often use a little bit of tidying up before they are unleashed on a reviewer. Clarifying/cleaning up commit messages, reordering commits, splitting large commits or those which contain different types of changes, squashing related or straggler commits are all B worthwhile activities to undertake on your topic branch. B Your topic branch is yours. Don't worry about rewriting its history or breaking fast-forward. Some useful commands are listed below but please make sure that you understand what they do as they can rewrite history: - git commit --amend - git rebase --interactive - git cherry-pick Ultimately, your goal in cleaning up your branch is to craft a set of commits whose content and messages are as focused and understandable as possible. Doing so will greatly increase the chances of a speedy review and acceptance into the mainline development. =head3 Rebase on the Latest Before your final push and issuing a pull request, you need to ensure that your changes can be easily merged into the master branch of the upstream repository. This is done by once again rebasing your branch on the latest C. git fetch # or, git remote update git rebase origin/master # or, git pull --rebase origin master =head3 Publish and Pull Request Now it's time to make your final push of the branch to your fork. The C<--force> flag is only necessary if you've pushed before and subsequently rewriting your history: git push --force After your branch is published, you can issue a pull request to the Moose Cabal. See for details. Congratulations! You're now a contributor! =head2 Approval Workflow Moose is an open project but it is also an increasingly important one. Many modules depend on Moose being stable. Therefore, we have a basic set of criteria for reviewing and merging branches. What follows is a set of rough guidelines that ensures all new code is properly vetted before it is merged to the master branch. It should be noted that if you want your specific branch to be approved, it is B responsibility to follow this process and advocate for your branch. =over 4 =item Small bug fixes, doc patches and additional passing tests. These items don't really require approval beyond one of the core contributors just doing a simple review. For especially simple patches (doc patches especially), committing directly to master is fine. =item Larger bug fixes, doc additions and TODO or failing tests. Larger bug fixes should be reviewed by at least one cabal member and should be tested using the F test. New documentation is always welcome, but should also be reviewed by a cabal member for accuracy. TODO tests are basically feature requests, see our L section for more information on that. If your feature needs core support, create a C branch using the L and start hacking away. Failing tests are basically bug reports. You should find a core contributor and/or cabal member to see if it is a real bug, then submit the bug and your test to the RT queue. Source control is not a bug reporting tool. =item New user-facing features. Anything that creates a new user-visible feature needs to be approved by B cabal member. Make sure you have reviewed L to be sure that you are following the guidelines. Do not be surprised if a new feature is rejected for the core. =item New internals features. New features for Moose internals are less restrictive than user facing features, but still require approval by B cabal member. Ideally you will have run the F script to be sure you are not breaking any MooseX module or causing any other unforeseen havoc. If you do this (rather than make us do it), it will only help to hasten your branch's approval. =item Backwards incompatible changes. Anything that breaks backwards compatibility must be discussed by the cabal. Backwards incompatible changes should not be merged to master if there are strong objections from any cabal members. We have a policy for what we see as sane L for Moose. If your changes break back-compat, you must be ready to discuss and defend your change. =back =head2 Release Workflow # major releases (including trial releases) git checkout master # minor releases git checkout stable/X.YY # do final changelogging, etc git commit dzil release # or dzil release --trial for trial releases =head3 Release How-To Moose uses L to manage releases. Although the git repository comes with a C, it is a very basic one just to allow the basic C cycle to work. In particular, it doesn't include any release metadata, such as dependencies. In order to get started with Dist::Zilla, first install it: C, and then install the plugins necessary for reading the C: C. Moose releases fall into two categories, each with their own level of release preparation. A minor release is one which does not include any API changes, deprecations, and so on. In that case, it is sufficient to simply test the release candidate against a few different Perls. Testing should be done against at least two recent major versions of Perl (5.8.8 and 5.10.1, for example). If you have more versions available, you are encouraged to test them all. However, we do not put a lot of effort into supporting older 5.8.x releases. For major releases which include an API change or deprecation, you should run the F test. This tests a long list of MooseX and other Moose-using modules from CPAN. In order to run this script, you must arrange to have the new version of Moose in Perl's include path. You can use C and C, install the module, or fiddle with the C environment variable, whatever makes you happy. This test downloads each module from CPAN, runs its tests, and logs failures and warnings to a set of files named F. If there are failures or warnings, please work with the authors of the modules in question to fix them. If the module author simply isn't available or does not want to fix the bug, it is okay to make a release. Regardless of whether or not a new module is available, any breakages should be noted in the conflicts list in the distribution's F. =head2 Emergency Bug Workflow (for immediate release) The stable branch exists for easily making bug fix releases. git remote update git checkout -b topic/my-emergency-fix origin/master # hack git commit Then a cabal member merges into C, and backports the change into C: git checkout master git merge topic/my-emergency-fix git push git checkout stable/X.YY git cherry-pick -x master git push # release =head2 Project Workflow For longer lasting branches, we use a subversion style branch layout, where master is routinely merged into the branch. Rebasing is allowed as long as all the branch contributors are using C properly. C, C, etc. are not allowed, and should only be done in topic branches. Committing to master is still done with the same review process as a topic branch, and the branch must merge as a fast forward. This is pretty much the way we're doing branches for large-ish things right now. Obviously there is no technical limitation on the number of branches. You can freely create topic branches off of project branches, or sub projects inside larger projects freely. Such branches should incorporate the name of the branch they were made off so that people don't accidentally assume they should be merged into master: git checkout -b my-project--topic/foo my-project (unfortunately Git will not allow C as a branch name if C is a valid ref). =head1 BRANCH ARCHIVAL Merged branches should be deleted. Failed branches may be kept, but should be moved to C to differentiate them from in-progress topic branches. Branches that have not been worked on for a long time will be moved to C periodically, but feel free to move the branch back to C if you want to start working on it again. =head1 TESTS, TESTS, TESTS If you write I code for Moose, you B add tests for that code. If you do not write tests then we cannot guarantee your change will not be removed or altered at a later date, as there is nothing to confirm this is desired behavior. If your code change/addition is deep within the bowels of Moose and your test exercises this feature in a non-obvious way, please add some comments either near the code in question or in the test so that others know. We also greatly appreciate documentation to go with your changes, and an entry in the Changes file. Make sure to give yourself credit! Major changes or new user-facing features should also be documented in L. =head1 DOCS, DOCS, DOCS Any user-facing changes must be accompanied by documentation. If you're not comfortable writing docs yourself, you might be able to convince another Moose dev to help you. Our goal is to make sure that all features are documented. Undocumented features are not considered part of the API when it comes to determining whether a change is backwards compatible. =head1 BACKWARDS COMPATIBILITY Change is inevitable, and Moose is not immune to this. We do our best to maintain backwards compatibility, but we do not want the code base to become overburdened by this. This is not to say that we will be frivolous with our changes, quite the opposite, just that we are not afraid of change and will do our best to keep it as painless as possible for the end user. Our policy for handling backwards compatibility is documented in more detail in L. All backwards incompatible changes B be documented in L. Make sure to document any useful tips or workarounds for the change in that document. =head1 AUTHORS =over 4 =item * Stevan Little =item * Dave Rolsky =item * Jesse Luehrs =item * Shawn M Moore =item * יובל קוג'מן (Yuval Kogman) =item * Karen Etheridge =item * Florian Ragwitz =item * Hans Dieter Pearcey =item * Chris Prather =item * Matt S Trout =back =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2006 by Infinity Interactive, Inc. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Moose-2.2200/lib/Moose/Manual/MooseX.pod000644 000766 000024 00000020661 14137574636 020144 0ustar00etherstaff000000 000000 # PODNAME: Moose::Manual::MooseX # ABSTRACT: Recommended Moose extensions __END__ =pod =encoding UTF-8 =head1 NAME Moose::Manual::MooseX - Recommended Moose extensions =head1 VERSION version 2.2200 =head1 MooseX? It's easy to extend and change Moose, and this is part of what makes Moose so powerful. You can use the MOP API to do things your own way, add new features, and generally customize your Moose. Writing your own extensions does require a good understanding of the meta-model. You can start learning about this with the L docs. There are also several extension recipes in the L. Explaining how to write extensions is beyond the scope of this manual. Fortunately, lots of people have already written extensions and put them on CPAN for you. This document covers a few of the ones we like best. =head1 L The functionality of this MooseX module has been moved into Moose core. See L. =head1 L MooseX::AttributeHelpers, but turned inside out, Moose::Autobox provides methods on both arrays/hashes/etc. but also references to them, using Moose roles, allowing you do to things like: use Moose::Autobox; $somebody_elses_object->orders->push($order); Lexically scoped and not to everybody's taste, but very handy for sugaring up other people's APIs and your own code. =head1 L By default, Moose lets you pass any old junk into a class's constructor. If you load L, your class will throw an error if it sees something it doesn't recognize; package User; use Moose; use MooseX::StrictConstructor; has 'name'; has 'email'; User->new( name => 'Bob', emali => 'bob@example.com' ); With L, that typo ("emali") will cause a runtime error. With plain old Moose, the "emali" attribute would be silently ignored. =head1 L We have high hopes for the future of L and L. However, these modules, while used regularly in production by some of the more insane members of the community, are still marked alpha just in case backwards incompatible changes need to be made. If you don't want to risk that, for now we recommend the decidedly more clunky (but also faster and simpler) L. This module lets you apply Moose types and coercions to any method arguments. package User; use Moose; use MooseX::Params::Validate; sub login { my $self = shift; my ($password) = validated_list( \@_, password => { isa => 'Str', required => 1 } ); ... } =head1 L This is a role which adds a C method to your class. This is a constructor that takes the command line options and uses them to populate attributes. This makes writing a command-line application as a module trivially simple: package App::Foo; use Moose; with 'MooseX::Getopt'; has 'input' => ( is => 'ro', isa => 'Str', required => 1 ); has 'output' => ( is => 'ro', isa => 'Str', required => 1 ); sub run { ... } Then in the script that gets run we have: use App::Foo; App::Foo->new_with_options->run; From the command line, someone can execute the script: foo@example> foo --input /path/to/input --output /path/to/output =head1 L To be honest, using a singleton is just a way to have a magic global variable in languages that don't actually have global variables. In perl, you can just as easily use a global. However, if your colleagues are Java-infected, they might prefer a singleton. Also, if you have an existing class that I a singleton but should be, using L is the easiest way to convert it. package Config; use MooseX::Singleton; # instead of Moose has 'cache_dir' => ( ... ); It's that simple. =head1 EXTENSIONS TO CONSIDER There are literally dozens of other extensions on CPAN. This is a list of extensions that you might find useful, but we're not quite ready to endorse just yet. =head2 L MooseX::Declare is based on L, a giant bag of crack originally implemented by mst with the goal of upsetting the perl core developers so much by its very existence that they implemented proper keyword handling in the core. As of perl5 version 14, this goal has been achieved, and modules such as L, L, and L provide mechanisms to mangle perl syntax that don't require hallucinogenic drugs to interpret the error messages they produce. If you want to use declarative syntax in new code, please for the love of kittens get yourself a recent perl and look at L instead. =head2 L This extension helps you build a type library for your application. It also lets you predeclare type names and use them as barewords. use MooseX::Types -declare => ['PositiveInt']; use MooseX::Types::Moose 'Int'; subtype PositiveInt, as Int, where { $_ > 0 }, message { "Int is not larger than 0" }; One nice feature is that those bareword names are actually namespaced in Moose's type registry, so multiple applications can use the same bareword names, even if the type definitions differ. =head2 L This extension builds on top of L to let you declare complex data structure types. use MooseX::Types -declare => [ qw( Name Color ) ]; use MooseX::Types::Moose qw(Str Int); use MooseX::Types::Structured qw(Dict Tuple Optional); subtype Name => as Dict[ first => Str, middle => Optional[Str], last => Str ]; subtype Color => as Tuple[ Int, Int, Int, Optional[Int] ]; Of course, you could always use objects to represent these sorts of things too. =head2 L This extension provides class attributes for Moose classes. The declared class attributes are introspectable just like regular Moose attributes. package User; use Moose; use MooseX::ClassAttribute; has 'name' => ( ... ); class_has 'Cache' => ( ... ); Note however that this class attribute does I inherit like a L or similar attribute - calling $subclass->Cache($cache); will set it for the superclass as well. Additionally, class data is usually The Wrong Thing To Do in a strongly OO program since it makes testing a lot harder - consider carefully whether you'd be better off with an object that's passed around instead. =head2 L This is a role that provides a number of methods useful for creating a daemon, including methods for starting and stopping, managing a PID file, and signal handling. =head2 L If you find yourself wanting a role that customizes itself for each consumer, this is the tool for you. With this module, you can create a role that accepts parameters and generates attributes, methods, etc. on a customized basis for each consumer. =head2 L This is a small wrapper that ties together a Moose class with C, and gives you an C sugar function to declare event handlers. =head2 L Automatically names all accessors I-style, "get_size" and "set_size". =head2 L Automatically names all accessors with an explicit set and implicit get, "size" and "set_size". =head2 L MooseX::NonMoose allows for easily subclassing non-Moose classes with Moose, taking care of the annoying details connected with doing this, such as setting up proper inheritance from Moose::Object and installing (and inlining, at make_immutable time) a constructor that makes sure things like BUILD methods are called. =head1 AUTHORS =over 4 =item * Stevan Little =item * Dave Rolsky =item * Jesse Luehrs =item * Shawn M Moore =item * יובל קוג'מן (Yuval Kogman) =item * Karen Etheridge =item * Florian Ragwitz =item * Hans Dieter Pearcey =item * Chris Prather =item * Matt S Trout =back =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2006 by Infinity Interactive, Inc. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Moose-2.2200/lib/Moose/Manual/Support.pod000644 000766 000024 00000015246 14137574636 020411 0ustar00etherstaff000000 000000 # PODNAME: Moose::Manual::Support # ABSTRACT: Policies regarding support, releases, and compatibility. __END__ =pod =encoding UTF-8 =head1 NAME Moose::Manual::Support - Policies regarding support, releases, and compatibility. =head1 VERSION version 2.2200 =head1 SUPPORT POLICY There are two principles to Moose's policy of supported behavior. =over 4 =item 1. Moose favors correctness over everything. =item 2. Moose supports documented and tested behavior, not accidental behavior or side effects. =back If a behavior has never been documented or tested, the behavior is I undefined. Relying upon undocumented and untested behavior is done at your own risk. If a behavior is documented or tested but found to be incorrect later, the behavior will go through a deprecation period. During the deprecation period, use of that feature will cause a warning. Eventually, the deprecated feature will be removed. In some cases, it is not possible to deprecate a behavior. In this case, the behavior will simply be changed in a major release. =head1 RELEASE SCHEDULE Moose is on a system of quarterly major releases, with minor releases as needed between major releases. A minor release is defined as one that makes every attempt to preserve backwards compatibility. Currently this means that we did not introduce any new dependency conflicts, and that we did not make any changes to documented or tested behavior (this typically means that minor releases will not change any existing tests in the test suite, although they can add new ones). A minor release can include new features and bug fixes. Major releases may be backwards incompatible. Moose prioritizes correctness over backwards compatibility or performance; see the L to understand how backwards incompatible changes are announced. Major releases are scheduled to happen during fixed release windows. If the window is missed, then there will not be a major release until the next release window. The release windows are one month long, and occur during the months of January, April, July, and October. Before a major release, a series of development releases will be made so that users can test the upcoming major release before it is distributed to CPAN. It is in the best interests of everyone involved if these releases are tested as widely as possible. =head1 DEPRECATION POLICY Moose has always prioritized correctness over performance and backwards compatibility. Major deprecations or API changes are documented in the Changes file as well as in L. The Moose developers will also make an effort to warn users of upcoming deprecations and breakage through the Moose blog (http://blog.moose.perl.org). Deprecated APIs will be preserved for at least one year I. Deprecated APIs will only be removed in a major release. Moose will also warn during installation if the version of Moose being installed will break an installed dependency. Unfortunately, due to the nature of the Perl install process these warnings may be easy to miss. =head1 BACKWARDS COMPATIBILITY We try to ensure compatibility by having a extensive test suite (last count over 18000 tests), as well as testing a number of packages (currently just under 100 packages) that depend on Moose before any release. The current list of downstream dependencies that are tested is in C. =head1 VERSION NUMBERS Moose version numbers consist of three parts, in the form X.YYZZ. The X is the "special magic number" that only gets changed for really big changes. Think of this as being like the "5" in Perl 5.12.1. The YY portion is the major version number. Moose uses even numbers for stable releases, and odd numbers for trial releases. The ZZ is the minor version, and it simply increases monotonically. It starts at "00" each time a new major version is released. Semantically, this means that any two releases which share a major version should be API-compatible with each other. In other words, 2.0200, 2.0201, and 2.0274 are all API-compatible. Prior to version 2.0, Moose version numbers were monotonically incrementing two decimal values (0.01, 0.02, ... 1.11, 1.12, etc.). Moose was declared production ready at version 0.18 (via L<< http://www.perlmonks.org/?node_id=608144 >>). =head1 PERL VERSION COMPATIBILITY As of version 2.16, Moose will officially support being run on perl 5.10.1+. Our current policy is to support the earliest version of Perl shipped in the latest stable release of any major operating system (this tends to mean CentOS). We will provide at least six months notice (two major releases) when we decide to increase the officially supported Perl version. "Officially supported" does not mean that these are the only versions of Perl that Moose will work with. Our declared perl dependency will remain at 5.8.3 as long as our test suite continues to pass on 5.8.3. What this does mean is that the core Moose dev team will not be spending any time fixing bugs on versions that aren't officially supported, and new contributions will not be rejected due to being incompatible with older versions of perl except in the most trivial of cases. We will, however, still welcome patches to make Moose compatible with earlier versions, if other people are still interested in maintaining compatibility. As such, the current minimum required version of 5.8.3 will remain for as long as downstream users are happy to assist with maintenance. Note that although performance regressions are acceptable in order to maintain backwards compatibility (as long as they only affect the older versions), functionality changes and buggy behavior will not be. If it becomes impossible to provide identical functionality between modern Perl versions and unsupported Perl versions, we will increase our declared perl dependency instead. =head1 CONTRIBUTING Moose has an open contribution policy. Anybody is welcome to submit a patch. Please see L for more details. =head1 AUTHORS =over 4 =item * Stevan Little =item * Dave Rolsky =item * Jesse Luehrs =item * Shawn M Moore =item * יובל קוג'מן (Yuval Kogman) =item * Karen Etheridge =item * Florian Ragwitz =item * Hans Dieter Pearcey =item * Chris Prather =item * Matt S Trout =back =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2006 by Infinity Interactive, Inc. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Moose-2.2200/lib/Moose/Manual/Exceptions/000770 000766 000024 00000000000 14137574636 020337 5ustar00etherstaff000000 000000 Moose-2.2200/lib/Moose/Manual/Exceptions.pod000640 000766 000024 00000013112 14137574636 021040 0ustar00etherstaff000000 000000 # PODNAME: Moose::Manual::Exceptions # ABSTRACT: Moose's exceptions __END__ =pod =encoding UTF-8 =head1 NAME Moose::Manual::Exceptions - Moose's exceptions =head1 VERSION version 2.2200 =head1 EXCEPTIONS IN MOOSE Moose will throw an exception for all error conditions. This applies both to code in the Moose core I as to all code generated when a class is made immutable. All exceptions are subclasses of the C class. Each type of error has its own unique subclass, and many subclasses have additional attributes to provide more information about the error's context, such as what classes or roles were involved. =head1 EXCEPTION STRINGIFICATION By default, Moose exceptions remove Moose internals from the stack trace. If you set the C environment variable to a true value, then the Moose internals will be included in the trace. =head1 HANDLING MOOSE EXCEPTIONS Because Moose's exceptions use the standard C mechanism, you are free to catch and handle errors however you like. You could use an C block to catch Moose exceptions. However, the Moose team strongly recommends using L instead. Please refer to L's documentation for a discussion of how C is dangerous. The following example demonstrates how to catch and inspect a L. For the sake of simplicity, we will cause a very simple error. The C keywords expects a list of superclass names. If we pass no superclass names, Moose will throw an instance of L. =head2 Catching with Try::Tiny use warnings; use strict; use Try::Tiny; try { package Example::Exception; use Moose; extends; # <-- error! } catch { # $_ contains the instance of the exception thrown by the above try # block, but $_ may get clobbered, so we should copy its value to # another variable. my $e = $_; # Exception objects are not ubiquitous in Perl, so we must check # whether $e is blessed. We also need to ensure that $e is actually # the kind of exception we were expecting. if ( blessed $e && $e->isa('Moose::Exception::ExtendsMissingArgs') ) { my $class_name = $e->class_name; warn "You forgot to specify a superclass for $class_name, silly!"; } # It's either another type of an object or not an object at all. else { warn "$e\n"; } }; =head2 Example of catching ValidationFailedForTypeConstraint use warnings; use strict; use Try::Tiny; { package Person; use Moose; use Moose::Util::TypeConstraints; subtype 'NameStr', as 'Str', where { $_ =~ /^[a-zA-Z]+$/; }; has age => ( is => 'ro', isa => 'Int', required => 1 ); has name => ( is => 'ro', isa => 'NameStr', required => 1 ); } my $person; while ( !$person ) { try { print 'Enter your age : '; my $age = ; chomp $age; print 'Enter your name : '; my $name = ; chomp $name; $person = Person->new( age => $age, name => $name ); my $person_name = $person->name; my $person_age = $person->age; print "$person_name is $person_age years old\n"; } catch { my $e = $_; if ( blessed $e && $e->isa( 'Moose::Exception::ValidationFailedForTypeConstraint') ) { my $attribute_name = $e->attribute->name; my $type_name = $e->type->name; my $value = $e->value; warn "You entered $value for $attribute_name, which is not a $type_name!"; } else { warn "$e\n"; } }; } =head2 Example of catching AttributeIsRequired use warnings; use strict; use Try::Tiny; { package Example::RequiredAttribute; use Moose; has required_attribute => ( is => 'ro', isa => 'Int', required => 1 ); } try { # we're not passing required_attribute, so it'll throw an exception my $object = Example::RequiredAttribute->new(); } catch { my $e = $_; if ( blessed $e && $e->isa('Moose::Exception::AttributeIsRequired') ) { warn $e->message, "\n"; } else { warn "$e\n"; } }; =head1 MOOSE EXCEPTION CLASSES All the exception classes are listed in L. =head1 AUTHORS =over 4 =item * Stevan Little =item * Dave Rolsky =item * Jesse Luehrs =item * Shawn M Moore =item * יובל קוג'מן (Yuval Kogman) =item * Karen Etheridge =item * Florian Ragwitz =item * Hans Dieter Pearcey =item * Chris Prather =item * Matt S Trout =back =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2006 by Infinity Interactive, Inc. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Moose-2.2200/lib/Moose/Manual/Construction.pod000640 000766 000024 00000015350 14137574636 021417 0ustar00etherstaff000000 000000 # PODNAME: Moose::Manual::Construction # ABSTRACT: Object construction (and destruction) with Moose __END__ =pod =encoding UTF-8 =head1 NAME Moose::Manual::Construction - Object construction (and destruction) with Moose =head1 VERSION version 2.2200 =head1 WHERE'S THE CONSTRUCTOR? B method for your classes!> When you C in your class, your class becomes a subclass of L. The L provides a C method for your class. If you follow our recommendations in L and make your class immutable, then you actually get a class-specific C method "inlined" in your class. =head1 OBJECT CONSTRUCTION AND ATTRIBUTES The Moose-provided constructor accepts a hash or hash reference of named parameters matching your attributes (actually, matching their Cs). This is just another way in which Moose keeps you from worrying I classes are implemented. Simply define a class and you're ready to start creating objects! =head1 OBJECT CONSTRUCTION HOOKS Moose lets you hook into object construction. You can validate an object's state, do logging, customize construction from parameters which do not match your attributes, or maybe allow non-hash(ref) constructor arguments. You can do this by creating C and/or C methods. If these methods exist in your class, Moose will arrange for them to be called as part of the object construction process. =head2 BUILDARGS The C method is called as a class method I an object is created. It will receive all of the arguments that were passed to C I, and is expected to return a hash reference. This hash reference will be used to construct the object, so it should contain keys matching your attributes' names (well, Cs). One common use for C is to accommodate a non-hash(ref) calling style. For example, we might want to allow our Person class to be called with a single argument of a social security number, C<< Person->new($ssn) >>. Without a C method, Moose will complain, because it expects a hash or hash reference. We can use the C method to accommodate this calling style: around BUILDARGS => sub { my $orig = shift; my $class = shift; if ( @_ == 1 && !ref $_[0] ) { return $class->$orig( ssn => $_[0] ); } else { return $class->$orig(@_); } }; Note the call to C<< $class->$orig >>. This will call the default C in L. This method takes care of distinguishing between a hash reference and a plain hash for you. =head2 BUILD The C method is called I an object is created. There are several reasons to use a C method. One of the most common is to check that the object state is valid. While we can validate individual attributes through the use of types, we can't validate the state of a whole object that way. sub BUILD { my $self = shift; if ( $self->country_of_residence eq 'USA' ) { die 'All US residents must have an SSN' unless $self->has_ssn; } } Another use of a C method could be for logging or tracking object creation. sub BUILD { my $self = shift; debug( 'Made a new person - SSN = ', $self->ssn, ); } The C method is called with the hash reference of the parameters passed to the constructor (after munging by C). This gives you a chance to do something with parameters that do not represent object attributes. sub BUILD { my $self = shift; my $args = shift; $self->add_friend( My::User->new( user_id => $args->{user_id}, ) ); } =head3 BUILD and parent classes The interaction between multiple C methods in an inheritance hierarchy is different from normal Perl methods. BSUPER::BUILD >>>, nor should you ever apply a method modifier to C. Roles are an exception to this rule, though: it's completely acceptable to apply a method modifier to C in a role; you can even provide an empty C subroutine in a role so the role is applicable even to classes without their own C. Moose arranges to have all of the C methods in a hierarchy called when an object is constructed, I. This might be surprising at first, because it reverses the normal order of method inheritance. The theory behind this is that C methods can only be used for increasing specialization of a class's constraints, so it makes sense to call the least specific C method first. Also, this is how Perl 6 does it. =head1 OBJECT DESTRUCTION Moose provides a hook for object destruction with the C method. As with C, you should never explicitly call C<< $self->SUPER::DEMOLISH >>. Moose will arrange for all of the C methods in your hierarchy to be called, from most to least specific. Each C method is called with a single argument. This is a boolean value indicating whether or not this method was called as part of the global destruction process (when the Perl interpreter exits). In most cases, Perl's built-in garbage collection is sufficient, and you won't need to provide a C method. =head2 Error Handling During Destruction The interaction of object destruction and Perl's global C<$@> and C<$?> variables can be very confusing. Moose always localizes C<$?> when an object is being destroyed. This means that if you explicitly call C, that exit code will be preserved even if an object's destructor makes a system call. Moose also preserves C<$@> against any C calls that may happen during object destruction. However, if an object's C method actually dies, Moose explicitly rethrows that error. If you do not like this behavior, you will have to provide your own C method and use that instead of the one provided by L. You can do this to preserve C<$@> I capture any errors from object destruction by creating an error stack. =head1 AUTHORS =over 4 =item * Stevan Little =item * Dave Rolsky =item * Jesse Luehrs =item * Shawn M Moore =item * יובל קוג'מן (Yuval Kogman) =item * Karen Etheridge =item * Florian Ragwitz =item * Hans Dieter Pearcey =item * Chris Prather =item * Matt S Trout =back =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2006 by Infinity Interactive, Inc. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Moose-2.2200/lib/Moose/Manual/Delegation.pod000644 000766 000024 00000017605 14137574636 021011 0ustar00etherstaff000000 000000 # PODNAME: Moose::Manual::Delegation # ABSTRACT: Attribute delegation __END__ =pod =encoding UTF-8 =head1 NAME Moose::Manual::Delegation - Attribute delegation =head1 VERSION version 2.2200 =head1 WHAT IS DELEGATION? Delegation is a feature that lets you create "proxy" methods that do nothing more than call some other method on an attribute. This lets you simplify a complex set of "has-a" relationships and present a single unified API from one class. With delegation, consumers of a class don't need to know about all the objects it contains, reducing the amount of API they need to learn. Delegations are defined as a mapping between one or more methods provided by the "real" class (the delegatee), and a set of corresponding methods in the delegating class. The delegating class can re-use the method names provided by the delegatee or provide its own names. Delegation is also a great way to wrap an existing class, especially a non-Moose class or one that is somehow hard (or impossible) to subclass. =head1 DEFINING A MAPPING Moose offers a number of options for defining a delegation's mapping, ranging from simple to complex. The simplest form is to simply specify a list of methods: package Website; use Moose; has 'uri' => ( is => 'ro', isa => 'URI', handles => [qw( host path )], ); Using an arrayref tells Moose to create methods in your class that match the method names in the delegated class. With this definition, we can call C<< $website->host >> and it "just works". Under the hood, Moose will call C<< $website->uri->host >> for you. Note that C<$website> is I automatically passed to the C method; the invocant is C<< $website->uri >>. We can also define a mapping as a hash reference. This allows you to rename methods as part of the mapping: package Website; use Moose; has 'uri' => ( is => 'ro', isa => 'URI', handles => { hostname => 'host', path => 'path', }, ); Using a hash tells Moose to create method names (specified on the left) which invoke the delegated class methods (specified on the right). In this example, we've created a C<< $website->hostname >> method, rather than simply using C's name, C in the Website class. These two mapping forms are the ones you will use most often. The remaining methods are a bit more complex. has 'uri' => ( is => 'ro', isa => 'URI', handles => qr/^(?:host|path|query.*)/, ); This is similar to the array version, except it uses the regex to match against all the methods provided by the delegatee. In order for this to work, you must provide an C parameter for the attribute, and it must be a class. Moose uses this to introspect the delegatee class and determine what methods it provides. You can use a role name as the value of C: has 'uri' => ( is => 'ro', isa => 'URI', handles => 'HasURI', ); Moose will introspect the role to determine what methods it provides and create a name-for-name mapping for each of those methods. Finally, you can provide a sub reference to I a mapping that behaves like the hash example above. You probably won't need this version often (if ever). See the L docs for more details on exactly how this works. =head1 NATIVE DELEGATION Native delegations allow you to delegate to standard Perl data structures as if they were objects. has 'queue' => ( traits => ['Array'], isa => 'ArrayRef[Item]', default => sub { [ ] }, handles => { add_item => 'push', next_item => 'shift', }, ) The C trait in the C parameter tells Moose that you would like to use the set of Array helpers. Moose will then create C and C methods that "just work". Behind the scenes C is something like sub add_item { my ($self, @items) = @_; for my $item (@items) { $Item_TC->validate($item); } push @{ $self->queue }, @items; } For example, you might use Array helpers to add C and C methods to a Calendar class: has 'tasks' => ( traits => ['Array'], isa => 'ArrayRef[Task]', default => sub { [ ] }, handles => { add_task => 'push', next_task => 'shift', }, ); has 'appointments' => ( traits => ['Array'], isa => 'ArrayRef[Appointment]', default => sub { [ ] }, handles => { add_appointment => 'push', next_appointment => 'shift', }, ); Which you would call as: $calendar->add_task( $task_obj ); $calendar->add_appointment( $appointment_obj ); As mentioned above, each trait provides a number of methods which are summarized below. For more information about each of these provided methods see the documentation for that specific trait. Moose includes the following traits for native delegation. =over 4 =item * L The following methods are provided by the native Array trait: count, is_empty, elements, get, pop, push, shift, unshift, splice, first, first_index, grep, map, reduce, sort, sort_in_place, shuffle, uniq, join, set, delete, insert, clear, accessor, natatime, shallow_clone =item * L The following methods are provided by the native Bool trait: set, unset, toggle, not =item * L The following methods are provided by the native Code trait: execute, execute_method =item * L The following methods are provided by the native Counter trait: set, inc, dec, reset =item * L The following methods are provided by the native Hash trait: get, set, delete, keys, exists, defined, values, kv, elements, clear, count, is_empty, accessor, shallow_clone =item * L The following methods are provided by the native Number trait: add, sub, mul, div, mod, abs =item * L The following methods are provided by the native String trait: inc, append, prepend, replace, match, chop, chomp, clear, length, substr =back =head1 CURRYING Currying allows you to create a method with some pre-set parameters. You can create a curried delegation method: package Spider; use Moose; has request => ( is => 'ro' isa => 'HTTP::Request', handles => { set_user_agent => [ header => 'UserAgent' ], }, ) With this definition, calling C<< $spider->set_user_agent('MyClient') >> will call C<< $spider->request->header('UserAgent', 'MyClient') >> behind the scenes. Note that with currying, the currying always starts with the first parameter to a method (C<$_[0]>). Any arguments you pass to the delegation come after the curried arguments. =head1 MISSING ATTRIBUTES It is perfectly valid to delegate methods to an attribute which is not required or can be undefined. When a delegated method is called, Moose will throw a runtime error if the attribute does not contain an object. =head1 AUTHORS =over 4 =item * Stevan Little =item * Dave Rolsky =item * Jesse Luehrs =item * Shawn M Moore =item * יובל קוג'מן (Yuval Kogman) =item * Karen Etheridge =item * Florian Ragwitz =item * Hans Dieter Pearcey =item * Chris Prather =item * Matt S Trout =back =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2006 by Infinity Interactive, Inc. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Moose-2.2200/lib/Moose/Manual/FAQ.pod000644 000766 000024 00000035326 14137574636 017345 0ustar00etherstaff000000 000000 # PODNAME: Moose::Manual::FAQ # ABSTRACT: Frequently asked questions about Moose __END__ =pod =encoding UTF-8 =head1 NAME Moose::Manual::FAQ - Frequently asked questions about Moose =head1 VERSION version 2.2200 =head1 FREQUENTLY ASKED QUESTIONS =head2 Module Stability =head3 Is Moose "production ready"? Yes! Many sites with household names are using Moose to build high-traffic services. Countless others are using Moose in production. See L for a partial list. As of this writing, Moose is a dependency of several hundred CPAN modules. L =head3 Is Moose's API stable? Yes. The sugary API, the one 95% of users will interact with, is B. Any changes will be B<100% backwards compatible>. The meta API is less set in stone. We reserve the right to tweak parts of it to improve efficiency or consistency. This will not be done lightly. We do perform deprecation cycles. We I do not like making ourselves look bad by breaking your code. Submitting test cases is the best way to ensure that your code is not inadvertently broken by refactoring. =head3 I heard Moose is slow, is this true? Again, this one is tricky, so Yes I No. Firstly, I in life is free, and some Moose features do cost more than others. It is also the policy of Moose to B, and to do our absolute best to not place any extra burdens on the execution of your code for features you are not using. Of course using Moose itself does involve some overhead, but it is mostly compile time. At this point we do have some options available for getting the speed you need. Currently we provide the option of making your classes immutable as a means of boosting speed. This will mean a slightly larger compile time cost, but the runtime speed increase (especially in object construction) is pretty significant. This can be done with the following code: MyClass->meta->make_immutable(); =head2 Constructors =head3 How do I write custom constructors with Moose? Ideally, you should never write your own C method, and should use Moose's other features to handle your specific object construction needs. Here are a few scenarios, and the Moose way to solve them; If you need to call initialization code post instance construction, then use the C method. This feature is taken directly from Perl 6. Every C method in your inheritance chain is called (in the correct order) immediately after the instance is constructed. This allows you to ensure that all your superclasses are initialized properly as well. This is the best approach to take (when possible) because it makes subclassing your class much easier. If you need to affect the constructor's parameters prior to the instance actually being constructed, you have a number of options. To change the parameter processing as a whole, you can use the C method. The default implementation accepts key/value pairs or a hash reference. You can override it to take positional args, or any other format To change the handling of individual parameters, there are I (See the L for a complete example and explanation of coercions). With coercions it is possible to morph argument values into the correct expected types. This approach is the most flexible and robust, but does have a slightly higher learning curve. =head3 How do I make non-Moose constructors work with Moose? Usually the correct approach to subclassing a non-Moose class is delegation. Moose makes this easy using the C keyword, coercions, and C, so subclassing is often not the ideal route. That said, if you really need to inherit from a non-Moose class, see L for an example of how to do it, or take a look at L. =head2 Accessors =head3 How do I tell Moose to use get/set accessors? The easiest way to accomplish this is to use the C and C attribute options: has 'bar' => ( isa => 'Baz', reader => 'get_bar', writer => 'set_bar', ); Moose will still take advantage of type constraints, triggers, etc. when creating these methods. If you do not like this much typing, and wish it to be a default for your classes, please see L. This extension will allow you to write: has 'bar' => ( isa => 'Baz', is => 'rw', ); Moose will create separate C and C methods instead of a single C method. If you like C and C, see L. NOTE: This B be set globally in Moose, as that would break other classes which are built with Moose. You can still save on typing by defining a new C that exports Moose's sugar and then turns on L. See L. =head3 How can I inflate/deflate values in accessors? Well, the first question to ask is if you actually need both inflate and deflate. If you only need to inflate, then we suggest using coercions. Here is some basic sample code for inflating a L object: class_type 'DateTime'; coerce 'DateTime' => from 'Str' => via { DateTime::Format::MySQL->parse_datetime($_) }; has 'timestamp' => (is => 'rw', isa => 'DateTime', coerce => 1); This creates a custom type for L objects, then attaches a coercion to that type. The C attribute is then told to expect a C type, and to try to coerce it. When a C type is given to the C accessor, it will attempt to coerce the value into a C object using the code in found in the C block. For a more comprehensive example of using coercions, see the L. If you need to deflate your attribute's value, the current best practice is to add an C modifier to your accessor: # a timestamp which stores as # seconds from the epoch has 'timestamp' => (is => 'rw', isa => 'Int'); around 'timestamp' => sub { my $next = shift; my $self = shift; return $self->$next unless @_; # assume we get a DateTime object ... my $timestamp = shift; return $self->$next( $timestamp->epoch ); }; It is also possible to do deflation using coercion, but this tends to get quite complex and require many subtypes. An example of this is outside the scope of this document, ask on #moose or send a mail to the list. Still another option is to write a custom attribute metaclass, which is also outside the scope of this document, but we would be happy to explain it on #moose or the mailing list. =head2 Method Modifiers =head3 How can I affect the values in C<@_> using C? You can't, actually: C only runs before the main method, and it cannot easily affect the method's execution. You similarly can't use C to affect the return value of a method. We limit C and C because this lets you write more concise code. You do not have to worry about passing C<@_> to the original method, or forwarding its return value (being careful to preserve context). The C method modifier has neither of these limitations, but is a little more verbose. Alternatively, the L extension provides the C function, which does allow you to affect C<@_>. =head3 Can I use C to stop execution of a method? Yes, but only if you throw an exception. If this is too drastic a measure then we suggest using C instead. The C method modifier is the only modifier which can gracefully prevent execution of the main method. Here is an example: around 'baz' => sub { my $next = shift; my ($self, %options) = @_; unless ($options->{bar} eq 'foo') { return 'bar'; } $self->$next(%options); }; By choosing not to call the C<$next> method, you can stop the execution of the main method. Alternatively, the L extension provides the C function, which will conditionally prevent execution of the original method. =head3 Why can't I see return values in an C modifier? As with the C modifier, the C modifier is simply called I the main method. It is passed the original contents of C<@_> and B the return values of the main method. Again, the arguments are too lengthy as to why this has to be. And as with C I recommend using an C modifier instead. Here is some sample code: around 'foo' => sub { my $next = shift; my ($self, @args) = @_; my @rv = $next->($self, @args); # do something silly with the return values return reverse @rv; }; Alternatively, the L extension provides the C function, which allows modifying the return values of the original method. =head2 Type Constraints =head3 How can I provide a custom error message for a type constraint? Use the C option when building the subtype: subtype 'NaturalLessThanTen' => as 'Natural' => where { $_ < 10 } => message { "This number ($_) is not less than ten!" }; This C block will be called when a value fails to pass the C constraint check. =head3 Can I turn off type constraint checking? There's no support for it in the core of Moose yet. This option may come in a future release. Meanwhile there's a L that allows you to do this on a per-attribute basis, and if it doesn't do what you it's easy to write one that fits your use case. =head3 My coercions stopped working with recent Moose, why did you break it? Moose 0.76 fixed a case where coercions were being applied even if the original constraint passed. This has caused some edge cases to fail where people were doing something like subtype 'Address', as 'Str'; coerce 'Address', from 'Str', via { get_address($_) }; This is not what they intended, because the type constraint C
is too loose in this case. It is saying that all strings are Addresses, which is obviously not the case. The solution is to provide a C clause that properly restricts the type constraint: subtype 'Address', as 'Str', where { looks_like_address($_) }; This will allow the coercion to apply only to strings that fail to look like an Address. =head2 Roles =head3 Why is BUILD not called for my composed roles? C is never called in composed roles. The primary reason is that roles are B order sensitive. Roles are composed in such a way that the order of composition does not matter (for information on the deeper theory of this read the original traits papers here L). Because roles are essentially unordered, it would be impossible to determine the order in which to execute the C methods. As for alternate solutions, there are a couple. =over 4 =item * Using a combination of lazy and default in your attributes to defer initialization (see the Binary Tree example in the cookbook for a good example of lazy/default usage L) =item * Use attribute triggers, which fire after an attribute is set, to facilitate initialization. These are described in the L docs, and examples can be found in the test suite. =back In general, roles should not I initialization; they should either provide sane defaults or should be documented as needing specific initialization. One such way to "document" this is to have a separate attribute initializer which is required for the role. Here is an example of how to do this: package My::Role; use Moose::Role; has 'height' => ( is => 'rw', isa => 'Int', lazy => 1, default => sub { my $self = shift; $self->init_height; } ); requires 'init_height'; In this example, the role will not compose successfully unless the class provides a C method. If none of those solutions work, then it is possible that a role is not the best tool for the job, and you really should be using classes. Or, at the very least, you should reduce the amount of functionality in your role so that it does not require initialization. =head3 What are traits, and how are they different from roles? In Moose, a trait is almost exactly the same thing as a role, except that traits typically register themselves, which allows you to refer to them by a short name ("Big" vs "MyApp::Role::Big"). In Moose-speak, a I is usually composed into a I at compile time, whereas a I is usually composed into an instance of a class at runtime to add or modify the behavior of B. Outside the context of Moose, traits and roles generally mean exactly the same thing. The original paper called them traits, but Perl 6 will call them roles. =head3 Can an attribute-generated method (e.g. an accessor) satisfy requires? Yes, just be sure to consume the role I declaring your attribute. L provides an example: package Breakable; use Moose::Role; requires 'stress'; package Car; use Moose; has 'stress' => ( is => 'rw', isa => 'Int' ); with 'Breakable'; If you mistakenly consume the C role before declaring your C attribute, you would see an error like this: 'Breakable' requires the method 'stress' to be implemented by 'Car' at... =head2 Moose and Subroutine Attributes =head3 Why don't subroutine attributes I inherited from a superclass work? Currently when subclassing a module is done at runtime with the C keyword, but attributes are checked at compile time by Perl. To make attributes work, you must place C in a C block so that the attribute handlers will be available at compile time, like this: BEGIN { extends qw/Foo/ } Note that we're talking about Perl's subroutine attributes here, not Moose attributes: sub foo : Bar(27) { ... } =head1 AUTHORS =over 4 =item * Stevan Little =item * Dave Rolsky =item * Jesse Luehrs =item * Shawn M Moore =item * יובל קוג'מן (Yuval Kogman) =item * Karen Etheridge =item * Florian Ragwitz =item * Hans Dieter Pearcey =item * Chris Prather =item * Matt S Trout =back =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2006 by Infinity Interactive, Inc. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Moose-2.2200/lib/Moose/Manual/Types.pod000600 000766 000024 00000033035 14137574636 020025 0ustar00etherstaff000000 000000 # PODNAME: Moose::Manual::Types # ABSTRACT: Moose's type system __END__ =pod =encoding UTF-8 =head1 NAME Moose::Manual::Types - Moose's type system =head1 VERSION version 2.2200 =head1 TYPES IN PERL? Moose provides its own type system for attributes. You can also use these types to validate method parameters with the help of a MooseX module. Moose's type system is based on a combination of Perl 5's own I types and some Perl 6 concepts. You can create your own subtypes with custom constraints, making it easy to express any sort of validation. Types have names, and you can re-use them by name, making it easy to share types throughout a large application. However, this is not a "real" type system. Moose does not magically make Perl start associating types with variables. This is just an advanced parameter checking system which allows you to associate a name with a constraint. That said, it's still pretty damn useful, and we think it's one of the things that makes Moose both fun and powerful. Taking advantage of the type system makes it much easier to ensure that you are getting valid data, and it also contributes greatly to code maintainability. =head1 THE TYPES The basic Moose type hierarchy looks like this Any Item Bool Maybe[`a] Undef Defined Value Str Num Int ClassName RoleName Ref ScalarRef[`a] ArrayRef[`a] HashRef[`a] CodeRef RegexpRef GlobRef FileHandle Object In practice, the only difference between C and C is conceptual. C is used as the top-level type in the hierarchy. The rest of these types correspond to existing Perl concepts. In particular: =over 4 =item C accepts C<1> for true, and undef, 0, or the empty string as false. =item C accepts either C<`a> or C. =item C accepts integers, floating point numbers (both in decimal notation & exponential notation), 0, .0, 0.0 etc. It doesn't accept numbers with whitespace, Inf, Infinity, "0 but true", NaN & other such strings. =item C and C accept strings that are either the name of a class or the name of a role. The class/role must already be loaded when the constraint is checked. =item C accepts either an L object or a builtin perl filehandle (see L). =item C accepts any blessed reference. =back The types followed by "[`a]" can be parameterized. So instead of just plain C we can say that we want C instead. We can even do something like C. The C type deserves a special mention. Used by itself, it doesn't really mean anything (and is equivalent to C). When it is parameterized, it means that the value is either C or the parameterized type. So C means an integer or C. For more details on the type hierarchy, see L. =head1 WHAT IS A TYPE? It's important to realize that types are not classes (or packages). Types are just objects (L objects, to be exact) with a name and a constraint. Moose maintains a global type registry that lets it convert names like C into the appropriate object. However, class names I type names. When you define a new class using Moose, it defines an associated type name behind the scenes: package MyApp::User; use Moose; Now you can use C<'MyApp::User'> as a type name: has creator => ( is => 'ro', isa => 'MyApp::User', ); However, for non-Moose classes there's no magic. You may have to explicitly declare the class type. This is a bit muddled because Moose assumes that any unknown type name passed as the C value for an attribute is a class. So this works: has 'birth_date' => ( is => 'ro', isa => 'DateTime', ); In general, when Moose is presented with an unknown name, it assumes that the name is a class: subtype 'ModernDateTime' => as 'DateTime' => where { $_->year() >= 1980 } => message { 'The date you provided is not modern enough' }; has 'valid_dates' => ( is => 'ro', isa => 'ArrayRef[DateTime]', ); Moose will assume that C is a class name in both of these instances. =head1 SUBTYPES Moose uses subtypes in its built-in hierarchy. For example, C is a child of C. A subtype is defined in terms of a parent type and a constraint. Any constraints defined by the parent(s) will be checked first, followed by constraints defined by the subtype. A value must pass I of these checks to be valid for the subtype. Typically, a subtype takes the parent's constraint and makes it more specific. A subtype can also define its own constraint failure message. This lets you do things like have an error "The value you provided (20), was not a valid rating, which must be a number from 1-10." This is much friendlier than the default error, which just says that the value failed a validation check for the type. The default error can, however, be made more friendly by installing L (version 0.14 or higher), which Moose will use if possible to display the invalid value. Here's a simple (and useful) subtype example: subtype 'PositiveInt', as 'Int', where { $_ > 0 }, message { "The number you provided, $_, was not a positive number" }; Note that the sugar functions for working with types are all exported by L. =head1 TYPE NAMES Type names are global throughout the current Perl interpreter. Internally, Moose maps names to type objects via a L. If you have multiple apps or libraries all using Moose in the same process, you could have problems with collisions. We recommend that you prefix names with some sort of namespace indicator to prevent these sorts of collisions. For example, instead of calling a type "PositiveInt", call it "MyApp::Type::PositiveInt" or "MyApp::Types::PositiveInt". We recommend that you centralize all of these definitions in a single package, C, which can be loaded by other classes in your application. However, before you do this, you should look at the L module. This module makes it easy to create a "type library" module, which can export your types as perl constants. has 'counter' => (is => 'rw', isa => PositiveInt); This lets you use a short name rather than needing to fully qualify the name everywhere. It also allows you to easily create parameterized types: has 'counts' => (is => 'ro', isa => HashRef[PositiveInt]); This module will check your names at compile time, and is generally more robust than the string type parsing for complex cases. =head1 COERCION A coercion lets you tell Moose to automatically convert one type to another. subtype 'ArrayRefOfInts', as 'ArrayRef[Int]'; coerce 'ArrayRefOfInts', from 'Int', via { [ $_ ] }; You'll note that we created a subtype rather than coercing C directly. It's a bad idea to add coercions to the raw built in types. Coercions are global, just like type names, so a coercion applied to a built in type is seen by all modules using Moose types. This is I reason why it is good to namespace your types. Moose will I try to coerce a value unless you explicitly ask for it. This is done by setting the C attribute option to a true value: package Foo; has 'sizes' => ( is => 'ro', isa => 'ArrayRefOfInts', coerce => 1, ); Foo->new( sizes => 42 ); This code example will do the right thing, and the newly created object will have C<[ 42 ]> as its C attribute. =head2 Deep coercion Deep coercion is the coercion of type parameters for parameterized types. Let's take these types as an example: subtype 'HexNum', as 'Str', where { /[a-f0-9]/i }; coerce 'Int', from 'HexNum', via { hex $_ }; has 'sizes' => ( is => 'ro', isa => 'ArrayRef[Int]', coerce => 1, ); If we try passing an array reference of hex numbers for the C attribute, Moose will not do any coercion. However, you can define a set of subtypes to enable coercion between two parameterized types. subtype 'ArrayRefOfHexNums', as 'ArrayRef[HexNum]'; subtype 'ArrayRefOfInts', as 'ArrayRef[Int]'; coerce 'ArrayRefOfInts', from 'ArrayRefOfHexNums', via { [ map { hex } @{$_} ] }; Foo->new( sizes => [ 'a1', 'ff', '22' ] ); Now Moose will coerce the hex numbers to integers. Moose does not attempt to chain coercions, so it will not coerce a single hex number. To do that, we need to define a separate coercion: coerce 'ArrayRefOfInts', from 'HexNum', via { [ hex $_ ] }; Yes, this can all get verbose, but coercion is tricky magic, and we think it's best to make it explicit. =head1 TYPE UNIONS Moose allows you to say that an attribute can be of two or more disparate types. For example, we might allow an C or C: has 'output' => ( is => 'rw', isa => 'Object | FileHandle', ); Moose actually parses that string and recognizes that you are creating a type union. The C attribute will accept any sort of object, as well as an unblessed file handle. It is up to you to do the right thing for each of them in your code. Whenever you use a type union, you should consider whether or not coercion might be a better answer. For our example above, we might want to be more specific, and insist that output be an object with a C method: duck_type 'CanPrint', [qw(print)]; We can coerce file handles to an object that satisfies this condition with a simple wrapper class: package FHWrapper; use Moose; has 'handle' => ( is => 'rw', isa => 'FileHandle', ); sub print { my $self = shift; my $fh = $self->handle(); print {$fh} @_; } Now we can define a coercion from C to our wrapper class: coerce 'CanPrint' => from 'FileHandle' => via { FHWrapper->new( handle => $_ ) }; has 'output' => ( is => 'rw', isa => 'CanPrint', coerce => 1, ); This pattern of using a coercion instead of a type union will help make your class internals simpler. =head1 TYPE CREATION HELPERS The L module exports a number of helper functions for creating specific kinds of types. These include C, C, C, and C. See the docs for details. One helper worth noting is C, which allows you to create a subtype of C that only allows the specified values: enum 'RGB', [qw( red green blue )]; This creates a type named C. =head1 ANONYMOUS TYPES All of the type creation functions return a type object. This type object can be used wherever you would use a type name, as a parent type, or as the value for an attribute's C option: has 'size' => ( is => 'ro', isa => subtype( 'Int' => where { $_ > 0 } ), ); This is handy when you want to create a one-off type and don't want to "pollute" the global namespace registry. =head1 VALIDATING METHOD PARAMETERS Moose does not provide any means of validating method parameters. However, there are several MooseX extensions on CPAN which let you do this. The simplest and least sugary is L. This lets you validate a set of named parameters using Moose types: use Moose::Util::TypeConstraints qw( find_type_constraint ); use Params::ValidationCompiler qw( validation_for ); { my $validator = validation_for( params => { foo => { type => find_type_constraint('Int') }, bar => { type => find_type_constraint('Str'), optional => 1, }, baz => { type => find_type_constraint('Int'), default => 42, }, }, ); sub foo { my %args = $validator->(@_); } } L also supports coercions. There are several more powerful extensions that support method parameter validation using Moose types, including L, which gives you a full-blown C keyword. method morning ( Str $name ) { $self->say("Good morning ${name}!"); } =head1 LOAD ORDER ISSUES Because Moose types are defined at runtime, you may run into load order problems. In particular, you may want to use a class's type constraint before that type has been defined. In order to ameliorate this problem, we recommend defining I of your custom types in one module, C, and then loading this module in all of your other modules. =head1 AUTHORS =over 4 =item * Stevan Little =item * Dave Rolsky =item * Jesse Luehrs =item * Shawn M Moore =item * יובל קוג'מן (Yuval Kogman) =item * Karen Etheridge =item * Florian Ragwitz =item * Hans Dieter Pearcey =item * Chris Prather =item * Matt S Trout =back =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2006 by Infinity Interactive, Inc. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Moose-2.2200/lib/Moose/Manual/Resources.pod000644 000766 000024 00000024732 14137574636 020707 0ustar00etherstaff000000 000000 # PODNAME: Moose::Manual::Resources # ABSTRACT: Links to various tutorials, videos, blogs, presentations, interviews, etc... __END__ =pod =encoding UTF-8 =head1 NAME Moose::Manual::Resources - Links to various tutorials, videos, blogs, presentations, interviews, etc... =head1 VERSION version 2.2200 =head1 Resources This section is an attempt to collect and list some of the many Moose resources that can be found online. Additional information can be found at http://moose.perl.org/ =head2 Videos =over 4 =item A new object system for the Perl 5 core, Stevan Little L =item Stevan Little interviewed by Gabor Szabo for PerlMaven.com L =item Perl 6 OO vs. Moose, Herbert Breunung L =item Introduction To Moose, Mike Whitaker L =item "Dr. Strange... Moose or: How I Learned to Stop Worrying and Love Perl" L =item Evolving Software with Moose, Dave Cross L =item Testing with Test::Class::Moose, Curtis Poe L =item "Moose is Perl" tutorial, OSCON 2014, Ricardo Signes L =back =head2 Slide Shows =over 4 =item Use Moose to create abstractions in the domain, Shawn M. Moore (sartak) L =back =head2 Articles =over 4 =item Perl.org Moose Whitepaper L =item PerlMaven.com L =item Getting Started with Moose, brian d foy http://www.theperlreview.com/articles/moose.html =item Wikipedia.org L =item Moose: A postmodern object system for Perl 5 L =item Roles and Delegates and Refactoring L =back =head1 Older Resources =head2 Articles =head3 2011 =over 4 =item Dave Rolsky reviews Perl Best Practices, Chapter 15, Objects 7 years later L =item Mark A. Stratman discusses subclassing non-Moose classes L =item Mark A. Stratman shows how to use delegation to work with non-Moose classes L =item The WebGUI folks talk about version 8.0 (which uses Moose) L =item chromatic discusses Parameterized roles with Moose L =back =head3 2010 =over 4 =item Chris Prather discusses Moose and the Modern Perl movement L =item Devin Austin talks about MooseX::App::Cmd L =item JT Smith declares The Second Age of Perl L =item JT Smith talks about Lacuna Expanse (which uses Moose) L =item Moose 1.00 is Released L =item Moritz Lenz asks What is "Modern Perl"? L =item Yuval Kogman declares "Moose has won". L =item chromatic discusses how Moose helps you write more correct code L =item chromatic discusses the Moose deprecation policy L =item chromatic talks about Class::MOP in relation to his Modern Perl book L =item chromatic talks about Encapsulation and Moose L =back =head3 2009 =over 4 =item Bruno Vecchi praises Moose for making his protein analysis code easier L =item Chris Prather compares MooseX::Declare to Simula 67 L =item Chris Prather rationalizes Moose's "post modern" label L =item Dave Rolsky's post-mortem on his Moose documentation grant L =item David McLaughlin experiments with extending Moose for MooseX::ChainedAccessors L =item Sam Crawley summarizes his experience with roles L =item Shawn M Moore discusses Perl::Critic for Moose and linting with the MOP L =item Shlomi Fish discovers a better way to Moose L =item Stevan Little explains why you should make your Moose classes immutable L =item Tomas Doran interview about the new Moose-based Catalyst L =item chromatic contrasts roles and duck-typing L =item chromatic contrasts roles and inheritance L =item chromatic on The Why of Perl Roles L =back =head3 2008 =over 4 =item Barry Walsh does an excellent comparison of Moose and Ruby (specifically the Doodle module) L =item Tim Bunce's excellent Perl Myths talk gives a shout out to Moose L =item chromatic suggests Moose and Mouse in his Beginners Introduction to Object-Oriented Programming with Perl article L =back =head3 2007 =over 4 =item Larry mentioned Moose in 2007's State of the Onion speech L =item Max Kanat-Alexander (of Bugzilla fame) has some nice things to say about Moose L =back =head3 2006 =over 4 =item Class::MOP Review (OnLAMP) L =back =head2 Presentations =head3 Perl Mongers Groups =over 4 =item Doug Treder's Moose talk at Seattle Perl Users Group L =item Hans Dieter Pearcey's Meta-Moose at PDX.pm L =item Piers Cawley's MooseX::Declare talk at London.pm (video) L =item Robert Boone's Moose talk at Houston.pm L =item hakobe's Moose presentation at Kansai.pm L =back =head3 2011 =over 4 =item SawyerX's FOSDEM 2011 Moose talk L =back =head3 2010 =over 4 =item Drew Stephens gives a lighting talk on Moose at SHDH 36 L =item Jesse Luehrs's "Extending Moose" talk at YAPC::NA 2010 L =item Shawn Moore's "Non-hierarchical osdc.tw L =item Ynon Perek's Perl Object Oriented Programming slides L =back =head3 2009 =over 4 =item Dave Rolsky's Introduction to Moose master class at YAPC::NA 2009 (delivered by Shawn Moore and Jonathan Rockway) L =item Devin Austin's Intro to Moose at YAPC::NA 2009 L =item Hans Dieter Pearcey's Code Reuse with Moose at YAPC::NA 2009 L =item Mike Whitaker's Intro to Moose at Italian Perl Workshop L =item Mike Whitaker's Introduction to Moose at the Italian Perl Workshop L =item Shawn M Moore's Intro to Moose at Frozen Perl L =item Shawn Moore's Extending Moose for Applications at YAPC::NA 2009 L =item Shawn Moore's Moose master class at YAPC::Asia 2009 L =item Yuval Kogman's Why Moose at the Nordic Perl Workshop L =back =head3 2008 =over 4 =item Mike Whitaker's Intro to Moose at the London Perl Workshop L =back =head3 2006 =over 4 =item Sam Vilain gives the very first Moose talk at YAPC::EU L =back =head1 AUTHORS =over 4 =item * Stevan Little =item * Dave Rolsky =item * Jesse Luehrs =item * Shawn M Moore =item * יובל קוג'מן (Yuval Kogman) =item * Karen Etheridge =item * Florian Ragwitz =item * Hans Dieter Pearcey =item * Chris Prather =item * Matt S Trout =back =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2006 by Infinity Interactive, Inc. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Moose-2.2200/lib/Moose/Manual/Unsweetened.pod000640 000766 000024 00000021160 14137574636 021207 0ustar00etherstaff000000 000000 # PODNAME: Moose::Manual::Unsweetened # ABSTRACT: Moose idioms in plain old Perl 5 without the sugar __END__ =pod =encoding UTF-8 =head1 NAME Moose::Manual::Unsweetened - Moose idioms in plain old Perl 5 without the sugar =head1 VERSION version 2.2200 =head1 DESCRIPTION If you're trying to figure out just what the heck Moose does, and how it saves you time, you might find it helpful to see what Moose is I doing for you. This document shows you the translation from Moose sugar back to plain old Perl 5. =head1 CLASSES AND ATTRIBUTES First, we define two very small classes the Moose way. package Person; use DateTime; use DateTime::Format::Natural; use Moose; use Moose::Util::TypeConstraints; has name => ( is => 'rw', isa => 'Str', required => 1, ); # Moose doesn't know about non-Moose-based classes. class_type 'DateTime'; my $en_parser = DateTime::Format::Natural->new( lang => 'en', time_zone => 'UTC', ); coerce 'DateTime' => from 'Str' => via { $en_parser->parse_datetime($_) }; has birth_date => ( is => 'rw', isa => 'DateTime', coerce => 1, handles => { birth_year => 'year' }, ); enum 'ShirtSize' => [qw( s m l xl xxl )]; has shirt_size => ( is => 'rw', isa => 'ShirtSize', default => 'l', ); This is a fairly simple class with three attributes. We also define an enum type to validate t-shirt sizes because we don't want to end up with something like "blue" for the shirt size! package User; use Email::Valid; use Moose; use Moose::Util::TypeConstraints; extends 'Person'; subtype 'Email' => as 'Str' => where { Email::Valid->address($_) } => message { "$_ is not a valid email address" }; has email_address => ( is => 'rw', isa => 'Email', required => 1, ); This class subclasses Person to add a single attribute, email address. Now we will show what these classes would look like in plain old Perl 5. For the sake of argument, we won't use any base classes or any helpers like C. package Person; use strict; use warnings; use Carp qw( confess ); use DateTime; use DateTime::Format::Natural; sub new { my $class = shift; my %p = ref $_[0] ? %{ $_[0] } : @_; exists $p{name} or confess 'name is a required attribute'; $class->_validate_name( $p{name} ); exists $p{birth_date} or confess 'birth_date is a required attribute'; $p{birth_date} = $class->_coerce_birth_date( $p{birth_date} ); $class->_validate_birth_date( $p{birth_date} ); $p{shirt_size} = 'l' unless exists $p{shirt_size}; $class->_validate_shirt_size( $p{shirt_size} ); return bless \%p, $class; } sub _validate_name { shift; my $name = shift; local $Carp::CarpLevel = $Carp::CarpLevel + 1; defined $name or confess 'name must be a string'; } { my $en_parser = DateTime::Format::Natural->new( lang => 'en', time_zone => 'UTC', ); sub _coerce_birth_date { shift; my $date = shift; return $date unless defined $date && ! ref $date; my $dt = $en_parser->parse_datetime($date); return $dt ? $dt : undef; } } sub _validate_birth_date { shift; my $birth_date = shift; local $Carp::CarpLevel = $Carp::CarpLevel + 1; $birth_date->isa('DateTime') or confess 'birth_date must be a DateTime object'; } sub _validate_shirt_size { shift; my $shirt_size = shift; local $Carp::CarpLevel = $Carp::CarpLevel + 1; defined $shirt_size or confess 'shirt_size cannot be undef'; my %sizes = map { $_ => 1 } qw( s m l xl xxl ); $sizes{$shirt_size} or confess "$shirt_size is not a valid shirt size (s, m, l, xl, xxl)"; } sub name { my $self = shift; if (@_) { $self->_validate_name( $_[0] ); $self->{name} = $_[0]; } return $self->{name}; } sub birth_date { my $self = shift; if (@_) { my $date = $self->_coerce_birth_date( $_[0] ); $self->_validate_birth_date( $date ); $self->{birth_date} = $date; } return $self->{birth_date}; } sub birth_year { my $self = shift; return $self->birth_date->year; } sub shirt_size { my $self = shift; if (@_) { $self->_validate_shirt_size( $_[0] ); $self->{shirt_size} = $_[0]; } return $self->{shirt_size}; } Wow, that was a mouthful! One thing to note is just how much space the data validation code consumes. As a result, it's pretty common for Perl 5 programmers to just not bother. Unfortunately, not validating arguments leads to surprises down the line ("why is birth_date an email address?"). Also, did you spot the (intentional) bug? It's in the C<_validate_birth_date()> method. We should check that the value in C<$birth_date> is actually defined and an object before we go and call C on it! Leaving out those checks means our data validation code could actually cause our program to die. Oops. Note that if we add a superclass to Person we'll have to change the constructor to account for that. (As an aside, getting all the little details of what Moose does for you just right in this example was really not easy, which emphasizes the point of the example. Moose saves you a lot of work!) Now let's see User: package User; use strict; use warnings; use Carp qw( confess ); use Email::Valid; use Scalar::Util qw( blessed ); use parent 'Person'; sub new { my $class = shift; my %p = ref $_[0] ? %{ $_[0] } : @_; exists $p{email_address} or confess 'email_address is a required attribute'; $class->_validate_email_address( $p{email_address} ); my $self = $class->SUPER::new(%p); $self->{email_address} = $p{email_address}; return $self; } sub _validate_email_address { shift; my $email_address = shift; local $Carp::CarpLevel = $Carp::CarpLevel + 1; defined $email_address or confess 'email_address must be a string'; Email::Valid->address($email_address) or confess "$email_address is not a valid email address"; } sub email_address { my $self = shift; if (@_) { $self->_validate_email_address( $_[0] ); $self->{email_address} = $_[0]; } return $self->{email_address}; } That one was shorter, but it only has one attribute. Between the two classes, we have a whole lot of code that doesn't do much. We could probably simplify this by defining some sort of "attribute and validation" hash, like this: package Person; my %Attr = ( name => { required => 1, validate => sub { defined $_ }, }, birth_date => { required => 1, validate => sub { blessed $_ && $_->isa('DateTime') }, }, shirt_size => { required => 1, validate => sub { defined $_ && $_ =~ /^(?:s|m|l|xl|xxl)$/i }, } ); Then we could define a base class that would accept such a definition and do the right thing. Keep that sort of thing up and we're well on our way to writing a half-assed version of Moose! Of course, there are CPAN modules that do some of what Moose does, like C, C, and so on. But none of them put together all of Moose's features along with a layer of declarative sugar, nor are these other modules designed for extensibility in the same way as Moose. With Moose, it's easy to write a MooseX module to replace or extend a piece of built-in functionality. Moose is a complete OO package in and of itself, and is part of a rich ecosystem of extensions. It also has an enthusiastic community of users and is being actively maintained and developed. =head1 AUTHORS =over 4 =item * Stevan Little =item * Dave Rolsky =item * Jesse Luehrs =item * Shawn M Moore =item * יובל קוג'מן (Yuval Kogman) =item * Karen Etheridge =item * Florian Ragwitz =item * Hans Dieter Pearcey =item * Chris Prather =item * Matt S Trout =back =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2006 by Infinity Interactive, Inc. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Moose-2.2200/lib/Moose/Manual/MOP.pod000644 000766 000024 00000014122 14137574636 017360 0ustar00etherstaff000000 000000 # PODNAME: Moose::Manual::MOP # ABSTRACT: The Moose (and Class::MOP) meta API __END__ =pod =encoding UTF-8 =head1 NAME Moose::Manual::MOP - The Moose (and Class::MOP) meta API =head1 VERSION version 2.2200 =head1 INTRODUCTION Moose provides a powerful introspection API built on top of C. "MOP" stands for Meta-Object Protocol. In plainer English, a MOP is an API for performing introspection on classes, attributes, methods, and so on. In fact, it is C that provides many of Moose's core features, including attributes, before/after/around method modifiers, and immutability. In most cases, Moose takes an existing C class and subclasses it to add additional features. Moose also adds some entirely new features of its own, such as roles, the augment modifier, and types. If you're interested in the MOP, it's important to know about C so you know what docs to read. Often, the introspection method that you're looking for is defined in a C class, rather than Moose itself. The MOP provides more than just I introspection. It also lets you add attributes and methods, apply roles, and much more. In fact, all of the declarative Moose sugar is simply a thin layer on top of the MOP API. If you want to write Moose extensions, you'll need to learn some of the MOP API. The introspection methods are also handy if you want to generate docs or inheritance graphs, or do some other runtime reflection. This document is not a complete reference for the meta API. We're just going to cover some of the highlights, and give you a sense of how it all works. To really understand it, you'll have to read a lot of other docs, and possibly even dig into the Moose guts a bit. =head1 GETTING STARTED The usual entry point to the meta API is through a class's metaclass object, which is a L. This is available by calling the C method on a class or object: package User; use Moose; my $meta = __PACKAGE__->meta; The C method is added to a class when it uses Moose. You can also use C<< Class::MOP::Class->initialize($name) >> to get a metaclass object for any class. This is safer than calling C<< $class->meta >> when you're not sure that the class has a meta method. The C<< Class::MOP::Class->initialize >> constructor will return an existing metaclass if one has already been created (via Moose or some other means). If it hasn't, it will return a new C object. This will work for classes that use Moose, meta API classes, and classes which don't use Moose at all. =head1 USING THE METACLASS OBJECT The metaclass object can tell you about a class's attributes, methods, roles, parents, and more. For example, to look at all of the class's attributes: for my $attr ( $meta->get_all_attributes ) { print $attr->name, "\n"; } The C method is documented in C. For Moose-using classes, it returns a list of L objects for attributes defined in the class and its parents. You can also get a list of methods: for my $method ( $meta->get_all_methods ) { print $method->fully_qualified_name, "\n"; } Now we're looping over a list of L objects. Note that some of these objects may actually be a subclass of L, as Moose uses different classes to represent wrapped methods, delegation methods, constructors, etc. We can look at a class's parent classes and subclasses: for my $class ( $meta->linearized_isa ) { print "$class\n"; } for my $subclass ( $meta->subclasses ) { print "$subclass\n"; } Note that both these methods return class I, not metaclass objects. =head1 ALTERING CLASSES WITH THE MOP The metaclass object can change the class directly, by adding attributes, methods, etc. As an example, we can add a method to a class: $meta->add_method( 'say' => sub { print @_, "\n" } ); Or an attribute: $meta->add_attribute( 'size' => ( is => 'rw', isa => 'Int' ) ); Obviously, this is much more cumbersome than using Perl syntax or Moose sugar for defining methods and attributes, but this API allows for very powerful extensions. You might remember that we've talked about making classes immutable elsewhere in the manual. This is a good practice. However, once a class is immutable, calling any of these update methods will throw an exception. You can make a class mutable again simply by calling C<< $meta->make_mutable >>. Once you're done changing it, you can restore immutability by calling C<< $meta->make_immutable >>. However, the most common use for this part of the meta API is as part of Moose extensions. These extensions should assume that they are being run before you make a class immutable. =head1 GOING FURTHER If you're interested in extending Moose, we recommend reading all of the "Meta" and "Extending" recipes in the L. Those recipes show various practical applications of the MOP. If you'd like to write your own extensions, one of the best ways to learn more about this is to look at other similar extensions to see how they work. You'll probably also need to read various API docs, including the docs for the various C and C classes. Finally, we welcome questions on the Moose mailing list and IRC. Information on the mailing list, IRC, and more references can be found in the L. =head1 AUTHORS =over 4 =item * Stevan Little =item * Dave Rolsky =item * Jesse Luehrs =item * Shawn M Moore =item * יובל קוג'מן (Yuval Kogman) =item * Karen Etheridge =item * Florian Ragwitz =item * Hans Dieter Pearcey =item * Chris Prather =item * Matt S Trout =back =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2006 by Infinity Interactive, Inc. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Moose-2.2200/lib/Moose/Manual/Delta.pod000644 000766 000024 00000125764 14137574636 017775 0ustar00etherstaff000000 000000 # PODNAME: Moose::Manual::Delta # ABSTRACT: Important Changes in Moose __END__ =pod =encoding UTF-8 =head1 NAME Moose::Manual::Delta - Important Changes in Moose =head1 VERSION version 2.2200 =head1 DESCRIPTION This documents any important or noteworthy changes in Moose, with a focus on things that affect backwards compatibility. This does duplicate data from the F file, but aims to provide more details and when possible workarounds. Besides helping keep up with changes, you can also use this document for finding the lowest version of Moose that supported a given feature. If you encounter a problem and have a solution but don't see it documented here, or think we missed an important feature, please send us a patch. =head1 2.1400 =over 4 =item Overloading implementation has changed Overloading meta information used to be implemented by a C class. This class has been removed, and overloading is now implemented by L. Overloading is not really equivalent to a method, so the former implementation didn't work properly for various cases. All of the overloading-related methods for classes and roles have the same names, but those methods now return L objects. =item Core support for overloading in roles Roles which use overloading now pass that overloading onto other classes (and roles) which consume that role. This works much like L, except that we properly detect overloading conflicts during role summation and when applying one role to another. L did not do any conflict detection. If you want to write code that uses overloading and works with previous versions of Moose and this one, upgrade to L version 0.15 or greater. That version will detect when Moose itself handles overloading and get out of the way. =back =head1 2.1200 =over 4 =item Classes created by Moose are now registered in C<%INC> This means that this will no longer die (and will also no longer try to load C): { package Foo; use Moose; } # ... use Foo; If you're using the MOP, this behavior will occur when the C (or C) method is used, but not when the C method is used. =item Moose now uses L instead of L to load classes Class::Load has always had some weird issues with the ways that it tries to figure out if a class is loaded. For instance, extending an empty package was previously impossible, because Class::Load would think that the class failed to load, even though that is a perfectly valid thing to do. It was also difficult to deal with modules like L, which partially populate several other packages when they are loaded (so calling C on C<'IO::Handle'> followed by C<'IO::File'> could end up with a broken C, in some cases). Now, Moose uses the same mechanisms as perl itself to figure out if a class is loaded. A class is considered to be loaded if its entry in C<%INC> is set. Perl sets the C<%INC> entry for you automatically whenever a file is loaded via C or C. Also, as mentioned above, Moose also now sets the C<%INC> entry for any classes defined with it, even if they aren't loaded from a separate file. This does however mean that if you are trying to use Moose with non-Moose classes defined in the same file, then you will need to set C<%INC> manually now, where it may have worked in the past. For instance: { package My::NonMoose; sub new { bless {}, shift } $INC{'My/NonMoose.pm'} = __FILE__; # alternatively: # use Module::Runtime 'module_notional_filename'; # $INC{module_notional_filename(__PACKAGE__)} = __FILE__; } { package My::Moose; use Moose; extends 'My::NonMoose'; } If you don't do this, you will get an error message about not being able to locate C in C<@INC>. We hope that this case will be fairly rare. =item The Class::Load wrapper functions in Class::MOP have been deprecated C, C, and C have been deprecated. They have been undocumented and discouraged since version 2.0200. You should replace their use with the corresponding functions in L, or just use L directly. =item The non-arrayref forms of C and C have been deprecated Originally, C could be called like this: enum('MyType' => qw(foo bar baz)) This was confusing, however (since it was different from the syntax for anonymous enum types), and it makes error checking more difficult (since you can't tell just by looking whether C was intended to be a type named C with elements of C and C, or if this was actually a mistake where someone got the syntax for an anonymous enum type wrong). This all also applies to C. Calling C and C with a list of arguments as described above has been undocumented since version 0.93, and is now deprecated. You should replace enum MyType => qw(foo bar baz); in your code with enum MyType => [qw(foo bar baz)]; =item Moose string exceptions have been replaced by Moose exception objects Previously, Moose threw string exceptions on error conditions, which were not so verbose. All those string exceptions have now been converted to exception objects, which provide very detailed information about the exceptions. These exception objects provide a string overload that matches the previous exception message, so in most cases you should not have to change your code. For learning about the usage of Moose exception objects, read L. Individual exceptions are documented in L. This work was funded as part of the GNOME Outreach Program for Women. =back =head1 2.1000 =over 4 =item The Num type is now stricter The C type used to accept anything that fits Perl's notion of a number, which included Inf, NaN, and strings like C<" 1234 \n">. We believe that the type constraint should indicate "this is a number", not "this coerces to a number". Therefore, Num now only accepts integers, floating point numbers (both in decimal notation and exponential notation), 0, .0, 0.0, etc. If you want the old behavior you can use the C type in L. =item You can use L instead of core Moose types The L distribution is an experimental new type system intended to eventually replace the core Moose types, but yet also work with things like L and L and anything else. Right now this is all speculative, but at least you can use Specio with Moose. =back =head1 2.0600 =over 4 =item C<< ->init_meta >> is even less reliable at loading extensions Previously, calling C<< MooseX::Foo->init_meta(@_) >> (and nothing else) from within your own C had a decent chance of doing something useful. This was never supported behavior, and didn't always work anyway. Due to some implementation adjustments, this now has a smaller chance of doing something useful, which could break code that was expecting it to continue doing useful things. Code that does this should instead just call C<< MooseX::Foo->import({ into => $into }) >>. =item All the Cookbook recipes have been renamed We've given them all descriptive names, rather than numbers. This makes it easier to talk about them, and eliminates the need to renumber recipes in order to reorder them or delete one. =back =head1 2.0400 =over 4 =item The parent of a union type is its components' nearest common ancestor Previously, union types considered all of their component types their parent types. This was incorrect because parent types are defined as types that must be satisfied in order for the child type to be satisfied, but in a union, validating as any parent type will validate against the entire union. This has been changed to find the nearest common ancestor for all of its components. For example, a union of "Int|ArrayRef[Int]" now has a parent of "Defined". =item Union types consider all members in the C and C methods Previously, a union type would report itself as being of a subtype of a type if I of its member types were subtypes of that type. This was incorrect because any value that passes a subtype constraint must also pass a parent constraint. This has changed so that I of its member types must be a subtype of the specified type. =item Enum types now work with just one value Previously, an C type needed to have two or more values. Nobody knew why, so we fixed it. =item Methods defined in UNIVERSAL now appear in the MOP Any method introspection methods that look at methods from parent classes now find methods defined in UNIVERSAL. This includes methods like C<< $class->get_all_methods >> and C<< $class->find_method_by_name >>. This also means that you can now apply method modifiers to these methods. =item Hand-optimized type constraint code causes a deprecation warning If you provide an optimized sub ref for a type constraint, this now causes a deprecation warning. Typically, this comes from passing an C parameter to C, but it could also happen if you create a L object directly. Use the inlining feature (C) added in 2.0100 instead. =item C and C have been removed The C and C subroutines are no longer documented, and will cause a deprecation warning in the future. Moose now uses L to provide this functionality, and you should do so as well. =back =head1 2.0205 =over 4 =item Array and Hash native traits provide a C method The Array and Hash native traits now provide a "shallow_clone" method, which will return a reference to a new container with the same contents as the attribute's reference. =back =head1 2.0200 =over 4 =item Hand-optimized type constraint code is deprecated in favor of inlining Moose allows you to provide a hand-optimized version of a type constraint's subroutine reference. This version allows type constraints to generate inline code, and you should use this inlining instead of providing a hand-optimized subroutine reference. This affects the C sub exported by L. Use C instead. This will start warning in the 2.0300 release. =back =head1 2.0002 =over 4 =item More useful type constraint error messages If you have L version 0.14 or higher installed, Moose's type constraint error messages will use it to display the invalid value, rather than just displaying it directly. This will generally be much more useful. For instance, instead of this: Attribute (foo) does not pass the type constraint because: Validation failed for 'ArrayRef[Int]' with value ARRAY(0x275eed8) the error message will instead look like Attribute (foo) does not pass the type constraint because: Validation failed for 'ArrayRef[Int]' with value [ "a" ] Note that L can't be made a direct dependency at the moment, because it uses Moose itself, but we're considering options to make this easier. =back =head1 2.0000 =over 4 =item Roles have their own default attribute metaclass Previously, when a role was applied to a class, it would use the attribute metaclass defined in the class when copying over the attributes in the role. This was wrong, because for instance, using L in the class would end up renaming all of the accessors generated by the role, some of which may be being called in the role, causing it to break. Roles now keep track of their own attribute metaclass to use by default when being applied to a class (defaulting to Moose::Meta::Attribute). This is modifiable using L by passing the C key to the C option, as in: Moose::Util::MetaRole::apply_metaroles( for => __PACKAGE__, class_metaroles => { attribute => ['My::Meta::Role::Attribute'], }, role_metaroles => { applied_attribute => ['My::Meta::Role::Attribute'], }, ); =item Class::MOP has been folded into the Moose dist Moose and Class::MOP are tightly related enough that they have always had to be kept pretty closely in step in terms of versions. Making them into a single dist should simplify the upgrade process for users, as it should no longer be possible to upgrade one without the other and potentially cause issues. No functionality has changed, and this should be entirely transparent. =item Moose's conflict checking is more robust and useful There are two parts to this. The most useful one right now is that Moose will ship with a C script, which can be run at any point to list the modules which are installed that conflict with the installed version of Moose. After upgrading Moose, running C should be sufficient to ensure that all of the Moose extensions you use will continue to work. The other part is that Moose's C file will also specify the conflicts under the C (now C) key. We are working with the Perl tool chain developers to try to get conflicts support added to CPAN clients, and if/when that happens, the metadata already exists, and so the conflict checking will become automatic. =item The lazy_build attribute feature is discouraged While not deprecated, we strongly discourage you from using this feature. =item Most deprecated APIs/features are slated for removal in Moose 2.0200 Most of the deprecated APIs and features in Moose will start throwing an error in Moose 2.0200. Some of the features will go away entirely, and some will simply throw an error. The things on the chopping block are: =over 8 =item * Old public methods in Class::MOP and Moose This includes things like C<< Class::MOP::Class->get_attribute_map >>, C<< Class::MOP::Class->construct_instance >>, and many others. These were deprecated in L 0.80_01, released on April 5, 2009. These methods will be removed entirely in Moose 2.0200. =item * Old public functions in Class::MOP This include C, C, and the C constant. The first two were deprecated in 0.84, and the last in 0.80. Class::MOP 0.84 was released on May 12, 2009. These functions will be removed entirely in Moose 2.0200. =item * The C and C option for role composition These were renamed to C<-alias> and C<-excludes> in Moose 0.89, released on August 13, 2009. Passing these will throw an error in Moose 2.0200. =item * The old L API This include the C function, as well as passing the C or any key ending in C<_roles> to C. This was deprecated in Moose 0.93_01, released on January 4, 2010. These will all throw an error in Moose 2.0200. =item * Passing plain lists to C or C The old API for these functions allowed you to pass a plain list of parameter, rather than a list of hash references (which is what C, C, etc. return). This was deprecated in Moose 0.71_01, released on February 22, 2009. This will throw an error in Moose 2.0200. =item * The Role subtype This subtype was deprecated in Moose 0.84, released on June 26, 2009. This will be removed entirely in Moose 2.0200. =back =back =head1 1.21 =over 4 =item * New release policy As of the 2.0 release, Moose now has an official release and support policy, documented in L. All API changes will now go through a deprecation cycle of at least one year, after which the deprecated API can be removed. Deprecations and removals will only happen in major releases. In between major releases, we will still make minor releases to add new features, fix bugs, update documentation, etc. =back =head1 1.16 =over 4 =item Configurable stacktraces Classes which use the L error class can now have stacktraces disabled by setting the C env var to C. This is experimental, fairly incomplete, and won't work in all cases (because Moose's error system in general is all of these things), but this should allow for reducing at least some of the verbosity in most cases. =back =head1 1.15 =over 4 =item Native Delegations In previous versions of Moose, the Native delegations were created as closures. The generated code was often quite slow compared to doing the same thing by hand. For example, the Array's push delegation ended up doing something like this: push @{ $self->$reader() }, @_; If the attribute was created without a reader, the C<$reader> sub reference followed a very slow code path. Even with a reader, this is still slower than it needs to be. Native delegations are now generated as inline code, just like other accessors, so we can access the slot directly. In addition, native traits now do proper constraint checking in all cases. In particular, constraint checking has been improved for array and hash references. Previously, only the I type (the C in C) would be checked when a new value was added to the collection. However, if there was a constraint that applied to the whole value, this was never checked. In addition, coercions are now called on the whole value. The delegation methods now do more argument checking. All of the methods check that a valid number of arguments were passed to the method. In addition, the delegation methods check that the arguments are sane (array indexes, hash keys, numbers, etc.) when applicable. We have tried to emulate the behavior of Perl builtins as much as possible. Finally, triggers are called whenever the value of the attribute is changed by a Native delegation. These changes are only likely to break code in a few cases. The inlining code may or may not preserve the original reference when changes are made. In some cases, methods which change the value may replace it entirely. This will break tied values. If you have a typed arrayref or hashref attribute where the type enforces a constraint on the whole collection, this constraint will now be checked. It's possible that code which previously ran without errors will now cause the constraint to fail. However, presumably this is a good thing ;) If you are passing invalid arguments to a delegation which were previously being ignored, these calls will now fail. If your code relied on the trigger only being called for a regular writer, that may cause problems. As always, you are encouraged to test before deploying the latest version of Moose to production. =item Defaults is and default for String, Counter, and Bool A few native traits (String, Counter, Bool) provide default values of "is" and "default" when you created an attribute. Allowing them to provide these values is now deprecated. Supply the value yourself when creating the attribute. =item The C method Moose and Class::MOP have been cleaned up internally enough to make the C method that you get by default optional. C and C now can take an additional C<-meta_name> option, which tells Moose what name to use when installing the C method. Passing C to this option suppresses generation of the C method entirely. This should be useful for users of modules which also use a C method or function, such as L or L. =back =head1 1.09 =over 4 =item All deprecated features now warn Previously, deprecation mostly consisted of simply saying "X is deprecated" in the Changes file. We were not very consistent about actually warning. Now, all deprecated features still present in Moose actually give a warning. The warning is issued once per calling package. See L for more details. =item You cannot pass C<< coerce => 1 >> unless the attribute's type constraint has a coercion Previously, this was accepted, and it sort of worked, except that if you attempted to set the attribute after the object was created, you would get a runtime error. Now you will get a warning when you attempt to define the attribute. =item C, C, and C no longer unimport strict and warnings This change was made in 1.05, and has now been reverted. We don't know if the user has explicitly loaded strict or warnings on their own, and unimporting them is just broken in that case. =item Reversed logic when defining which options can be changed L now allows all options to be changed in an overridden attribute. The previous behaviour required each option to be whitelisted using the C method. This method has been removed, and there is a new method, C, which can now be used to prevent certain options from being changeable. In addition, we only throw an error if the illegal option is actually changed. If the superclass didn't specify this option at all when defining the attribute, the subclass version can still add it as an option. Example of overriding this in an attribute trait: package Bar::Meta::Attribute; use Moose::Role; has 'my_illegal_option' => ( isa => 'CodeRef', is => 'rw', ); around illegal_options_for_inheritance => sub { return ( shift->(@_), qw/my_illegal_option/ ); }; =back =head1 1.05 =over 4 =item L methods are now called when calling C Previously, C methods would only be called from C, but now they are also called when constructing an object via C. C methods are an inherent part of the object construction process, and this should make C<< $meta->new_object >> actually usable without forcing people to use C<< $meta->name->new >>. =item C, C, and C now unimport strict and warnings In the interest of having C clean up everything that C does in the calling scope, C (as well as all other L-using modules) now unimports strict and warnings. =item Metaclass compatibility checking and fixing should be much more robust The L checking and fixing algorithms have been completely rewritten, in both Class::MOP and Moose. This should resolve many confusing errors when dealing with non-Moose inheritance and with custom metaclasses for things like attributes, constructors, etc. For correct code, the only thing that should require a change is that custom error metaclasses must now inherit from L. =back =head1 1.02 =over 4 =item Moose::Meta::TypeConstraint::Class is_subtype_of behavior Earlier versions of L would incorrectly return true when called with itself, its own TC name or its class name as an argument. (i.e. $foo_tc->is_subtype_of('Foo') == 1) This behavior was a caused by C being checked before the class name. The old behavior can be accessed with L =back =head1 1.00 =over 4 =item Moose::Meta::Attribute::Native::Trait::Code no longer creates reader methods by default Earlier versions of L created read-only accessors for the attributes it's been applied to, even if you didn't ask for it with C<< is => 'ro' >>. This incorrect behaviour has now been fixed. =back =head1 0.95 =over 4 =item Moose::Util add_method_modifier behavior add_method_modifier (and subsequently the sugar functions Moose::before, Moose::after, and Moose::around) can now accept arrayrefs, with the same behavior as lists. Types other than arrayref and regexp result in an error. =back =head1 0.93_01 and 0.94 =over 4 =item Moose::Util::MetaRole API has changed The C function is now called C. The way arguments are supplied has been changed to force you to distinguish between metaroles applied to L (and helpers) versus L. The old API still works, but will warn in a future release, and eventually be removed. =item Moose::Meta::Role has real attributes The attributes returned by L are now instances of the L class, instead of bare hash references. =item "no Moose" now removes C and C Moose is now smart enough to know exactly what it exported, even when it re-exports functions from other packages. When you unimport Moose, it will remove these functions from your namespace unless you I imported them directly from their respective packages. If you have a C in your code I you call C or C, your code will break. You can either move the C call later in your code, or explicitly import the relevant functions from the packages that provide them. =item L is smarter about unimporting re-exports The change above comes from a general improvement to L. It will now unimport any function it exports, even if that function is a re-export from another package. =item Attributes in roles can no longer override class attributes with "+foo" Previously, this worked more or less accidentally, because role attributes weren't objects. This was never documented, but a few MooseX modules took advantage of this. =item The composition_class_roles attribute in L is now a method This was done to make it possible for roles to alter the list of composition class roles by applying a method modifiers. Previously, this was an attribute and MooseX modules override it. Since that no longer works, this was made a method. This I be an attribute, so this may switch back to being an attribute in the future if we can figure out how to make this work. =back =head1 0.93 =over 4 =item Calling $object->new() is no longer deprecated We decided to undeprecate this. Now it just works. =item Both C and C is deprecated These metaclass methods were never meant to be public, and they are both now deprecated. The work around if you still need the functionality they provided is to iterate over the list of names manually. my %fields = map { $_ => $meta->get_attribute($_) } $meta->get_attribute_list; This was actually a change in L, but this version of Moose requires a version of L that includes said change. =back =head1 0.90 =over 4 =item Added Native delegation for Code refs See L for details. =item Calling $object->new() is deprecated Moose has long supported this, but it's never really been documented, and we don't think this is a good practice. If you want to construct an object from an existing object, you should provide some sort of alternate constructor like C<< $object->clone >>. Calling C<< $object->new >> now issues a warning, and will be an error in a future release. =item Moose no longer warns if you call C for a class with mutable ancestors While in theory this is a good thing to warn about, we found so many exceptions to this that doing this properly became quite problematic. =back =head1 0.89_02 =over 4 =item New Native delegation methods from L and L In particular, we now have C, C, C, and C. =item The Moose::Exporter with_caller feature is now deprecated Use C instead. The C option will start warning in a future release. =item Moose now warns if you call C for a class with mutable ancestors This is dangerous because modifying a class after a subclass has been immutabilized will lead to incorrect results in the subclass, due to inlining, caching, etc. This occasionally happens accidentally, when a class loads one of its subclasses in the middle of its class definition, so pointing out that this may cause issues should be helpful. Metaclasses (classes that inherit from L) are currently exempt from this check, since at the moment we aren't very consistent about which metaclasses we immutabilize. =item C and C now take arrayrefs for all forms Previously, calling these functions with a list would take the first element of the list as the type constraint name, and use the remainder as the enum values or method names. This makes the interface inconsistent with the anon-type forms of these functions (which must take an arrayref), and a free-form list where the first value is sometimes special is hard to validate (and harder to give reasonable error messages for). These functions have been changed to take arrayrefs in all their forms - so, C<< enum 'My::Type' => [qw(foo bar)] >> is now the preferred way to create an enum type constraint. The old syntax still works for now, but it will hopefully be deprecated and removed in a future release. =back =head1 0.89_01 L has been moved into the Moose core from L. Major changes include: =over 4 =item C, not C Method providers are only available via traits. =item C, not C or C The C syntax was like core Moose C<< handles => HASHREF >> syntax, but with the keys and values reversed. This was confusing, and AttributeHelpers now uses C<< handles => HASHREF >> in a way that should be intuitive to anyone already familiar with how it is used for other attributes. The C functionality provided by AttributeHelpers has been generalized to apply to all cases of C<< handles => HASHREF >>, though not every piece of functionality has been ported (currying with a CODEREF is not supported). =item C is now C, and means empty, not non-empty Previously, the C method provided by Arrays and Hashes returned true if the attribute was B empty (no elements). Now it returns true if the attribute B empty. It was also renamed to C, to reflect this. =item C was renamed to C, and C and C were removed L refers to the functionality that we used to provide under C as L, so that will likely be more familiar (and will fit in better if we decide to add more List::Util functions). C and C were removed, since their functionality is easily duplicated with curries of C. =item Helpers that take a coderef of one argument now use C<$_> Subroutines passed as the first argument to C, C, and C now receive their argument in C<$_> rather than as a parameter to the subroutine. Helpers that take a coderef of two or more arguments remain using the argument list (there are technical limitations to using C<$a> and C<$b> like C does). See L for the new documentation. =back The C and C role parameters have been renamed to C<-alias> and C<-excludes>. The old names still work, but new code should use the new names, and eventually the old ones will be deprecated and removed. =head1 0.89 C<< use Moose -metaclass => 'Foo' >> now does alias resolution, just like C<-traits> (and the C and C options to C). Added two functions C and C to L, to simplify aliasing metaclasses and metatraits. This is a wrapper around the old package Moose::Meta::Class::Custom::Trait::FooTrait; sub register_implementation { 'My::Meta::Trait' } way of doing this. =head1 0.84 When an attribute generates I accessors, we now warn. This is to help users who forget the C option. If you really do not want any accessors, you can use C<< is => 'bare' >>. You can maintain back compat with older versions of Moose by using something like: ($Moose::VERSION >= 0.84 ? is => 'bare' : ()) When an accessor overwrites an existing method, we now warn. To work around this warning (if you really must have this behavior), you can explicitly remove the method before creating it as an accessor: sub foo {} __PACKAGE__->meta->remove_method('foo'); has foo => ( is => 'ro', ); When an unknown option is passed to C, we now warn. You can silence the warning by fixing your code. :) The C type has been deprecated. On its own, it was useless, since it just checked C<< $object->can('does') >>. If you were using it as a parent type, just call C to create an appropriate type instead. =head1 0.78 C now imports C and C into packages that use it. =head1 0.77 C and C now receive an argument indicating whether or not we are in global destruction. =head1 0.76 Type constraints no longer run coercions for a value that already matches the constraint. This may affect some (arguably buggy) edge case coercions that rely on side effects in the C clause. =head1 0.75 L now accepts the C<-metaclass> option for easily overriding the metaclass (without L). This works for classes and roles. =head1 0.74 Added a C sugar function to L to make integration with non-Moose classes easier. It simply checks if C<< $obj->can() >> a list of methods. A number of methods (mostly inherited from L) have been renamed with a leading underscore to indicate their internal-ness. The old method names will still work for a while, but will warn that the method has been renamed. In a few cases, the method will be removed entirely in the future. This may affect MooseX authors who were using these methods. =head1 0.73 Calling C with a name as the only argument now throws an exception. If you want an anonymous subtype do: my $subtype = subtype as 'Foo'; This is related to the changes in version 0.71_01. The C method in L is now only usable as a class method. Previously, it worked as a class or object method, with a different internal implementation for each version. The internals of making a class immutable changed a lot in Class::MOP 0.78_02, and Moose's internals have changed along with it. The external C<< $metaclass->make_immutable >> method still works the same way. =head1 0.72 A mutable class accepted C<< Foo->new(undef) >> without complaint, while an immutable class would blow up with an unhelpful error. Now, in both cases we throw a helpful error instead. This "feature" was originally added to allow for cases such as this: my $args; if ( something() ) { $args = {...}; } return My::Class->new($args); But we decided this is a bad idea and a little too magical, because it can easily mask real errors. =head1 0.71_01 Calling C or C without the sugar helpers (C, C, C) is now deprecated. As a side effect, this meant we ended up using Perl prototypes on C, and code like this will no longer work: use Moose::Util::TypeConstraints; use Declare::Constraints::Simple -All; subtype 'ArrayOfInts' => as 'ArrayRef' => IsArrayRef(IsInt); Instead it must be changed to this: subtype( 'ArrayOfInts' => { as => 'ArrayRef', where => IsArrayRef(IsInt) } ); If you want to maintain backwards compat with older versions of Moose, you must explicitly test Moose's C: if ( Moose->VERSION < 0.71_01 ) { subtype 'ArrayOfInts' => as 'ArrayRef' => IsArrayRef(IsInt); } else { subtype( 'ArrayOfInts' => { as => 'ArrayRef', where => IsArrayRef(IsInt) } ); } =head1 0.70 We no longer pass the meta-attribute object as a final argument to triggers. This actually changed for inlined code a while back, but the non-inlined version and the docs were still out of date. If by some chance you actually used this feature, the workaround is simple. You fetch the attribute object from out of the C<$self> that is passed as the first argument to trigger, like so: has 'foo' => ( is => 'ro', isa => 'Any', trigger => sub { my ( $self, $value ) = @_; my $attr = $self->meta->find_attribute_by_name('foo'); # ... } ); =head1 0.66 If you created a subtype and passed a parent that Moose didn't know about, it simply ignored the parent. Now it automatically creates the parent as a class type. This may not be what you want, but is less broken than before. You could declare a name with subtype such as "Foo!Bar". Moose would accept this allowed, but if you used it in a parameterized type such as "ArrayRef[Foo!Bar]" it wouldn't work. We now do some vetting on names created via the sugar functions, so that they can only contain alphanumerics, ":", and ".". =head1 0.65 Methods created via an attribute can now fulfill a C declaration for a role. Honestly we don't know why Stevan didn't make this work originally, he was just insane or something. Stack traces from inlined code will now report the line and file as being in your class, as opposed to in Moose guts. =head1 0.62_02 When a class does not provide all of a role's required methods, the error thrown now mentions all of the missing methods, as opposed to just the first missing method. Moose will no longer inline a constructor for your class unless it inherits its constructor from Moose::Object, and will warn when it doesn't inline. If you want to force inlining anyway, pass C<< replace_constructor => 1 >> to C. If you want to get rid of the warning, pass C<< inline_constructor => 0 >>. =head1 0.62 Removed the (deprecated) C keyword. Removing an attribute from a class now also removes delegation (C) methods installed for that attribute. This is correct behavior, but if you were wrongly relying on it you might get bit. =head1 0.58 Roles now add methods by calling C, not C. They make sure to always provide a method object, which will be cloned internally. This means that it is now possible to track the source of a method provided by a role, and even follow its history through intermediate roles. This means that methods added by a role now show up when looking at a class's method list/map. Parameter and Union args are now sorted, this makes Int|Str the same constraint as Str|Int. Also, incoming type constraint strings are normalized to remove all whitespace differences. This is mostly for internals and should not affect outside code. L will no longer remove a subroutine that the exporting package re-exports. Moose re-exports the Carp::confess function, among others. The reasoning is that we cannot know whether you have also explicitly imported those functions for your own use, so we err on the safe side and always keep them. =head1 0.56 C should now be called as a method. New modules for extension writers, L and L. =head1 0.55_01 Implemented metaclass traits (and wrote a recipe for it): use Moose -traits => 'Foo' This should make writing small Moose extensions a little easier. =head1 0.55 Fixed C to accept anon types just like C can. So that you can do: coerce $some_anon_type => from 'Str' => via { ... }; =head1 0.51 Added C, a new step in C<< Moose::Object->new() >>. =head1 0.49 Fixed how the C<< is => (ro|rw) >> works with custom defined C, C and C options. See the below table for details: is => ro, writer => _foo # turns into (reader => foo, writer => _foo) is => rw, writer => _foo # turns into (reader => foo, writer => _foo) is => rw, accessor => _foo # turns into (accessor => _foo) is => ro, accessor => _foo # error, accesor is rw =head1 0.45 The C method modifiers now support regexp matching of method names. NOTE: this only works for classes, it is currently not supported in roles, but, ... patches welcome. The C keyword for roles now accepts the same array ref form that L.pm does for classes. A trigger on a read-only attribute is no longer an error, as it's useful to trigger off of the constructor. Subtypes of parameterizable types now are parameterizable types themselves. =head1 0.44 Fixed issue where C was eating the value in C<$@>, and so not working correctly. It still kind of eats them, but so does vanilla perl. =head1 0.41 Inherited attributes may now be extended without restriction on the type ('isa', 'does'). The entire set of Moose::Meta::TypeConstraint::* classes were refactored in this release. If you were relying on their internals you should test your code carefully. =head1 0.40 Documenting the use of '+name' with attributes that come from recently composed roles. It makes sense, people are using it, and so why not just officially support it. The C<< Moose::Meta::Class->create >> method now supports roles. It is now possible to make anonymous enum types by passing C an array reference instead of the C<< enum $name => @values >>. =head1 0.37 Added the C keyword as a shortcut to calling C on the meta object. This eventually got removed! Made C<< init_arg => undef >> work in Moose. This means "do not accept a constructor parameter for this attribute". Type errors now use the provided message. Prior to this release they didn't. =head1 0.34 Moose is now a postmodern object system :) The Role system was completely refactored. It is 100% backwards compat, but the internals were totally changed. If you relied on the internals then you are advised to test carefully. Added method exclusion and aliasing for Roles in this release. Added the L module. Passing a list of values to an accessor (which is only expecting one value) used to be silently ignored, now it throws an error. =head1 0.26 Added parameterized types and did a pretty heavy refactoring of the type constraint system. Better framework extensibility and better support for "making your own Moose". =head1 0.25 or before Honestly, you shouldn't be using versions of Moose that are this old, so many bug fixes and speed improvements have been made you would be crazy to not upgrade. Also, I am tired of going through the Changelog so I am stopping here, if anyone would like to continue this please feel free. =head1 AUTHORS =over 4 =item * Stevan Little =item * Dave Rolsky =item * Jesse Luehrs =item * Shawn M Moore =item * יובל קוג'מן (Yuval Kogman) =item * Karen Etheridge =item * Florian Ragwitz =item * Hans Dieter Pearcey =item * Chris Prather =item * Matt S Trout =back =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2006 by Infinity Interactive, Inc. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Moose-2.2200/lib/Moose/Manual/Exceptions/Manifest.pod000640 000766 000024 00000225652 14137574636 022624 0ustar00etherstaff000000 000000 # PODNAME: Moose::Manual::Exceptions::Manifest # ABSTRACT: Moose's Exception Types __END__ =pod =encoding UTF-8 =head1 NAME Moose::Manual::Exceptions::Manifest - Moose's Exception Types =head1 VERSION version 2.2200 =head1 DESCRIPTION This document contains a manifest of all the exception classes that are thrown as Moose internal errors. =head1 COMMON ELEMENTS Unless otherwise stated, all classes are subclasses of L. Similarly, all classes provide the following attribute reader methods: =head2 $exception->message This method returns the error message for the exception. =head2 $exception->trace This method returns a L object. =head1 EXCEPTION CLASSES Moose ships with the following exception classes: =head2 Moose::Exception::AccessorMustReadWrite This class consumes the Moose::Exception::Role::InvalidAttributeOptions and Moose::Exception::Role::ParamsHash roles. This class has the following methods: =over 4 =item * $exception->attribute_name() Returns a Str value. =item * $exception->params() Returns a HashRef value. =back =head2 Moose::Exception::AddParameterizableTypeTakesParameterizableType This class has the following methods: =over 4 =item * $exception->type_name() Returns a Str value. =back =head2 Moose::Exception::AddRoleTakesAMooseMetaRoleInstance This class consumes the Moose::Exception::Role::Class role. This class has the following methods: =over 4 =item * $exception->class_name() Returns a Str value. This attribute can be used for fetching metaclass instance: my $metaclass_instance = Moose::Util::find_meta( $exception->class_name ); =item * $exception->role_to_be_added() =back =head2 Moose::Exception::AddRoleToARoleTakesAMooseMetaRole This class consumes the Moose::Exception::Role::Role role. This class has the following methods: =over 4 =item * $exception->role_name() Returns a Str value. This attribute can be used for fetching the class's metaclass instance: my $metaclass_instance = Moose::Util::find_meta( $exception->role_name ); =item * $exception->role_to_be_added() =back =head2 Moose::Exception::ApplyTakesABlessedInstance This class consumes the Moose::Exception::Role::Role role. This class has the following methods: =over 4 =item * $exception->param() =item * $exception->role_name() Returns a Str value. This attribute can be used for fetching the class's metaclass instance: my $metaclass_instance = Moose::Util::find_meta( $exception->role_name ); =back =head2 Moose::Exception::AttachToClassNeedsAClassMOPClassInstanceOrASubclass This class consumes the Moose::Exception::Role::Attribute role. This class has the following methods: =over 4 =item * $exception->attribute() Returns a L object. =item * $exception->class() =back =head2 Moose::Exception::AttributeConflictInRoles This class consumes the Moose::Exception::Role::Role role. This class has the following methods: =over 4 =item * $exception->attribute_name() Returns a Str value. =item * $exception->role_name() Returns a Str value. This attribute can be used for fetching the class's metaclass instance: my $metaclass_instance = Moose::Util::find_meta( $exception->role_name ); =item * $exception->second_role_name() Returns a Str value. =back =head2 Moose::Exception::AttributeConflictInSummation This class consumes the Moose::Exception::Role::AttributeName and Moose::Exception::Role::Role roles. This class has the following methods: =over 4 =item * $exception->attribute_name() Returns a Str value. =item * $exception->role_name() Returns a Str value. This attribute can be used for fetching the class's metaclass instance: my $metaclass_instance = Moose::Util::find_meta( $exception->role_name ); =item * $exception->second_role_name() Returns a Str value. =back =head2 Moose::Exception::AttributeExtensionIsNotSupportedInRoles This class consumes the Moose::Exception::Role::Role role. This class has the following methods: =over 4 =item * $exception->attribute_name() Returns a Str value. =item * $exception->role_name() Returns a Str value. This attribute can be used for fetching the class's metaclass instance: my $metaclass_instance = Moose::Util::find_meta( $exception->role_name ); =back =head2 Moose::Exception::AttributeIsRequired This class consumes the Moose::Exception::Role::Class role. This class has the following methods: =over 4 =item * $exception->attribute_init_arg() Returns a Str value. =item * $exception->attribute_name() Returns a Str value. This attribute can be used for fetching attribute instance: my $class = Moose::Util::find_meta( $exception->class_name ); my $attribute = $class->get_attribute( $exception->attribute_name ); =item * $exception->class_name() Returns a Str value. This attribute can be used for fetching metaclass instance: my $metaclass_instance = Moose::Util::find_meta( $exception->class_name ); =item * $exception->params() Returns a HashRef value. =back =head2 Moose::Exception::AttributeMustBeAnClassMOPMixinAttributeCoreOrSubclass This class consumes the Moose::Exception::Role::Class role. This class has the following methods: =over 4 =item * $exception->attribute() =item * $exception->class_name() Returns a Str value. This attribute can be used for fetching metaclass instance: my $metaclass_instance = Moose::Util::find_meta( $exception->class_name ); =back =head2 Moose::Exception::AttributeNamesDoNotMatch This class has the following methods: =over 4 =item * $exception->attribute() Returns a L object. =item * $exception->attribute_name() Returns a Str value. =back =head2 Moose::Exception::AttributeValueIsNotAnObject This class consumes the Moose::Exception::Role::Attribute and Moose::Exception::Role::Instance roles. This class has the following methods: =over 4 =item * $exception->attribute() Returns a L object. =item * $exception->given_value() =item * $exception->instance() Returns an Object value. =item * $exception->method() Returns a L object. =back =head2 Moose::Exception::AttributeValueIsNotDefined This class consumes the Moose::Exception::Role::Attribute and Moose::Exception::Role::Instance roles. This class has the following methods: =over 4 =item * $exception->attribute() Returns a L object. =item * $exception->instance() Returns an Object value. =item * $exception->method() Returns a L object. =back =head2 Moose::Exception::AutoDeRefNeedsArrayRefOrHashRef This class consumes the Moose::Exception::Role::InvalidAttributeOptions and Moose::Exception::Role::ParamsHash roles. This class has the following methods: =over 4 =item * $exception->attribute_name() Returns a Str value. =item * $exception->params() Returns a HashRef value. =back =head2 Moose::Exception::BadOptionFormat This class consumes the Moose::Exception::Role::Attribute role. This class has the following methods: =over 4 =item * $exception->attribute() Returns a L object. =item * $exception->option_name() Returns a Str value. =item * $exception->option_value() =back =head2 Moose::Exception::BothBuilderAndDefaultAreNotAllowed This class consumes the Moose::Exception::Role::ParamsHash role. This class has the following methods: =over 4 =item * $exception->class() Returns a Str value. =item * $exception->params() Returns a HashRef value. =back =head2 Moose::Exception::BuilderDoesNotExist This class consumes the Moose::Exception::Role::Attribute and Moose::Exception::Role::Instance roles. This class has the following methods: =over 4 =item * $exception->attribute() Returns a L object. =item * $exception->instance() Returns an Object value. =back =head2 Moose::Exception::BuilderMethodNotSupportedForAttribute This class consumes the Moose::Exception::Role::Attribute and Moose::Exception::Role::Instance roles. This class has the following methods: =over 4 =item * $exception->attribute() Returns a L object. =item * $exception->instance() Returns an Object value. =back =head2 Moose::Exception::BuilderMethodNotSupportedForInlineAttribute This class consumes the Moose::Exception::Role::Class and Moose::Exception::Role::Instance roles. This class has the following methods: =over 4 =item * $exception->attribute_name() Returns a Str value. =item * $exception->builder() Returns a Str value. =item * $exception->class_name() Returns a Str value. This attribute can be used for fetching metaclass instance: my $metaclass_instance = Moose::Util::find_meta( $exception->class_name ); =item * $exception->instance() Returns an Object value. =back =head2 Moose::Exception::BuilderMustBeAMethodName This class consumes the Moose::Exception::Role::ParamsHash role. This class has the following methods: =over 4 =item * $exception->class() Returns a Str value. =item * $exception->params() Returns a HashRef value. =back =head2 Moose::Exception::CallingMethodOnAnImmutableInstance This class has the following methods: =over 4 =item * $exception->method_name() Returns a Str value. =back =head2 Moose::Exception::CallingReadOnlyMethodOnAnImmutableInstance This class has the following methods: =over 4 =item * $exception->method_name() Returns a Str value. =back =head2 Moose::Exception::CanExtendOnlyClasses This class consumes the Moose::Exception::Role::Role role. This class has the following methods: =over 4 =item * $exception->role_name() Returns a Str value. This attribute can be used for fetching the class's metaclass instance: my $metaclass_instance = Moose::Util::find_meta( $exception->role_name ); =back =head2 Moose::Exception::CanOnlyConsumeRole This class has the following methods: =over 4 =item * $exception->role_name() Returns a Str value. =back =head2 Moose::Exception::CanOnlyWrapBlessedCode This class consumes the Moose::Exception::Role::ParamsHash role. This class has the following methods: =over 4 =item * $exception->class() Returns a Str value. =item * $exception->code() =item * $exception->params() Returns a HashRef value. =back =head2 Moose::Exception::CanReblessOnlyIntoASubclass This class consumes the Moose::Exception::Role::Class, Moose::Exception::Role::Instance, Moose::Exception::Role::InstanceClass, and Moose::Exception::Role::ParamsHash roles. This class has the following methods: =over 4 =item * $exception->class_name() Returns a Str value. This attribute can be used for fetching metaclass instance: my $metaclass_instance = Moose::Util::find_meta( $exception->class_name ); =item * $exception->instance() Returns an Object value. =item * $exception->instance_class() Returns a Str value. =item * $exception->params() Returns a HashRef value. =back =head2 Moose::Exception::CanReblessOnlyIntoASuperclass This class consumes the Moose::Exception::Role::Class, Moose::Exception::Role::Instance, and Moose::Exception::Role::InstanceClass roles. This class has the following methods: =over 4 =item * $exception->class_name() Returns a Str value. This attribute can be used for fetching metaclass instance: my $metaclass_instance = Moose::Util::find_meta( $exception->class_name ); =item * $exception->instance() Returns an Object value. =item * $exception->instance_class() Returns a Str value. =back =head2 Moose::Exception::CannotAddAdditionalTypeCoercionsToUnion This class has the following methods: =over 4 =item * $exception->type_coercion_union_object() Returns a L object. =back =head2 Moose::Exception::CannotAddAsAnAttributeToARole This class consumes the Moose::Exception::Role::Role role. This class has the following methods: =over 4 =item * $exception->attribute_class() Returns a Str value. =item * $exception->role_name() Returns a Str value. This attribute can be used for fetching the class's metaclass instance: my $metaclass_instance = Moose::Util::find_meta( $exception->role_name ); =back =head2 Moose::Exception::CannotApplyBaseClassRolesToRole This class consumes the Moose::Exception::Role::ParamsHash and Moose::Exception::Role::Role roles. This class has the following methods: =over 4 =item * $exception->params() Returns a HashRef value. =item * $exception->role_name() Returns a Str value. This attribute can be used for fetching the class's metaclass instance: my $metaclass_instance = Moose::Util::find_meta( $exception->role_name ); =back =head2 Moose::Exception::CannotAssignValueToReadOnlyAccessor This class consumes the Moose::Exception::Role::Class and Moose::Exception::Role::EitherAttributeOrAttributeName roles. This class has the following methods: =over 4 =item * $exception->attribute() Returns a L object. =item * $exception->attribute_name() Returns a Str value. =item * $exception->class_name() Returns a Str value. This attribute can be used for fetching metaclass instance: my $metaclass_instance = Moose::Util::find_meta( $exception->class_name ); =item * $exception->params() Returns a HashRef value. =item * $exception->value() =back =head2 Moose::Exception::CannotAugmentIfLocalMethodPresent This class consumes the Moose::Exception::Role::Class and Moose::Exception::Role::Method roles. This class has the following methods: =over 4 =item * $exception->class_name() Returns a Str value. This attribute can be used for fetching metaclass instance: my $metaclass_instance = Moose::Util::find_meta( $exception->class_name ); =item * $exception->method() Returns a L object. =back =head2 Moose::Exception::CannotAugmentNoSuperMethod This class consumes the Moose::Exception::Role::ParamsHash role. This class has the following methods: =over 4 =item * $exception->class() Returns a Str value. =item * $exception->method_name() Returns a Str value. =item * $exception->params() Returns a HashRef value. =back =head2 Moose::Exception::CannotAutoDerefWithoutIsa This class consumes the Moose::Exception::Role::InvalidAttributeOptions and Moose::Exception::Role::ParamsHash roles. This class has the following methods: =over 4 =item * $exception->attribute_name() Returns a Str value. =item * $exception->params() Returns a HashRef value. =back =head2 Moose::Exception::CannotAutoDereferenceTypeConstraint This class consumes the Moose::Exception::Role::Attribute, Moose::Exception::Role::Instance, and Moose::Exception::Role::TypeConstraint roles. This class has the following methods: =over 4 =item * $exception->attribute() Returns a L object. =item * $exception->instance() Returns an Object value. =item * $exception->type_name() Returns a Str value. This attribute can be used for fetching type constraint(Moose::Meta::TypeConstraint): my $type_constraint = Moose::Util::TypeConstraints::find_type_constraint( $exception->type_name ); =back =head2 Moose::Exception::CannotCalculateNativeType This class consumes the Moose::Exception::Role::Instance role. This class has the following methods: =over 4 =item * $exception->instance() Returns an Object value. =back =head2 Moose::Exception::CannotCallAnAbstractBaseMethod This class has the following methods: =over 4 =item * $exception->package_name() Returns a Str value. =back =head2 Moose::Exception::CannotCallAnAbstractMethod This class has no attributes except for C and C. =head2 Moose::Exception::CannotCoerceAWeakRef This class consumes the Moose::Exception::Role::InvalidAttributeOptions and Moose::Exception::Role::ParamsHash roles. This class has the following methods: =over 4 =item * $exception->attribute_name() Returns a Str value. =item * $exception->params() Returns a HashRef value. =back =head2 Moose::Exception::CannotCoerceAttributeWhichHasNoCoercion This class consumes the Moose::Exception::Role::InvalidAttributeOptions, Moose::Exception::Role::ParamsHash, and Moose::Exception::Role::TypeConstraint roles. This class has the following methods: =over 4 =item * $exception->attribute_name() Returns a Str value. =item * $exception->params() Returns a HashRef value. =item * $exception->type_name() Returns a Str value. This attribute can be used for fetching type constraint(Moose::Meta::TypeConstraint): my $type_constraint = Moose::Util::TypeConstraints::find_type_constraint( $exception->type_name ); =back =head2 Moose::Exception::CannotCreateHigherOrderTypeWithoutATypeParameter This class consumes the Moose::Exception::Role::TypeConstraint role. This class has the following methods: =over 4 =item * $exception->type_name() Returns a Str value. This attribute can be used for fetching type constraint(Moose::Meta::TypeConstraint): my $type_constraint = Moose::Util::TypeConstraints::find_type_constraint( $exception->type_name ); =back =head2 Moose::Exception::CannotCreateMethodAliasLocalMethodIsPresent This class consumes the Moose::Exception::Role::Method and Moose::Exception::Role::Role roles. This class has the following methods: =over 4 =item * $exception->aliased_method_name() Returns a Str value. =item * $exception->method() Returns a L object. =item * $exception->role_being_applied_name() Returns a Str value. =item * $exception->role_name() Returns a Str value. This attribute can be used for fetching the class's metaclass instance: my $metaclass_instance = Moose::Util::find_meta( $exception->role_name ); =back =head2 Moose::Exception::CannotCreateMethodAliasLocalMethodIsPresentInClass This class consumes the Moose::Exception::Role::Class, Moose::Exception::Role::Method, and Moose::Exception::Role::Role roles. This class has the following methods: =over 4 =item * $exception->aliased_method_name() Returns a Str value. =item * $exception->class_name() Returns a Str value. This attribute can be used for fetching metaclass instance: my $metaclass_instance = Moose::Util::find_meta( $exception->class_name ); =item * $exception->method() Returns a L object. =item * $exception->role_name() Returns a Str value. This attribute can be used for fetching the class's metaclass instance: my $metaclass_instance = Moose::Util::find_meta( $exception->role_name ); =back =head2 Moose::Exception::CannotDelegateLocalMethodIsPresent This class consumes the Moose::Exception::Role::Attribute and Moose::Exception::Role::Method roles. This class has the following methods: =over 4 =item * $exception->attribute() Returns a L object. =item * $exception->method() Returns a L object. =back =head2 Moose::Exception::CannotDelegateWithoutIsa This class consumes the Moose::Exception::Role::Attribute role. This class has the following methods: =over 4 =item * $exception->attribute() Returns a L object. =back =head2 Moose::Exception::CannotFindDelegateMetaclass This class consumes the Moose::Exception::Role::Attribute role. This class has the following methods: =over 4 =item * $exception->attribute() Returns a L object. =back =head2 Moose::Exception::CannotFindType This class has the following methods: =over 4 =item * $exception->type_name() Returns a Str value. =back =head2 Moose::Exception::CannotFindTypeGivenToMatchOnType This class has the following methods: =over 4 =item * $exception->action() =item * $exception->to_match() =item * $exception->type() =back =head2 Moose::Exception::CannotFixMetaclassCompatibility This class consumes the Moose::Exception::Role::Class role. This class has the following methods: =over 4 =item * $exception->class_name() Returns a Str value. This attribute can be used for fetching metaclass instance: my $metaclass_instance = Moose::Util::find_meta( $exception->class_name ); =item * $exception->metaclass_type() Returns a Str value. =item * $exception->superclass() Returns an Object value. =back =head2 Moose::Exception::CannotGenerateInlineConstraint This class consumes the Moose::Exception::Role::TypeConstraint role. This class has the following methods: =over 4 =item * $exception->parameterizable_type_object_name() Returns a Str value. This attribute can be used for fetching parameterizable type constraint(Moose::Meta::TypeConstraint::Parameterizable): my $type_constraint = Moose::Util::TypeConstraints::find_type_constraint( $exception->type_name ); =item * $exception->type_name() Returns a Str value. This attribute can be used for fetching type constraint(Moose::Meta::TypeConstraint): my $type_constraint = Moose::Util::TypeConstraints::find_type_constraint( $exception->type_name ); =item * $exception->value() Returns a Str value. =back =head2 Moose::Exception::CannotInitializeMooseMetaRoleComposite This class has the following methods: =over 4 =item * $exception->args() Returns an ArrayRef value. =item * $exception->old_meta() =item * $exception->role_composite() Returns a L object. =back =head2 Moose::Exception::CannotInlineTypeConstraintCheck This class consumes the Moose::Exception::Role::TypeConstraint role. This class has the following methods: =over 4 =item * $exception->type_name() Returns a Str value. This attribute can be used for fetching type constraint(Moose::Meta::TypeConstraint): my $type_constraint = Moose::Util::TypeConstraints::find_type_constraint( $exception->type_name ); =back =head2 Moose::Exception::CannotLocatePackageInINC This class consumes the Moose::Exception::Role::ParamsHash role. This class has the following methods: =over 4 =item * $exception->INC() Returns an ArrayRef value. =item * $exception->metaclass_name() Returns a Str value. =item * $exception->params() Returns a HashRef value. =item * $exception->possible_packages() Returns a Str value. =item * $exception->type() Returns a Str value. =back =head2 Moose::Exception::CannotMakeMetaclassCompatible This class consumes the Moose::Exception::Role::Class role. This class has the following methods: =over 4 =item * $exception->class_name() Returns a Str value. This attribute can be used for fetching metaclass instance: my $metaclass_instance = Moose::Util::find_meta( $exception->class_name ); =item * $exception->superclass_name() Returns a Str value. =back =head2 Moose::Exception::CannotOverrideALocalMethod This class consumes the Moose::Exception::Role::Role role. This class has the following methods: =over 4 =item * $exception->method_name() Returns a Str value. =item * $exception->role_name() Returns a Str value. This attribute can be used for fetching the class's metaclass instance: my $metaclass_instance = Moose::Util::find_meta( $exception->role_name ); =back =head2 Moose::Exception::CannotOverrideBodyOfMetaMethods This class consumes the Moose::Exception::Role::ParamsHash role. This class has the following methods: =over 4 =item * $exception->class() Returns a Str value. =item * $exception->params() Returns a HashRef value. =back =head2 Moose::Exception::CannotOverrideLocalMethodIsPresent This class consumes the Moose::Exception::Role::Class and Moose::Exception::Role::Method roles. This class has the following methods: =over 4 =item * $exception->class_name() Returns a Str value. This attribute can be used for fetching metaclass instance: my $metaclass_instance = Moose::Util::find_meta( $exception->class_name ); =item * $exception->method() Returns a L object. =back =head2 Moose::Exception::CannotOverrideNoSuperMethod This class consumes the Moose::Exception::Role::ParamsHash role. This class has the following methods: =over 4 =item * $exception->class() Returns a Str value. =item * $exception->method_name() Returns a Str value. =item * $exception->params() Returns a HashRef value. =back =head2 Moose::Exception::CannotRegisterUnnamedTypeConstraint This class has no attributes except for C and C. =head2 Moose::Exception::CannotUseLazyBuildAndDefaultSimultaneously This class consumes the Moose::Exception::Role::InvalidAttributeOptions and Moose::Exception::Role::ParamsHash roles. This class has the following methods: =over 4 =item * $exception->attribute_name() Returns a Str value. =item * $exception->params() Returns a HashRef value. =back =head2 Moose::Exception::CircularReferenceInAlso This class has the following methods: =over 4 =item * $exception->also_parameter() Returns a Str value. =item * $exception->stack() Returns an ArrayRef value. =back =head2 Moose::Exception::ClassDoesNotHaveInitMeta This class consumes the Moose::Exception::Role::Class role. This class has the following methods: =over 4 =item * $exception->class_name() Returns a Str value. This attribute can be used for fetching metaclass instance: my $metaclass_instance = Moose::Util::find_meta( $exception->class_name ); =item * $exception->traits() Returns an ArrayRef value. =back =head2 Moose::Exception::ClassDoesTheExcludedRole This class consumes the Moose::Exception::Role::Class and Moose::Exception::Role::Role roles. This class has the following methods: =over 4 =item * $exception->class_name() Returns a Str value. This attribute can be used for fetching metaclass instance: my $metaclass_instance = Moose::Util::find_meta( $exception->class_name ); =item * $exception->excluded_role_name() Returns a Str value. =item * $exception->role_name() Returns a Str value. This attribute can be used for fetching the class's metaclass instance: my $metaclass_instance = Moose::Util::find_meta( $exception->role_name ); =back =head2 Moose::Exception::ClassNamesDoNotMatch This class has the following methods: =over 4 =item * $exception->class() Returns a L object. =item * $exception->class_name() Returns a Str value. =back =head2 Moose::Exception::CloneObjectExpectsAnInstanceOfMetaclass This class consumes the Moose::Exception::Role::Class role. This class has the following methods: =over 4 =item * $exception->class_name() Returns a Str value. This attribute can be used for fetching metaclass instance: my $metaclass_instance = Moose::Util::find_meta( $exception->class_name ); =item * $exception->instance() =back =head2 Moose::Exception::CodeBlockMustBeACodeRef This class consumes the Moose::Exception::Role::Instance and Moose::Exception::Role::ParamsHash roles. This class has the following methods: =over 4 =item * $exception->instance() Returns an Object value. =item * $exception->params() Returns a HashRef value. =back =head2 Moose::Exception::CoercingWithoutCoercions This class consumes the Moose::Exception::Role::TypeConstraint role. This class has the following methods: =over 4 =item * $exception->type_name() Returns a Str value. This attribute can be used for fetching type constraint(Moose::Meta::TypeConstraint): my $type_constraint = Moose::Util::TypeConstraints::find_type_constraint( $exception->type_name ); =back =head2 Moose::Exception::CoercionAlreadyExists This class consumes the Moose::Exception::Role::Instance role. This class has the following methods: =over 4 =item * $exception->constraint_name() Returns a Str value. =item * $exception->instance() Returns an Object value. =back =head2 Moose::Exception::CoercionNeedsTypeConstraint This class consumes the Moose::Exception::Role::InvalidAttributeOptions and Moose::Exception::Role::ParamsHash roles. This class has the following methods: =over 4 =item * $exception->attribute_name() Returns a Str value. =item * $exception->params() Returns a HashRef value. =back =head2 Moose::Exception::ConflictDetectedInCheckRoleExclusions This class consumes the Moose::Exception::Role::Role role. This class has the following methods: =over 4 =item * $exception->excluded_role_name() Returns a Str value. =item * $exception->role_name() Returns a Str value. This attribute can be used for fetching the class's metaclass instance: my $metaclass_instance = Moose::Util::find_meta( $exception->role_name ); =back =head2 Moose::Exception::ConflictDetectedInCheckRoleExclusionsInToClass This class consumes the Moose::Exception::Role::Class and Moose::Exception::Role::Role roles. This class has the following methods: =over 4 =item * $exception->class_name() Returns a Str value. This attribute can be used for fetching metaclass instance: my $metaclass_instance = Moose::Util::find_meta( $exception->class_name ); =item * $exception->role_name() Returns a Str value. This attribute can be used for fetching the class's metaclass instance: my $metaclass_instance = Moose::Util::find_meta( $exception->role_name ); =back =head2 Moose::Exception::ConstructClassInstanceTakesPackageName This class has no attributes except for C and C. =head2 Moose::Exception::CouldNotCreateMethod This class consumes the Moose::Exception::Role::Attribute role. This class has the following methods: =over 4 =item * $exception->attribute() Returns a L object. =item * $exception->error() Returns a Str value. =item * $exception->option_name() Returns a Str value. =item * $exception->option_value() =back =head2 Moose::Exception::CouldNotCreateWriter This class consumes the Moose::Exception::Role::EitherAttributeOrAttributeName and Moose::Exception::Role::Instance roles. This class has the following methods: =over 4 =item * $exception->attribute() Returns a L object. =item * $exception->attribute_name() Returns a Str value. =item * $exception->error() Returns a Str value. =item * $exception->instance() Returns an Object value. =item * $exception->params() Returns a HashRef value. =back =head2 Moose::Exception::CouldNotEvalConstructor This class has the following methods: =over 4 =item * $exception->constructor_method() Returns a L object. =item * $exception->error() Returns a Str value. =item * $exception->source() Returns a Str value. =back =head2 Moose::Exception::CouldNotEvalDestructor This class has the following methods: =over 4 =item * $exception->error() Returns a Str value. =item * $exception->method_destructor_object() Returns a L object. =item * $exception->source() Returns a Str value. =back =head2 Moose::Exception::CouldNotFindTypeConstraintToCoerceFrom This class consumes the Moose::Exception::Role::Instance role. This class has the following methods: =over 4 =item * $exception->constraint_name() Returns a Str value. =item * $exception->instance() Returns an Object value. =back =head2 Moose::Exception::CouldNotGenerateInlineAttributeMethod This class consumes the Moose::Exception::Role::Instance role. This class has the following methods: =over 4 =item * $exception->error() Returns a Moose::Exception|Str value. =item * $exception->instance() Returns an Object value. =item * $exception->option() Returns a Str value. =back =head2 Moose::Exception::CouldNotLocateTypeConstraintForUnion This class consumes the Moose::Exception::Role::TypeConstraint role. This class has the following methods: =over 4 =item * $exception->type_name() Returns a Str value. This attribute can be used for fetching type constraint(Moose::Meta::TypeConstraint): my $type_constraint = Moose::Util::TypeConstraints::find_type_constraint( $exception->type_name ); =back =head2 Moose::Exception::CouldNotParseType This class has the following methods: =over 4 =item * $exception->position() Returns an Int value. =item * $exception->type() Returns a Str value. =back =head2 Moose::Exception::CreateMOPClassTakesArrayRefOfAttributes This class consumes the Moose::Exception::Role::ParamsHash and Moose::Exception::Role::RoleForCreateMOPClass roles. This class has the following methods: =over 4 =item * $exception->class() Returns a Str value. =item * $exception->params() Returns a HashRef value. =back =head2 Moose::Exception::CreateMOPClassTakesArrayRefOfSuperclasses This class consumes the Moose::Exception::Role::ParamsHash and Moose::Exception::Role::RoleForCreateMOPClass roles. This class has the following methods: =over 4 =item * $exception->class() Returns a Str value. =item * $exception->params() Returns a HashRef value. =back =head2 Moose::Exception::CreateMOPClassTakesHashRefOfMethods This class consumes the Moose::Exception::Role::ParamsHash and Moose::Exception::Role::RoleForCreateMOPClass roles. This class has the following methods: =over 4 =item * $exception->class() Returns a Str value. =item * $exception->params() Returns a HashRef value. =back =head2 Moose::Exception::CreateTakesArrayRefOfRoles This class consumes the Moose::Exception::Role::ParamsHash and Moose::Exception::Role::RoleForCreate roles. This class has the following methods: =over 4 =item * $exception->attribute_class() Returns a Str value. =item * $exception->params() Returns a HashRef value. =back =head2 Moose::Exception::CreateTakesHashRefOfAttributes This class consumes the Moose::Exception::Role::ParamsHash and Moose::Exception::Role::RoleForCreate roles. This class has the following methods: =over 4 =item * $exception->attribute_class() Returns a Str value. =item * $exception->params() Returns a HashRef value. =back =head2 Moose::Exception::CreateTakesHashRefOfMethods This class consumes the Moose::Exception::Role::ParamsHash and Moose::Exception::Role::RoleForCreate roles. This class has the following methods: =over 4 =item * $exception->attribute_class() Returns a Str value. =item * $exception->params() Returns a HashRef value. =back =head2 Moose::Exception::DefaultToMatchOnTypeMustBeCodeRef This class has the following methods: =over 4 =item * $exception->cases_to_be_matched() Returns an ArrayRef value. =item * $exception->default_action() =item * $exception->to_match() =back =head2 Moose::Exception::DelegationToAClassWhichIsNotLoaded This class consumes the Moose::Exception::Role::Attribute role. This class has the following methods: =over 4 =item * $exception->attribute() Returns a L object. =item * $exception->class_name() Returns a Str value. =back =head2 Moose::Exception::DelegationToARoleWhichIsNotLoaded This class consumes the Moose::Exception::Role::Attribute role. This class has the following methods: =over 4 =item * $exception->attribute() Returns a L object. =item * $exception->role_name() Returns a Str value. =back =head2 Moose::Exception::DelegationToATypeWhichIsNotAClass This class consumes the Moose::Exception::Role::Attribute role. This class has the following methods: =over 4 =item * $exception->attribute() Returns a L object. =back =head2 Moose::Exception::DoesRequiresRoleName This class consumes the Moose::Exception::Role::Class role. This class has the following methods: =over 4 =item * $exception->class_name() Returns a Str value. This attribute can be used for fetching metaclass instance: my $metaclass_instance = Moose::Util::find_meta( $exception->class_name ); =back =head2 Moose::Exception::EnumCalledWithAnArrayRefAndAdditionalArgs This class has the following methods: =over 4 =item * $exception->args() Returns an ArrayRef value. =item * $exception->array() Returns an ArrayRef value. =back =head2 Moose::Exception::EnumValuesMustBeString This class consumes the Moose::Exception::Role::ParamsHash role. This class has the following methods: =over 4 =item * $exception->class() Returns a Str value. =item * $exception->params() Returns a HashRef value. =item * $exception->value() =back =head2 Moose::Exception::ExtendsMissingArgs This class consumes the Moose::Exception::Role::Class role. This class has the following methods: =over 4 =item * $exception->class_name() Returns a Str value. This attribute can be used for fetching metaclass instance: my $metaclass_instance = Moose::Util::find_meta( $exception->class_name ); =back =head2 Moose::Exception::HandlesMustBeAHashRef This class consumes the Moose::Exception::Role::Instance role. This class has the following methods: =over 4 =item * $exception->given_handles() =item * $exception->instance() Returns an Object value. =back =head2 Moose::Exception::IllegalInheritedOptions This class consumes the Moose::Exception::Role::ParamsHash role. This class has the following methods: =over 4 =item * $exception->illegal_options() Returns an ArrayRef value. =item * $exception->params() Returns a HashRef value. =back =head2 Moose::Exception::IllegalMethodTypeToAddMethodModifier This class has the following methods: =over 4 =item * $exception->class_or_object() =item * $exception->modifier_name() Returns a Str value. =item * $exception->params() Returns an ArrayRef value. =back =head2 Moose::Exception::IncompatibleMetaclassOfSuperclass This class consumes the Moose::Exception::Role::Class role. This class has the following methods: =over 4 =item * $exception->class_meta_type() Returns a Str value. =item * $exception->class_name() Returns a Str value. This attribute can be used for fetching metaclass instance: my $metaclass_instance = Moose::Util::find_meta( $exception->class_name ); =item * $exception->superclass_meta_type() Returns a Str value. =item * $exception->superclass_name() Returns a Str value. =back =head2 Moose::Exception::InitMetaRequiresClass This class consumes the Moose::Exception::Role::ParamsHash role. This class has the following methods: =over 4 =item * $exception->params() Returns a HashRef value. =back =head2 Moose::Exception::InitializeTakesUnBlessedPackageName This class has the following methods: =over 4 =item * $exception->package_name() =back =head2 Moose::Exception::InstanceBlessedIntoWrongClass This class consumes the Moose::Exception::Role::Class, Moose::Exception::Role::Instance, and Moose::Exception::Role::ParamsHash roles. This class has the following methods: =over 4 =item * $exception->class_name() Returns a Str value. This attribute can be used for fetching metaclass instance: my $metaclass_instance = Moose::Util::find_meta( $exception->class_name ); =item * $exception->instance() Returns an Object value. =item * $exception->params() Returns a HashRef value. =back =head2 Moose::Exception::InstanceMustBeABlessedReference This class consumes the Moose::Exception::Role::Class and Moose::Exception::Role::ParamsHash roles. This class has the following methods: =over 4 =item * $exception->class_name() Returns a Str value. This attribute can be used for fetching metaclass instance: my $metaclass_instance = Moose::Util::find_meta( $exception->class_name ); =item * $exception->instance() =item * $exception->params() Returns a HashRef value. =back =head2 Moose::Exception::InvalidArgPassedToMooseUtilMetaRole This class has the following methods: =over 4 =item * $exception->argument() =back =head2 Moose::Exception::InvalidArgumentToMethod This class has the following methods: =over 4 =item * $exception->argument() =item * $exception->argument_noun() Returns a Str value. =item * $exception->method_name() Returns a Str value. =item * $exception->ordinal() Returns a Str value. =item * $exception->type() Returns a Str value. =item * $exception->type_of_argument() Returns a Str value. =back =head2 Moose::Exception::InvalidArgumentsToTraitAliases This class consumes the Moose::Exception::Role::Class role. This class has the following methods: =over 4 =item * $exception->alias() =item * $exception->class_name() Returns a Str value. This attribute can be used for fetching metaclass instance: my $metaclass_instance = Moose::Util::find_meta( $exception->class_name ); =item * $exception->package_name() Returns a Str value. =back =head2 Moose::Exception::InvalidBaseTypeGivenToCreateParameterizedTypeConstraint This class consumes the Moose::Exception::Role::TypeConstraint role. This class has the following methods: =over 4 =item * $exception->type_name() Returns a Str value. This attribute can be used for fetching type constraint(Moose::Meta::TypeConstraint): my $type_constraint = Moose::Util::TypeConstraints::find_type_constraint( $exception->type_name ); =back =head2 Moose::Exception::InvalidHandleValue This class consumes the Moose::Exception::Role::Instance role. This class has the following methods: =over 4 =item * $exception->handle_value() =item * $exception->instance() Returns an Object value. =back =head2 Moose::Exception::InvalidHasProvidedInARole This class consumes the Moose::Exception::Role::Role role. This class has the following methods: =over 4 =item * $exception->attribute_name() Returns a Str value. =item * $exception->role_name() Returns a Str value. This attribute can be used for fetching the class's metaclass instance: my $metaclass_instance = Moose::Util::find_meta( $exception->role_name ); =back =head2 Moose::Exception::InvalidNameForType This class has the following methods: =over 4 =item * $exception->name() Returns a Str value. =back =head2 Moose::Exception::InvalidOverloadOperator This class has the following methods: =over 4 =item * $exception->operator() Returns a Defined value. =back =head2 Moose::Exception::InvalidRoleApplication This class consumes the Moose::Exception::Role::Class role. This class has the following methods: =over 4 =item * $exception->application() =item * $exception->class_name() Returns a Str value. This attribute can be used for fetching metaclass instance: my $metaclass_instance = Moose::Util::find_meta( $exception->class_name ); =back =head2 Moose::Exception::InvalidTypeConstraint This class has the following methods: =over 4 =item * $exception->registry_object() Returns a L object. =item * $exception->type() =back =head2 Moose::Exception::InvalidTypeGivenToCreateParameterizedTypeConstraint This class consumes the Moose::Exception::Role::TypeConstraint role. This class has the following methods: =over 4 =item * $exception->type_name() Returns a Str value. This attribute can be used for fetching type constraint(Moose::Meta::TypeConstraint): my $type_constraint = Moose::Util::TypeConstraints::find_type_constraint( $exception->type_name ); =back =head2 Moose::Exception::InvalidValueForIs This class consumes the Moose::Exception::Role::InvalidAttributeOptions and Moose::Exception::Role::ParamsHash roles. This class has the following methods: =over 4 =item * $exception->attribute_name() Returns a Str value. =item * $exception->params() Returns a HashRef value. =back =head2 Moose::Exception::IsaDoesNotDoTheRole This class consumes the Moose::Exception::Role::InvalidAttributeOptions and Moose::Exception::Role::ParamsHash roles. This class has the following methods: =over 4 =item * $exception->attribute_name() Returns a Str value. =item * $exception->params() Returns a HashRef value. =back =head2 Moose::Exception::IsaLacksDoesMethod This class consumes the Moose::Exception::Role::InvalidAttributeOptions and Moose::Exception::Role::ParamsHash roles. This class has the following methods: =over 4 =item * $exception->attribute_name() Returns a Str value. =item * $exception->params() Returns a HashRef value. =back =head2 Moose::Exception::LazyAttributeNeedsADefault This class consumes the Moose::Exception::Role::EitherAttributeOrAttributeName role. This class has the following methods: =over 4 =item * $exception->attribute() Returns a L object. =item * $exception->attribute_name() Returns a Str value. =item * $exception->params() Returns a HashRef value. =back =head2 Moose::Exception::Legacy This class has no attributes except for C and C. =head2 Moose::Exception::MOPAttributeNewNeedsAttributeName This class consumes the Moose::Exception::Role::ParamsHash role. This class has the following methods: =over 4 =item * $exception->class() Returns a Str value. =item * $exception->params() Returns a HashRef value. =back =head2 Moose::Exception::MatchActionMustBeACodeRef This class consumes the Moose::Exception::Role::TypeConstraint role. This class has the following methods: =over 4 =item * $exception->action() =item * $exception->to_match() =item * $exception->type_name() Returns a Str value. This attribute can be used for fetching type constraint(Moose::Meta::TypeConstraint): my $type_constraint = Moose::Util::TypeConstraints::find_type_constraint( $exception->type_name ); =back =head2 Moose::Exception::MessageParameterMustBeCodeRef This class consumes the Moose::Exception::Role::ParamsHash role. This class has the following methods: =over 4 =item * $exception->class() Returns a Str value. =item * $exception->params() Returns a HashRef value. =back =head2 Moose::Exception::MetaclassIsAClassNotASubclassOfGivenMetaclass This class consumes the Moose::Exception::Role::Class role. This class has the following methods: =over 4 =item * $exception->class_name() Returns a Str value. This attribute can be used for fetching metaclass instance: my $metaclass_instance = Moose::Util::find_meta( $exception->class_name ); =item * $exception->metaclass() Returns a Str value. =back =head2 Moose::Exception::MetaclassIsARoleNotASubclassOfGivenMetaclass This class consumes the Moose::Exception::Role::Role role. This class has the following methods: =over 4 =item * $exception->metaclass() Returns a Str value. =item * $exception->role_name() Returns a Str value. This attribute can be used for fetching the class's metaclass instance: my $metaclass_instance = Moose::Util::find_meta( $exception->role_name ); =back =head2 Moose::Exception::MetaclassIsNotASubclassOfGivenMetaclass This class consumes the Moose::Exception::Role::Class role. This class has the following methods: =over 4 =item * $exception->class_name() Returns a Str value. This attribute can be used for fetching metaclass instance: my $metaclass_instance = Moose::Util::find_meta( $exception->class_name ); =item * $exception->metaclass() Returns a Str value. =back =head2 Moose::Exception::MetaclassMustBeASubclassOfMooseMetaClass This class consumes the Moose::Exception::Role::Class role. This class has the following methods: =over 4 =item * $exception->class_name() Returns a Str value. This attribute can be used for fetching metaclass instance: my $metaclass_instance = Moose::Util::find_meta( $exception->class_name ); =back =head2 Moose::Exception::MetaclassMustBeASubclassOfMooseMetaRole This class consumes the Moose::Exception::Role::Role role. This class has the following methods: =over 4 =item * $exception->role_name() Returns a Str value. This attribute can be used for fetching the class's metaclass instance: my $metaclass_instance = Moose::Util::find_meta( $exception->role_name ); =back =head2 Moose::Exception::MetaclassMustBeDerivedFromClassMOPClass This class has the following methods: =over 4 =item * $exception->class_name() Returns a Str value. =back =head2 Moose::Exception::MetaclassNotLoaded This class consumes the Moose::Exception::Role::Class role. This class has the following methods: =over 4 =item * $exception->class_name() Returns a Str value. This attribute can be used for fetching metaclass instance: my $metaclass_instance = Moose::Util::find_meta( $exception->class_name ); =back =head2 Moose::Exception::MetaclassTypeIncompatible This class consumes the Moose::Exception::Role::Class role. This class has the following methods: =over 4 =item * $exception->class_name() Returns a Str value. This attribute can be used for fetching metaclass instance: my $metaclass_instance = Moose::Util::find_meta( $exception->class_name ); =item * $exception->metaclass_type() Returns a Str value. =item * $exception->superclass_name() Returns a Str value. =back =head2 Moose::Exception::MethodExpectedAMetaclassObject This class has the following methods: =over 4 =item * $exception->class() Returns a Str value. =item * $exception->metaclass() =back =head2 Moose::Exception::MethodExpectsFewerArgs This class has the following methods: =over 4 =item * $exception->maximum_args() Returns an Int value. =item * $exception->method_name() Returns a Str value. =back =head2 Moose::Exception::MethodExpectsMoreArgs This class has the following methods: =over 4 =item * $exception->method_name() Returns a Str value. =item * $exception->minimum_args() Returns an Int value. =back =head2 Moose::Exception::MethodModifierNeedsMethodName This class consumes the Moose::Exception::Role::Class role. This class has the following methods: =over 4 =item * $exception->class_name() Returns a Str value. This attribute can be used for fetching metaclass instance: my $metaclass_instance = Moose::Util::find_meta( $exception->class_name ); =back =head2 Moose::Exception::MethodNameConflictInRoles This class consumes the Moose::Exception::Role::Class role. This class has the following methods: =over 4 =item * $exception->class_name() Returns a Str value. This attribute can be used for fetching metaclass instance: my $metaclass_instance = Moose::Util::find_meta( $exception->class_name ); =item * $exception->conflict() Returns an ArrayRef[Moose::Meta::Role::Method::Conflicting] value. =back =head2 Moose::Exception::MethodNameNotFoundInInheritanceHierarchy This class consumes the Moose::Exception::Role::Class role. This class has the following methods: =over 4 =item * $exception->class_name() Returns a Str value. This attribute can be used for fetching metaclass instance: my $metaclass_instance = Moose::Util::find_meta( $exception->class_name ); =item * $exception->method_name() Returns a Str value. =back =head2 Moose::Exception::MethodNameNotGiven This class consumes the Moose::Exception::Role::Class role. This class has the following methods: =over 4 =item * $exception->class_name() Returns a Str value. This attribute can be used for fetching metaclass instance: my $metaclass_instance = Moose::Util::find_meta( $exception->class_name ); =back =head2 Moose::Exception::MustDefineAMethodName This class consumes the Moose::Exception::Role::Instance role. This class has the following methods: =over 4 =item * $exception->instance() Returns an Object value. =back =head2 Moose::Exception::MustDefineAnAttributeName This class consumes the Moose::Exception::Role::Class role. This class has the following methods: =over 4 =item * $exception->class_name() Returns a Str value. This attribute can be used for fetching metaclass instance: my $metaclass_instance = Moose::Util::find_meta( $exception->class_name ); =back =head2 Moose::Exception::MustDefineAnOverloadOperator This class consumes the Moose::Exception::Role::Instance role. This class has the following methods: =over 4 =item * $exception->instance() Returns an Object value. =back =head2 Moose::Exception::MustHaveAtLeastOneValueToEnumerate This class consumes the Moose::Exception::Role::ParamsHash role. This class has the following methods: =over 4 =item * $exception->class() Returns a Str value. =item * $exception->params() Returns a HashRef value. =back =head2 Moose::Exception::MustPassAHashOfOptions This class consumes the Moose::Exception::Role::ParamsHash role. This class has the following methods: =over 4 =item * $exception->class() Returns a Str value. =item * $exception->params() Returns a HashRef value. =back =head2 Moose::Exception::MustPassAMooseMetaRoleInstanceOrSubclass This class has the following methods: =over 4 =item * $exception->class() Returns a Str value. =item * $exception->role() =back =head2 Moose::Exception::MustPassAPackageNameOrAnExistingClassMOPPackageInstance This class consumes the Moose::Exception::Role::ParamsHash role. This class has the following methods: =over 4 =item * $exception->class() =item * $exception->params() Returns a HashRef value. =back =head2 Moose::Exception::MustPassEvenNumberOfArguments This class has the following methods: =over 4 =item * $exception->args() Returns an ArrayRef value. =item * $exception->method_name() Returns a Str value. =back =head2 Moose::Exception::MustPassEvenNumberOfAttributeOptions This class has the following methods: =over 4 =item * $exception->attribute_name() Returns a Str value. =item * $exception->options() Returns an ArrayRef value. =back =head2 Moose::Exception::MustProvideANameForTheAttribute This class consumes the Moose::Exception::Role::ParamsHash role. This class has the following methods: =over 4 =item * $exception->class() Returns a Str value. =item * $exception->params() Returns a HashRef value. =back =head2 Moose::Exception::MustSpecifyAtleastOneMethod This class consumes the Moose::Exception::Role::Role role. This class has the following methods: =over 4 =item * $exception->role_name() Returns a Str value. This attribute can be used for fetching the class's metaclass instance: my $metaclass_instance = Moose::Util::find_meta( $exception->role_name ); =back =head2 Moose::Exception::MustSpecifyAtleastOneRole This class consumes the Moose::Exception::Role::Role role. This class has the following methods: =over 4 =item * $exception->role_name() Returns a Str value. This attribute can be used for fetching the class's metaclass instance: my $metaclass_instance = Moose::Util::find_meta( $exception->role_name ); =back =head2 Moose::Exception::MustSpecifyAtleastOneRoleToApplicant This class has the following methods: =over 4 =item * $exception->applicant() =back =head2 Moose::Exception::MustSupplyAClassMOPAttributeInstance This class consumes the Moose::Exception::Role::ParamsHash role. This class has the following methods: =over 4 =item * $exception->class() Returns a Str value. =item * $exception->params() Returns a HashRef value. =back =head2 Moose::Exception::MustSupplyADelegateToMethod This class consumes the Moose::Exception::Role::ParamsHash role. This class has the following methods: =over 4 =item * $exception->class() Returns a Str value. =item * $exception->params() Returns a HashRef value. =back =head2 Moose::Exception::MustSupplyAMetaclass This class consumes the Moose::Exception::Role::ParamsHash role. This class has the following methods: =over 4 =item * $exception->class() Returns a Str value. =item * $exception->params() Returns a HashRef value. =back =head2 Moose::Exception::MustSupplyAMooseMetaAttributeInstance This class consumes the Moose::Exception::Role::ParamsHash role. This class has the following methods: =over 4 =item * $exception->class() Returns a Str value. =item * $exception->params() Returns a HashRef value. =back =head2 Moose::Exception::MustSupplyAnAccessorTypeToConstructWith This class consumes the Moose::Exception::Role::ParamsHash role. This class has the following methods: =over 4 =item * $exception->class() Returns a Str value. =item * $exception->params() Returns a HashRef value. =back =head2 Moose::Exception::MustSupplyAnAttributeToConstructWith This class consumes the Moose::Exception::Role::ParamsHash role. This class has the following methods: =over 4 =item * $exception->class() Returns a Str value. =item * $exception->params() Returns a HashRef value. =back =head2 Moose::Exception::MustSupplyArrayRefAsCurriedArguments This class consumes the Moose::Exception::Role::Class and Moose::Exception::Role::ParamsHash roles. This class has the following methods: =over 4 =item * $exception->class_name() Returns a Str value. This attribute can be used for fetching metaclass instance: my $metaclass_instance = Moose::Util::find_meta( $exception->class_name ); =item * $exception->params() Returns a HashRef value. =back =head2 Moose::Exception::MustSupplyPackageNameAndName This class consumes the Moose::Exception::Role::ParamsHash role. This class has the following methods: =over 4 =item * $exception->class() Returns a Str value. =item * $exception->params() Returns a HashRef value. =back =head2 Moose::Exception::NeedsTypeConstraintUnionForTypeCoercionUnion This class consumes the Moose::Exception::Role::TypeConstraint role. This class has the following methods: =over 4 =item * $exception->type_coercion_union_object() Returns a L object. =item * $exception->type_name() Returns a Str value. This attribute can be used for fetching type constraint(Moose::Meta::TypeConstraint): my $type_constraint = Moose::Util::TypeConstraints::find_type_constraint( $exception->type_name ); =back =head2 Moose::Exception::NeitherAttributeNorAttributeNameIsGiven This class has no attributes except for C and C. =head2 Moose::Exception::NeitherClassNorClassNameIsGiven This class has no attributes except for C and C. =head2 Moose::Exception::NeitherRoleNorRoleNameIsGiven This class has no attributes except for C and C. =head2 Moose::Exception::NeitherTypeNorTypeNameIsGiven This class has no attributes except for C and C. =head2 Moose::Exception::NoAttributeFoundInSuperClass This class consumes the Moose::Exception::Role::Class, Moose::Exception::Role::InvalidAttributeOptions, and Moose::Exception::Role::ParamsHash roles. This class has the following methods: =over 4 =item * $exception->attribute_name() Returns a Str value. =item * $exception->class_name() Returns a Str value. This attribute can be used for fetching metaclass instance: my $metaclass_instance = Moose::Util::find_meta( $exception->class_name ); =item * $exception->params() Returns a HashRef value. =back =head2 Moose::Exception::NoBodyToInitializeInAnAbstractBaseClass This class has the following methods: =over 4 =item * $exception->package_name() Returns a Str value. =back =head2 Moose::Exception::NoCasesMatched This class has the following methods: =over 4 =item * $exception->cases_to_be_matched() Returns an ArrayRef value. =item * $exception->to_match() =back =head2 Moose::Exception::NoConstraintCheckForTypeConstraint This class consumes the Moose::Exception::Role::TypeConstraint role. This class has the following methods: =over 4 =item * $exception->type_name() Returns a Str value. This attribute can be used for fetching type constraint(Moose::Meta::TypeConstraint): my $type_constraint = Moose::Util::TypeConstraints::find_type_constraint( $exception->type_name ); =back =head2 Moose::Exception::NoDestructorClassSpecified This class consumes the Moose::Exception::Role::Class and Moose::Exception::Role::ParamsHash roles. This class has the following methods: =over 4 =item * $exception->class_name() Returns a Str value. This attribute can be used for fetching metaclass instance: my $metaclass_instance = Moose::Util::find_meta( $exception->class_name ); =item * $exception->params() Returns a HashRef value. =back =head2 Moose::Exception::NoImmutableTraitSpecifiedForClass This class consumes the Moose::Exception::Role::Class and Moose::Exception::Role::ParamsHash roles. This class has the following methods: =over 4 =item * $exception->class_name() Returns a Str value. This attribute can be used for fetching metaclass instance: my $metaclass_instance = Moose::Util::find_meta( $exception->class_name ); =item * $exception->params() Returns a HashRef value. =back =head2 Moose::Exception::NoParentGivenToSubtype This class has the following methods: =over 4 =item * $exception->name() Returns a Str value. =back =head2 Moose::Exception::OnlyInstancesCanBeCloned This class consumes the Moose::Exception::Role::Class and Moose::Exception::Role::ParamsHash roles. This class has the following methods: =over 4 =item * $exception->class_name() Returns a Str value. This attribute can be used for fetching metaclass instance: my $metaclass_instance = Moose::Util::find_meta( $exception->class_name ); =item * $exception->instance() =item * $exception->params() Returns a HashRef value. =back =head2 Moose::Exception::OperatorIsRequired This class consumes the Moose::Exception::Role::ParamsHash role. This class has the following methods: =over 4 =item * $exception->class() Returns a Str value. =item * $exception->params() Returns a HashRef value. =back =head2 Moose::Exception::OverloadConflictInSummation This class has the following methods: =over 4 =item * $exception->overloaded_op() Returns a Str value. =item * $exception->role_application() Returns a L object. =item * $exception->role_names() =item * $exception->elements() This attribute is an ArrayRef containing role names, if you want metaobjects associated with these role names, then call method roles on the exception object. =back =head2 Moose::Exception::OverloadRequiresAMetaClass This class has no attributes except for C and C. =head2 Moose::Exception::OverloadRequiresAMetaMethod This class has no attributes except for C and C. =head2 Moose::Exception::OverloadRequiresAMetaOverload This class has no attributes except for C and C. =head2 Moose::Exception::OverloadRequiresAMethodNameOrCoderef This class has no attributes except for C and C. =head2 Moose::Exception::OverloadRequiresAnOperator This class has no attributes except for C and C. =head2 Moose::Exception::OverloadRequiresNamesForCoderef This class has no attributes except for C and C. =head2 Moose::Exception::OverrideConflictInComposition This class consumes the Moose::Exception::Role::Role role. This class has the following methods: =over 4 =item * $exception->method_name() Returns a Str value. =item * $exception->role_being_applied_name() Returns a Str value. =item * $exception->role_name() Returns a Str value. This attribute can be used for fetching the class's metaclass instance: my $metaclass_instance = Moose::Util::find_meta( $exception->role_name ); =item * $exception->two_overrides_found() Returns a Bool value. =back =head2 Moose::Exception::OverrideConflictInSummation This class has the following methods: =over 4 =item * $exception->method_name() Returns a Str value. =item * $exception->role_application() Returns a L object. =item * $exception->role_names() =item * $exception->elements() This attribute is an ArrayRef containing role names, if you want metaobjects associated with these role names, then call method roles on the exception object. =item * $exception->two_overrides_found() Returns a Bool value. =back =head2 Moose::Exception::PackageDoesNotUseMooseExporter This class has the following methods: =over 4 =item * $exception->is_loaded() Returns a Bool value. =item * $exception->package() Returns a Str value. =back =head2 Moose::Exception::PackageNameAndNameParamsNotGivenToWrap This class consumes the Moose::Exception::Role::ParamsHash role. This class has the following methods: =over 4 =item * $exception->class() Returns a Str value. =item * $exception->code() Returns a CodeRef value. =item * $exception->params() Returns a HashRef value. =back =head2 Moose::Exception::PackagesAndModulesAreNotCachable This class consumes the Moose::Exception::Role::Class and Moose::Exception::Role::ParamsHash roles. This class has the following methods: =over 4 =item * $exception->class_name() Returns a Str value. This attribute can be used for fetching metaclass instance: my $metaclass_instance = Moose::Util::find_meta( $exception->class_name ); =item * $exception->is_module() Returns a Bool value. =item * $exception->params() Returns a HashRef value. =back =head2 Moose::Exception::ParameterIsNotSubtypeOfParent This class consumes the Moose::Exception::Role::TypeConstraint role. This class has the following methods: =over 4 =item * $exception->type_name() Returns a Str value. This attribute can be used for fetching type constraint(Moose::Meta::TypeConstraint): my $type_constraint = Moose::Util::TypeConstraints::find_type_constraint( $exception->type_name ); =item * $exception->type_parameter() Returns a Str value. =back =head2 Moose::Exception::ReferencesAreNotAllowedAsDefault This class consumes the Moose::Exception::Role::ParamsHash role. This class has the following methods: =over 4 =item * $exception->attribute_name() Returns a Str value. =item * $exception->class() Returns a Str value. =item * $exception->params() Returns a HashRef value. =back =head2 Moose::Exception::RequiredAttributeLacksInitialization This class consumes the Moose::Exception::Role::ParamsHash role. This class has the following methods: =over 4 =item * $exception->class() Returns a Str value. =item * $exception->params() Returns a HashRef value. =back =head2 Moose::Exception::RequiredAttributeNeedsADefault This class consumes the Moose::Exception::Role::InvalidAttributeOptions and Moose::Exception::Role::ParamsHash roles. This class has the following methods: =over 4 =item * $exception->attribute_name() Returns a Str value. =item * $exception->params() Returns a HashRef value. =back =head2 Moose::Exception::RequiredMethodsImportedByClass This class consumes the Moose::Exception::Role::Class and Moose::Exception::Role::Role roles. This class has the following methods: =over 4 =item * $exception->class_name() Returns a Str value. This attribute can be used for fetching metaclass instance: my $metaclass_instance = Moose::Util::find_meta( $exception->class_name ); =item * $exception->imported_method() Returns a L object. =item * $exception->missing_methods() Returns an ArrayRef[Moose::Meta::Role::Method::Required] value. =item * $exception->role_name() Returns a Str value. This attribute can be used for fetching the class's metaclass instance: my $metaclass_instance = Moose::Util::find_meta( $exception->role_name ); =back =head2 Moose::Exception::RequiredMethodsNotImplementedByClass This class consumes the Moose::Exception::Role::Class and Moose::Exception::Role::Role roles. This class has the following methods: =over 4 =item * $exception->class_name() Returns a Str value. This attribute can be used for fetching metaclass instance: my $metaclass_instance = Moose::Util::find_meta( $exception->class_name ); =item * $exception->missing_methods() Returns an ArrayRef[Moose::Meta::Role::Method::Required] value. =item * $exception->role_name() Returns a Str value. This attribute can be used for fetching the class's metaclass instance: my $metaclass_instance = Moose::Util::find_meta( $exception->role_name ); =back =head2 Moose::Exception::RoleDoesTheExcludedRole This class consumes the Moose::Exception::Role::Role role. This class has the following methods: =over 4 =item * $exception->excluded_role_name() Returns a Str value. =item * $exception->role_name() Returns a Str value. This attribute can be used for fetching the class's metaclass instance: my $metaclass_instance = Moose::Util::find_meta( $exception->role_name ); =item * $exception->second_role_name() Returns a Str value. =back =head2 Moose::Exception::RoleExclusionConflict This class consumes the Moose::Exception::Role::Role role. This class has the following methods: =over 4 =item * $exception->role_name() Returns a Str value. This attribute can be used for fetching the class's metaclass instance: my $metaclass_instance = Moose::Util::find_meta( $exception->role_name ); =item * $exception->roles() Returns an ArrayRef value. =back =head2 Moose::Exception::RoleNameRequired This class consumes the Moose::Exception::Role::Class role. This class has the following methods: =over 4 =item * $exception->class_name() Returns a Str value. This attribute can be used for fetching metaclass instance: my $metaclass_instance = Moose::Util::find_meta( $exception->class_name ); =back =head2 Moose::Exception::RoleNameRequiredForMooseMetaRole This class consumes the Moose::Exception::Role::Role role. This class has the following methods: =over 4 =item * $exception->role_name() Returns a Str value. This attribute can be used for fetching the class's metaclass instance: my $metaclass_instance = Moose::Util::find_meta( $exception->role_name ); =back =head2 Moose::Exception::RolesDoNotSupportAugment This class has no attributes except for C and C. =head2 Moose::Exception::RolesDoNotSupportExtends This class has no attributes except for C and C. =head2 Moose::Exception::RolesDoNotSupportInner This class has no attributes except for C and C. =head2 Moose::Exception::RolesDoNotSupportRegexReferencesForMethodModifiers This class consumes the Moose::Exception::Role::Role role. This class has the following methods: =over 4 =item * $exception->modifier_type() Returns a Str value. =item * $exception->role_name() Returns a Str value. This attribute can be used for fetching the class's metaclass instance: my $metaclass_instance = Moose::Util::find_meta( $exception->role_name ); =back =head2 Moose::Exception::RolesInCreateTakesAnArrayRef This class consumes the Moose::Exception::Role::ParamsHash role. This class has the following methods: =over 4 =item * $exception->params() Returns a HashRef value. =back =head2 Moose::Exception::RolesListMustBeInstancesOfMooseMetaRole This class consumes the Moose::Exception::Role::ParamsHash role. This class has the following methods: =over 4 =item * $exception->class() Returns a Str value. =item * $exception->params() Returns a HashRef value. =item * $exception->role() =back =head2 Moose::Exception::SingleParamsToNewMustBeHashRef This class has no attributes except for C and C. =head2 Moose::Exception::TriggerMustBeACodeRef This class consumes the Moose::Exception::Role::InvalidAttributeOptions and Moose::Exception::Role::ParamsHash roles. This class has the following methods: =over 4 =item * $exception->attribute_name() Returns a Str value. =item * $exception->params() Returns a HashRef value. =back =head2 Moose::Exception::TypeConstraintCannotBeUsedForAParameterizableType This class consumes the Moose::Exception::Role::TypeConstraint role. This class has the following methods: =over 4 =item * $exception->parent_type_name() Returns a Str value. This attribute can be used for fetching type constraint(Moose::Meta::TypeConstraint): my $type_constraint = Moose::Util::TypeConstraints::find_type_constraint( $exception->parent_type_name ); =item * $exception->type_name() Returns a Str value. This attribute can be used for fetching type constraint(Moose::Meta::TypeConstraint): my $type_constraint = Moose::Util::TypeConstraints::find_type_constraint( $exception->type_name ); =back =head2 Moose::Exception::TypeConstraintIsAlreadyCreated This class consumes the Moose::Exception::Role::TypeConstraint role. This class has the following methods: =over 4 =item * $exception->package_defined_in() Returns a Str value. =item * $exception->type_name() Returns a Str value. This attribute can be used for fetching type constraint(Moose::Meta::TypeConstraint): my $type_constraint = Moose::Util::TypeConstraints::find_type_constraint( $exception->type_name ); =back =head2 Moose::Exception::TypeParameterMustBeMooseMetaType This class consumes the Moose::Exception::Role::TypeConstraint role. This class has the following methods: =over 4 =item * $exception->type_name() Returns a Str value. This attribute can be used for fetching type constraint(Moose::Meta::TypeConstraint): my $type_constraint = Moose::Util::TypeConstraints::find_type_constraint( $exception->type_name ); =back =head2 Moose::Exception::UnableToCanonicalizeHandles This class consumes the Moose::Exception::Role::Attribute role. This class has the following methods: =over 4 =item * $exception->attribute() Returns a L object. =item * $exception->handles() =back =head2 Moose::Exception::UnableToCanonicalizeNonRolePackage This class consumes the Moose::Exception::Role::Attribute role. This class has the following methods: =over 4 =item * $exception->attribute() Returns a L object. =item * $exception->handles() Returns a Str value. =back =head2 Moose::Exception::UnableToRecognizeDelegateMetaclass This class consumes the Moose::Exception::Role::Attribute role. This class has the following methods: =over 4 =item * $exception->attribute() Returns a L object. =item * $exception->delegate_metaclass() =back =head2 Moose::Exception::UndefinedHashKeysPassedToMethod This class has the following methods: =over 4 =item * $exception->hash_keys() Returns an ArrayRef value. =item * $exception->method_name() Returns a Str value. =back =head2 Moose::Exception::UnionCalledWithAnArrayRefAndAdditionalArgs This class has the following methods: =over 4 =item * $exception->args() Returns an ArrayRef value. =item * $exception->array() Returns an ArrayRef value. =back =head2 Moose::Exception::UnionTakesAtleastTwoTypeNames This class has no attributes except for C and C. =head2 Moose::Exception::ValidationFailedForInlineTypeConstraint This class consumes the Moose::Exception::Role::Class role. This class has the following methods: =over 4 =item * $exception->attribute_name() Returns a Str value. =item * $exception->class_name() Returns a Str value. This attribute can be used for fetching metaclass instance: my $metaclass_instance = Moose::Util::find_meta( $exception->class_name ); =item * $exception->new_member() Returns a Bool value. =item * $exception->type_constraint_message() Returns a Str value. =item * $exception->value() =back =head2 Moose::Exception::ValidationFailedForTypeConstraint This class consumes the Moose::Exception::Role::Attribute role. This class has the following methods: =over 4 =item * $exception->attribute() Returns a L object. =item * $exception->type() Returns a Moose::Util::TypeConstraints value. =item * $exception->value() =back =head2 Moose::Exception::WrapTakesACodeRefToBless This class consumes the Moose::Exception::Role::ParamsHash role. This class has the following methods: =over 4 =item * $exception->class() Returns a Str value. =item * $exception->code() =item * $exception->params() Returns a HashRef value. =back =head2 Moose::Exception::WrongTypeConstraintGiven This class consumes the Moose::Exception::Role::ParamsHash role. This class has the following methods: =over 4 =item * $exception->attribute_name() Returns a Str value. =item * $exception->given_type() Returns a Str value. =item * $exception->params() Returns a HashRef value. =item * $exception->required_type() Returns a Str value. =back =cut =for comment insert generated content here =head1 AUTHORS =over 4 =item * Stevan Little =item * Dave Rolsky =item * Jesse Luehrs =item * Shawn M Moore =item * יובל קוג'מן (Yuval Kogman) =item * Karen Etheridge =item * Florian Ragwitz =item * Hans Dieter Pearcey =item * Chris Prather =item * Matt S Trout =back =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2006 by Infinity Interactive, Inc. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cutMoose-2.2200/lib/Moose/Cookbook/Basics/000770 000766 000024 00000000000 14137574636 017753 5ustar00etherstaff000000 000000 Moose-2.2200/lib/Moose/Cookbook/Snack/000770 000766 000024 00000000000 14137574636 017606 5ustar00etherstaff000000 000000 Moose-2.2200/lib/Moose/Cookbook/Meta/000770 000766 000024 00000000000 14137574636 017435 5ustar00etherstaff000000 000000 Moose-2.2200/lib/Moose/Cookbook/Legacy/000770 000766 000024 00000000000 14137574636 017753 5ustar00etherstaff000000 000000 Moose-2.2200/lib/Moose/Cookbook/Roles/000770 000766 000024 00000000000 14137574636 017633 5ustar00etherstaff000000 000000 Moose-2.2200/lib/Moose/Cookbook/Style.pod000644 000766 000024 00000002252 14137574636 020357 0ustar00etherstaff000000 000000 # PODNAME: Moose::Cookbook::Style # ABSTRACT: Expanded into Moose::Manual::BestPractices, so go read that __END__ =pod =encoding UTF-8 =head1 NAME Moose::Cookbook::Style - Expanded into Moose::Manual::BestPractices, so go read that =head1 VERSION version 2.2200 =head1 DESCRIPTION The style cookbook has been replaced by L. This POD document still exists for the benefit of anyone out there who might've linked to it in the past. =head1 AUTHORS =over 4 =item * Stevan Little =item * Dave Rolsky =item * Jesse Luehrs =item * Shawn M Moore =item * יובל קוג'מן (Yuval Kogman) =item * Karen Etheridge =item * Florian Ragwitz =item * Hans Dieter Pearcey =item * Chris Prather =item * Matt S Trout =back =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2006 by Infinity Interactive, Inc. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Moose-2.2200/lib/Moose/Cookbook/Extending/000770 000766 000024 00000000000 14137574636 020474 5ustar00etherstaff000000 000000 Moose-2.2200/lib/Moose/Cookbook/Extending/Debugging_BaseClassRole.pod000644 000766 000024 00000006662 14137574636 025652 0ustar00etherstaff000000 000000 # PODNAME: Moose::Cookbook::Extending::Debugging_BaseClassRole # ABSTRACT: Providing a role for the base object class __END__ =pod =encoding UTF-8 =head1 NAME Moose::Cookbook::Extending::Debugging_BaseClassRole - Providing a role for the base object class =head1 VERSION version 2.2200 =head1 SYNOPSIS package MooseX::Debugging; use Moose::Exporter; Moose::Exporter->setup_import_methods( base_class_roles => ['MooseX::Debugging::Role::Object'], ); package MooseX::Debugging::Role::Object; use Moose::Role; sub BUILD {} after BUILD => sub { my $self = shift; warn "Made a new " . ( ref $self ) . " object\n"; }; =head1 DESCRIPTION In this example, we provide a role for the base object class that adds some simple debugging output. Every time an object is created, it spits out a warning saying what type of object it was. Obviously, a real debugging role would do something more interesting, but this recipe is all about how we apply that role. In this case, with the combination of L and L, we ensure that when a module does C>, it automatically gets the debugging role applied to its base object class. There are a few pieces of code worth looking at more closely. Moose::Exporter->setup_import_methods( base_class_roles => ['MooseX::Debugging::Role::Object'], ); This creates an C method in the C package. Since we are not actually exporting anything, we do not pass C any parameters related to exports, but we need to have an C method to ensure that our C method is called. The C is created by C for us, since we passed the C parameter. The generated C will in turn call L. sub BUILD {} after BUILD => sub { ... }; Due to the way role composition currently works, if the class that a role is composed into contains a C method, then that will override the C method in any roles it composes, which is typically not what you want. Using a method modifier on C avoids this issue, since method modifiers compose together rather than being overridden. Method modifiers require that a method exists in order to wrap, however, so we also provide a stub method to wrap if no C method exists in the class. =for testing-SETUP use Test::Requires 'Test::Output'; =begin testing { package Debugged; use Moose; MooseX::Debugging->import; } stderr_is( sub { Debugged->new }, "Made a new Debugged object\n", 'got expected output from debugging role' ); =end testing =head1 AUTHORS =over 4 =item * Stevan Little =item * Dave Rolsky =item * Jesse Luehrs =item * Shawn M Moore =item * יובל קוג'מן (Yuval Kogman) =item * Karen Etheridge =item * Florian Ragwitz =item * Hans Dieter Pearcey =item * Chris Prather =item * Matt S Trout =back =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2006 by Infinity Interactive, Inc. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Moose-2.2200/lib/Moose/Cookbook/Extending/ExtensionOverview.pod000644 000766 000024 00000033232 14137574636 024711 0ustar00etherstaff000000 000000 # PODNAME: Moose::Cookbook::Extending::ExtensionOverview # ABSTRACT: Moose extension overview __END__ =pod =encoding UTF-8 =head1 NAME Moose::Cookbook::Extending::ExtensionOverview - Moose extension overview =head1 VERSION version 2.2200 =head1 DESCRIPTION Moose provides several ways in which extensions can hook into Moose and change its behavior. Moose also has a lot of behavior that can be changed. This recipe will provide an overview of each extension method and give you some recommendations on what tools to use. If you haven't yet read the recipes on metaclasses, go read those first. You can't write Moose extensions without understanding the metaclasses, and those recipes also demonstrate some basic extension mechanisms, such as metaclass subclasses and traits. =head2 Playing Nice With Others One of the goals of this overview is to help you build extensions that cooperate well with other extensions. This is especially important if you plan to release your extension to CPAN. Moose comes with several modules that exist to help your write cooperative extensions. These are L and L. By using these two modules, you will ensure that your extension works with both the Moose core features and any other CPAN extension using those modules. =head1 PARTS OF Moose YOU CAN EXTEND The types of things you might want to do in Moose extensions fall into a few broad categories. =head2 Metaclass Extensions One way of extending Moose is by extending one or more Moose metaclasses. For example, in L we saw a metaclass role that added a C attribute to the metaclass. If you were writing an ORM, this would be a logical extension. Many of the Moose extensions on CPAN work by providing an attribute metaclass role. For example, the L module provides an attribute metaclass trait that lets you specify aliases to install for methods and attribute accessors. A metaclass extension can be packaged as a role/trait or a subclass. If you can, we recommend using traits instead of subclasses, since it's much easier to combine disparate traits than it is to combine a bunch of subclasses. When your extensions are implemented as roles, you can apply them with the L module. =head2 Providing Sugar Functions As part of a metaclass extension, you may also want to provide some sugar functions, just like L does. Moose provides a helper module called L that makes this much simpler. We will be use L in several of the extension recipes. =head2 Object Class Extensions Another common Moose extension technique is to change the default object class's behavior. As with metaclass extensions, this can be done with a role/trait or with a subclass. For example, L extension applies a trait that makes the constructor reject arguments which don't match its attributes. Object class extensions often include metaclass extensions as well. In particular, if you want your object extension to work when a class is made immutable, you may need to modify the behavior of some or all of the L, L, and L objects. The L module lets you apply roles to the base object class, as well as the meta classes just mentioned. =head2 Providing a Role Some extensions come in the form of a role for you to consume. The L extension is a great example of this. In fact, despite the C name, it does not actually change anything about Moose's behavior. Instead, it is just a role that an object which wants to be pluggable can consume. If you are implementing this sort of extension, you don't need to do anything special. You simply create a role and document that it should be used via the normal C sugar: package MyApp::User; use Moose; with 'My::Role'; Don't use "MooseX" in the name for such packages. =head2 New Types Another common Moose extension is a new type for the Moose type system. In this case, you simply create a type in your module. When people load your module, the type is created, and they can refer to it by name after that. The L and L distributions are two good examples of how this works. These both build on top of the L extension. =head1 ROLES VS TRAITS VS SUBCLASSES It is important to understand that B. A trait is simply a role applied to a instance. The only thing that may distinguish the two is that a trait can be packaged in a way that lets Moose resolve a short name to a class name. In other words, with a trait, the caller can refer to it by a short name like "Big", and Moose will resolve it to a class like C. See L and L for examples of traits in action. In particular, both of these recipes demonstrate the trait resolution mechanism. Implementing an extension as a (set of) metaclass or base object role(s) will make your extension more cooperative. It is hard for an end-user to effectively combine together multiple metaclass subclasses, but it is very easy to combine roles. =head1 USING YOUR EXTENSION There are a number of ways in which an extension can be applied. In some cases you can provide multiple ways of consuming your extension. =head2 Extensions as Metaclass Traits If your extension is available as a trait, you can ask end users to simply specify it in a list of traits. Currently, this only works for (class) metaclass and attribute metaclass traits: use Moose -traits => [ 'Big', 'Blue' ]; has 'animal' => ( traits => [ 'Big', 'Blue' ], ... ); If your extension applies to any other metaclass, or the object base class, you cannot use the trait mechanism. The benefit of the trait mechanism is that is very easy to see where a trait is applied in the code, and consumers have fine-grained control over what the trait applies to. This is especially true for attribute traits, where you can apply the trait to just one attribute in a class. =head2 Extensions as Metaclass (and Base Object) Roles Implementing your extensions as metaclass roles makes your extensions easy to apply, and cooperative with other role-based extensions for metaclasses. Just as with a subclass, you will probably want to package your extensions for consumption with a single module that uses L. However, in this case, you will use L to apply all of your roles. The advantage of using this module is that I. This means that your extension is cooperative I, and consumers of your extension can easily use it with other role-based extensions. Most uses of L can be handled by L directly; see the L docs. package MooseX::Embiggen; use Moose::Exporter; use MooseX::Embiggen::Role::Meta::Class; use MooseX::Embiggen::Role::Meta::Attribute; use MooseX::Embiggen::Role::Meta::Method::Constructor; use MooseX::Embiggen::Role::Object; Moose::Exporter->setup_import_methods( class_metaroles => { class => ['MooseX::Embiggen::Role::Meta::Class'], attribute => ['MooseX::Embiggen::Role::Meta::Attribute'], constructor => ['MooseX::Embiggen::Role::Meta::Method::Constructor'], }, base_class_roles => ['MooseX::Embiggen::Role::Object'], ); As you can see from this example, you can use L to apply roles to any metaclass, as well as the base object class. If some other extension has already applied its own roles, they will be preserved when your extension applies its roles, and vice versa. =head2 Providing Sugar With L, you can also export your own sugar functions: package MooseX::Embiggen; use Moose::Exporter; Moose::Exporter->setup_import_methods( with_meta => ['embiggen'], class_metaroles => { class => ['MooseX::Embiggen::Role::Meta::Class'], }, ); sub embiggen { my $meta = shift; $meta->embiggen(@_); } And then the consumer of your extension can use your C sub: package Consumer; use Moose; use MooseX::Embiggen; extends 'Thing'; embiggen ...; This can be combined with metaclass and base class roles quite easily. =head2 More advanced extensions Providing your extension simply as a set of traits that gets applied to the appropriate metaobjects is easy, but sometimes not sufficient. For instance, sometimes you need to supply not just a base object role, but an actual base object class (due to needing to interact with existing systems that only provide a base class). To write extensions like this, you will need to provide a custom C method in your exporter. For instance: package MooseX::Embiggen; use Moose::Exporter; my ($import, $unimport, $init_meta) = Moose::Exporter->build_import_methods( install => ['import', 'unimport'], with_meta => ['embiggen'], class_metaroles => { class => ['MooseX::Embiggen::Role::Meta::Class'], }, ); sub embiggen { my $meta = shift; $meta->embiggen(@_); } sub init_meta { my $package = shift; my %options = @_; if (my $meta = Class::MOP::class_of($options{for_class})) { if ($meta->isa('Class::MOP::Class')) { my @supers = $meta->superclasses; $meta->superclasses('MooseX::Embiggen::Base::Class') if @supers == 1 && $supers[0] eq 'Moose::Object'; } } $package->$init_meta(%options); } In the previous examples, C was generated for you, but here you must override it in order to add additional functionality. Some differences to note: =over 4 =item C instead of C C simply returns the C, C, and C methods, rather than installing them under the appropriate names. This way, you can write your own methods which wrap the functionality provided by L. The C sub also takes an additional C parameter, which tells it to just go ahead and install these methods (since we don't need to modify them). =item C Next, we must write our C wrapper. The important things to remember are that it is called as a method, and that C<%options> needs to be passed through to the existing implementation. We call the base implementation by using the C<$init_meta> subroutine reference that was returned by C earlier. =item Additional implementation This extension sets a different default base object class. To do so, it first checks to see if it's being applied to a class, and then checks to see if L is that class's only superclass, and if so, replaces that with the superclass that this extension requires. Note that two extensions that do this same thing will not work together properly (the second extension to be loaded won't see L as the base object, since it has already been overridden). This is why using a base object role is recommended for the general case. This C also works defensively, by only applying its functionality if a metaclass already exists. This makes sure it doesn't break with legacy extensions which override the metaclass directly (and so must be the first extension to initialize the metaclass). This is likely not necessary, since almost no extensions work this way anymore, but just provides an additional level of protection. The common case of C is not affected regardless. =back This is just one example of what can be done with a custom C method. It can also be used for preventing an extension from being applied to a role, doing other kinds of validation on the class being applied to, or pretty much anything that would otherwise be done in an C method. =head1 LEGACY EXTENSION MECHANISMS Before the existence of L and L, there were a number of other ways to extend Moose. In general, these methods were less cooperative, and only worked well with a single extension. These methods include L, L (which uses L under the hood), and various hacks to do what L does. Please do not use these for your own extensions. Note that if you write a cooperative extension, it should cooperate with older extensions, though older extensions generally do not cooperate with each other. =head1 CONCLUSION If you can write your extension as one or more metaclass and base object roles, please consider doing so. Make sure to read the docs for L and L as well. =head1 AUTHORS =over 4 =item * Stevan Little =item * Dave Rolsky =item * Jesse Luehrs =item * Shawn M Moore =item * יובל קוג'מן (Yuval Kogman) =item * Karen Etheridge =item * Florian Ragwitz =item * Hans Dieter Pearcey =item * Chris Prather =item * Matt S Trout =back =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2006 by Infinity Interactive, Inc. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Moose-2.2200/lib/Moose/Cookbook/Extending/Mooseish_MooseSugar.pod000644 000766 000024 00000005756 14137574636 025152 0ustar00etherstaff000000 000000 # PODNAME: Moose::Cookbook::Extending::Mooseish_MooseSugar # ABSTRACT: Acting like Moose.pm and providing sugar Moose-style __END__ =pod =encoding UTF-8 =head1 NAME Moose::Cookbook::Extending::Mooseish_MooseSugar - Acting like Moose.pm and providing sugar Moose-style =head1 VERSION version 2.2200 =head1 SYNOPSIS package MyApp::Mooseish; use Moose::Exporter; Moose::Exporter->setup_import_methods( with_meta => ['has_table'], class_metaroles => { class => ['MyApp::Meta::Class::Trait::HasTable'], }, ); sub has_table { my $meta = shift; $meta->table(shift); } package MyApp::Meta::Class::Trait::HasTable; use Moose::Role; has table => ( is => 'rw', isa => 'Str', ); =head1 DESCRIPTION This recipe expands on the use of L we saw in L and the class metaclass trait we saw in L. In this example we provide our own metaclass trait, and we also export a C sugar function. The C parameter specifies a list of functions that should be wrapped before exporting. The wrapper simply ensures that the importing package's appropriate metaclass object is the first argument to the function, so we can do C>. See the L docs for more details on its API. =head1 USING MyApp::Mooseish The purpose of all this code is to provide a Moose-like interface. Here's what it would look like in actual use: package MyApp::User; use namespace::autoclean; use Moose; use MyApp::Mooseish; has_table 'User'; has 'username' => ( is => 'ro' ); has 'password' => ( is => 'ro' ); sub login { ... } =head1 CONCLUSION Providing sugar functions can make your extension look much more Moose-ish. See L for a more extensive example. =begin testing { package MyApp::User; use Moose; MyApp::Mooseish->import; has_table( 'User' ); has( 'username' => ( is => 'ro' ) ); has( 'password' => ( is => 'ro' ) ); sub login { } } can_ok( MyApp::User->meta, 'table' ); is( MyApp::User->meta->table, 'User', 'MyApp::User->meta->table returns User' ); ok( MyApp::User->can('username'), 'MyApp::User has username method' ); =end testing =head1 AUTHORS =over 4 =item * Stevan Little =item * Dave Rolsky =item * Jesse Luehrs =item * Shawn M Moore =item * יובל קוג'מן (Yuval Kogman) =item * Karen Etheridge =item * Florian Ragwitz =item * Hans Dieter Pearcey =item * Chris Prather =item * Matt S Trout =back =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2006 by Infinity Interactive, Inc. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Moose-2.2200/lib/Moose/Cookbook/Roles/Restartable_AdvancedComposition.pod000644 000766 000024 00000011441 14137574636 026624 0ustar00etherstaff000000 000000 # PODNAME: Moose::Cookbook::Roles::Restartable_AdvancedComposition # ABSTRACT: Advanced Role Composition - method exclusion and aliasing __END__ =pod =encoding UTF-8 =head1 NAME Moose::Cookbook::Roles::Restartable_AdvancedComposition - Advanced Role Composition - method exclusion and aliasing =head1 VERSION version 2.2200 =head1 SYNOPSIS package Restartable; use Moose::Role; has 'is_paused' => ( is => 'rw', isa => 'Bool', default => 0, ); requires 'save_state', 'load_state'; sub stop { 1 } sub start { 1 } package Restartable::ButUnreliable; use Moose::Role; with 'Restartable' => { -alias => { stop => '_stop', start => '_start' }, -excludes => [ 'stop', 'start' ], }; sub stop { my $self = shift; $self->explode() if rand(1) > .5; $self->_stop(); } sub start { my $self = shift; $self->explode() if rand(1) > .5; $self->_start(); } package Restartable::ButBroken; use Moose::Role; with 'Restartable' => { -excludes => [ 'stop', 'start' ] }; sub stop { my $self = shift; $self->explode(); } sub start { my $self = shift; $self->explode(); } =head1 DESCRIPTION In this example, we demonstrate how to exercise fine-grained control over what methods we consume from a role. We have a C role which provides an C attribute, and two methods, C and C. Then we have two more roles which implement the same interface, each putting their own spin on the C and C methods. In the C role, we want to provide a new implementation of C and C, but still have access to the original implementation. To do this, we alias the methods from C to private methods, and provide wrappers around the originals (1). Note that aliasing simply I a name, so we also need to exclude the methods with their original names. with 'Restartable' => { -alias => { stop => '_stop', start => '_start' }, -excludes => [ 'stop', 'start' ], }; In the C role, we want to provide an entirely new behavior for C and C. We exclude them entirely when composing the C role into C. It's worth noting that the C<-excludes> parameter also accepts a single string as an argument if you just want to exclude one method. with 'Restartable' => { -excludes => [ 'stop', 'start' ] }; =head1 CONCLUSION Exclusion and renaming are a power tool that can be handy, especially when building roles out of other roles. In this example, all of our roles implement the C role. Each role provides same API, but each has a different implementation under the hood. You can also use the method aliasing and excluding features when composing a role into a class. =head1 FOOTNOTES =over 4 =item (1) The mention of wrapper should tell you that we could do the same thing using method modifiers, but for the sake of this example, we don't. =back =begin testing { my $unreliable = Moose::Meta::Class->create_anon_class( superclasses => [], roles => [qw/Restartable::ButUnreliable/], methods => { explode => sub { }, # nop. 'save_state' => sub { }, 'load_state' => sub { }, }, )->new_object(); ok( $unreliable, 'made anon class with Restartable::ButUnreliable role' ); can_ok( $unreliable, qw/start stop/ ); } { my $cnt = 0; my $broken = Moose::Meta::Class->create_anon_class( superclasses => [], roles => [qw/Restartable::ButBroken/], methods => { explode => sub { $cnt++ }, 'save_state' => sub { }, 'load_state' => sub { }, }, )->new_object(); ok( $broken, 'made anon class with Restartable::ButBroken role' ); $broken->start(); is( $cnt, 1, '... start called explode' ); $broken->stop(); is( $cnt, 2, '... stop also called explode' ); } =end testing =head1 AUTHORS =over 4 =item * Stevan Little =item * Dave Rolsky =item * Jesse Luehrs =item * Shawn M Moore =item * יובל קוג'מן (Yuval Kogman) =item * Karen Etheridge =item * Florian Ragwitz =item * Hans Dieter Pearcey =item * Chris Prather =item * Matt S Trout =back =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2006 by Infinity Interactive, Inc. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Moose-2.2200/lib/Moose/Cookbook/Roles/Comparable_CodeReuse.pod000644 000766 000024 00000023371 14137574636 024353 0ustar00etherstaff000000 000000 # PODNAME: Moose::Cookbook::Roles::Comparable_CodeReuse # ABSTRACT: Using roles for code reuse __END__ =pod =encoding UTF-8 =head1 NAME Moose::Cookbook::Roles::Comparable_CodeReuse - Using roles for code reuse =head1 VERSION version 2.2200 =head1 SYNOPSIS package Eq; use Moose::Role; requires 'equal_to'; sub not_equal_to { my ( $self, $other ) = @_; not $self->equal_to($other); } package Comparable; use Moose::Role; with 'Eq'; requires 'compare'; sub equal_to { my ( $self, $other ) = @_; $self->compare($other) == 0; } sub greater_than { my ( $self, $other ) = @_; $self->compare($other) == 1; } sub less_than { my ( $self, $other ) = @_; $self->compare($other) == -1; } sub greater_than_or_equal_to { my ( $self, $other ) = @_; $self->greater_than($other) || $self->equal_to($other); } sub less_than_or_equal_to { my ( $self, $other ) = @_; $self->less_than($other) || $self->equal_to($other); } package Printable; use Moose::Role; requires 'to_string'; package US::Currency; use Moose; with 'Comparable', 'Printable'; has 'amount' => ( is => 'rw', isa => 'Num', default => 0 ); sub compare { my ( $self, $other ) = @_; $self->amount <=> $other->amount; } sub to_string { my $self = shift; sprintf '$%0.2f USD' => $self->amount; } =head1 DESCRIPTION Roles have two primary purposes: as interfaces, and as a means of code reuse. This recipe demonstrates the latter, with roles that define comparison and display code for objects. Let's start with C. First, note that we've replaced C with C. We also have a new sugar function, C: requires 'equal_to'; This says that any class which consumes this role must provide an C method. It can provide this method directly, or by consuming some other role. The C role defines its C method in terms of the required C method. This lets us minimize the methods that consuming classes must provide. The next role, C, builds on the C role. We include C in C using C, another new sugar function: with 'Eq'; The C function takes a list of roles to consume. In our example, the C role provides the C method required by C. However, it could opt not to, in which case a class that consumed C would have to provide its own C. In other words, a role can consume another role I providing any required methods. The C role requires a method, C: requires 'compare'; The C role also provides a number of other methods, all of which ultimately rely on C. sub equal_to { my ( $self, $other ) = @_; $self->compare($other) == 0; } sub greater_than { my ( $self, $other ) = @_; $self->compare($other) == 1; } sub less_than { my ( $self, $other ) = @_; $self->compare($other) == -1; } sub greater_than_or_equal_to { my ( $self, $other ) = @_; $self->greater_than($other) || $self->equal_to($other); } sub less_than_or_equal_to { my ( $self, $other ) = @_; $self->less_than($other) || $self->equal_to($other); } Finally, we define the C role. This role exists solely to provide an interface. It has no methods, just a list of required methods. In this case, it just requires a C method. An interface role is useful because it defines both a method and a I. We know that any class which does this role has a C method, but we can also assume that this method has the semantics we want. Presumably, in real code we would define those semantics in the documentation for the C role. (1) Finally, we have the C class which consumes both the C and C roles. with 'Comparable', 'Printable'; It also defines a regular Moose attribute, C: has 'amount' => ( is => 'rw', isa => 'Num', default => 0 ); Finally we see the implementation of the methods required by our roles. We have a C method: sub compare { my ( $self, $other ) = @_; $self->amount <=> $other->amount; } By consuming the C role and defining this method, we gain the following methods for free: C, C, C, C and C. Then we have our C method: sub to_string { my $self = shift; sprintf '$%0.2f USD' => $self->amount; } =head1 CONCLUSION Roles can be very powerful. They are a great way of encapsulating reusable behavior, as well as communicating (semantic and interface) information about the methods our classes provide. =head1 FOOTNOTES =over 4 =item (1) Consider two classes, C and C, both of which define a C method. If we just require that an object implements a C method, we still aren't saying anything about what that method I. If we require an object that implements the C role, we're saying something about semantics. =back =begin testing ok( US::Currency->does('Comparable'), '... US::Currency does Comparable' ); ok( US::Currency->does('Eq'), '... US::Currency does Eq' ); ok( US::Currency->does('Printable'), '... US::Currency does Printable' ); my $hundred = US::Currency->new( amount => 100.00 ); isa_ok( $hundred, 'US::Currency' ); ok( $hundred->DOES("US::Currency"), "UNIVERSAL::DOES for class" ); ok( $hundred->DOES("Comparable"), "UNIVERSAL::DOES for role" ); can_ok( $hundred, 'amount' ); is( $hundred->amount, 100, '... got the right amount' ); can_ok( $hundred, 'to_string' ); is( $hundred->to_string, '$100.00 USD', '... got the right stringified value' ); ok( $hundred->does('Comparable'), '... US::Currency does Comparable' ); ok( $hundred->does('Eq'), '... US::Currency does Eq' ); ok( $hundred->does('Printable'), '... US::Currency does Printable' ); my $fifty = US::Currency->new( amount => 50.00 ); isa_ok( $fifty, 'US::Currency' ); can_ok( $fifty, 'amount' ); is( $fifty->amount, 50, '... got the right amount' ); can_ok( $fifty, 'to_string' ); is( $fifty->to_string, '$50.00 USD', '... got the right stringified value' ); ok( $hundred->greater_than($fifty), '... 100 gt 50' ); ok( $hundred->greater_than_or_equal_to($fifty), '... 100 ge 50' ); ok( !$hundred->less_than($fifty), '... !100 lt 50' ); ok( !$hundred->less_than_or_equal_to($fifty), '... !100 le 50' ); ok( !$hundred->equal_to($fifty), '... !100 eq 50' ); ok( $hundred->not_equal_to($fifty), '... 100 ne 50' ); ok( !$fifty->greater_than($hundred), '... !50 gt 100' ); ok( !$fifty->greater_than_or_equal_to($hundred), '... !50 ge 100' ); ok( $fifty->less_than($hundred), '... 50 lt 100' ); ok( $fifty->less_than_or_equal_to($hundred), '... 50 le 100' ); ok( !$fifty->equal_to($hundred), '... !50 eq 100' ); ok( $fifty->not_equal_to($hundred), '... 50 ne 100' ); ok( !$fifty->greater_than($fifty), '... !50 gt 50' ); ok( $fifty->greater_than_or_equal_to($fifty), '... !50 ge 50' ); ok( !$fifty->less_than($fifty), '... 50 lt 50' ); ok( $fifty->less_than_or_equal_to($fifty), '... 50 le 50' ); ok( $fifty->equal_to($fifty), '... 50 eq 50' ); ok( !$fifty->not_equal_to($fifty), '... !50 ne 50' ); ## ... check some meta-stuff # Eq my $eq_meta = Eq->meta; isa_ok( $eq_meta, 'Moose::Meta::Role' ); ok( $eq_meta->has_method('not_equal_to'), '... Eq has_method not_equal_to' ); ok( $eq_meta->requires_method('equal_to'), '... Eq requires_method not_equal_to' ); # Comparable my $comparable_meta = Comparable->meta; isa_ok( $comparable_meta, 'Moose::Meta::Role' ); ok( $comparable_meta->does_role('Eq'), '... Comparable does Eq' ); foreach my $method_name ( qw( equal_to not_equal_to greater_than greater_than_or_equal_to less_than less_than_or_equal_to ) ) { ok( $comparable_meta->has_method($method_name), '... Comparable has_method ' . $method_name ); } ok( $comparable_meta->requires_method('compare'), '... Comparable requires_method compare' ); # Printable my $printable_meta = Printable->meta; isa_ok( $printable_meta, 'Moose::Meta::Role' ); ok( $printable_meta->requires_method('to_string'), '... Printable requires_method to_string' ); # US::Currency my $currency_meta = US::Currency->meta; isa_ok( $currency_meta, 'Moose::Meta::Class' ); ok( $currency_meta->does_role('Comparable'), '... US::Currency does Comparable' ); ok( $currency_meta->does_role('Eq'), '... US::Currency does Eq' ); ok( $currency_meta->does_role('Printable'), '... US::Currency does Printable' ); foreach my $method_name ( qw( amount equal_to not_equal_to compare greater_than greater_than_or_equal_to less_than less_than_or_equal_to to_string ) ) { ok( $currency_meta->has_method($method_name), '... US::Currency has_method ' . $method_name ); } =end testing =head1 AUTHORS =over 4 =item * Stevan Little =item * Dave Rolsky =item * Jesse Luehrs =item * Shawn M Moore =item * יובל קוג'מן (Yuval Kogman) =item * Karen Etheridge =item * Florian Ragwitz =item * Hans Dieter Pearcey =item * Chris Prather =item * Matt S Trout =back =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2006 by Infinity Interactive, Inc. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Moose-2.2200/lib/Moose/Cookbook/Roles/ApplicationToInstance.pod000644 000766 000024 00000007625 14137574636 024607 0ustar00etherstaff000000 000000 # PODNAME: Moose::Cookbook::Roles::ApplicationToInstance # ABSTRACT: Applying a role to an object instance __END__ =pod =encoding UTF-8 =head1 NAME Moose::Cookbook::Roles::ApplicationToInstance - Applying a role to an object instance =head1 VERSION version 2.2200 =head1 SYNOPSIS package MyApp::Role::Job::Manager; use List::Util qw( first ); use Moose::Role; has 'employees' => ( is => 'rw', isa => 'ArrayRef[Employee]', ); sub assign_work { my $self = shift; my $work = shift; my $employee = first { !$_->has_work } @{ $self->employees }; die 'All my employees have work to do!' unless $employee; $employee->work($work); } package main; my $lisa = Employee->new( name => 'Lisa' ); MyApp::Role::Job::Manager->meta->apply($lisa); my $homer = Employee->new( name => 'Homer' ); my $bart = Employee->new( name => 'Bart' ); my $marge = Employee->new( name => 'Marge' ); $lisa->employees( [ $homer, $bart, $marge ] ); $lisa->assign_work('mow the lawn'); =head1 DESCRIPTION In this recipe, we show how a role can be applied to an object. In this specific case, we are giving an employee managerial responsibilities. Applying a role to an object is simple. The L object provides an C method. This method will do the right thing when given an object instance. MyApp::Role::Job::Manager->meta->apply($lisa); We could also use the C function from L. apply_all_roles( $person, MyApp::Role::Job::Manager->meta ); The main advantage of using C is that it can be used to apply more than one role at a time. We could also pass parameters to the role we're applying: MyApp::Role::Job::Manager->meta->apply( $lisa, -alias => { assign_work => 'get_off_your_lazy_behind' }, ); We saw examples of how method exclusion and alias working in L. =begin testing-SETUP { # Not in the recipe, but needed for writing tests. package Employee; use Moose; has 'name' => ( is => 'ro', isa => 'Str', required => 1, ); has 'work' => ( is => 'rw', isa => 'Str', predicate => 'has_work', ); } =end testing-SETUP =head1 CONCLUSION Applying a role to an object instance is a useful tool for adding behavior to existing objects. In our example, it is effective used to model a promotion. It can also be useful as a sort of controlled monkey-patching for existing code, particularly non-Moose code. For example, you could create a debugging role and apply it to an object at runtime. =begin testing { my $lisa = Employee->new( name => 'Lisa' ); MyApp::Role::Job::Manager->meta->apply($lisa); my $homer = Employee->new( name => 'Homer' ); my $bart = Employee->new( name => 'Bart' ); my $marge = Employee->new( name => 'Marge' ); $lisa->employees( [ $homer, $bart, $marge ] ); $lisa->assign_work('mow the lawn'); ok( $lisa->does('MyApp::Role::Job::Manager'), 'lisa now does the manager role' ); is( $homer->work, 'mow the lawn', 'homer was assigned a task by lisa' ); } =end testing =head1 AUTHORS =over 4 =item * Stevan Little =item * Dave Rolsky =item * Jesse Luehrs =item * Shawn M Moore =item * יובל קוג'מן (Yuval Kogman) =item * Karen Etheridge =item * Florian Ragwitz =item * Hans Dieter Pearcey =item * Chris Prather =item * Matt S Trout =back =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2006 by Infinity Interactive, Inc. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Moose-2.2200/lib/Moose/Cookbook/Legacy/Debugging_BaseClassReplacement.pod000600 000766 000024 00000007154 14137574636 026454 0ustar00etherstaff000000 000000 # PODNAME: Moose::Cookbook::Legacy::Debugging_BaseClassReplacement # ABSTRACT: Providing an alternate base object class __END__ =pod =encoding UTF-8 =head1 NAME Moose::Cookbook::Legacy::Debugging_BaseClassReplacement - Providing an alternate base object class =head1 VERSION version 2.2200 =head1 SYNOPSIS package MyApp::Base; use Moose; extends 'Moose::Object'; before 'new' => sub { warn "Making a new " . $_[0] }; no Moose; package MyApp::UseMyBase; use Moose (); use Moose::Exporter; Moose::Exporter->setup_import_methods( also => 'Moose' ); sub init_meta { shift; return Moose->init_meta( @_, base_class => 'MyApp::Base' ); } =head1 DESCRIPTION B A common extension is to provide an alternate base class. One way to do that is to make a C and add C> to every class in your application. That's pretty tedious. Instead, you can create a Moose-alike module that sets the base object class to C for you. Then, instead of writing C> you can write C>. In this particular example, our base class issues some debugging output every time a new object is created, but you can think of some more interesting things to do with your own base class. This uses the magic of L. When we call C<< Moose::Exporter->setup_import_methods( also => 'Moose' ) >> it builds C and C methods for you. The C<< also => 'Moose' >> bit says that we want to export everything that Moose does. The C method that gets created will call our C method, passing it C<< for_caller => $caller >> as its arguments. The C<$caller> is set to the class that actually imported us in the first place. See the L docs for more details on its API. =for testing-SETUP use Test::Requires 'Test::Output'; =head1 USING MyApp::UseMyBase To actually use our new base class, we simply use C I of C. We get all the Moose sugar plus our new base class. package Foo; use MyApp::UseMyBase; has 'size' => ( is => 'rw' ); no MyApp::UseMyBase; =head1 CONCLUSION This is an awful lot of magic for a simple base class. You will often want to combine a metaclass trait with a base class extension, and that's when this technique is useful. =begin testing { package Foo; MyApp::UseMyBase->import; has( 'size' => ( is => 'rw' ) ); } ok( Foo->isa('MyApp::Base'), 'Foo isa MyApp::Base' ); ok( Foo->can('size'), 'Foo has a size method' ); my $foo; stderr_like( sub { $foo = Foo->new( size => 2 ) }, qr/^Making a new Foo/, 'got expected warning when calling Foo->new' ); is( $foo->size(), 2, '$foo->size is 2' ); =end testing =head1 AUTHORS =over 4 =item * Stevan Little =item * Dave Rolsky =item * Jesse Luehrs =item * Shawn M Moore =item * יובל קוג'מן (Yuval Kogman) =item * Karen Etheridge =item * Florian Ragwitz =item * Hans Dieter Pearcey =item * Chris Prather =item * Matt S Trout =back =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2006 by Infinity Interactive, Inc. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Moose-2.2200/lib/Moose/Cookbook/Legacy/Labeled_AttributeMetaclass.pod000600 000766 000024 00000021662 14137574636 025671 0ustar00etherstaff000000 000000 # PODNAME: Moose::Cookbook::Legacy::Labeled_AttributeMetaclass # ABSTRACT: A meta-attribute, attributes with labels __END__ =pod =encoding UTF-8 =head1 NAME Moose::Cookbook::Legacy::Labeled_AttributeMetaclass - A meta-attribute, attributes with labels =head1 VERSION version 2.2200 =head1 SYNOPSIS package MyApp::Meta::Attribute::Labeled; use Moose; extends 'Moose::Meta::Attribute'; has label => ( is => 'rw', isa => 'Str', predicate => 'has_label', ); package Moose::Meta::Attribute::Custom::Labeled; sub register_implementation {'MyApp::Meta::Attribute::Labeled'} package MyApp::Website; use Moose; has url => ( metaclass => 'Labeled', is => 'rw', isa => 'Str', label => "The site's URL", ); has name => ( is => 'rw', isa => 'Str', ); sub dump { my $self = shift; my $meta = $self->meta; my $dump = ''; for my $attribute ( map { $meta->get_attribute($_) } sort $meta->get_attribute_list ) { if ( $attribute->isa('MyApp::Meta::Attribute::Labeled') && $attribute->has_label ) { $dump .= $attribute->label; } else { $dump .= $attribute->name; } my $reader = $attribute->get_read_method; $dump .= ": " . $self->$reader . "\n"; } return $dump; } package main; my $app = MyApp::Website->new( url => "http://google.com", name => "Google" ); =head1 SUMMARY B In this recipe, we begin to delve into the wonder of meta-programming. Some readers may scoff and claim that this is the arena of only the most twisted Moose developers. Absolutely not! Any sufficiently twisted developer can benefit greatly from going more meta. Our goal is to allow each attribute to have a human-readable "label" attached to it. Such labels would be used when showing data to an end user. In this recipe we label the C attribute with "The site's URL" and create a simple method showing how to use that label. The proper, modern way to extend attributes (using a role instead of a subclass) is described in L, but that recipe assumes you've read and at least tried to understand this one. =head1 META-ATTRIBUTE OBJECTS All the attributes of a Moose-based object are actually objects themselves. These objects have methods and attributes. Let's look at a concrete example. has 'x' => ( isa => 'Int', is => 'ro' ); has 'y' => ( isa => 'Int', is => 'rw' ); Internally, the metaclass for C has two L. There are several methods for getting meta-attributes out of a metaclass, one of which is C. This method is called on the metaclass object. The C method returns a list of attribute names. You can then use C to get the L object itself. Once you have this meta-attribute object, you can call methods on it like this: print $point->meta->get_attribute('x')->type_constraint; => Int To add a label to our attributes there are two steps. First, we need a new attribute metaclass that can store a label for an attribute. Second, we need to create attributes that use that attribute metaclass. =head1 RECIPE REVIEW We start by creating a new attribute metaclass. package MyApp::Meta::Attribute::Labeled; use Moose; extends 'Moose::Meta::Attribute'; We can subclass a Moose metaclass in the same way that we subclass anything else. has label => ( is => 'rw', isa => 'Str', predicate => 'has_label', ); Again, this is standard Moose code. Then we need to register our metaclass with Moose: package Moose::Meta::Attribute::Custom::Labeled; sub register_implementation { 'MyApp::Meta::Attribute::Labeled' } This is a bit of magic that lets us use a short name, "Labeled", when referring to our new metaclass. That was the whole attribute metaclass. Now we start using it. package MyApp::Website; use Moose; use MyApp::Meta::Attribute::Labeled; We have to load the metaclass to use it, just like any Perl class. Finally, we use it for an attribute: has url => ( metaclass => 'Labeled', is => 'rw', isa => 'Str', label => "The site's URL", ); This looks like a normal attribute declaration, except for two things, the C and C
attribute is quite simple. Given a class named C, we could simply write the following: my $table = MyApp::User->meta->table; As long as C has arranged to use C as its metaclass, this method call just works. If we want to be more careful, we can check the metaclass's class: $table = MyApp::User->meta->table if MyApp::User->meta->isa('MyApp::Meta::Class'); =head1 CONCLUSION Creating custom metaclass is trivial. Using it is a little harder, and is covered in other recipes. We will also talk about applying traits to a class metaclass, which is a more flexible and cooperative implementation. =head1 SEE ALSO L - The "table" attribute implemented as a metaclass trait L - Acting like Moose.pm and providing sugar Moose-style =head1 AUTHORS =over 4 =item * Stevan Little =item * Dave Rolsky =item * Jesse Luehrs =item * Shawn M Moore =item * יובל קוג'מן (Yuval Kogman) =item * Karen Etheridge =item * Florian Ragwitz =item * Hans Dieter Pearcey =item * Chris Prather =item * Matt S Trout =back =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2006 by Infinity Interactive, Inc. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Moose-2.2200/lib/Moose/Cookbook/Meta/PrivateOrPublic_MethodMetaclass.pod000644 000766 000024 00000012236 14137574636 026357 0ustar00etherstaff000000 000000 # PODNAME: Moose::Cookbook::Meta::PrivateOrPublic_MethodMetaclass # ABSTRACT: A method metaclass for marking methods public or private __END__ =pod =encoding UTF-8 =head1 NAME Moose::Cookbook::Meta::PrivateOrPublic_MethodMetaclass - A method metaclass for marking methods public or private =head1 VERSION version 2.2200 =head1 SYNOPSIS package MyApp::Meta::Method::PrivateOrPublic; use Moose; use Moose::Util::TypeConstraints; extends 'Moose::Meta::Method'; has '_policy' => ( is => 'ro', isa => enum( [ qw( public private ) ] ), default => 'public', init_arg => 'policy', ); sub new { my $class = shift; my %options = @_; my $self = $class->SUPER::wrap(%options); $self->{_policy} = $options{policy}; $self->_add_policy_wrapper; return $self; } sub _add_policy_wrapper { my $self = shift; return if $self->is_public; my $name = $self->name; my $package = $self->package_name; my $real_body = $self->body; my $body = sub { die "The $package\::$name method is private" unless ( scalar caller() ) eq $package; goto &{$real_body}; }; $self->{body} = $body; } sub is_public { $_[0]->_policy eq 'public' } sub is_private { $_[0]->_policy eq 'private' } package MyApp::User; use Moose; has 'password' => ( is => 'rw' ); __PACKAGE__->meta()->add_method( '_reset_password', MyApp::Meta::Method::PrivateOrPublic->new( name => '_reset_password', package_name => __PACKAGE__, body => sub { $_[0]->password('reset') }, policy => 'private', ) ); =head1 DESCRIPTION This example shows a custom method metaclass that models public versus private methods. If a method is defined as private, it adds a wrapper around the method which dies unless it is called from the class where it was defined. The way the method is added to the class is rather ugly. If we wanted to make this a real feature, we'd probably want to add some sort of sugar to allow us to declare private methods, but that is beyond the scope of this recipe. See the Extending recipes for more on this topic. The core of our custom class is the C attribute, and C<_add_policy_wrapper> method. You'll note that we have to explicitly set the C attribute in our constructor: $self->{_policy} = $options{policy}; That is necessary because Moose metaclasses do not use the meta API to create objects. Most Moose classes have a custom "inlined" constructor for speed. In this particular case, our parent class's constructor is the C method. We call that to build our object, but it does not include subclass-specific attributes. The C<_add_policy_wrapper> method is where the real work is done. If the method is private, we construct a wrapper around the real subroutine which checks that the caller matches the package in which the subroutine was created. If they don't match, it dies. If they do match, the real method is called. We use C so that the wrapper does not show up in the call stack. Finally, we replace the value of C<< $self->{body} >>. This is another case where we have to do something a bit gross because Moose does not use Moose for its own implementation. When we pass this method object to the metaclass's C method, it will take the method body and make it available in the class. Finally, when we retrieve these methods via the introspection API, we can call the C and C methods on them to get more information about the method. =head1 SUMMARY A custom method metaclass lets us add both behavior and meta-information to methods. Unfortunately, because the Perl interpreter does not provide easy hooks into method declaration, the API we have for adding these methods is not very pretty. That can be improved with custom Moose-like sugar, or even by using a tool like L to create full-blown new keywords in Perl. =begin testing package main; use strict; use warnings; use Test::Fatal; my $user = MyApp::User->new( password => 'foo!' ); like( exception { $user->_reset_password }, qr/The MyApp::User::_reset_password method is private/, '_reset_password method dies if called outside MyApp::User class'); { package MyApp::User; sub run_reset { $_[0]->_reset_password } } $user->run_reset; is( $user->password, 'reset', 'password has been reset' ); =end testing =head1 AUTHORS =over 4 =item * Stevan Little =item * Dave Rolsky =item * Jesse Luehrs =item * Shawn M Moore =item * יובל קוג'מן (Yuval Kogman) =item * Karen Etheridge =item * Florian Ragwitz =item * Hans Dieter Pearcey =item * Chris Prather =item * Matt S Trout =back =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2006 by Infinity Interactive, Inc. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Moose-2.2200/lib/Moose/Cookbook/Meta/Table_MetaclassTrait.pod000644 000766 000024 00000006666 14137574636 024211 0ustar00etherstaff000000 000000 # PODNAME: Moose::Cookbook::Meta::Table_MetaclassTrait # ABSTRACT: Adding a "table" attribute as a metaclass trait __END__ =pod =encoding UTF-8 =head1 NAME Moose::Cookbook::Meta::Table_MetaclassTrait - Adding a "table" attribute as a metaclass trait =head1 VERSION version 2.2200 =head1 SYNOPSIS # in lib/MyApp/Meta/Class/Trait/HasTable.pm package MyApp::Meta::Class::Trait::HasTable; use Moose::Role; Moose::Util::meta_class_alias('HasTable'); has table => ( is => 'rw', isa => 'Str', ); # in lib/MyApp/User.pm package MyApp::User; use Moose -traits => 'HasTable'; __PACKAGE__->meta->table('User'); =head1 DESCRIPTION In this recipe, we'll create a class metaclass trait which has a "table" attribute. This trait is for classes associated with a DBMS table, as one might do for an ORM. In this example, the table name is just a string, but in a real ORM the table might be an object describing the table. =begin testing-SETUP BEGIN { package MyApp::Meta::Class::Trait::HasTable; use Moose::Role; Moose::Util::meta_class_alias('HasTable'); has table => ( is => 'rw', isa => 'Str', ); } =end testing-SETUP =head1 THE METACLASS TRAIT This really is as simple as the recipe L shows. The trick is getting your classes to use this metaclass, and providing some sort of sugar for declaring the table. This is covered in L, which shows how to make a module like C itself, with sugar like C. =head2 Using this Metaclass Trait in Practice Accessing this new C
attribute is quite simple. Given a class named C, we could simply write the following: my $table = MyApp::User->meta->table; As long as C has arranged to apply the C to its metaclass, this method call just works. If we want to be more careful, we can check that the class metaclass object has a C
method: $table = MyApp::User->meta->table if MyApp::User->meta->can('table'); In theory, this is not entirely correct, since the metaclass might be getting its C
method from a I trait. In practice, you are unlikely to encounter this sort of problem. =head1 RECIPE CAVEAT This recipe doesn't work when you paste it all into a single file. This is because the C<< use Moose -traits => 'HasTable'; >> line ends up being executed before the C
attribute is defined. When the two packages are separate files, this just works. =head1 SEE ALSO L - Labels implemented via attribute traits =pod =for testing can_ok( MyApp::User->meta, 'table' ); is( MyApp::User->meta->table, 'User', 'My::User table is User' ); =head1 AUTHORS =over 4 =item * Stevan Little =item * Dave Rolsky =item * Jesse Luehrs =item * Shawn M Moore =item * יובל קוג'מן (Yuval Kogman) =item * Karen Etheridge =item * Florian Ragwitz =item * Hans Dieter Pearcey =item * Chris Prather =item * Matt S Trout =back =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2006 by Infinity Interactive, Inc. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Moose-2.2200/lib/Moose/Cookbook/Meta/GlobRef_InstanceMetaclass.pod000644 000766 000024 00000015763 14137574636 025161 0ustar00etherstaff000000 000000 # PODNAME: Moose::Cookbook::Meta::GlobRef_InstanceMetaclass # ABSTRACT: Creating a glob reference meta-instance class __END__ =pod =encoding UTF-8 =head1 NAME Moose::Cookbook::Meta::GlobRef_InstanceMetaclass - Creating a glob reference meta-instance class =head1 VERSION version 2.2200 =head1 SYNOPSIS package My::Meta::Instance; use Scalar::Util qw( weaken ); use Symbol qw( gensym ); use Moose::Role; sub create_instance { my $self = shift; my $sym = gensym(); bless $sym, $self->_class_name; } sub clone_instance { my ( $self, $instance ) = @_; my $new_sym = gensym(); %{*$new_sym} = %{*$instance}; bless $new_sym, $self->_class_name; } sub get_slot_value { my ( $self, $instance, $slot_name ) = @_; return *$instance->{$slot_name}; } sub set_slot_value { my ( $self, $instance, $slot_name, $value ) = @_; *$instance->{$slot_name} = $value; } sub deinitialize_slot { my ( $self, $instance, $slot_name ) = @_; delete *$instance->{$slot_name}; } sub is_slot_initialized { my ( $self, $instance, $slot_name ) = @_; exists *$instance->{$slot_name}; } sub weaken_slot_value { my ( $self, $instance, $slot_name ) = @_; weaken *$instance->{$slot_name}; } sub inline_create_instance { my ( $self, $class_variable ) = @_; return 'do { my $sym = Symbol::gensym(); bless $sym, ' . $class_variable . ' }'; } sub inline_slot_access { my ( $self, $instance, $slot_name ) = @_; return '*{' . $instance . '}->{' . $slot_name . '}'; } package MyApp::User; use Moose; Moose::Util::MetaRole::apply_metaroles( for => __PACKAGE__, class_metaroles => { instance => ['My::Meta::Instance'], }, ); has 'name' => ( is => 'rw', isa => 'Str', ); has 'email' => ( is => 'rw', isa => 'Str', ); =head1 DESCRIPTION This recipe shows how to build your own meta-instance. The meta instance is the metaclass that creates object instances and helps manages access to attribute slots. In this example, we're creating a meta-instance that is based on a glob reference rather than a hash reference. This example is largely based on the Piotr Roszatycki's L module. Our extension is a role which will be applied to L, which creates hash reference based objects. We need to override all the methods which make assumptions about the object's data structure. The first method we override is C: sub create_instance { my $self = shift; my $sym = gensym(); bless $sym, $self->_class_name; } This returns an glob reference which has been blessed into our meta-instance's associated class. We also override C to create a new array reference: sub clone_instance { my ( $self, $instance ) = @_; my $new_sym = gensym(); %{*$new_sym} = %{*$instance}; bless $new_sym, $self->_class_name; } After that, we have a series of methods which mediate access to the object's slots (attributes are stored in "slots"). In the default instance class, these expect the object to be a hash reference, but we need to change this to expect a glob reference instead. sub get_slot_value { my ( $self, $instance, $slot_name ) = @_; *$instance->{$slot_name}; } This level of indirection probably makes our instance class I than the default. However, when attribute access is inlined, this lookup will be cached: sub inline_slot_access { my ( $self, $instance, $slot_name ) = @_; return '*{' . $instance . '}->{' . $slot_name . '}'; } The code snippet that the C method returns will get C'd once per attribute. Finally, we use this meta-instance in our C class: Moose::Util::MetaRole::apply_metaroles( for => __PACKAGE__, class_metaroles => { instance => ['My::Meta::Instance'], }, ); We actually don't recommend the use of L directly in your class in most cases. Typically, this would be provided by a L-based module which handles applying the role for you. =head1 CONCLUSION This recipe shows how to create your own meta-instance class. It's unlikely that you'll need to do this yourself, but it's interesting to take a peek at how Moose works under the hood. =head1 SEE ALSO There are a few meta-instance class extensions on CPAN: =over 4 =item * L This module extends the instance class in order to ensure that the object is a singleton. The instance it uses is still a blessed hash reference. =item * L This module makes the instance a blessed glob reference. This lets you use a handle as an object instance. =back =begin testing { package MyApp::Employee; use Moose; extends 'MyApp::User'; has 'employee_number' => ( is => 'rw' ); } for my $x ( 0 .. 1 ) { MyApp::User->meta->make_immutable if $x; my $user = MyApp::User->new( name => 'Faye', email => 'faye@example.com', ); ok( eval { *{$user} }, 'user object is an glob ref with some values' ); is( $user->name, 'Faye', 'check name' ); is( $user->email, 'faye@example.com', 'check email' ); $user->name('Ralph'); is( $user->name, 'Ralph', 'check name after changing it' ); $user->email('ralph@example.com'); is( $user->email, 'ralph@example.com', 'check email after changing it' ); } for my $x ( 0 .. 1 ) { MyApp::Employee->meta->make_immutable if $x; my $emp = MyApp::Employee->new( name => 'Faye', email => 'faye@example.com', employee_number => $x, ); ok( eval { *{$emp} }, 'employee object is an glob ref with some values' ); is( $emp->name, 'Faye', 'check name' ); is( $emp->email, 'faye@example.com', 'check email' ); is( $emp->employee_number, $x, 'check employee_number' ); $emp->name('Ralph'); is( $emp->name, 'Ralph', 'check name after changing it' ); $emp->email('ralph@example.com'); is( $emp->email, 'ralph@example.com', 'check email after changing it' ); $emp->employee_number(42); is( $emp->employee_number, 42, 'check employee_number after changing it' ); } =end testing =head1 AUTHORS =over 4 =item * Stevan Little =item * Dave Rolsky =item * Jesse Luehrs =item * Shawn M Moore =item * יובל קוג'מן (Yuval Kogman) =item * Karen Etheridge =item * Florian Ragwitz =item * Hans Dieter Pearcey =item * Chris Prather =item * Matt S Trout =back =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2006 by Infinity Interactive, Inc. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Moose-2.2200/lib/Moose/Cookbook/Meta/WhyMeta.pod000644 000766 000024 00000005235 14137574636 021527 0ustar00etherstaff000000 000000 # PODNAME: Moose::Cookbook::Meta::WhyMeta # ABSTRACT: Welcome to the meta world (Why Go Meta?) __END__ =pod =encoding UTF-8 =head1 NAME Moose::Cookbook::Meta::WhyMeta - Welcome to the meta world (Why Go Meta?) =head1 VERSION version 2.2200 =head1 SUMMARY You might want to read L if you haven't done so yet. If you've ever thought "Moose is great, but I wish it did X differently", then you've gone meta. The meta recipes demonstrate how to change and extend the way Moose works by extending and overriding how the meta classes (L, L, etc) work. The metaclass API is a set of classes that describe classes, roles, attributes, etc. The metaclass API lets you ask questions about a class, like "what attributes does it have?", or "what roles does the class do?" The metaclass system also lets you make changes to a class, for example by adding new methods or attributes. The interface presented by L (C, C, C) is just a thin layer of syntactic sugar over the underlying metaclass system. By extending and changing how this metaclass system works, you can create your own Moose variant. =head2 Examples Let's say that you want to add additional properties to attributes. Specifically, we want to add a "label" property to each attribute, so we can write C<< My::Class->meta()->get_attribute('size')->label() >>. The first recipe shows how to do this using an attribute trait. You might also want to add additional properties to your metaclass. For example, if you were writing an ORM based on Moose, you could associate a table name with each class via the class's metaclass object, letting you write C<< My::Class->meta()->table_name() >>. =head1 SEE ALSO Many of the MooseX modules on CPAN implement metaclass extensions. A couple good examples include L and L. For a more complex example see L or L. =head1 AUTHORS =over 4 =item * Stevan Little =item * Dave Rolsky =item * Jesse Luehrs =item * Shawn M Moore =item * יובל קוג'מן (Yuval Kogman) =item * Karen Etheridge =item * Florian Ragwitz =item * Hans Dieter Pearcey =item * Chris Prather =item * Matt S Trout =back =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2006 by Infinity Interactive, Inc. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Moose-2.2200/lib/Moose/Cookbook/Meta/Labeled_AttributeTrait.pod000600 000766 000024 00000021410 14137574636 024511 0ustar00etherstaff000000 000000 # PODNAME: Moose::Cookbook::Meta::Labeled_AttributeTrait # ABSTRACT: Labels implemented via attribute traits __END__ =pod =encoding UTF-8 =head1 NAME Moose::Cookbook::Meta::Labeled_AttributeTrait - Labels implemented via attribute traits =head1 VERSION version 2.2200 =head1 SYNOPSIS package MyApp::Meta::Attribute::Trait::Labeled; use Moose::Role; Moose::Util::meta_attribute_alias('Labeled'); has label => ( is => 'rw', isa => 'Str', predicate => 'has_label', ); package MyApp::Website; use Moose; has url => ( traits => [qw/Labeled/], is => 'rw', isa => 'Str', label => "The site's URL", ); has name => ( is => 'rw', isa => 'Str', ); sub dump { my $self = shift; my $meta = $self->meta; my $dump = ''; for my $attribute ( map { $meta->get_attribute($_) } sort $meta->get_attribute_list ) { if ( $attribute->does('MyApp::Meta::Attribute::Trait::Labeled') && $attribute->has_label ) { $dump .= $attribute->label; } else { $dump .= $attribute->name; } my $reader = $attribute->get_read_method; $dump .= ": " . $self->$reader . "\n"; } return $dump; } package main; my $app = MyApp::Website->new( url => "http://google.com", name => "Google" ); =head1 SUMMARY In this recipe, we begin to delve into the wonder of meta-programming. Some readers may scoff and claim that this is the arena of only the most twisted Moose developers. Absolutely not! Any sufficiently twisted developer can benefit greatly from going more meta. Our goal is to allow each attribute to have a human-readable "label" attached to it. Such labels would be used when showing data to an end user. In this recipe we label the C attribute with "The site's URL" and create a simple method showing how to use that label. =head1 META-ATTRIBUTE OBJECTS All the attributes of a Moose-based object are actually objects themselves. These objects have methods and attributes. Let's look at a concrete example. has 'x' => ( isa => 'Int', is => 'ro' ); has 'y' => ( isa => 'Int', is => 'rw' ); Internally, the metaclass for C has two L objects. There are several methods for getting meta-attributes out of a metaclass, one of which is C. This method is called on the metaclass object. The C method returns a list of attribute names. You can then use C to get the L object itself. Once you have this meta-attribute object, you can call methods on it like this: print $point->meta->get_attribute('x')->type_constraint; => Int To add a label to our attributes there are two steps. First, we need a new attribute metaclass trait that can store a label for an attribute. Second, we need to apply that trait to our attributes. =head1 TRAITS Roles that apply to metaclasses have a special name: traits. Don't let the change in nomenclature fool you, B. L allows you to pass a C parameter for an attribute. This parameter takes a list of trait names which are composed into an anonymous metaclass, and that anonymous metaclass is used for the attribute. Yes, we still have lots of metaclasses in the background, but they're managed by Moose for you. Traits can do anything roles can do. They can add or refine attributes, wrap methods, provide more methods, define an interface, etc. The only difference is that you're now changing the attribute metaclass instead of a user-level class. =head1 DISSECTION We start by creating a package for our trait. package MyApp::Meta::Attribute::Trait::Labeled; use Moose::Role; has label => ( is => 'rw', isa => 'Str', predicate => 'has_label', ); You can see that a trait is just a L. In this case, our role contains a single attribute, C