PPI-1.272/000755 000765 000024 00000000000 14176526433 012254 5ustar00olafstaff000000 000000 PPI-1.272/README000644 000765 000024 00000000566 14176526433 013143 0ustar00olafstaff000000 000000 This archive contains the distribution PPI, version 1.272: Parse, Analyze and Manipulate Perl (without perl) This software is copyright (c) 2002 by Adam Kennedy. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. This README file was generated by Dist::Zilla::Plugin::Readme v6.024. PPI-1.272/dev_notes.txt000644 000765 000024 00000002360 14176526433 015004 0ustar00olafstaff000000 000000 prove -l -v t | grep '^^[ \t]*ok.*TODO' prove -l -v t | grep '^^not ok' prove -vl t\ppi_token_unknown.t | grep '^^[ \t]*ok.*TODO' prove -vl t\ppi_token_unknown.t | grep '^^not ok' prove -l -j 9 t https://github.com/wolfsage/p5-distribution-smoke D:\cpan\p5-distribution-smoke>perl -Ilib bin\p5-distribution-smoke -b new -a Perl::Critic ../PPI D:\cpan\p5-distribution-smoke>perl -Ilib bin\p5-distribution-smoke -b new -r ../PPI perl -Ilib bin/p5-distribution-smoke -r -b new -n PPI -s MooseX::amine -s ^Task:: -s Apache2::PPI::HTML ../PPI perl -Ilib bin/p5-distribution-smoke -r -b old -n PPI -s MooseX::amine -s ^Task:: -s Apache2::PPI::HTML ../PPI perl -Ilib bin/p5-distribution-smoke -r -a Perl::Critic::* -b new -n PPI -s MooseX::amine -s ^Task:: -s Apache2::PPI::HTML ../PPI perl -Ilib bin/p5-distribution-smoke -r -a Perl::Critic::* -b old -n PPI -s MooseX::amine -s ^Task:: -s Apache2::PPI::HTML ../PPI perl -Ilib bin/p5-distribution-smoke -r -d 2 -b new -n PPI -s MooseX::amine -s ^Task:: -s Apache2::PPI::HTML ../PPI perl -Ilib bin/p5-distribution-smoke -r -d 2 -b old -n PPI -s MooseX::amine -s ^Task:: -s Apache2::PPI::HTML ../PPI ppi_version change 1.221_02 1.222 dmake clean perl Makefile.PL && dmake && dmake manifest && dmake dist PPI-1.272/Changes000644 000765 000024 00000153453 14176526433 013562 0ustar00olafstaff000000 000000 Revision history for Perl extension PPI 1.272 2022-02-02 16:10:50Z Summary: - Drop prerequisite for IO::String on perl 5.8+ 1.271 2022-01-25 21:47:21Z Summary: - return correct name for lexical subroutines - silence uninitialized warning in t/07_token.t - bump minimum Test::More version to 0.96 - fix some typos in Pod - moved repository to Perl-Critic GitHub org: https://github.com/Perl-Critic/PPI 1.270 2019-07-09 15:14:57Z Summary: - attempt to handle new blead binary/hexadecimal parsing behavior in tests 1.269 2019-05-17 18:36:46Z Summary: - many small documentation improvements 1.268 2019-05-16 10:00:39Z Summary: - fix a broken link in the pod 1.267 2019-05-16 09:22:34Z Summary: - make PPI::Test::Run more OS-agnostic 1.266 2019-05-15 16:17:49Z Summary: - keep heredoc terminator detection from triggering regex errors - small cleanups Details: - make the output of PPI::Test::Run more useful - remove a superfluous import 1.265 2019-05-14 12:39:51Z Summary: - simplified a code construct 1.264 2019-04-28 14:56:28Z Summary: - keep vstring processing from swallowing underscores 1.262 2019-04-28 11:41:54Z Summary: - convert newlines in some raw test files from win32 to unix 1.260 2019-04-28 11:10:02Z Summary: - allow underscores in vstrings 1.258 2019-04-27 17:05:33Z Summary: - remove accidentally included Test::InDistDir 1.256 2019-04-26 16:40:01Z Summary: - allow all PPI::Document instances to have a filename attribute 1.254 2019-04-26 16:23:21Z Summary: - recognize `for (;<$foo>;) {}` as containing a readline operator 1.252 2019-04-26 14:21:36Z Summary: - add support for the double diamond (<<>>) input operator - adjust position of a todo marker to not catch a passing test 1.250 2019-04-25 16:43:32Z Summary: - various smaller releng changes Details: - removed dependency on File::Remove - add some tests including a TODO test for misparse bug on '(1)-1' - allow tests to run without pre-determined module versions - add travis-perl helper to be run before install - update versions of Perl Travis tests on 1.248 2019-04-25 16:08:08Z Summary: - parse list-embedded curlies as hash constructors 1.246 2019-04-25 15:33:48Z Summary: - support indented here-docs - fixed some typos 1.244 2019-04-25 15:21:51Z Summary: - support key-value and index-value slices in PPI::Token::Symbol symbol method 1.242 2019-04-25 14:33:56Z Summary: - keep exponents of 2 or more zeroes from trapping PPI in an endless loop 1.240 2019-04-25 14:09:24Z Summary: - add support for lexical subroutines from perl-5.26 1.238 2019-04-25 12:03:37Z Summary: - only release engineering, moved to Dist::Zilla, straightened out dependencies and fixed some formatting in Changes 1.237_001 Wed 15 Nov 2017 Summary: - support postfix dereference - remove dependencies on vars, base and List::MoreUtils - reduce globals and cross-package variables - make xt/api.t skip/run properly Details: - convert many cross-package var accesses to var imports - convert several unnecessary globals to local variables 1.236 Thu 22 June 2017 Summary: - prevent Node->child from proceeding without a valid argument - make test pragma warning code enable -w to match warnings policy 1.234 Wed 21 June 2017 Summary: - Prevent sub names like v10 from being version strings (GitHub #65) (MOREGAN) 1.232 Wed 21 June 2017 Summary: - add Changes entries forgotten in 1.230 1.230 Wed 21 June 2017 Summary: - remove temporary fix introduced in 1.226 - prevent possible regex on undefined scalar in __current_token_is_forced_word 1.228 Tue 20 June 2017 Summary: - keep PPI::Dumper from breaking Perl::Critic under cperl 5.27 (RURBAN) 1.226 Tue 20 June 2017 Summary: - Fix test reliance on '.' in @INC (KENTNL) - temporary fix to keep an untested combination from blocking Perl::Critic (https://github.com/chriscapaci) 1.224 Sun 14 May 2017 Summary: - updating an out-of-date meta.yml caused by Module::Install 1.222 Sun 14 May 2017 Summary: - unit tests for many parts, both passing and TODO - many documentation fixes - add ->version method to PPI::Statement::Package (WOLFSAGE) - remove unused PPI::Document->new timeout feature - do not expect '.' in @INC (PLICEASE) - many parsing fixes - various fixes to the behaviors of methods - removal of problematic dependencies Details: - Remove undocumented, non-working 'timeout' attribute to Document->new, including HAVE_ALARM and PPI::Exception::ParserTimeout. (GitHub #140) (MOREGAN) - first cut of a travis configuration - do hex number matching with [[:xdigit:]] - some readability improvements on the code of HereDoc.pm - recognize heredoc even if they have no newline at the end (AUBERTG) - parse left side of => as bareword even if it looks like a keyword or op (MOREGAN) - remove source code escapes in the output of QuoteLike::Words->literal (MOREGAN) - removal of Test::NoWarnings - less uses of List::MoreUtils in favor of List::Util - expand $'x to $::main::x in Symbol->canonical as with $::x (MOREGAN) - fixed parsing of large numbers in Number::Exp on Solaris 80 (JMASLAK) - make remove_child actually return undef on failure to find child to remove - higher accuracy when deciding whether certain characters are operators or variable type casts (*&% etc.) (MOREGAN) - parse x as the first element of code as a word, not an operator (MOREGAN) - recognize the implied end of a package statement that includes a block (MOREGAN) - parse package names that look like operators as strings, not ops (MOREGAN) - parse package names that look like v10 as strings, not versions (MOREGAN) - parse things like v49use as a single bareword, not v-string + keyword (MOREGAN) - parse x64 as a word, not x operator + number (MOREGAN) - parse 1.eq 1 as float + op, not concatenation - parse subroutine attributes correctly (MOREGAN) 1.220 Tue 11 Nov 2014 Summary: - incompatible behavior fixes on PPI::Statement::Sub->prototype - improved parsing of various syntax elements - code quality improvements - various small documentation fixes Details: - {} is now recognized as anonymous hash constructor instead of a code block after these operators: &&= //= || && // ? : (GitHub #36) (MOREGAN) - regex capture variables greater than $9 are now parsed completely, instead of being parsed as single digit captures with numbers after them (GitHub #38) (MOREGAN) - DESTROY and AUTOLOAD subs are now parsed even without the sub keyword (GitHub #39) (MOREGAN) - PPI::Statement::Sub->prototype behavior now matches its documentation, instead of returning the prototype string unchanged and still including the parens (GitHub #56) (MOREGAN) - PPI::Statement::Sub->prototype now returns undef on subs without a prototype, instead of returning an empty string (GitHub #56) (MOREGAN) - list of keywords which are not parsed as packages when followed by the Perl4 package separator ' has been increased (GitHub #77) (MOREGAN) - application of a number of Perl::Critic policies and documentation fixes (GitHub #53) (MOREGAN, MITHALDU) - automation of README.md generation for git (GitHub #86) (COWENS) - various small documentation fixes (Github #96) (MOREGAN) 1.218 Sat 16 Aug 2014 Summary: - Fixes for various parsing and documentation bugs - 1MB limit on input document size removed - Moved repository to GitHub: https://github.com/adamkennedy/PPI Details: - Stop directing bugs to rt.cpan.org (GitHub #40) (MOREGAN) - Fix documentation reference to List::Util (RT #75308) (RWSTAUNER) - Improve scalability of parsing long lines, and remove the size limit on documents PPI will parse (GitHub #5) (MITHALDU) - Speed up adding an element to an unlabeled statement. Allow inlining of some methods. (WOLFSAGE) - Expanded test coverage (DOLMEN, MOREGAN) - Convert inline tests to standalone tests (GitHub #12) (MOREGAN) - Fix for '1=>x' being parsed as x operator (GitHub #46) (MOREGAN) - Recognize that '1 x3' is the x operator followed by a 3 (RT #37892, GitHub #27) (MOREGAN) - Support all augmented assignment operators (<<=, ||=, etc.) (RT #68176, 71705) (MOREGAN) - Stop upper-case "=CUT" from terminating POD (RT #75039) (JAE) - Support upper-case digits in hex and binary numbers, including in the leading '0X' and '0B'. (RT #36540) (KRYDE, MOREGAN) - Fix float argument to range operator misparsed as version string (RT #45014) (MOREGAN) - Fix POD markup in PPI::Find (RT #51693) (FWIE) - Fix spelling of "Tom Christiansen" (RT #67264) (TADMC) - Fix a large raft of spelling and grammar errors (RT #85049) (David Steinbrunner, DOLMEN, MOREGAN) - Fix errors in documentation of the PPI::Element class hierarchy (RT #30863, 69026) (SJQUINNEY) - Prevent PPI::XSAccessor packages from hiding corresponding PPI packages in CPAN (RT #90792) (MITHALDU) - Recognize the formfeed character as whitespace (RT #67517) (WYANT) - Recognize regex match following 'return' (RT #27475) (ADAMK) - Fix missing dereference, length called on reference (RT #40103) (ADAMK) 1.215 Sat 26 Feb 2011 Summary: - No changes Details: - Confirmed new Perl::Critic works with 1.214_02, so we can release a new PPI now. 1.214_02 Mon 31 Jan 2011 Summary: - More minor fixes, preparing for production release Details: - Updated copyright year to 2011 (ADAMK) - Fixed RT #64247 bless {} probably contains a hash constructor (WYANT) - Backed out glob fix (WYANT) - Fixed RT #65199 Cast can trump braces in PPI::Token::Symbol->symbol (WYANT) 1.214_01 Thu 16 Dec 2010 Summary: - General fix release Details: - index_locations on an empty document no longer warns (WYANT) - Corrected a bug in line-spanning attribute support (WYANT) - Regression test for line-spanning attribute support (ADAMK) - Fixed #61305 return { foo => 1 } should parse curlys as hash constructor, not block (WYANT) - Fixed #63943 map and regexp confuse PPI? (ADAMK) 1.213 Tue 6 Jul 2010 Summary: - Targetted bug fix, no changes to parsing or normal usage Details: - Updated to Module::Install 1.00 - Updated module depednencies in xt author tests - Fixed extremely broken PPI::Token::Pod::merge and added test case 1.212 Sun 9 May 2010 Summary: - Minor bug fixes and development support Details: - Fixed #48819: Bug in ForLoop back-compatilbilty warning - Added support for $ENV{X_TOKENIZER} --> $PPI::Lexer::X_TOKENIZER 1.211_01 Sun 21 Feb 2010 Summary: - Experimentation support and bug fixes Details: - Upgraded to Module::Install 0.93 - Added support for $PPI::Lexer::X_TOKENIZER, so that alternate experimentatal tokenizers can be swapped in for testing. - Added an extra 14_charsets.t case to validate we handle byte order marks properly. - Moved author tests from t to xt to reduce spurious test failures in CPAN Testers, when the testing modules change across versions - Fixed #26082: scalar { %x } is misparsed - Fixed #26591: VMS patch for PPI 1.118 - Fixed #44862: PPI cannot parse "package Foo::100;" correctly - Fixed #54208: PPI::Token::Quote::Literal::literal is missing due to case-sensitivity error 1.210 Mon 15 Feb 2010 Summary: - Packaging fixes Details: - No functional changes - Upgrading to Module::Install 0.93 - Added missing test_requires dependency for Class::Inspector 1.209 Sat 6 Feb 2010 Summary: - Small optimisation release Details: - No functional changes - Upgrading to Module::Install 0.92 - Moved the Test::ClassAPI test to only run during RELEASE_TESTING to reduce the dependency load (and occasionally Test::ClassAPI seems to FAIL on CPAN Testers. 1.208 Thu 14 Jan 2010 Summary: - THIS IS THE 100TH RELEASE OF PPI! - Fixes some tiny issues, otherwise unchanged from 1.207_01 Details: - Don't assign '' to $^W, it generates a warning on Gentoo - Added missing PPI::Token::Regexp fix to Changes file - Updating Copyright to the new year (yet again) 1.207_01 Thu 10 Dec 2009 Summary: - This is a general bug fix and accuracy release Details: - Fixed #50309: literal() wrong result on "qw (a b c)" - PPI::Dumper no longer causes Elements to flush location data. Also it no longer disables location information for non-Documents. - +{ package => 1 } doesn't create a PPI::Statement::Package - PPI::Token::Regexp and PPI::Token::QuoteLike::Regexp how have methods for getting at the various components (delimiters, modifiers, match & substitution strings). 1.206 Sun 9 Aug 2009 Summary: - This is an optimisation release (1-2% speed up) (Using information uncovered by a Devel::NYTProf 3 alpha) Details: - Removing som superfluous 1; returns - Using defined and ref to avoid highly excessive calls to PPI::Util::TRUE 1.205 Mon 3 Aug 2009 Summary: - This is a production release Details: - No changes from 1.204_07 1.204_07 Fri 31 Jul 2009 Summary: - Minor tweaks Details: - Allow ::For and ::List to return true to ->isa(::ForLoop) and do a once-per-process warning when we do. - Fixed a bug in Class::XSAccessor prototype. 1.204_06 Wed 22 Jul 2009 Summary: - API Change Details: - Changing PPI::Structure::ForLoop to PPI::Structure::For 1.204_05 Tue 21 Jul 2009 Summary: - Bug fixes in preparation for production release Details: - There is no longer any real reason to bundle the testing modules except as a potential source of more bugs. - Removed quantifier ? on zero-length ^ in /^?for(?:each)?\z/ - Run-time load PPI::Document instal of compile-time loading it - Tweak a few load orders to get PPI::Util loaded earlier. - Fixed location access methods on PPI::Element - New PPI::Statement::Include::version_literal() method. 1.204_04 Thu 16 Jul 2009 Summary: - Dependency tweaks Details: - Because we bundle Test::ClassAPI, we need to explicitly match its dependencies. Bumped Params::Util to 1.00. - Bumped a couple of deps a couple of revisions to get better XS. 1.204_03 Tue 14 Jul 2009 Summary: - More bug fixing, clean up, and optimisation - Cleaning up contributed APIs - Adding some demonstration classes Details: - Implemented PPI::Transform::UpdateCopyright - Removed the use of 'use base' - Various minor simplifications - Renamed PPI::Statement::Switch to ::Given - Renamed PPI::Structure::WhenMatch to ::When - Converted the Lexer internals to use exception-based error handling. - Take advantage of the removal of all those "or return undef" to simplify the Lexer code, remove variable declarations, and inline calls to several hot-code-path functions. The Lexer should be significantly faster (FSDO "significant"). - The v6 key on Tokenizer broke support for Perl 5.6 (perl thought it was a numeric v-string) 1.204_02 Sun 10 May 2009 Summary: - Various bug fixing and stabilisation work - It's a perl 5.10 extravaganza! Details: - Updated Module::Install to 0.87 - Added Test::NoWarnings to the test suite - Added support for qw{foo} in addition to for ('foo') - Added support for vstrings again - Now supports the 5.10 "state" keyword. (As far as PPI is concerned it's a synonym for "my") - Now supports switch statements. - Now supports the smart match operator (~~). - Now supports keeping track of line numbers and file names as affected by the #line directive. - Now supports UNITCHECK blocks. - Statement::Include::module_version() implemented. - Statement::Include::arguments() implemented. - Statement::Variable::symbols() implemented. - Token::QuoteLike::Words::literal() implemented. - Token::Quote::Double::simplify() fixed. - Element line_number(), column_number(), visual_column_number(), logical_line_number(), and logical_filename() implemented. - Support for Unicode byte order marks (PPI::Token::BOM) added. - Token::Word::method_call() implemented. - Element::descendant_of() and Element::ancestor_of() implemented. - Statement::specialized() implemented. - Now can handle files named "0". (Perl::Critic got a complaint about this) - foreach loop variables can be declared using "our". - Much more comprehensive testing of compound statement detection. 1.204_01 Sun 18 May 2008 Summary: - Unicode cleanup and bug fixing - Taking the opportunity to do some house cleaning while the code base is relatively stable, before things get crazy again. Details: - For completeness sake, add support for empty documents - Moved capability detection into PPI::Util - POD test script now skips on install properly - Removed 200 lines of old dead "rawinput" code from PPI::Tokenizer - 100% of PPI::Tokenizer is now exception-driven - Workaround for "RT#35917 - charsets.t eats all available VM" (unicode bug in 5.8.6, works in 5.8.8) - Temporarily disable round-trip testing of 14_charset.t 1.203 Wed 14 May 2008 Summary: - No change, switching to production version 1.202_03 Wed 14 May 2008 Summary: - Initial Perl 6 support - Bug fixes and final 1.203 release candidate - I finally catch up with all the failing test cases that Chris Dolan keeps commiting :) Details: - Adding initial support for "use v6-alpha;" - Adding new class Perl::Statement::Include::Perl6 - Adding a test on the KindaPerl6::Grammar, which triggered a bug in the tokenizer during CPAN::Metrics tinderboxing. - All open() calls now use three-argument form - Upgrading explicit Perl dependency to 5.006, because of the previous item. - Better support for labels, including tricky ones like "BEGIN : { ... }" 1.202_02 Wed 2 Jan 2008 Summary: - Back-compatibility and 1.203 release candidate Details: - Removing the use of use base 'Exporter'; - Updating Test::SubCalls dep to 1.07 to get the use base 'Exporter' fix for that too. 1.202_01 Tue 20 Nov 2007 Summary: - Minor bug fix release Details: - RT #30469: calling length() on PPI::Token gives error - 14_charsets.t was incorrectly skipping in situations that it should have been running. 1.201 Mon 22 Oct 2007 Summary: - Minor bug fix release Details: - The internal exception class PPI::Exception::ParserTimeout was inheriting from itself. 1.200 Mon 15 Oct 2007 Summary: - Production Release Details: - Zero changes from 1.199_07 - Updated version from 1.199_07 to 1.200 1.199_07 Fri 12 Oct 2007 Summary: - This is the third release candidate for 1.200 - Minor tweak Details: - Changed the way to detect Perl 5.6 to ignore the 1_0e1_0 failure 1.199_06 Wed 10 Oct 2007 Summary: - This is the second release candidate for 1.200 - Some small bug fixes Details: - Remove -w from test scripts to allow taint'enabled testing - Skip the failing 1_0e1_0 test on Perl 5.6.2 1.199_05 Tue 9 Oct 2007 Summary: - This is the first release candidate for 1.200 - Fix some parser corner cases Details: - Fixed parsing of %!, $^\w, and %^H - Fixed parsing of @{$foo}-1 - Fixed parsing of <$fh1>, <$fh2> 1.199_04 Summary: - Build tweaks - More regression changes Details: - Increasing List::Util dependency to 1.19 (Removes a memory leak on Win32) 1.199_03 Thu 12 Jul 2007 Summary: - Support for a few more rare/legacy Perl syntax - Tokenizer simplification, optimization and exception'ification Details: - Added support for the <<\EOF heredoc style - Always create ->{type} in full-quote sections - Converted more of the Tokenizer to use exceptions - Optimized away a bunch of now-unneeded "or return undef" - Optimized _set_token_class down to a single statement - Inlined _set_token_class out of existence - Cache and fast-clone PPI::Token::Whitespace->null - Removed some superfluous parameter checks on private methods, for conditions that would cause explosions and be noticed anyway. - Removed the fancy options from PPI::Token::new - More consistent structure of incomplete quotes 1.199_02 Mon 5 Mar 2007 Summary: - Added parser timeout support - Fixing various regression cases - Adding some housekeeping tweaks Details: - Created PPI::Exception with an eye to moving towards using exceptions more for error handling (for speed). The goal is to get rid of the "or return undef"s. - Added the timeout param to the PPI::Document constructor which uses alarm to implement basic timeout support. This should help when parsing a large corpus on Unix. (Not available on Win32) - Fixed incorrect location() for PPI::Structure instances. - Adding better parsing of hash constructors. - Pushing Clone dependency to 0.22 to get closer to taint support) - Pushing deps on bundled test modules to prevent accidentally bundling old versions. 1.199_01 Tue 31 Oct 2006 Summary: - Improved lexing correctness - Partial implementation of literal - Initial implementation of Number classes (Chris Dolan) Details: - Split out PPI::Token::Number subclasses - Implement numbers with exponential notation - Implement literal() for ::Number classes (except ::Version) - Implement literal() for ::Token::Quote::Single - Added -T for inline tests - Add tests for nested statements and nested structures - Fixed some bugs as a result - Improved detection of the correct curly brace structure types 1.118 Fri 22 Sep 2006 Summary: - Better 5.10 support - Fixing various (mostly parsing) bugs Details: - Upgraded to Module::Install 0.64 - Improving support for dor and added //= operators - Fixed parsing of binary, octal and hex numbers - Fixed parsing of /= and *= - Fixed #21571 symbol() returns just sigil with adjacent braces - Fixed #21575 variables() chokes on list with whitespace - Fixed #20480 (Misparse of some floating-point numbers.) - Fixed #19999: Make test fails (undeclared global variable $document) under Perl 5.6.2 (or at least, I think I have. This needs double-checking on Perl 5.6.2) - Partially Fixed #16952: [PATCH] Speed up tokenizer char-by-char (Did not apply the patch, but fixed a bug noted as an aside in the report) - PPI::Document::File was returning a plain PPI::Document object, fixed. - FINALLY added some basic POD for PPI::Structure, the one class I somehow keep forgetting to do. 1.117 Sat 02 Sep 2006 Summary: - Fixing bugs introduced in 1.116 Details: - Simple compound statements "{ 1 }" were not end-detecting properly - The new handling for the "-" character was shortcutting naively - Labelled compound statements were not end-detecting properly - { package => 1 } was treating package incorrectly - Fixed bugs in test cases submitted by the Perl::Critic team - Added a number of extra test cases, and introduced Test::Object based testing for PPI::Document objects. 1.116 Thu 31 Aug 2006 Summary: - PPI::Document::File first release - Adding readonly attribute - Fixed various accumulated bugs Details: - Upgraded to Module::Install 0.63 - Add a new file-only subclass of PPI::Document - Added the readonly attribute to the PPI::Document->new constructor - Added method PPI::Document->readonly method - 'goto' is a PPI::Statement::Break - Re-fixed #19629: End of list mistakenly seen as end of statement - Applied #16892: [PATCH] docs and comments - Fixed #16815 (location of Structure::List is not defined.) - Fixed misparsing of C< 1-1 > - Fixed #18413: PPI::Node prune() implementation broken - Fixed #20428 (minor doc bug in PPI::Token::Symbol) - Resolved NOTABUG #20031 (PPI installation) - Resolved NOTABUG #20038 (PPI installation) - Fixed #19883: 'package' bareword used as hash key is detected as package statement - Fixed #19629: End of list mistakenly seen as end of statement - Fixed #15043: (no description) # He wanted PPI::Document::File 1.115 Sat 03 Jun 2006 Summary: - Fixing rt.cpan.org bugs Details: - Fixed #19614: Suspicious code in PPI::Structure - Fixed #16831: until () { } not parsed as compound statement - NOTABUG #16834: "$a = 1 if ($a == 2)" vs "$a = 1 if $a == 2" - Fixed #19629: End of list mistakenly seen as end of statement - Fixed #18413: PPI::Node prune() implementation broken 1.114 Thu 25 May 2006 Summary: - This release addresses only dependency issues Details: - Changed over from IO::Scalar to IO::String - Added a dependency on Task::Weaken so that we can make various not-so-clueful downstream packagers play nicely. 1.113 Wed 10 May 2006 Summary: - This release contains only build-time changes Details: - Upgraded to Module::Install 0.62 - No features() used in this dist, so removing auto_install 1.112 Mon 24 Apr 2006 Summary: - Emergency release to fix a bug that prevents install on perl > 5.8.4 Details: - Small typo in the unicode-specific section of 14_charsets.t prevents tests passing for anyone with a unicode-sane Perl version. - Added a test for strange locales that can't handle unicode, and skip the unicode tests. 1.111 Sat 22 Apr 2006 General - Moved from SourceForge CVS to new collaborative SVN repository - Fixed regressions other people had added since 1.110 - Upgraded to Module::Install 0.62 Details: - SourceForge was too hard to get into, so moved to specially designed new SVN repository to make it easy for others to help out. - Moved t.data to t/data in line with current style and to reduce complexity. - Fixed t/data/08_regression/11_multiply_vs_glob_cast (added by unknown) - Fixed t/data/08_regression/12_pow (added by unknown) - Removed every use of UNIVERSAL::isa in the tests - Upgraded to Module::Install 0.62 (my private prerelease) 1.110 Fri Jan 27 2005 General - Added test support for the third location component (Arjen Laarhoven) - Various bug fixes (Releasing early with only small changes at the request of Perl::Critic) Details: - Fixed CPAN #16924: PPI::Statement::Sub.pm fix to use Params::Util line to resolve _INSTANCE error - Fixed CPAN #16837: typo in PPI::Statement::Expression POD - Fixed CPAN #16973: PPI 1.109 shouldn't require List::Util 1.18 (We do need 1.18 to avoid a leak, but it doesn't work everywhere) - Fixed CPAN #16814: _INSTANCE method not defined in PPI::Statement::Sub (dupe) - Arjen Laarhoven added to CVS committers - Added a third element to ->location return arrayref that contains the visual starting column of the token, taking into account tabbing. 1.109 Fri Dec 30 2005 Summary: - Various bug fixes - Minor structural cleanup Details: - Removed every single use of UNIVERSAL::isa - PPI::Normal was quite broken, cleaned it up - Fixed PPI::Normal::Standard::remove_statement_separator - Fixed CPAN #16674 PPI::Token::Quote::Double->interpolations (awigley) - Fixed CPAN #15131 PPI::Node->find() behavior not completely documented (Jeffrey Thalhammer) - Fixed CPAN 13743 PPI::Statement::Scheduled api (johanl) - PPI::Statement::Scheduled is now a subclass of PPI::Statement::Sub - Removed breaking circular include in PPI::Util - Removed an 'our' variable in t/04_element.t that created a 5.6.0 dependency - Only do the PPI::Cache tests that use Test::SubCalls if >= 5.006 - (Except for File::Remove, we should ACTUALLY depend on 5.005 now) - Fixed CPAN #16671 $_ is not localized (JPIERCE) (I missed an unlocaled $_ hiding in the Node object destructor) 1.108 Thu Dec 15 2005 Summary: - Fixing of some very minor bugs Details: - 8 wasn't an illegal character in an octal number (fixed) - Two <= 5.8.5) (not pre-checked and enforced yet, but will be) - Starting new generation of "exhaustive" testing Details: - Added 20_tokenizer_regressions, which tests all detectably-failing 3-or-less character long Perl programs (not inclusive of latin-1 or Unicode). (Audrey Tang) - Fixed bug for incomplete quotes at EOF (there may be a few more similar cases) - Fixed bug with $'0 (where 0 is only legal after ::) - No longer die for illegal chars in hex/bin number types (Attach the error to $token->{_warning} instead) - Caught a number of cases with trailing colons for $things (Both at EOF and end of token) - Convert [^\W\d]\w* to (?!\d)\w+ to improve unicode support in symbols etc (Audrey Tang) - Miscellaneous doc bugs in the SYNOPSIS (Audrey Tang) 1.104 Thu Nov 10 2005 General - No change to code - Both List::Util and List::MoreUtil contain memory leaks, and we use them extensively. Pushed the dependencies up to versions with the memory leaks fixed. 1.103 Thu Oct 6 2005 General - Small bug fix that shouldn't have escaped Details: - Changed md5hex_file to act more like the PPI::Documeny way. That is, localise and THEN convert to \015 1.102 Wed Oct 5 2005 General - Small things to support Perl::Metrics Details: - Added undocumented PPI::Util::md5hex_file function 1.101 Thu Sep 29 2005 General - Bug fix release Details: - Fixed CPAN bug #14436 and #14440, misparse for my ($foo) ... - Added an self-analysis test script for PPI-testable problems - Fixed some minor bugs it threw up. 1.100_03 General - Major bug fixing - Some additions to help simplify Perl::Metrics Details: - A whole bunch (practically all) of the sibling code was breaking under non-trivial use. Fixed, with a number of new tests added. - Added function PPI::Util::md5hex - Added method PPI::Document::hex_id 1.100_02 General - Various bug fixes - Completed the first version of PPI::Cache Details: - Expanded round-trip testing coverage to all the lexer and regression test files - 06_round_trip.t wasn't doing the round-trip test properly. Fortunately, this only resulted in false failures, so no actual damage was done as a result of this. 1.100_01 Sat Sep 03 2005 Summary: - Added integrated cache support Details: - Added PPI::Cache class - Removed warning in 99_pod.t - Added a common PPI::Util::_slurp function - PPI::Document can be given a cache to use 1.003 Tue Aug 18 2005 Summary: - Bug fix release Details: - Add support for 'for $foo () {}' - Add support for 'for my $foo () {}' - Fixed bug where "'Hello..." crashed the Tokenizer - Fixed bug where '"Hello...' crashed the Tokenizer - Fixed bug where 's' crashed the Tokenizer 1.002 Thu Jul 14 2005 Summary: - Bug fix release Details: - Fixed CPAN #13655 - insert_before and insert_after broken. 1.001 Tue Jul 12 2005 Summary: - Turning on Test::Inline scripts Details: - Bug fix: ->string returns wrong for qq and all braced quotes - Added Test::Inline 2.100-type inline2test.conf and inline2test.tpl files - Added t/ppi_token__quoteengine_full.t - Added t/ppi_token_quote_single.t - Added t/ppi_token_quote_double.t - Added t/ppi_token_quote_literal.t - Added t/ppi_token_quote_interpolate.t 1.000 Sat Jul 9 2005 Summary: - FIRST PRODUCTION RELEASE - Finalising POD, corrected the Copyright dates - Rewrote much of the main PPI.pm docs - Removing more unneeded dependencies - Added native Storable support Details: - Removed dependency on Class::Inspector - Added build dependency on Class::Inspector and include() it (although it's still needed at build time, this still does manage to reduce the number of files to download by one more) - Added PPI::Document::STORABLE_freeze and PPI::Document::STORABLE_thaw 0.996 Fri Jul 8 2005 Summary: - RELEASE CANDIDATE 2 - Clearing all remaining RT bugs - Removing and inlining dependencies Details: - Resolved PDOM bug CPAN #13454 ( while ( $s = $s->sprevious_sibling ) infinite loops ) Mental Note: Doing an auto-decrement in an array subscript is BAD - Resolved Lexer bug CPAN #13425 ( $p{package} creates a PPI::Statement::Package ) Added smarts to resolve word-started statements as ::Expression in subscripts - Resolved PDOM bug CPAN #13326 ( problems in index_locations ) Patch and comprehensive additional tests provided by johanl[ÄT]DarSerMan.com - Removed dependency on Class::Autouse. Just load Tokenizer and Lexer up front. - Removed dependency on File::Slurp. Only use it 3 times and it's not worth it when almost all the files we will read are under 50k. 0.995 Sun Jul 3 2005 Summary: - RELEASE CANDIDATE 1 - Added some internals to help with XML compatibility - Completed primary POD docs - Completed first versions of insert_before and insert_after - Removed last uses of _isa - Added final missing POD docs Details: - Added convenience method PPI::Element::class - Added docs for all PPI::Structure classes - Added additional tests to check for ::Unknown classes - Added PPI::Document::insert_before to return an error - Added PPI::Document::insert_after to return an error - Added PPI::Document::replace to return an error - Removed a number of unneeded UNIVERSAL::isa imports - Removed PPI::Token::_isa before anyone starts using it. It was hacky and unsuitable to a production release 0.994 skipped 0.993 Tue Jun 21 2005 Summary: - Various minor code, packaging and POD cleanups Details: - Corrected a POD bug in PPI::Dumper - Upgraded PPI::Dumper param checking to Params::Util - Restored PPI::Element->clone to using Clone::clone ( 0.17+ ) - Removed dependency on Storable - Until it fixes the problem, explicitly include ExtUtils::AutoInstall 0.992 Sun Jun 12 2005 Summary: - Added the PPI::Transform API 0.991 Fri Jun 10 2005 - Typo. I wasn't dieing on newlines to PPI::Document->new( string ) correctly, and thus dieing without the API CHANGE message. This was confusing people as to why. 0.990 Wed Jun 8 2005 Summary: - Last version (hopefully) to make API changes - Slight API shuffle in the constructors - Completed all PPI::Statement::* API documentation - Enabled latin-1 support in the appropriate places 0.906 Thu Apr 28 2005 Summary: - Completed location support and added related unit tests - Added API for future support of tab widths Details: - Removed PPI::Element::_line - Removed PPI::Element::_col - Fixed bugs in PPI::Document::index_location - Fixed bugs in PPI::Element::location - Added 12_location.t unit test - Added PPI::Document::tab_width method - Added PPI::Normal::Standard::remove_useless_attributes (to remove the ->{tab_width} attributes and later other things) 0.905 Wed Apr 20 2005 Summary: - Completely forgot to write unit tests for PPI::Util, and a bug slipped in. Fixed and added tests Details: - Fixed bug in PPI::Util::_Document - Added 11_util.t 0.904 Wed Apr 20 2005 Summary: - Improvements to PPI::Normal - Method renaming to parse-time PDOM private methods - Various bug fixes and POD tweaks - Added PPI::Util Details: - Partly added Layer 2 to PPI::Normal - Added function PPI::Normal::Standard::remove_useless_pragma - Added function PPI::Normal::Standard::remove_statement_separator - Added function PPI::Normal::Standard::remove_useless_return - Renamed _on_line_start to __TOKENIZER__on_line_start - Renamed _on_line_end to __TOKENIZER__on_line_end - Renamed _on_char to __TOKENIZER__on_char - Renamed _scan_for_end to __TOKENIZER__scan_for_end - Renamed _commit to __TOKENIZER__commit - Renamed _is_an_attribute to __TOKENIZER__is_an_attribute - Renamed _literal to __TOKENIZER__literal - Renamed _opposite to __LEXER__opposite - Fixed bug in PPI::Statement::Package::namespace - Added unit tests for PPI::Statement::Package - Added (currently mostly internal) PPI::Util - Added exportable function PPI::Util::_Document 0.903 Fri Mar 25 2005 Summary: - PPI::Document and other PPI::Node-subclasses will now implicitly DESTROY correctly. - Now that PPI.pm is just a module loader, merge the main documentation from PPI::Manual back into it again. Details: - Added use of Scalar::Util::weaken for all %_PARENT writes - Uncovered critical bug in Clone, so we use Storable::dclone for now, until Clone is fixed. This resolves rt.cpan.org #11552 - Added dependency on Storable 1.13 - Moved all PPI::Manual content to PPI and relinked This resolves rt.cpan.org #11803 - Removed lib/PPI/Manual.pod - Added the standard 99_pod.t to check POD - Fixed a POD bug in Element.pm 0.902 Sun Feb 6 2005 Summary: - Added Document Normalization functions from old Perl::Compare (although it is very very limited in function at this point) Details: - Added class PPI::Normal - Added class PPI::Normal::Standard - Added class PPI::Document::Normalized - Added method PPI::Document->normalize - Bug: ->clone was going to all the trouble to build a clone, but then returning the original :( Fixed 0.901 Sat Jan 29 2005 Summary: - Moved all up-to-date code over to SourceForge - Various fixes to allow the release of File::Find::Rule::PPI Details: - Got all modules synchronising their versions correctly - Moved to SourceForge CVS repository - Changed all files over to the new CVS directory layout - Fixed bug in PPI::Node::find_first - Added unit tests for PPI::Node::find_first - Added unit tests for PPI::Node::find_any - Added a stub and docs for PPI::Statement::stable 0.900 Mon Jan 17 2005 Summary: - Final removal of PPI::Base - Completed majority of crash bugs in the Tokenizer Details: - Fixed Tokenizer Bug C< @foo = < seen as ::Readline - Fixed Tokenizer Bug C< (< seen as ::Readline - Fixed Tokenizer Bug C< q'foo bar' > parsed incorrectly - Fixed bug in PPI::Token::_QuoteEngine::_scan_quote_like_operator_gap - Fixed Tokenizer Bug C< $foo:'' > sees symbol $foo:' - Fixed Tokenizer Bug C< $#arrayindex > was seen as a Symbol - Fixed Tokenizer Bug C< %2 > was seen as a Symbol - Fixed Tokenizer Bug C< &64 > was seen as a Symbol - Fixed Tokenizer Bug C< $::| > is actually a Magic - Fixed Tokenizer Bug C< @0 > is a Magic - Deleted PPI::Base - Added $PPI::Element::errstr - Added basic private error methods to PPI::Element - PPI::Element::significant now returns '' as false - PPI::XS - Added all C methods 0.846 Mon Jan 17 2005 Summary: - Added proper support for - Last release before beta 1 if all looks good Details: - Added class PPI::Token::QuoteLike::Readline - Added t.data/05_lexer_practical/10_readline.code/dump - Added support for <> - A few other minor bug fixes 0.845 Sat Jan 15 2005 Summary: - Adding integration with PPI::XS, autoloading if installed Details: - Added $PPI::XS_COMPATIBLE and $PPI::XS_EXCLUDE variables to guide integration - Don't autoload PPI::Document, always load - Load in PPI::XS whenever it is installed - Loading and depending on Class::Inspector - PPI::Element::significant implemented in XS (as a trial) 0.844 Fri Jan 14 2005 Summary: - Found a massive performance bug when parsing large perl constructs - Fixed some install problems Details: - PPI::Node::schild was copying the entirety of its child array each call. This was causing massive slowdowns when ->{children} got large. Fixed. - The core tests still expect Transform to be in the core. Fixed. 0.843 Tue Jan 12 2005 Summary: - Starting the process of removing PPI::Base. It only does does error handling now, which will be split up. - Fixing some packaging and "play well with others" issues Details: - Randal Schwartz pointed out t/06... wouldn't working for him. It appears when Test::More bug CPAN #8385 was fixed, we broke. - We now include build-time-only dependencies in the installer - Although unusable, PPI::Document::Normalized's version fell out of sync with the rest of the distribution. Fixed. - PPI::Tokenizer no longer inherits from PPI::Base - Added class variable $PPI::Tokenizer::errstr - Added class method PPI::Tokenizer->errstr - Fixed Tokenizer Bug: C< y => 1 > was being seen as a regex - Fixed Tokenizer Bug: C< <<''; > was dying because I expected at least one character - Fixed Tokenizer Bug: C< $foo->{s} > was being seen as a regex 0.842 Tue Jan 11 2005 Summary: - Lots of debugging based on Tinderbox results Details: - Fixed MANIFEST.SKIP to removed PPI::Transform and PPI::Tinderbox from the core PPI distribution (like they should be) - Optimised the previous #9582 to not have to run for EVERY word, only those where it might be needed. - Corrected a use of QuoteLike::Execute to QuoteLike::Backtick - Fixed CPAN #9598 Tokenizer Bug: C< qx( $command ) > - Fixed CPAN #9614 Tokenizer Bug: C< $foo << 16 > - Set the properly includive regex for << '...' here-doc - Added an very early filter to prevent non-basic chars going in 0.841 Mon Jan 10 2005 Summary: - Completed much more documentation on the core classes - PPI::Tester back in sync again (separate distribution) - PPI::Processor and PPI::Tinderbox completed (separate distribution) Details: - Documented PPI::Tokenizer - PPI::Document->new( $source ) added as a convenience - PPI::Lexer::lex_file can now be called statically - PPI::Lexer::lex_source can now be called statically - PPI::Lexer::lex_tokenizer can now be called statically - Fixed a small bug in PPI::Dumper::print - Fixed CPAN #9582 Tokenizer Bug: C< sub y { } # Comment > - Fixed similar case with C< foo->y() > 0.840 Thu Dec 21 2004 Summary: - Changed the PPI summary to no longer use the devisive word "parse" Now: "PPI - Analyze and manipulate Perl code without using perl itself" - Total rewrite of all the ->location code - Upgrading MakeFile.PL to Module::Install - Fixed #CPAN 8752 (a round-trip edge case bug) - Added 08_regression.t to do code/dump regression testing for lexer bugs - Completed (hopefully) HereDocs conversion to a single complex token - PPI is now compatible with prefork.pm (although not dependant) Details: - Added PPI::Node::find_first object method - Changed PPI::Node::find_any to just call PPI::Node::find_first - Added PPI::Element::first_token object method - Added PPI::Element::last_token object method - Made a partial-removal-capable PPI::Element::_flush_locations - PPI::Document::flush_locations uses PPI::Element::_flush_locations - PPI::Document::index_locations is here-doc sane - Added PPI::Token::HereDoc::heredoc object method - Added PPI::Token::HereDoc::terminator object method - Documented PPI::Token::HereDoc - Added a HereDoc code/dump test to 05_lexer_practical.t - Added PPI::Document::serialize, which replaces the use of ->content for generating the actual string to write out to files when saving Documents. - File::Spec reduced from dependency to build dependency - Updated Test::ClassAPI dependency to newest version - Enabled API collision detection in 02_api.t - Updated Class::Autouse dependency to newest version 0.840_01 Tue Dec 21 2004 Summary: - Perl Foundation Funding Commences - Changes separated into General and Details from here on - Complete re-organisation of the quote-like token classes. Any and all code that works with quotes will be broken. - Gave up on the old PPI::Query code and wrote a complete new and much thinner implementation based roughly on the API of File::Find::Rule. PPI::Find uses the &wanted function (which also has a slightly different API to the old one) but has the ->in style search methods. It should be relatively easy for someone to write PPI::Find::Rule on top of it. - PPI::Transform is thus temporarily stale Details: - Introduced a bug for C< foreach $foo () > and caught/fixed it during the changeover. - Changed PPI::Lexer::Dump to PPI::Dumper - API Freeze PPI::Find - API Freeze PPI::Dumper - Documented PPI::Find - Documented PPI::Dumper 0.831 Fri Nov 5 2004 - Overloaded PPI::Document bool => true - Overloaded PPI::Document "" => content (That is, ::Documents stringify to their content) - Fixed PPI::Document::save - Merged Leon Brocard's docs patch - Cleaned up PPI::Node::_condition and documented conditions better (fixed #7799) - Allow dropping of the initial PPI:: in class search conditions - Fixed two instances of File::Slurp::read_file being called as a method 0.830 Mon Sep 27 2004 - Added PPI::Statement::Package::file_scoped object method - Handle potentially dangerous C< sub foo ($$ > safer - Resolve C< sub BEGIN { } > to PPI::Statement::Scheduled correctly - Resolve C< sub () { 1 }; > to PPI::Statement correctly - API Freeze PPI::Statement::Package - API Freeze PPI::Statement::Scheduled - API Freeze PPI::Statement::Sub - Documented PPI::Statement - Documented PPI::Statement::Package - Documented PPI::Statement::Scheduled - Documented PPI::Statement::Sub - Documented PPI::Document::Fragment 0.829 Sat Sep 25 2004 - BREAKS API COMPATIBILITY - Changed PPI::Token::SubPrototype to PPI::Token::Prototype - Added PPI::Token::Prototype::prototype object method - Added PPI::Statement::Sub::prototype object method - Added PPI::Statement::Sub::block object method - Fixed PPI::Statement::Include::version 0.828 Sun Aug 8 2004 - BREAKS API COMPATIBILITY - Changed PPI::Token::DashedBareword to PPI::Token::Quote::Dashed - Changed PPI::Token::Bareword to PPI::Token::Word - Vastly improved PPI::Manual 0.827 Thu Aug 5 2004 - Added PPI::Token::Separator class ( for __DATA__ and __END__ ) - Added better Tokenizer handling of __DATA__ and __END__ - Added better Lexer handling of __DATA__ and __END__ - Fixed some version inconsistencies 0.826 Sat Jul 31 2004 - Added PPI::Element::statement object method - Added PPI::Transform abstract class - Sped up the 'bool' overload for PPI::Element - Added PPI::Element::snext_sibling object method - Added PPI::Element::sprevious_sibling object method - Added PPI::Element::insert_before object method placeholder - Added PPI::Element::insert_after object method placeholder - Changed {elements} to {children} to match PPI::Node definitions - Added PPI::Node::first_element object method - Added PPI::Node::last_element object method - Added PPI::Element::next_token object method - Added PPI::Element::previous_token object method - Added PPI::Token::Symbol::symbol object method 0.825 Mon Jul 26 2004 - Added PPI::Statement::Include::type object method - Added PPI::Statement::Include::module object method - Added PPI::Statement::Include::pragma object method - Added PPI::Statement::Include::version object method - Overloaded == as "the same object" for PPI::Element - Overloaded eq as "->content is the same" for PPI::Element - Overloaded bool as always true, to prevent an error - Added PPI::Statement::Package::namespace object method - 100% round-trip safe. What goes in, will come out. - Reduced leaks by 95%. Process size 30meg after 5000 files. Still some leaks remaining when Lexing errors out. - Separated largest Tokens into their own files. This aligns token class structure with that of ::Statement and ::Structure - Rewrote PPI::Node::DESTROY several times while hunting down more leaks - Fixed Tokenizer crash on empty subroutine prototypes such as C< sub foo() {} > - Treat unexpected braces as an implicit close, to make the lexer more resilient - Added PPI::Statement::UnmatchedBrace (name suggested by Abhijit Menon-Sen) to handle closing braces found at the base of a Document. - Enabled foo'bar package notation again. - Getting close to the first 0.900 series beta release 0.824 Wed Jul 21 2004 - Removed a 6 meg tmon.out file I accidentally bundled 0.823 Wed Jul 21 2004 - Added PPI::Document::Fragment class - Added PPI::Node::schildren object method - Completed compound statement parsing - Lexer is now officially feature complete 0.822 Wed Jul 21 2004 - Filling out the API test as much as possible - Added PPI::Statement::label object method - Moved PPI::Structure::elements object method to PPI::Node::elements - Re-organised statement parsing to better implement ::Compound statements - Added PPI::Statement::Data class - Added PPI::Statement::End class - Re-organised the _lex_statement, _statement_continues stuff, ready for while - Added PPI::Lexer::_lex_statement_end to handle PPI::Statement::End properly - Organising 02_api.t was getting hard, so added implicit Module=class to Test::ClassAPI 0.821 Mon Jul 19 2004 - Cleaned up test data files directories - Added PPI::Statement::Variable::type object method - Added PPI::Statement::Variable::variables object method - Added some more classes to the API testing - Started 07_tokens.t for testing particular token classes - Added PPI::Token::Symbol::canonical object method (and tests) - PPI::Token::Magic now ISA PPI::Token::Symbol - PPI::Element::clone now fixes _PARENT links for Nodes 0.820 Mon Jul 19 2004 - Added Round-Trip-Safe testing for all PPI files - Added PPI::Node::find_any object method - Added PPI::Node::contains object method - Continuing the never ending addition of tests - Structure open and close brace tokens now see the Structure as their parent - Removed the sample application, to streamline the core install - Removed dependencies for the sample application - Removed custom META.yml, as now no longer needed 0.819 Mon Jul 14 2004 - Many parts of PPI are VASTLY changed in this revision - Breaks API compatibility heavily - Adds dependency on List::MoreUtils - Added PPI::Lexer support for CHECK blocks - Added PPI::Document::load method - Added PPI::Document::save method - Added PPI::Document::index_locations method - Added PPI::Document::flush_locations method - Added PPI::Element::top method - Added PPI::Element::document method - Renamed PPI::Element::extract -> PPI::Element::remove - Added test script for element-y stuff - Optimisation across the board using List::Any - Added PPI::Node::first_child method - Added PPI::Node::last_child method - Added PPI::Element::clone method - Removed Filehandle support from PPI::Tokenizer, to allow the ability to rollback source lines into the buffer if needed. - Added POD documentation for PPI::Element - Added POD documentation for PPI::Node - Added POD documentation for PPI::Document 0.818 Mon Jul 5 2004 - Changed lib/PPI/Manual.pm to lib/PPI/Manual.pod - Added documentation for PPI::Lexer - Fixed the misparsing of s{//}{\} - More clues added for deciding "slash or regex" - Removed PPI::Batch from the default distribution - Replaced File::Flat with File::Slurp to reduce dependencies 0.817 Thu Jul 1 2004 - Fixed the misparsing of $#{ } - Changed PPI::ParentElement to PPI::Node and moved it to its own file - Changed PPI::Common to PPI::Base - Fixed PPI::Node::find - Added PPI::Node::prune - Started to add a little more class structure documentation - Tried to make the DESTROY sequence of events work better 0.816 Tue Jun 29 2004 - Solved the "last token in file parses wrong" bug 0.815 Sun Jun 27 2004 - Fixed a bug with the detection of @- and @+ - Added support for @* - Added missing classmap entry for ^ to ::Token::WhiteSpace - Added support for arcane "foo"x10 idiosyncracy 0.814 Sat Jun 26 2004 - Added the PPI tester, a desktop-based interactive debugger, which should greatly accelerate finding and fixing both ::Tokenizer and ::Lexer bugs. This will probably end up as a separate distribution though, as it has a dependency on wxPerl. - Fixed the misparsing of Foo::Bar::Baz - Fixed the misparsing of *100 - Fixed the misparsing of Class::->method properly, or rather Foo:: - Tokenizer correctly identifies labels - Changed PPI::Statement::Flow to PPI::Statement::Compound - Removed the extra null whitespace token appearing after a bareword at the end of a file. - -X operator are recognised correctly, although not at end of file - Lexer detects subroutine and if () statement ends correctly 0.813 Sat Jun 26 2004 - PPI::Lexer is now structurally complete 0.812 Tue Jun 22 2004 - No changes to PPI itself. - With the addition of Test::ClassAPI 'complete' support, upgraded 02_api.t to use it. Fixed a few small house-keeping bugs. 0.811 Mon Jun 21 2004 - Added support for subroutine attributes - Fixed some problems with anonymous subroutines and prototypes - $#$foo parses as (Cast,Symbol) now, not (Magic,Symbol) 0.810 Mon Jun 14 2004 - Recognise the _ magic filehandle 0.809 Sat Apr 17 2004 - No changes to PPI itself. Set the correct number of tests to match changes to Test::ClassAPI 0.808 Sat Apr 17 2004 - No changes to PPI itself. Upgraded 02_api.t to match changes to Test::ClassAPI 0.807 Sat Apr 3 2004 - Added a manual META.yml file to stop the bundled private AppLib library from being indexed by CPAN 0.806 Mon Mar 22 2004 - The $} magic variable is now supported - Fixed a "tight sub property" bug ( sub foo:lvalue ) 0.805 Sun Sep 28 2003 - The maximum line length regressed, reseting it to 5000. - In PPI::Format::HTML, not any parsing error causing a premature end of tokenizer by adding it in a comment at the end of the file. 0.804 Sat Sep 06 2003 - Statement and Structure resolution preliminarily work. Some basic types of statements and structures are identified. - PPI::Format::Apache has been separated into a different module 0.803 Sat Sep 06 2003 - Added very long line protection support. Maximum line length is now 5000. - Added bug fixes to the Lexer so that block tree building works mostly OK again, without adding broken duplicate tokens. - Added the PPI::Lexer::Dump module, to do Lexer object dumps. 0.802 Sat Aug 23 2003 - PPI::Format::HTML sends the correct content headers 0.801 Fri Aug 22 2003 - Moved to a new numbering scheme to get more room before 1.0 - Always fully load when called under mod_perl - Add mod_perl hook to PPI::Format::HTML 0.8 Fixes to the quote parsing engine 0.7 Fixed some minor bugs 0.6 Fixed POD, fixed version number, included $'a as a symbol 0.5 Missing 0.4 Mon Dec 23 10:24:21 - Some more minor parsing fixes in Tokenizer - Completely changed the API from doThis to do_this style - Changed API to indicate private methods properly 0.3 Tue Dec 17 10:29:27 - Restructured a little bit - Fixed some mis-parsing cases 0.2 Unknown - Added test script 0.1 Thu Dec 06 16:50:23 2002 - original version PPI-1.272/MANIFEST000644 000765 000024 00000025114 14176526433 013410 0ustar00olafstaff000000 000000 # This file was automatically generated by Dist::Zilla::Plugin::Manifest v6.024. Changes LICENSE MANIFEST META.json META.yml Makefile.PL README dev_notes.txt dist.ini lib/PPI.pm lib/PPI/Cache.pm lib/PPI/Document.pm lib/PPI/Document/File.pm lib/PPI/Document/Fragment.pm lib/PPI/Document/Normalized.pm lib/PPI/Dumper.pm lib/PPI/Element.pm lib/PPI/Exception.pm lib/PPI/Exception/ParserRejection.pm lib/PPI/Find.pm lib/PPI/Lexer.pm lib/PPI/Node.pm lib/PPI/Normal.pm lib/PPI/Normal/Standard.pm lib/PPI/Singletons.pm lib/PPI/Statement.pm lib/PPI/Statement/Break.pm lib/PPI/Statement/Compound.pm lib/PPI/Statement/Data.pm lib/PPI/Statement/End.pm lib/PPI/Statement/Expression.pm lib/PPI/Statement/Given.pm lib/PPI/Statement/Include.pm lib/PPI/Statement/Include/Perl6.pm lib/PPI/Statement/Null.pm lib/PPI/Statement/Package.pm lib/PPI/Statement/Scheduled.pm lib/PPI/Statement/Sub.pm lib/PPI/Statement/Unknown.pm lib/PPI/Statement/UnmatchedBrace.pm lib/PPI/Statement/Variable.pm lib/PPI/Statement/When.pm lib/PPI/Structure.pm lib/PPI/Structure/Block.pm lib/PPI/Structure/Condition.pm lib/PPI/Structure/Constructor.pm lib/PPI/Structure/For.pm lib/PPI/Structure/Given.pm lib/PPI/Structure/List.pm lib/PPI/Structure/Subscript.pm lib/PPI/Structure/Unknown.pm lib/PPI/Structure/When.pm lib/PPI/Token.pm lib/PPI/Token/ArrayIndex.pm lib/PPI/Token/Attribute.pm lib/PPI/Token/BOM.pm lib/PPI/Token/Cast.pm lib/PPI/Token/Comment.pm lib/PPI/Token/DashedWord.pm lib/PPI/Token/Data.pm lib/PPI/Token/End.pm lib/PPI/Token/HereDoc.pm lib/PPI/Token/Label.pm lib/PPI/Token/Magic.pm lib/PPI/Token/Number.pm lib/PPI/Token/Number/Binary.pm lib/PPI/Token/Number/Exp.pm lib/PPI/Token/Number/Float.pm lib/PPI/Token/Number/Hex.pm lib/PPI/Token/Number/Octal.pm lib/PPI/Token/Number/Version.pm lib/PPI/Token/Operator.pm lib/PPI/Token/Pod.pm lib/PPI/Token/Prototype.pm lib/PPI/Token/Quote.pm lib/PPI/Token/Quote/Double.pm lib/PPI/Token/Quote/Interpolate.pm lib/PPI/Token/Quote/Literal.pm lib/PPI/Token/Quote/Single.pm lib/PPI/Token/QuoteLike.pm lib/PPI/Token/QuoteLike/Backtick.pm lib/PPI/Token/QuoteLike/Command.pm lib/PPI/Token/QuoteLike/Readline.pm lib/PPI/Token/QuoteLike/Regexp.pm lib/PPI/Token/QuoteLike/Words.pm lib/PPI/Token/Regexp.pm lib/PPI/Token/Regexp/Match.pm lib/PPI/Token/Regexp/Substitute.pm lib/PPI/Token/Regexp/Transliterate.pm lib/PPI/Token/Separator.pm lib/PPI/Token/Structure.pm lib/PPI/Token/Symbol.pm lib/PPI/Token/Unknown.pm lib/PPI/Token/Whitespace.pm lib/PPI/Token/Word.pm lib/PPI/Token/_QuoteEngine.pm lib/PPI/Token/_QuoteEngine/Full.pm lib/PPI/Token/_QuoteEngine/Simple.pm lib/PPI/Tokenizer.pm lib/PPI/Transform.pm lib/PPI/Transform/UpdateCopyright.pm lib/PPI/Util.pm lib/PPI/XSAccessor.pm t/00-report-prereqs.dd t/00-report-prereqs.t t/01_compile.t t/03_document.t t/04_element.t t/05_lexer.t t/06_round_trip.t t/07_token.t t/08_regression.t t/09_normal.t t/10_statement.t t/11_util.t t/12_location.t t/13_data.t t/14_charsets.t t/15_transform.t t/16_xml.t t/17_storable.t t/18_cache.t t/19_selftesting.t t/21_exhaustive.t t/22_readonly.t t/23_file.t t/24_v6.t t/25_increment.t t/26_bom.t t/27_complete.t t/28_foreach_qw.t t/29_logical_filename.t t/data/03_document/empty.dat t/data/03_document/test.dat t/data/05_lexer/01_simpleassign.code t/data/05_lexer/01_simpleassign.dump t/data/05_lexer/02_END.code t/data/05_lexer/02_END.dump t/data/05_lexer/03_subroutine_attributes.code t/data/05_lexer/03_subroutine_attributes.dump t/data/05_lexer/04_anonymous_subroutines.code t/data/05_lexer/04_anonymous_subroutines.dump t/data/05_lexer/05_compound_loops.code t/data/05_lexer/05_compound_loops.dump t/data/05_lexer/06_subroutine_prototypes.code t/data/05_lexer/06_subroutine_prototypes.dump t/data/05_lexer/07_unmatched_braces.code t/data/05_lexer/07_unmatched_braces.dump t/data/05_lexer/08_subroutines.code t/data/05_lexer/08_subroutines.dump t/data/05_lexer/09_heredoc.code t/data/05_lexer/09_heredoc.dump t/data/05_lexer/10_readline.code t/data/05_lexer/10_readline.dump t/data/05_lexer/11_dor.code t/data/05_lexer/11_dor.dump t/data/05_lexer/12_switch.code t/data/05_lexer/12_switch.dump t/data/05_lexer/13_braces_in_parens.code t/data/05_lexer/13_braces_in_parens.dump t/data/07_token/exp.code t/data/07_token/exp.dump t/data/07_token/exp1.code t/data/07_token/exp1.dump t/data/07_token/exp2.code t/data/07_token/exp2.dump t/data/07_token/exp3.code t/data/07_token/exp3.dump t/data/07_token/exp4.code t/data/07_token/exp4.dump t/data/07_token/exp5.code t/data/07_token/exp5.dump t/data/07_token/exp6.code t/data/07_token/exp6.dump t/data/07_token/exp7.code t/data/07_token/exp7.dump t/data/07_token/exp8.code t/data/07_token/exp8.dump t/data/07_token/hex.code t/data/07_token/hex.dump t/data/07_token/range_operator.code t/data/07_token/range_operator.dump t/data/07_token/smart_match.code t/data/07_token/smart_match.dump t/data/08_regression/01_rt_cpan_19629.code t/data/08_regression/01_rt_cpan_19629.dump t/data/08_regression/01_rt_cpan_19629b.code t/data/08_regression/01_rt_cpan_19629b.dump t/data/08_regression/02_rt_cpan_9582.code t/data/08_regression/02_rt_cpan_9582.dump t/data/08_regression/03_rt_cpan_9614.code t/data/08_regression/03_rt_cpan_9614.dump t/data/08_regression/04_tinderbox.code t/data/08_regression/04_tinderbox.dump t/data/08_regression/05_rt_cpan_13425.code t/data/08_regression/05_rt_cpan_13425.dump t/data/08_regression/06_partial_quote_double.code t/data/08_regression/06_partial_quote_double.dump t/data/08_regression/07_partial_quote_single.code t/data/08_regression/07_partial_quote_single.dump t/data/08_regression/08_partial_regex_substitution.code t/data/08_regression/08_partial_regex_substitution.dump t/data/08_regression/09_for_var.code t/data/08_regression/09_for_var.dump t/data/08_regression/10_leading_regexp.code t/data/08_regression/10_leading_regexp.dump t/data/08_regression/11_multiply_vs_glob_cast.code t/data/08_regression/11_multiply_vs_glob_cast.dump t/data/08_regression/12_pow.code t/data/08_regression/12_pow.dump t/data/08_regression/13_goto.code t/data/08_regression/13_goto.dump t/data/08_regression/14_minus.code t/data/08_regression/14_minus.dump t/data/08_regression/14b_minus.code t/data/08_regression/14b_minus.dump t/data/08_regression/15_dash_t.code t/data/08_regression/15_dash_t.dump t/data/08_regression/16_sub_declaration.code t/data/08_regression/16_sub_declaration.dump t/data/08_regression/17_scope.code t/data/08_regression/17_scope.dump t/data/08_regression/18_decimal_point.code t/data/08_regression/18_decimal_point.dump t/data/08_regression/19_long_operators.code t/data/08_regression/19_long_operators.dump t/data/08_regression/19_long_operators2.code t/data/08_regression/19_long_operators2.dump t/data/08_regression/20_hash_constructor.code t/data/08_regression/20_hash_constructor.dump t/data/08_regression/21_list_of_refs.code t/data/08_regression/21_list_of_refs.dump t/data/08_regression/22_hash_vs_brace.code t/data/08_regression/22_hash_vs_brace.dump t/data/08_regression/23_rt_cpan_8752.code t/data/08_regression/23_rt_cpan_8752.dump t/data/08_regression/24_compound.code t/data/08_regression/24_compound.dump t/data/08_regression/25_hash_block.code t/data/08_regression/25_hash_block.dump t/data/08_regression/26_rt_cpan_23253.code t/data/08_regression/26_rt_cpan_23253.dump t/data/08_regression/27_constant_hash.code t/data/08_regression/27_constant_hash.dump t/data/08_regression/28_backref_style_heredoc.code t/data/08_regression/28_backref_style_heredoc.dump t/data/08_regression/29_chained_casts.code t/data/08_regression/29_chained_casts.dump t/data/08_regression/29_magic_carat.code t/data/08_regression/29_magic_carat.dump t/data/08_regression/30_hash_bang.code t/data/08_regression/30_hash_bang.dump t/data/08_regression/31_hash_carat_H.code t/data/08_regression/31_hash_carat_H.dump t/data/08_regression/32_readline.code t/data/08_regression/32_readline.dump t/data/08_regression/33_magic_carat_long.code t/data/08_regression/33_magic_carat_long.dump t/data/08_regression/34_attr_whitespace.code t/data/08_regression/34_attr_whitespace.dump t/data/08_regression/35_attr_perlsub.code t/data/08_regression/35_attr_perlsub.dump t/data/08_regression/36_begin_label.code t/data/08_regression/36_begin_label.dump t/data/08_regression/37_partial_prototype.code t/data/08_regression/37_partial_prototype.dump t/data/08_regression/38_multiply.code t/data/08_regression/38_multiply.dump t/data/08_regression/39_foreach_our.code t/data/08_regression/39_foreach_our.dump t/data/08_regression/40_foreach_eval.code t/data/08_regression/40_foreach_eval.dump t/data/08_regression/41_scalar_hash.code t/data/08_regression/41_scalar_hash.dump t/data/08_regression/42_numeric_package.code t/data/08_regression/42_numeric_package.dump t/data/08_regression/43_nonblock_map.code t/data/08_regression/43_nonblock_map.dump t/data/08_regression/44_vstrings.code t/data/08_regression/44_vstrings.dump t/data/08_regression/45_heredoc_w_paren_in_terminator.code t/data/08_regression/45_heredoc_w_paren_in_terminator.dump t/data/08_regression/46_heredoc_w_paren_in_terminator.code t/data/08_regression/46_heredoc_w_paren_in_terminator.dump t/data/08_regression/47_heredoc_w_paren_in_terminator.code t/data/08_regression/47_heredoc_w_paren_in_terminator.dump t/data/08_regression/48_heredoc_w_paren_in_terminator.code t/data/08_regression/48_heredoc_w_paren_in_terminator.dump t/data/11_util/test.pm t/data/13_data/Foo.pm t/data/15_transform/sample1.pm t/data/15_transform/sample1.pm_out t/data/24_v6/Grammar.pm t/data/24_v6/Simple.pm t/data/26_bom/utf8.code t/data/26_bom/utf8.dump t/data/27_complete/01y_helloworld.code t/data/27_complete/02n_helloworld.code t/data/basic.pl t/data/filename.pl t/data/test2.txt t/interactive.t t/lib/Helper.pm t/lib/PPI/Test.pm t/lib/PPI/Test/Object.pm t/lib/PPI/Test/Run.pm t/lib/PPI/Test/pragmas.pm t/marpa.t t/ppi_element.t t/ppi_lexer.t t/ppi_node.t t/ppi_normal.t t/ppi_statement.t t/ppi_statement_compound.t t/ppi_statement_include.t t/ppi_statement_package.t t/ppi_statement_scheduled.t t/ppi_statement_sub.t t/ppi_statement_variable.t t/ppi_token.t t/ppi_token__quoteengine_full.t t/ppi_token_attribute.t t/ppi_token_dashedword.t t/ppi_token_heredoc.t t/ppi_token_magic.t t/ppi_token_number_version.t t/ppi_token_operator.t t/ppi_token_pod.t t/ppi_token_prototype.t t/ppi_token_quote.t t/ppi_token_quote_double.t t/ppi_token_quote_interpolate.t t/ppi_token_quote_literal.t t/ppi_token_quote_single.t t/ppi_token_quotelike_regexp.t t/ppi_token_quotelike_words.t t/ppi_token_regexp.t t/ppi_token_structure.t t/ppi_token_symbol.t t/ppi_token_unknown.t t/ppi_token_whitespace.t t/ppi_token_word.t xt/api.t xt/author.t xt/author/00-compile.t xt/author/distmeta.t xt/author/kwalitee.t xt/author/mojibake.t xt/author/pod-no404s.t xt/author/pod-syntax.t xt/author/portability.t xt/meta.t xt/pmv.t xt/release/changes_has_content.t PPI-1.272/LICENSE000644 000765 000024 00000043650 14176526433 013271 0ustar00olafstaff000000 000000 This software is copyright (c) 2002 by Adam Kennedy. 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) 2002 by Adam Kennedy. 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) 2002 by Adam Kennedy. 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 PPI-1.272/t/000755 000765 000024 00000000000 14176526434 012520 5ustar00olafstaff000000 000000 PPI-1.272/xt/000755 000765 000024 00000000000 14176526434 012710 5ustar00olafstaff000000 000000 PPI-1.272/META.yml000644 000765 000024 00000055234 14176526433 013536 0ustar00olafstaff000000 000000 --- abstract: 'Parse, Analyze and Manipulate Perl (without perl)' author: - 'Adam Kennedy ' build_requires: B: '0' Class::Inspector: '1.22' Encode: '0' ExtUtils::MakeMaker: '0' File::Copy: '0' File::Spec: '0' File::Spec::Functions: '0' File::Spec::Unix: '0' File::Temp: '0' Test::Deep: '0' Test::More: '0.96' Test::NoWarnings: '0' Test::Object: '0.07' Test::SubCalls: '1.07' lib: '0' utf8: '0' warnings: '0' configure_requires: ExtUtils::MakeMaker: '0' dynamic_config: 1 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: PPI provides: PPI: file: lib/PPI.pm version: '1.272' PPI::Cache: file: lib/PPI/Cache.pm version: '1.272' PPI::Document: file: lib/PPI/Document.pm version: '1.272' PPI::Document::File: file: lib/PPI/Document/File.pm version: '1.272' PPI::Document::Fragment: file: lib/PPI/Document/Fragment.pm version: '1.272' PPI::Document::Normalized: file: lib/PPI/Document/Normalized.pm version: '1.272' PPI::Dumper: file: lib/PPI/Dumper.pm version: '1.272' PPI::Element: file: lib/PPI/Element.pm version: '1.272' PPI::Exception: file: lib/PPI/Exception.pm version: '1.272' PPI::Exception::ParserRejection: file: lib/PPI/Exception/ParserRejection.pm version: '1.272' PPI::Find: file: lib/PPI/Find.pm version: '1.272' PPI::Lexer: file: lib/PPI/Lexer.pm version: '1.272' PPI::Node: file: lib/PPI/Node.pm version: '1.272' PPI::Normal: file: lib/PPI/Normal.pm version: '1.272' PPI::Normal::Standard: file: lib/PPI/Normal/Standard.pm version: '1.272' PPI::Singletons: file: lib/PPI/Singletons.pm version: '1.272' PPI::Statement: file: lib/PPI/Statement.pm version: '1.272' PPI::Statement::Break: file: lib/PPI/Statement/Break.pm version: '1.272' PPI::Statement::Compound: file: lib/PPI/Statement/Compound.pm version: '1.272' PPI::Statement::Data: file: lib/PPI/Statement/Data.pm version: '1.272' PPI::Statement::End: file: lib/PPI/Statement/End.pm version: '1.272' PPI::Statement::Expression: file: lib/PPI/Statement/Expression.pm version: '1.272' PPI::Statement::Given: file: lib/PPI/Statement/Given.pm version: '1.272' PPI::Statement::Include: file: lib/PPI/Statement/Include.pm version: '1.272' PPI::Statement::Include::Perl6: file: lib/PPI/Statement/Include/Perl6.pm version: '1.272' PPI::Statement::Null: file: lib/PPI/Statement/Null.pm version: '1.272' PPI::Statement::Package: file: lib/PPI/Statement/Package.pm version: '1.272' PPI::Statement::Scheduled: file: lib/PPI/Statement/Scheduled.pm version: '1.272' PPI::Statement::Sub: file: lib/PPI/Statement/Sub.pm version: '1.272' PPI::Statement::Unknown: file: lib/PPI/Statement/Unknown.pm version: '1.272' PPI::Statement::UnmatchedBrace: file: lib/PPI/Statement/UnmatchedBrace.pm version: '1.272' PPI::Statement::Variable: file: lib/PPI/Statement/Variable.pm version: '1.272' PPI::Statement::When: file: lib/PPI/Statement/When.pm version: '1.272' PPI::Structure: file: lib/PPI/Structure.pm version: '1.272' PPI::Structure::Block: file: lib/PPI/Structure/Block.pm version: '1.272' PPI::Structure::Condition: file: lib/PPI/Structure/Condition.pm version: '1.272' PPI::Structure::Constructor: file: lib/PPI/Structure/Constructor.pm version: '1.272' PPI::Structure::For: file: lib/PPI/Structure/For.pm version: '1.272' PPI::Structure::Given: file: lib/PPI/Structure/Given.pm version: '1.272' PPI::Structure::List: file: lib/PPI/Structure/List.pm version: '1.272' PPI::Structure::Subscript: file: lib/PPI/Structure/Subscript.pm version: '1.272' PPI::Structure::Unknown: file: lib/PPI/Structure/Unknown.pm version: '1.272' PPI::Structure::When: file: lib/PPI/Structure/When.pm version: '1.272' PPI::Token: file: lib/PPI/Token.pm version: '1.272' PPI::Token::ArrayIndex: file: lib/PPI/Token/ArrayIndex.pm version: '1.272' PPI::Token::Attribute: file: lib/PPI/Token/Attribute.pm version: '1.272' PPI::Token::BOM: file: lib/PPI/Token/BOM.pm version: '1.272' PPI::Token::Cast: file: lib/PPI/Token/Cast.pm version: '1.272' PPI::Token::Comment: file: lib/PPI/Token/Comment.pm version: '1.272' PPI::Token::DashedWord: file: lib/PPI/Token/DashedWord.pm version: '1.272' PPI::Token::Data: file: lib/PPI/Token/Data.pm version: '1.272' PPI::Token::End: file: lib/PPI/Token/End.pm version: '1.272' PPI::Token::HereDoc: file: lib/PPI/Token/HereDoc.pm version: '1.272' PPI::Token::Label: file: lib/PPI/Token/Label.pm version: '1.272' PPI::Token::Magic: file: lib/PPI/Token/Magic.pm version: '1.272' PPI::Token::Number: file: lib/PPI/Token/Number.pm version: '1.272' PPI::Token::Number::Binary: file: lib/PPI/Token/Number/Binary.pm version: '1.272' PPI::Token::Number::Exp: file: lib/PPI/Token/Number/Exp.pm version: '1.272' PPI::Token::Number::Float: file: lib/PPI/Token/Number/Float.pm version: '1.272' PPI::Token::Number::Hex: file: lib/PPI/Token/Number/Hex.pm version: '1.272' PPI::Token::Number::Octal: file: lib/PPI/Token/Number/Octal.pm version: '1.272' PPI::Token::Number::Version: file: lib/PPI/Token/Number/Version.pm version: '1.272' PPI::Token::Operator: file: lib/PPI/Token/Operator.pm version: '1.272' PPI::Token::Pod: file: lib/PPI/Token/Pod.pm version: '1.272' PPI::Token::Prototype: file: lib/PPI/Token/Prototype.pm version: '1.272' PPI::Token::Quote: file: lib/PPI/Token/Quote.pm version: '1.272' PPI::Token::Quote::Double: file: lib/PPI/Token/Quote/Double.pm version: '1.272' PPI::Token::Quote::Interpolate: file: lib/PPI/Token/Quote/Interpolate.pm version: '1.272' PPI::Token::Quote::Literal: file: lib/PPI/Token/Quote/Literal.pm version: '1.272' PPI::Token::Quote::Single: file: lib/PPI/Token/Quote/Single.pm version: '1.272' PPI::Token::QuoteLike: file: lib/PPI/Token/QuoteLike.pm version: '1.272' PPI::Token::QuoteLike::Backtick: file: lib/PPI/Token/QuoteLike/Backtick.pm version: '1.272' PPI::Token::QuoteLike::Command: file: lib/PPI/Token/QuoteLike/Command.pm version: '1.272' PPI::Token::QuoteLike::Readline: file: lib/PPI/Token/QuoteLike/Readline.pm version: '1.272' PPI::Token::QuoteLike::Regexp: file: lib/PPI/Token/QuoteLike/Regexp.pm version: '1.272' PPI::Token::QuoteLike::Words: file: lib/PPI/Token/QuoteLike/Words.pm version: '1.272' PPI::Token::Regexp: file: lib/PPI/Token/Regexp.pm version: '1.272' PPI::Token::Regexp::Match: file: lib/PPI/Token/Regexp/Match.pm version: '1.272' PPI::Token::Regexp::Substitute: file: lib/PPI/Token/Regexp/Substitute.pm version: '1.272' PPI::Token::Regexp::Transliterate: file: lib/PPI/Token/Regexp/Transliterate.pm version: '1.272' PPI::Token::Separator: file: lib/PPI/Token/Separator.pm version: '1.272' PPI::Token::Structure: file: lib/PPI/Token/Structure.pm version: '1.272' PPI::Token::Symbol: file: lib/PPI/Token/Symbol.pm version: '1.272' PPI::Token::Unknown: file: lib/PPI/Token/Unknown.pm version: '1.272' PPI::Token::Whitespace: file: lib/PPI/Token/Whitespace.pm version: '1.272' PPI::Token::Word: file: lib/PPI/Token/Word.pm version: '1.272' PPI::Tokenizer: file: lib/PPI/Tokenizer.pm version: '1.272' PPI::Transform: file: lib/PPI/Transform.pm version: '1.272' PPI::Transform::UpdateCopyright: file: lib/PPI/Transform/UpdateCopyright.pm version: '1.272' PPI::Util: file: lib/PPI/Util.pm version: '1.272' PPI::XSAccessor: file: lib/PPI/XSAccessor.pm version: '1.272' requires: Carp: '0' Clone: '0.30' Digest::MD5: '2.35' Exporter: '0' File::Path: '0' File::Spec: '0' List::Util: '1.33' Params::Util: '1.00' Scalar::Util: '0' Storable: '2.17' Task::Weaken: '0' constant: '0' if: '0' overload: '0' perl: '5.006' strict: '0' resources: bugtracker: https://github.com/Perl-Critic/PPI/issues homepage: https://github.com/Perl-Critic/PPI repository: https://github.com/Perl-Critic/PPI version: '1.272' x_Dist_Zilla: perl: version: '5.030002' plugins: - class: Dist::Zilla::Plugin::MetaResources name: MetaResources version: '6.024' - class: Dist::Zilla::Plugin::Encoding name: Encoding version: '6.024' - class: Dist::Zilla::Plugin::AutoPrereqs name: AutoPrereqs version: '6.024' - 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::DynamicPrereqs config: Dist::Zilla::Role::ModuleMetadata: Module::Metadata: '1.000037' version: '0.006' name: DynamicPrereqs version: '0.039' - class: Dist::Zilla::Plugin::OurPkgVersion name: OurPkgVersion version: '0.21' - class: Dist::Zilla::Plugin::Git::GatherDir config: Dist::Zilla::Plugin::GatherDir: exclude_filename: - README.pod exclude_match: [] 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::MetaYAML name: MetaYAML version: '6.024' - class: Dist::Zilla::Plugin::MetaJSON name: MetaJSON version: '6.024' - class: Dist::Zilla::Plugin::Readme name: Readme version: '6.024' - class: Dist::Zilla::Plugin::Manifest name: Manifest version: '6.024' - class: Dist::Zilla::Plugin::License name: License version: '6.024' - class: Dist::Zilla::Plugin::MakeMaker config: Dist::Zilla::Role::TestRunner: default_jobs: '1' name: MakeMaker version: '6.024' - class: Dist::Zilla::Plugin::Test::Compile config: Dist::Zilla::Plugin::Test::Compile: bail_out_on_fail: '1' fail_on_warning: author fake_home: 0 filename: xt/author/00-compile.t module_finder: - ':InstallModules' needs_display: 0 phase: develop script_finder: - ':PerlExecFiles' skips: [] switch: [] name: Test::Compile version: '2.058' - class: Dist::Zilla::Plugin::MetaTests name: MetaTests version: '6.024' - class: Dist::Zilla::Plugin::Test::ChangesHasContent name: Test::ChangesHasContent version: '0.011' - class: Dist::Zilla::Plugin::PodSyntaxTests name: PodSyntaxTests version: '6.024' - class: Dist::Zilla::Plugin::Test::Pod::No404s name: Test::Pod::No404s version: '1.004' - class: Dist::Zilla::Plugin::Test::Kwalitee config: Dist::Zilla::Plugin::Test::Kwalitee: filename: xt/author/kwalitee.t skiptest: [] name: Test::Kwalitee version: '2.12' - class: Dist::Zilla::Plugin::MojibakeTests name: MojibakeTests version: '0.8' - class: Dist::Zilla::Plugin::Test::ReportPrereqs name: Test::ReportPrereqs version: '0.028' - class: Dist::Zilla::Plugin::Test::Portability config: Dist::Zilla::Plugin::Test::Portability: options: '' name: Test::Portability version: '2.001000' - class: Dist::Zilla::Plugin::MetaProvides::Package config: Dist::Zilla::Plugin::MetaProvides::Package: finder_objects: - class: Dist::Zilla::Plugin::FinderCode name: MetaProvides::Package/AUTOVIV/:InstallModulesPM 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::MetaConfig name: MetaConfig version: '6.024' - class: Dist::Zilla::Plugin::Keywords config: Dist::Zilla::Plugin::Keywords: keywords: [] name: Keywords version: '0.007' - class: Dist::Zilla::Plugin::Git::Contributors config: Dist::Zilla::Plugin::Git::Contributors: git_version: 2.35.1 include_authors: 0 include_releaser: 1 order_by: name paths: [] name: Git::Contributors version: '0.036' - class: Dist::Zilla::Plugin::RunExtraTests config: Dist::Zilla::Role::TestRunner: default_jobs: '1' name: RunExtraTests version: '0.029' - class: Dist::Zilla::Plugin::Git::Check config: Dist::Zilla::Plugin::Git::Check: untracked_files: die Dist::Zilla::Role::Git::DirtyFiles: allow_dirty: - Changes - dist.ini allow_dirty_match: [] changelog: Changes Dist::Zilla::Role::Git::Repo: git_version: 2.35.1 repo_root: . name: 'initial check' version: '2.048' - class: Dist::Zilla::Plugin::Git::CheckFor::MergeConflicts config: Dist::Zilla::Role::Git::Repo: git_version: 2.35.1 repo_root: . name: Git::CheckFor::MergeConflicts version: '0.014' - class: Dist::Zilla::Plugin::Git::CheckFor::CorrectBranch config: Dist::Zilla::Role::Git::Repo: git_version: 2.35.1 repo_root: . name: Git::CheckFor::CorrectBranch version: '0.014' - class: Dist::Zilla::Plugin::CheckPrereqsIndexed name: CheckPrereqsIndexed version: '0.021' - class: Dist::Zilla::Plugin::TestRelease name: TestRelease version: '6.024' - class: Dist::Zilla::Plugin::Git::Check config: Dist::Zilla::Plugin::Git::Check: untracked_files: die Dist::Zilla::Role::Git::DirtyFiles: allow_dirty: - Changes - dist.ini allow_dirty_match: [] changelog: Changes Dist::Zilla::Role::Git::Repo: git_version: 2.35.1 repo_root: . name: 'after tests' version: '2.048' - class: Dist::Zilla::Plugin::UploadToCPAN name: UploadToCPAN version: '6.024' - class: Dist::Zilla::Plugin::Prereqs config: Dist::Zilla::Plugin::Prereqs: phase: develop type: recommends name: '@Git::VersionManager/pluginbundle version' version: '6.024' - class: Dist::Zilla::Plugin::RewriteVersion::Transitional config: Dist::Zilla::Plugin::RewriteVersion: add_tarball_name: 0 finders: - ':ExecFiles' - ':InstallModules' global: 0 skip_version_provider: 0 Dist::Zilla::Plugin::RewriteVersion::Transitional: _fallback_version_provider_args: {} fallback_version_provider: Git::NextVersion Git::NextVersion: Dist::Zilla::Plugin::Git::NextVersion: first_version: '0.001' version_by_branch: 0 version_regexp: (?^:^v(.+)$) Dist::Zilla::Role::Git::Repo: git_version: 2.35.1 repo_root: . name: '@Git::VersionManager/RewriteVersion::Transitional' version: '0.009' - class: Dist::Zilla::Plugin::MetaProvides::Update name: '@Git::VersionManager/MetaProvides::Update' version: '0.007' - class: Dist::Zilla::Plugin::CopyFilesFromRelease config: Dist::Zilla::Plugin::CopyFilesFromRelease: filename: - Changes match: [] name: '@Git::VersionManager/CopyFilesFromRelease' version: '0.007' - class: Dist::Zilla::Plugin::Git::Commit config: Dist::Zilla::Plugin::Git::Commit: add_files_in: - . commit_msg: '%N-%v%t%n%n%c' signoff: 0 Dist::Zilla::Role::Git::DirtyFiles: allow_dirty: - Changes allow_dirty_match: [] changelog: Changes Dist::Zilla::Role::Git::Repo: git_version: 2.35.1 repo_root: . Dist::Zilla::Role::Git::StringFormatter: time_zone: local name: '@Git::VersionManager/release snapshot' version: '2.048' - class: Dist::Zilla::Plugin::Git::Tag config: Dist::Zilla::Plugin::Git::Tag: branch: ~ changelog: Changes signed: 0 tag: v1.272 tag_format: v%v tag_message: v%v%t Dist::Zilla::Role::Git::Repo: git_version: 2.35.1 repo_root: . Dist::Zilla::Role::Git::StringFormatter: time_zone: local name: '@Git::VersionManager/Git::Tag' version: '2.048' - class: Dist::Zilla::Plugin::BumpVersionAfterRelease::Transitional config: Dist::Zilla::Plugin::BumpVersionAfterRelease: finders: - ':ExecFiles' - ':InstallModules' global: 0 munge_makefile_pl: 1 Dist::Zilla::Plugin::BumpVersionAfterRelease::Transitional: {} name: '@Git::VersionManager/BumpVersionAfterRelease::Transitional' version: '0.009' - class: Dist::Zilla::Plugin::NextRelease name: '@Git::VersionManager/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: - Build.PL - Changes - Makefile.PL allow_dirty_match: - (?^:^lib/.*\.pm$) changelog: Changes Dist::Zilla::Role::Git::Repo: git_version: 2.35.1 repo_root: . Dist::Zilla::Role::Git::StringFormatter: time_zone: local name: '@Git::VersionManager/post-release commit' version: '2.048' - class: Dist::Zilla::Plugin::ReadmeAnyFromPod config: Dist::Zilla::Role::FileWatcher: version: '0.006' name: ReadmeAnyFromPod version: '0.163250' - 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.35.1 repo_root: . name: Git::Push version: '2.048' - 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' - class: Dist::Zilla::Plugin::FinderCode name: MetaProvides::Package/AUTOVIV/:InstallModulesPM version: '6.024' zilla: class: Dist::Zilla::Dist::Builder config: is_trial: '0' version: '6.024' x_contributors: - 'Adam Kennedy ' - 'Arnout Pierre ' - 'bowtie ' - 'brian d foy ' - 'Chas. J. Owens IV ' - 'Chris Capaci ' - 'Chris Dolan ' - 'Christian Walde ' - 'Colin Newell ' - 'Damyan Ivanov ' - 'Dan Book ' - 'David Steinbrunner ' - 'Edmund Adjei ' - 'Elliot Shank ' - 'Gabor Szabo ' - 'Graham Knop ' - 'Graham Ollis ' - 'Guillaume Aubert ' - 'James E Keenan ' - 'Joel Maslak ' - 'Julian Fondren ' - 'Karen Etheridge ' - 'Kent Fredric ' - 'Lance Wicks ' - 'Matt Church ' - 'Matthew Horsfall ' - "Mike O'Regan " - 'Milos Kukla ' - 'Mohammad S Anwar ' - 'nanto_vi ' - 'Olaf Alders ' - 'Olivier Mengué ' - 'Philippe Bruhat (BooK) ' - 'Randy Lauen ' - 'Reini Urban ' - 'Shmuel Fomberg ' - 'Steffen Müller ' - 'Szymon Nieznański ' - 'Takumi Akiyama ' - 'Thomas Sibley ' - 'Tom Wyant ' - 'Van de Bugger ' - 'Will Braswell ' x_generated_by_perl: v5.30.2 x_serialization_backend: 'YAML::Tiny version 1.73' x_spdx_expression: 'Artistic-1.0-Perl OR GPL-1.0-or-later' PPI-1.272/META.json000644 000765 000024 00000104644 14176526433 013706 0ustar00olafstaff000000 000000 { "abstract" : "Parse, Analyze and Manipulate Perl (without perl)", "author" : [ "Adam Kennedy " ], "dynamic_config" : 1, "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" : "PPI", "prereqs" : { "configure" : { "requires" : { "ExtUtils::MakeMaker" : "0" } }, "develop" : { "recommends" : { "Dist::Zilla::PluginBundle::Git::VersionManager" : "0.007" }, "requires" : { "Encode" : "0", "File::Spec" : "0", "IO::Handle" : "0", "IPC::Open3" : "0", "Test::CPAN::Meta" : "0", "Test::ClassAPI" : "0", "Test::Kwalitee" : "1.21", "Test::Mojibake" : "0", "Test::More" : "0.94", "Test::Pod" : "1.41", "Test::Pod::No404s" : "0", "Test::Portability::Files" : "0", "lib" : "0", "warnings" : "0" } }, "runtime" : { "requires" : { "Carp" : "0", "Clone" : "0.30", "Digest::MD5" : "2.35", "Exporter" : "0", "File::Path" : "0", "File::Spec" : "0", "List::Util" : "1.33", "Params::Util" : "1.00", "Scalar::Util" : "0", "Storable" : "2.17", "Task::Weaken" : "0", "constant" : "0", "if" : "0", "overload" : "0", "perl" : "5.006", "strict" : "0" } }, "test" : { "recommends" : { "CPAN::Meta" : "2.120900" }, "requires" : { "B" : "0", "Class::Inspector" : "1.22", "Encode" : "0", "ExtUtils::MakeMaker" : "0", "File::Copy" : "0", "File::Spec" : "0", "File::Spec::Functions" : "0", "File::Spec::Unix" : "0", "File::Temp" : "0", "Test::Deep" : "0", "Test::More" : "0.96", "Test::NoWarnings" : "0", "Test::Object" : "0.07", "Test::SubCalls" : "1.07", "lib" : "0", "utf8" : "0", "warnings" : "0" } } }, "provides" : { "PPI" : { "file" : "lib/PPI.pm", "version" : "1.272" }, "PPI::Cache" : { "file" : "lib/PPI/Cache.pm", "version" : "1.272" }, "PPI::Document" : { "file" : "lib/PPI/Document.pm", "version" : "1.272" }, "PPI::Document::File" : { "file" : "lib/PPI/Document/File.pm", "version" : "1.272" }, "PPI::Document::Fragment" : { "file" : "lib/PPI/Document/Fragment.pm", "version" : "1.272" }, "PPI::Document::Normalized" : { "file" : "lib/PPI/Document/Normalized.pm", "version" : "1.272" }, "PPI::Dumper" : { "file" : "lib/PPI/Dumper.pm", "version" : "1.272" }, "PPI::Element" : { "file" : "lib/PPI/Element.pm", "version" : "1.272" }, "PPI::Exception" : { "file" : "lib/PPI/Exception.pm", "version" : "1.272" }, "PPI::Exception::ParserRejection" : { "file" : "lib/PPI/Exception/ParserRejection.pm", "version" : "1.272" }, "PPI::Find" : { "file" : "lib/PPI/Find.pm", "version" : "1.272" }, "PPI::Lexer" : { "file" : "lib/PPI/Lexer.pm", "version" : "1.272" }, "PPI::Node" : { "file" : "lib/PPI/Node.pm", "version" : "1.272" }, "PPI::Normal" : { "file" : "lib/PPI/Normal.pm", "version" : "1.272" }, "PPI::Normal::Standard" : { "file" : "lib/PPI/Normal/Standard.pm", "version" : "1.272" }, "PPI::Singletons" : { "file" : "lib/PPI/Singletons.pm", "version" : "1.272" }, "PPI::Statement" : { "file" : "lib/PPI/Statement.pm", "version" : "1.272" }, "PPI::Statement::Break" : { "file" : "lib/PPI/Statement/Break.pm", "version" : "1.272" }, "PPI::Statement::Compound" : { "file" : "lib/PPI/Statement/Compound.pm", "version" : "1.272" }, "PPI::Statement::Data" : { "file" : "lib/PPI/Statement/Data.pm", "version" : "1.272" }, "PPI::Statement::End" : { "file" : "lib/PPI/Statement/End.pm", "version" : "1.272" }, "PPI::Statement::Expression" : { "file" : "lib/PPI/Statement/Expression.pm", "version" : "1.272" }, "PPI::Statement::Given" : { "file" : "lib/PPI/Statement/Given.pm", "version" : "1.272" }, "PPI::Statement::Include" : { "file" : "lib/PPI/Statement/Include.pm", "version" : "1.272" }, "PPI::Statement::Include::Perl6" : { "file" : "lib/PPI/Statement/Include/Perl6.pm", "version" : "1.272" }, "PPI::Statement::Null" : { "file" : "lib/PPI/Statement/Null.pm", "version" : "1.272" }, "PPI::Statement::Package" : { "file" : "lib/PPI/Statement/Package.pm", "version" : "1.272" }, "PPI::Statement::Scheduled" : { "file" : "lib/PPI/Statement/Scheduled.pm", "version" : "1.272" }, "PPI::Statement::Sub" : { "file" : "lib/PPI/Statement/Sub.pm", "version" : "1.272" }, "PPI::Statement::Unknown" : { "file" : "lib/PPI/Statement/Unknown.pm", "version" : "1.272" }, "PPI::Statement::UnmatchedBrace" : { "file" : "lib/PPI/Statement/UnmatchedBrace.pm", "version" : "1.272" }, "PPI::Statement::Variable" : { "file" : "lib/PPI/Statement/Variable.pm", "version" : "1.272" }, "PPI::Statement::When" : { "file" : "lib/PPI/Statement/When.pm", "version" : "1.272" }, "PPI::Structure" : { "file" : "lib/PPI/Structure.pm", "version" : "1.272" }, "PPI::Structure::Block" : { "file" : "lib/PPI/Structure/Block.pm", "version" : "1.272" }, "PPI::Structure::Condition" : { "file" : "lib/PPI/Structure/Condition.pm", "version" : "1.272" }, "PPI::Structure::Constructor" : { "file" : "lib/PPI/Structure/Constructor.pm", "version" : "1.272" }, "PPI::Structure::For" : { "file" : "lib/PPI/Structure/For.pm", "version" : "1.272" }, "PPI::Structure::Given" : { "file" : "lib/PPI/Structure/Given.pm", "version" : "1.272" }, "PPI::Structure::List" : { "file" : "lib/PPI/Structure/List.pm", "version" : "1.272" }, "PPI::Structure::Subscript" : { "file" : "lib/PPI/Structure/Subscript.pm", "version" : "1.272" }, "PPI::Structure::Unknown" : { "file" : "lib/PPI/Structure/Unknown.pm", "version" : "1.272" }, "PPI::Structure::When" : { "file" : "lib/PPI/Structure/When.pm", "version" : "1.272" }, "PPI::Token" : { "file" : "lib/PPI/Token.pm", "version" : "1.272" }, "PPI::Token::ArrayIndex" : { "file" : "lib/PPI/Token/ArrayIndex.pm", "version" : "1.272" }, "PPI::Token::Attribute" : { "file" : "lib/PPI/Token/Attribute.pm", "version" : "1.272" }, "PPI::Token::BOM" : { "file" : "lib/PPI/Token/BOM.pm", "version" : "1.272" }, "PPI::Token::Cast" : { "file" : "lib/PPI/Token/Cast.pm", "version" : "1.272" }, "PPI::Token::Comment" : { "file" : "lib/PPI/Token/Comment.pm", "version" : "1.272" }, "PPI::Token::DashedWord" : { "file" : "lib/PPI/Token/DashedWord.pm", "version" : "1.272" }, "PPI::Token::Data" : { "file" : "lib/PPI/Token/Data.pm", "version" : "1.272" }, "PPI::Token::End" : { "file" : "lib/PPI/Token/End.pm", "version" : "1.272" }, "PPI::Token::HereDoc" : { "file" : "lib/PPI/Token/HereDoc.pm", "version" : "1.272" }, "PPI::Token::Label" : { "file" : "lib/PPI/Token/Label.pm", "version" : "1.272" }, "PPI::Token::Magic" : { "file" : "lib/PPI/Token/Magic.pm", "version" : "1.272" }, "PPI::Token::Number" : { "file" : "lib/PPI/Token/Number.pm", "version" : "1.272" }, "PPI::Token::Number::Binary" : { "file" : "lib/PPI/Token/Number/Binary.pm", "version" : "1.272" }, "PPI::Token::Number::Exp" : { "file" : "lib/PPI/Token/Number/Exp.pm", "version" : "1.272" }, "PPI::Token::Number::Float" : { "file" : "lib/PPI/Token/Number/Float.pm", "version" : "1.272" }, "PPI::Token::Number::Hex" : { "file" : "lib/PPI/Token/Number/Hex.pm", "version" : "1.272" }, "PPI::Token::Number::Octal" : { "file" : "lib/PPI/Token/Number/Octal.pm", "version" : "1.272" }, "PPI::Token::Number::Version" : { "file" : "lib/PPI/Token/Number/Version.pm", "version" : "1.272" }, "PPI::Token::Operator" : { "file" : "lib/PPI/Token/Operator.pm", "version" : "1.272" }, "PPI::Token::Pod" : { "file" : "lib/PPI/Token/Pod.pm", "version" : "1.272" }, "PPI::Token::Prototype" : { "file" : "lib/PPI/Token/Prototype.pm", "version" : "1.272" }, "PPI::Token::Quote" : { "file" : "lib/PPI/Token/Quote.pm", "version" : "1.272" }, "PPI::Token::Quote::Double" : { "file" : "lib/PPI/Token/Quote/Double.pm", "version" : "1.272" }, "PPI::Token::Quote::Interpolate" : { "file" : "lib/PPI/Token/Quote/Interpolate.pm", "version" : "1.272" }, "PPI::Token::Quote::Literal" : { "file" : "lib/PPI/Token/Quote/Literal.pm", "version" : "1.272" }, "PPI::Token::Quote::Single" : { "file" : "lib/PPI/Token/Quote/Single.pm", "version" : "1.272" }, "PPI::Token::QuoteLike" : { "file" : "lib/PPI/Token/QuoteLike.pm", "version" : "1.272" }, "PPI::Token::QuoteLike::Backtick" : { "file" : "lib/PPI/Token/QuoteLike/Backtick.pm", "version" : "1.272" }, "PPI::Token::QuoteLike::Command" : { "file" : "lib/PPI/Token/QuoteLike/Command.pm", "version" : "1.272" }, "PPI::Token::QuoteLike::Readline" : { "file" : "lib/PPI/Token/QuoteLike/Readline.pm", "version" : "1.272" }, "PPI::Token::QuoteLike::Regexp" : { "file" : "lib/PPI/Token/QuoteLike/Regexp.pm", "version" : "1.272" }, "PPI::Token::QuoteLike::Words" : { "file" : "lib/PPI/Token/QuoteLike/Words.pm", "version" : "1.272" }, "PPI::Token::Regexp" : { "file" : "lib/PPI/Token/Regexp.pm", "version" : "1.272" }, "PPI::Token::Regexp::Match" : { "file" : "lib/PPI/Token/Regexp/Match.pm", "version" : "1.272" }, "PPI::Token::Regexp::Substitute" : { "file" : "lib/PPI/Token/Regexp/Substitute.pm", "version" : "1.272" }, "PPI::Token::Regexp::Transliterate" : { "file" : "lib/PPI/Token/Regexp/Transliterate.pm", "version" : "1.272" }, "PPI::Token::Separator" : { "file" : "lib/PPI/Token/Separator.pm", "version" : "1.272" }, "PPI::Token::Structure" : { "file" : "lib/PPI/Token/Structure.pm", "version" : "1.272" }, "PPI::Token::Symbol" : { "file" : "lib/PPI/Token/Symbol.pm", "version" : "1.272" }, "PPI::Token::Unknown" : { "file" : "lib/PPI/Token/Unknown.pm", "version" : "1.272" }, "PPI::Token::Whitespace" : { "file" : "lib/PPI/Token/Whitespace.pm", "version" : "1.272" }, "PPI::Token::Word" : { "file" : "lib/PPI/Token/Word.pm", "version" : "1.272" }, "PPI::Tokenizer" : { "file" : "lib/PPI/Tokenizer.pm", "version" : "1.272" }, "PPI::Transform" : { "file" : "lib/PPI/Transform.pm", "version" : "1.272" }, "PPI::Transform::UpdateCopyright" : { "file" : "lib/PPI/Transform/UpdateCopyright.pm", "version" : "1.272" }, "PPI::Util" : { "file" : "lib/PPI/Util.pm", "version" : "1.272" }, "PPI::XSAccessor" : { "file" : "lib/PPI/XSAccessor.pm", "version" : "1.272" } }, "release_status" : "stable", "resources" : { "bugtracker" : { "web" : "https://github.com/Perl-Critic/PPI/issues" }, "homepage" : "https://github.com/Perl-Critic/PPI", "repository" : { "url" : "https://github.com/Perl-Critic/PPI" } }, "version" : "1.272", "x_Dist_Zilla" : { "perl" : { "version" : "5.030002" }, "plugins" : [ { "class" : "Dist::Zilla::Plugin::MetaResources", "name" : "MetaResources", "version" : "6.024" }, { "class" : "Dist::Zilla::Plugin::Encoding", "name" : "Encoding", "version" : "6.024" }, { "class" : "Dist::Zilla::Plugin::AutoPrereqs", "name" : "AutoPrereqs", "version" : "6.024" }, { "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::DynamicPrereqs", "config" : { "Dist::Zilla::Role::ModuleMetadata" : { "Module::Metadata" : "1.000037", "version" : "0.006" } }, "name" : "DynamicPrereqs", "version" : "0.039" }, { "class" : "Dist::Zilla::Plugin::OurPkgVersion", "name" : "OurPkgVersion", "version" : "0.21" }, { "class" : "Dist::Zilla::Plugin::Git::GatherDir", "config" : { "Dist::Zilla::Plugin::GatherDir" : { "exclude_filename" : [ "README.pod" ], "exclude_match" : [], "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::MetaYAML", "name" : "MetaYAML", "version" : "6.024" }, { "class" : "Dist::Zilla::Plugin::MetaJSON", "name" : "MetaJSON", "version" : "6.024" }, { "class" : "Dist::Zilla::Plugin::Readme", "name" : "Readme", "version" : "6.024" }, { "class" : "Dist::Zilla::Plugin::Manifest", "name" : "Manifest", "version" : "6.024" }, { "class" : "Dist::Zilla::Plugin::License", "name" : "License", "version" : "6.024" }, { "class" : "Dist::Zilla::Plugin::MakeMaker", "config" : { "Dist::Zilla::Role::TestRunner" : { "default_jobs" : "1" } }, "name" : "MakeMaker", "version" : "6.024" }, { "class" : "Dist::Zilla::Plugin::Test::Compile", "config" : { "Dist::Zilla::Plugin::Test::Compile" : { "bail_out_on_fail" : "1", "fail_on_warning" : "author", "fake_home" : 0, "filename" : "xt/author/00-compile.t", "module_finder" : [ ":InstallModules" ], "needs_display" : 0, "phase" : "develop", "script_finder" : [ ":PerlExecFiles" ], "skips" : [], "switch" : [] } }, "name" : "Test::Compile", "version" : "2.058" }, { "class" : "Dist::Zilla::Plugin::MetaTests", "name" : "MetaTests", "version" : "6.024" }, { "class" : "Dist::Zilla::Plugin::Test::ChangesHasContent", "name" : "Test::ChangesHasContent", "version" : "0.011" }, { "class" : "Dist::Zilla::Plugin::PodSyntaxTests", "name" : "PodSyntaxTests", "version" : "6.024" }, { "class" : "Dist::Zilla::Plugin::Test::Pod::No404s", "name" : "Test::Pod::No404s", "version" : "1.004" }, { "class" : "Dist::Zilla::Plugin::Test::Kwalitee", "config" : { "Dist::Zilla::Plugin::Test::Kwalitee" : { "filename" : "xt/author/kwalitee.t", "skiptest" : [] } }, "name" : "Test::Kwalitee", "version" : "2.12" }, { "class" : "Dist::Zilla::Plugin::MojibakeTests", "name" : "MojibakeTests", "version" : "0.8" }, { "class" : "Dist::Zilla::Plugin::Test::ReportPrereqs", "name" : "Test::ReportPrereqs", "version" : "0.028" }, { "class" : "Dist::Zilla::Plugin::Test::Portability", "config" : { "Dist::Zilla::Plugin::Test::Portability" : { "options" : "" } }, "name" : "Test::Portability", "version" : "2.001000" }, { "class" : "Dist::Zilla::Plugin::MetaProvides::Package", "config" : { "Dist::Zilla::Plugin::MetaProvides::Package" : { "finder_objects" : [ { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : "MetaProvides::Package/AUTOVIV/:InstallModulesPM", "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::MetaConfig", "name" : "MetaConfig", "version" : "6.024" }, { "class" : "Dist::Zilla::Plugin::Keywords", "config" : { "Dist::Zilla::Plugin::Keywords" : { "keywords" : [] } }, "name" : "Keywords", "version" : "0.007" }, { "class" : "Dist::Zilla::Plugin::Git::Contributors", "config" : { "Dist::Zilla::Plugin::Git::Contributors" : { "git_version" : "2.35.1", "include_authors" : 0, "include_releaser" : 1, "order_by" : "name", "paths" : [] } }, "name" : "Git::Contributors", "version" : "0.036" }, { "class" : "Dist::Zilla::Plugin::RunExtraTests", "config" : { "Dist::Zilla::Role::TestRunner" : { "default_jobs" : "1" } }, "name" : "RunExtraTests", "version" : "0.029" }, { "class" : "Dist::Zilla::Plugin::Git::Check", "config" : { "Dist::Zilla::Plugin::Git::Check" : { "untracked_files" : "die" }, "Dist::Zilla::Role::Git::DirtyFiles" : { "allow_dirty" : [ "Changes", "dist.ini" ], "allow_dirty_match" : [], "changelog" : "Changes" }, "Dist::Zilla::Role::Git::Repo" : { "git_version" : "2.35.1", "repo_root" : "." } }, "name" : "initial check", "version" : "2.048" }, { "class" : "Dist::Zilla::Plugin::Git::CheckFor::MergeConflicts", "config" : { "Dist::Zilla::Role::Git::Repo" : { "git_version" : "2.35.1", "repo_root" : "." } }, "name" : "Git::CheckFor::MergeConflicts", "version" : "0.014" }, { "class" : "Dist::Zilla::Plugin::Git::CheckFor::CorrectBranch", "config" : { "Dist::Zilla::Role::Git::Repo" : { "git_version" : "2.35.1", "repo_root" : "." } }, "name" : "Git::CheckFor::CorrectBranch", "version" : "0.014" }, { "class" : "Dist::Zilla::Plugin::CheckPrereqsIndexed", "name" : "CheckPrereqsIndexed", "version" : "0.021" }, { "class" : "Dist::Zilla::Plugin::TestRelease", "name" : "TestRelease", "version" : "6.024" }, { "class" : "Dist::Zilla::Plugin::Git::Check", "config" : { "Dist::Zilla::Plugin::Git::Check" : { "untracked_files" : "die" }, "Dist::Zilla::Role::Git::DirtyFiles" : { "allow_dirty" : [ "Changes", "dist.ini" ], "allow_dirty_match" : [], "changelog" : "Changes" }, "Dist::Zilla::Role::Git::Repo" : { "git_version" : "2.35.1", "repo_root" : "." } }, "name" : "after tests", "version" : "2.048" }, { "class" : "Dist::Zilla::Plugin::UploadToCPAN", "name" : "UploadToCPAN", "version" : "6.024" }, { "class" : "Dist::Zilla::Plugin::Prereqs", "config" : { "Dist::Zilla::Plugin::Prereqs" : { "phase" : "develop", "type" : "recommends" } }, "name" : "@Git::VersionManager/pluginbundle version", "version" : "6.024" }, { "class" : "Dist::Zilla::Plugin::RewriteVersion::Transitional", "config" : { "Dist::Zilla::Plugin::RewriteVersion" : { "add_tarball_name" : 0, "finders" : [ ":ExecFiles", ":InstallModules" ], "global" : 0, "skip_version_provider" : 0 }, "Dist::Zilla::Plugin::RewriteVersion::Transitional" : { "_fallback_version_provider_args" : {}, "fallback_version_provider" : "Git::NextVersion" }, "Git::NextVersion" : { "Dist::Zilla::Plugin::Git::NextVersion" : { "first_version" : "0.001", "version_by_branch" : 0, "version_regexp" : "(?^:^v(.+)$)" }, "Dist::Zilla::Role::Git::Repo" : { "git_version" : "2.35.1", "repo_root" : "." } } }, "name" : "@Git::VersionManager/RewriteVersion::Transitional", "version" : "0.009" }, { "class" : "Dist::Zilla::Plugin::MetaProvides::Update", "name" : "@Git::VersionManager/MetaProvides::Update", "version" : "0.007" }, { "class" : "Dist::Zilla::Plugin::CopyFilesFromRelease", "config" : { "Dist::Zilla::Plugin::CopyFilesFromRelease" : { "filename" : [ "Changes" ], "match" : [] } }, "name" : "@Git::VersionManager/CopyFilesFromRelease", "version" : "0.007" }, { "class" : "Dist::Zilla::Plugin::Git::Commit", "config" : { "Dist::Zilla::Plugin::Git::Commit" : { "add_files_in" : [ "." ], "commit_msg" : "%N-%v%t%n%n%c", "signoff" : 0 }, "Dist::Zilla::Role::Git::DirtyFiles" : { "allow_dirty" : [ "Changes" ], "allow_dirty_match" : [], "changelog" : "Changes" }, "Dist::Zilla::Role::Git::Repo" : { "git_version" : "2.35.1", "repo_root" : "." }, "Dist::Zilla::Role::Git::StringFormatter" : { "time_zone" : "local" } }, "name" : "@Git::VersionManager/release snapshot", "version" : "2.048" }, { "class" : "Dist::Zilla::Plugin::Git::Tag", "config" : { "Dist::Zilla::Plugin::Git::Tag" : { "branch" : null, "changelog" : "Changes", "signed" : 0, "tag" : "v1.272", "tag_format" : "v%v", "tag_message" : "v%v%t" }, "Dist::Zilla::Role::Git::Repo" : { "git_version" : "2.35.1", "repo_root" : "." }, "Dist::Zilla::Role::Git::StringFormatter" : { "time_zone" : "local" } }, "name" : "@Git::VersionManager/Git::Tag", "version" : "2.048" }, { "class" : "Dist::Zilla::Plugin::BumpVersionAfterRelease::Transitional", "config" : { "Dist::Zilla::Plugin::BumpVersionAfterRelease" : { "finders" : [ ":ExecFiles", ":InstallModules" ], "global" : 0, "munge_makefile_pl" : 1 }, "Dist::Zilla::Plugin::BumpVersionAfterRelease::Transitional" : {} }, "name" : "@Git::VersionManager/BumpVersionAfterRelease::Transitional", "version" : "0.009" }, { "class" : "Dist::Zilla::Plugin::NextRelease", "name" : "@Git::VersionManager/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" : [ "Build.PL", "Changes", "Makefile.PL" ], "allow_dirty_match" : [ "(?^:^lib/.*\\.pm$)" ], "changelog" : "Changes" }, "Dist::Zilla::Role::Git::Repo" : { "git_version" : "2.35.1", "repo_root" : "." }, "Dist::Zilla::Role::Git::StringFormatter" : { "time_zone" : "local" } }, "name" : "@Git::VersionManager/post-release commit", "version" : "2.048" }, { "class" : "Dist::Zilla::Plugin::ReadmeAnyFromPod", "config" : { "Dist::Zilla::Role::FileWatcher" : { "version" : "0.006" } }, "name" : "ReadmeAnyFromPod", "version" : "0.163250" }, { "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.35.1", "repo_root" : "." } }, "name" : "Git::Push", "version" : "2.048" }, { "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" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : "MetaProvides::Package/AUTOVIV/:InstallModulesPM", "version" : "6.024" } ], "zilla" : { "class" : "Dist::Zilla::Dist::Builder", "config" : { "is_trial" : 0 }, "version" : "6.024" } }, "x_contributors" : [ "Adam Kennedy ", "Arnout Pierre ", "bowtie ", "brian d foy ", "Chas. J. Owens IV ", "Chris Capaci ", "Chris Dolan ", "Christian Walde ", "Colin Newell ", "Damyan Ivanov ", "Dan Book ", "David Steinbrunner ", "Edmund Adjei ", "Elliot Shank ", "Gabor Szabo ", "Graham Knop ", "Graham Ollis ", "Guillaume Aubert ", "James E Keenan ", "Joel Maslak ", "Julian Fondren ", "Karen Etheridge ", "Kent Fredric ", "Lance Wicks ", "Matt Church ", "Matthew Horsfall ", "Mike O'Regan ", "Milos Kukla ", "Mohammad S Anwar ", "nanto_vi ", "Olaf Alders ", "Olivier Mengu\u00e9 ", "Philippe Bruhat (BooK) ", "Randy Lauen ", "Reini Urban ", "Shmuel Fomberg ", "Steffen M\u00fcller ", "Szymon Niezna\u0144ski ", "Takumi Akiyama ", "Thomas Sibley ", "Tom Wyant ", "Van de Bugger ", "Will Braswell " ], "x_generated_by_perl" : "v5.30.2", "x_serialization_backend" : "Cpanel::JSON::XS version 4.26", "x_spdx_expression" : "Artistic-1.0-Perl OR GPL-1.0-or-later" } PPI-1.272/lib/000755 000765 000024 00000000000 14176526433 013022 5ustar00olafstaff000000 000000 PPI-1.272/Makefile.PL000644 000765 000024 00000007043 14176526433 014232 0ustar00olafstaff000000 000000 # This file was automatically generated by Dist::Zilla::Plugin::MakeMaker v6.024. use strict; use warnings; use 5.006; use ExtUtils::MakeMaker; my %WriteMakefileArgs = ( "ABSTRACT" => "Parse, Analyze and Manipulate Perl (without perl)", "AUTHOR" => "Adam Kennedy ", "CONFIGURE_REQUIRES" => { "ExtUtils::MakeMaker" => 0 }, "DISTNAME" => "PPI", "LICENSE" => "perl", "MIN_PERL_VERSION" => "5.006", "NAME" => "PPI", "PREREQ_PM" => { "Carp" => 0, "Clone" => "0.30", "Digest::MD5" => "2.35", "Exporter" => 0, "File::Path" => 0, "File::Spec" => 0, "List::Util" => "1.33", "Params::Util" => "1.00", "Scalar::Util" => 0, "Storable" => "2.17", "Task::Weaken" => 0, "constant" => 0, "if" => 0, "overload" => 0, "strict" => 0 }, "TEST_REQUIRES" => { "B" => 0, "Class::Inspector" => "1.22", "Encode" => 0, "ExtUtils::MakeMaker" => 0, "File::Copy" => 0, "File::Spec" => 0, "File::Spec::Functions" => 0, "File::Spec::Unix" => 0, "File::Temp" => 0, "Test::Deep" => 0, "Test::More" => "0.96", "Test::NoWarnings" => 0, "Test::Object" => "0.07", "Test::SubCalls" => "1.07", "lib" => 0, "utf8" => 0, "warnings" => 0 }, "VERSION" => "1.272", "test" => { "TESTS" => "t/*.t" } ); my %FallbackPrereqs = ( "B" => 0, "Carp" => 0, "Class::Inspector" => "1.22", "Clone" => "0.30", "Digest::MD5" => "2.35", "Encode" => 0, "Exporter" => 0, "ExtUtils::MakeMaker" => 0, "File::Copy" => 0, "File::Path" => 0, "File::Spec" => 0, "File::Spec::Functions" => 0, "File::Spec::Unix" => 0, "File::Temp" => 0, "List::Util" => "1.33", "Params::Util" => "1.00", "Scalar::Util" => 0, "Storable" => "2.17", "Task::Weaken" => 0, "Test::Deep" => 0, "Test::More" => "0.96", "Test::NoWarnings" => 0, "Test::Object" => "0.07", "Test::SubCalls" => "1.07", "constant" => 0, "if" => 0, "lib" => 0, "overload" => 0, "strict" => 0, "utf8" => 0, "warnings" => 0 ); # inserted by Dist::Zilla::Plugin::DynamicPrereqs 0.039 requires('File::Spec', is_os('MSWin32') ? '3.2701' : '0.84'); requires('IO::String') if $] < '5.008000'; unless ( eval { ExtUtils::MakeMaker->VERSION(6.63_03) } ) { delete $WriteMakefileArgs{TEST_REQUIRES}; delete $WriteMakefileArgs{BUILD_REQUIRES}; $WriteMakefileArgs{PREREQ_PM} = \%FallbackPrereqs; } delete $WriteMakefileArgs{CONFIGURE_REQUIRES} unless eval { ExtUtils::MakeMaker->VERSION(6.52) }; WriteMakefile(%WriteMakefileArgs); # inserted by Dist::Zilla::Plugin::DynamicPrereqs 0.039 sub _add_prereq { my ($mm_key, $module, $version_or_range) = @_; $version_or_range ||= 0; warn "$module already exists in $mm_key (at version $WriteMakefileArgs{$mm_key}{$module}) -- need to do a sane metamerge!" if exists $WriteMakefileArgs{$mm_key}{$module} and $WriteMakefileArgs{$mm_key}{$module} ne '0' and $WriteMakefileArgs{$mm_key}{$module} ne $version_or_range; warn "$module already exists in FallbackPrereqs (at version $FallbackPrereqs{$module}) -- need to do a sane metamerge!" if exists $FallbackPrereqs{$module} and $FallbackPrereqs{$module} ne '0' and $FallbackPrereqs{$module} ne $version_or_range; $WriteMakefileArgs{$mm_key}{$module} = $FallbackPrereqs{$module} = $version_or_range; return; } sub is_os { foreach my $os (@_) { return 1 if $os eq $^O; } return 0; } sub requires { goto &runtime_requires } sub runtime_requires { my ($module, $version_or_range) = @_; _add_prereq(PREREQ_PM => $module, $version_or_range); } PPI-1.272/dist.ini000644 000765 000024 00000005026 14176526433 013723 0ustar00olafstaff000000 000000 name = PPI author = Adam Kennedy license = Perl_5 copyright_holder = Adam Kennedy copyright_year = 2002 [MetaResources] homepage = https://github.com/Perl-Critic/PPI bugtracker = https://github.com/Perl-Critic/PPI/issues repository = https://github.com/Perl-Critic/PPI [Encoding] ; exclude paths from autoprereqs detection encoding = bytes match = ^t/data/ [AutoPrereqs] ; to lower the risk of stuff getting overlooked skip = Class::XSAccessor ; used only in an experimental module skip = Time::HiRes ; optional, only used to speed up testing a little skip = PPI::XS ; optional, experimental [Prereqs] ; Force the existence of the weaken function ; (which some distributions annoyingly don't have) Task::Weaken = 0 [Prereqs / TestRequires] Test::More = 0.96 [DynamicPrereqs] -body = requires('File::Spec', is_os('MSWin32') ? '3.2701' : '0.84'); -body = requires('IO::String') if $] < '5.008000'; [OurPkgVersion] :version = 0.12 underscore_eval_version = 1 [Git::GatherDir] exclude_filename = README.pod [MetaYAML] [MetaJSON] [Readme] [Manifest] [License] [MakeMaker] [Test::Compile] :version = 2.039 bail_out_on_fail = 1 xt_mode = 1 ;[Test::NoTabs] ;[Test::EOL] [MetaTests] ;[Test::CPAN::Changes] [Test::ChangesHasContent] [PodSyntaxTests] ;[PodCoverageTests] ;[Test::PodSpelling] [Test::Pod::No404s] [Test::Kwalitee] :version = 2.10 filename = xt/author/kwalitee.t [MojibakeTests] :version = 0.8 [Test::ReportPrereqs] :version = 0.022 verify_prereqs = 1 version_extractor = ExtUtils::MakeMaker [Test::Portability] ;[Test::CleanNamespaces] [MetaProvides::Package] [MetaConfig] [Keywords] [Git::Contributors] [RunExtraTests] [Git::Check / initial check] [Git::CheckFor::MergeConflicts] [Git::CheckFor::CorrectBranch] :version = 0.004 release_branch = master [CheckPrereqsIndexed] :version = 0.019 [TestRelease] [Git::Check / after tests] [UploadToCPAN] ; The distribution version is calculated from the last git tag. ; To override, use V= dzil ... [@Git::VersionManager] RewriteVersion::Transitional.fallback_version_provider = Git::NextVersion NextRelease.format = %-6v %{yyyy-MM-dd HH:mm:ss'Z'}d%{ (TRIAL RELEASE)}T release snapshot.:version = 2.046 release snapshot.add_files_in = . release snapshot.commit_msg = %N-%v%t%n%n%c Git::Tag.tag_format = v%v Git::Tag.tag_message = v%v%t [ReadmeAnyFromPod] :version = 0.142180 type = pod location = root phase = release [Git::Push] ; listed late, to allow all other plugins which do BeforeRelease checks to run first. [ConfirmRelease] PPI-1.272/lib/PPI/000755 000765 000024 00000000000 14176526434 013453 5ustar00olafstaff000000 000000 PPI-1.272/lib/PPI.pm000644 000765 000024 00000073011 14176526433 014012 0ustar00olafstaff000000 000000 package PPI; # See POD at end for documentation use 5.006; use strict; # Set the version for CPAN our $VERSION = '1.272'; our ( $XS_COMPATIBLE, @XS_EXCLUDE ) = ( '0.845' ); # Load everything use PPI::Util (); use PPI::Exception (); use PPI::Element (); use PPI::Token (); use PPI::Statement (); use PPI::Structure (); use PPI::Document (); use PPI::Document::File (); use PPI::Document::Fragment (); use PPI::Document::Normalized (); use PPI::Normal (); use PPI::Tokenizer (); use PPI::Lexer (); # If it is installed, load in PPI::XS die if !$PPI::XS_DISABLE and !eval { require PPI::XS; 1 } and $@ !~ /^Can't locate .*? at /; # ignore failure to load if not installed 1; __END__ =pod =head1 NAME PPI - Parse, Analyze and Manipulate Perl (without perl) =head1 SYNOPSIS use PPI; # Create a new empty document my $Document = PPI::Document->new; # Create a document from source $Document = PPI::Document->new(\'print "Hello World!\n"'); # Load a Document from a file $Document = PPI::Document->new('Module.pm'); # Does it contain any POD? if ( $Document->find_any('PPI::Token::Pod') ) { print "Module contains POD\n"; } # Get the name of the main package $pkg = $Document->find_first('PPI::Statement::Package')->namespace; # Remove all that nasty documentation $Document->prune('PPI::Token::Pod'); $Document->prune('PPI::Token::Comment'); # Save the file $Document->save('Module.pm.stripped'); =head1 DESCRIPTION =head2 About this Document This is the PPI manual. It describes its reason for existing, its general structure, its use, an overview of the API, and provides a few implementation samples. =head2 Background The ability to read, and manipulate Perl (the language) programmatically other than with perl (the application) was one that caused difficulty for a long time. The cause of this problem was Perl's complex and dynamic grammar. Although there is typically not a huge diversity in the grammar of most Perl code, certain issues cause large problems when it comes to parsing. Indeed, quite early in Perl's history Tom Christiansen introduced the Perl community to the quote I<"Nothing but perl can parse Perl">, or as it is more often stated now as a truism: B<"Only perl can parse Perl"> One example of the sorts of things that prevent Perl from being easily parsed is function signatures, as demonstrated by the following. @result = (dothis $foo, $bar); # Which of the following is it equivalent to? @result = (dothis($foo), $bar); @result = dothis($foo, $bar); The first line above can be interpreted in two different ways, depending on whether the C<&dothis> function is expecting one argument, or two, or several. A "code parser" (something that parses for the purpose of execution) such as perl needs information that is not found in the immediate vicinity of the statement being parsed. The information might not just be elsewhere in the file, it might not even be in the same file at all. It might also not be able to determine this information without the prior execution of a C block, or the loading and execution of one or more external modules. Or worse the C<&dothis> function may not even have been written yet. B Even perl itself never really fully understands the structure of the source code after and indeed B it processes it, and in that sense doesn't "parse" Perl source into anything remotely like a structured document. This makes it of no real use for any task that needs to treat the source code as a document, and do so reliably and robustly. For more information on why it is impossible to parse perl, see Randal Schwartz's seminal response to the question of "Why can't you parse Perl". L The purpose of PPI is B to parse Perl I, but to parse Perl I. By treating the problem this way, we are able to parse a single file containing Perl source code "isolated" from any other resources, such as libraries upon which the code may depend, and without needing to run an instance of perl alongside or inside the parser. Historically, using an embedded perl parser was widely considered to be the most likely avenue for finding a solution to parsing Perl. It has been investigated from time to time, but attempts have generally failed or suffered from sufficiently bad corner cases that they were abandoned. =head2 What Does PPI Stand For? C is an acronym for the longer original module name C. And in the spirit of the silly acronym games played by certain unnamed Open Source projects you may have I of, it is also a reverse backronym of "I Parse Perl". Of course, I could just be lying and have just made that second bit up 10 minutes before the release of PPI 1.000. Besides, B the cool Perl packages have TLAs (Three Letter Acronyms). It's a rule or something. Why don't you just think of it as the B for simplicity. The original name was shortened to prevent the author (and you the users) from contracting RSI by having to type crazy things like C 100 times a day. In acknowledgment that someone may some day come up with a valid solution for the grammar problem it was decided at the commencement of the project to leave the C namespace free for any such effort. Since that time I've been able to prove to my own satisfaction that it B truly impossible to accurately parse Perl as both code and document at once. For the academics, parsing Perl suffers from the "Halting Problem". =head2 Why Parse Perl? Once you can accept that we will never be able to parse Perl well enough to meet the standards of things that treat Perl as code, it is worth re-examining I we want to "parse" Perl at all. What are the things that people might want a "Perl parser" for? =over 4 =item Documentation Analyzing the contents of a Perl document to automatically generate documentation, in parallel to, or as a replacement for, POD documentation. Allow an indexer to locate and process all the comments and documentation from code for "full text search" applications. =item Structural and Quality Analysis Determine quality or other metrics across a body of code, and identify situations relating to particular phrases, techniques or locations. Index functions, variables and packages within Perl code, and doing search and graph (in the node/edge sense) analysis of large code bases. L, based on PPI, is a large, thriving tool for bug detection and style analysis of Perl code. =item Refactoring Make structural, syntax, or other changes to code in an automated manner, either independently or in assistance to an editor. This sort of task list includes backporting, forward porting, partial evaluation, "improving" code, or whatever. All the sort of things you'd want from a L. =item Layout Change the layout of code without changing its meaning. This includes techniques such as tidying (like L), obfuscation, compressing and "squishing", or to implement formatting preferences or policies. =item Presentation This includes methods of improving the presentation of code, without changing the content of the code. Modify, improve, syntax colour etc the presentation of a Perl document. Generating "IntelliText"-like functions. =back If we treat this as a baseline for the sort of things we are going to have to build on top of Perl, then it becomes possible to identify a standard for how good a Perl parser needs to be. =head2 How good is Good Enough(TM) PPI seeks to be good enough to achieve all of the above tasks, or to provide a sufficiently good API on which to allow others to implement modules in these and related areas. However, there are going to be limits to this process. Because PPI cannot adapt to changing grammars, any code written using source filters should not be assumed to be parsable. At one extreme, this includes anything munged by L, as well as (arguably) more common cases like L. We do not pretend to be able to always parse code using these modules, although as long as it still follows a format that looks like Perl syntax, it may be possible to extend the lexer to handle them. The ability to extend PPI to handle lexical additions to the language is on the drawing board to be done some time post-1.0 The goal for success was originally to be able to successfully parse 99% of all Perl documents contained in CPAN. This means the entire file in each case. PPI has succeeded in this goal far beyond the expectations of even the author. At time of writing there are only 28 non-Acme Perl modules in CPAN that PPI is incapable of parsing. Most of these are so badly broken they do not compile as Perl code anyway. So unless you are actively going out of your way to break PPI, you should expect that it will handle your code just fine. =head2 Internationalisation PPI provides partial support for internationalisation and localisation. Specifically, it allows the use of characters from the Latin-1 character set to be used in quotes, comments, and POD. Primarily, this covers languages from Europe and South America. PPI does B currently provide support for Unicode. If you need Unicode support and would like to help, contact the author. (contact details below) =head2 Round Trip Safe When PPI parses a file it builds B into the model, including whitespace. This is needed in order to make the Document fully "Round Trip" safe. The general concept behind a "Round Trip" parser is that it knows what it is parsing is somewhat uncertain, and so B to get things wrong from time to time. In the cases where it parses code wrongly the tree will serialize back out to the same string of code that was read in, repairing the parser's mistake as it heads back out to the file. The end result is that if you parse in a file and serialize it back out without changing the tree, you are guaranteed to get the same file you started with. PPI does this correctly and reliably for 100% of all known cases. B The one minor exception at this time is that if the newlines for your file are wrong (meaning not matching the platform newline format), PPI will localise them for you. (It isn't to be convenient, supporting arbitrary newlines would make some of the code more complicated) Better control of the newline type is on the wish list though, and anyone wanting to help out is encouraged to contact the author. =head1 IMPLEMENTATION =head2 General Layout PPI is built upon two primary "parsing" components, L and L, and a large tree of about 70 classes which implement the various the I (PDOM). The PDOM is conceptually similar in style and intent to the regular DOM or other code Abstract Syntax Trees (ASTs), but contains some differences to handle perl-specific cases, and to assist in treating the code as a document. Please note that it is B an implementation of the official Document Object Model specification, only somewhat similar to it. On top of the Tokenizer, Lexer and the classes of the PDOM, sit a number of classes intended to make life a little easier when dealing with PDOM trees. Both the major parsing components were hand-coded from scratch with only plain Perl code and a few small utility modules. There are no grammar or patterns mini-languages, no YACC or LEX style tools and only a small number of regular expressions. This is primarily because of the sheer volume of accumulated cruft that exists in Perl. Not even perl itself is capable of parsing Perl documents (remember, it just parses and executes it as code). As a result, PPI needed to be cruftier than perl itself. Feel free to shudder at this point, and hope you never have to understand the Tokenizer codebase. Speaking of which... =head2 The Tokenizer The Tokenizer takes source code and converts it into a series of tokens. It does this using a slow but thorough character by character manual process, rather than using a pattern system or complex regexes. Or at least it does so conceptually. If you were to actually trace the code you would find it's not truly character by character due to a number of regexps and optimisations throughout the code. This lets the Tokenizer "skip ahead" when it can find shortcuts, so it tends to jump around a line a bit wildly at times. In practice, the number of times the Tokenizer will B move the character cursor itself is only about 5% - 10% higher than the number of tokens contained in the file. This makes it about as optimal as it can be made without implementing it in something other than Perl. In 2001 when PPI was started, this structure made PPI quite slow, and not really suitable for interactive tasks. This situation has improved greatly with multi-gigahertz processors, but can still be painful when working with very large files. The target parsing rate for PPI is about 5000 lines per gigacycle. It is currently believed to be at about 1500, and the main avenue for making it to the target speed has now become L, a drop-in XS accelerator for PPI. Since L has only just gotten off the ground and is currently only at proof-of-concept stage, this may take a little while. Anyone interested in helping out with L is B encouraged to contact the author. In fact, the design of L means it's possible to port one function at a time safely and reliably. So every little bit will help. =head2 The Lexer The Lexer takes a token stream, and converts it to a lexical tree. Because we are parsing Perl B this includes whitespace, comments, and all number of weird things that have no relevance when code is actually executed. An instantiated L consumes L objects and produces L objects. However you should probably never be working with the Lexer directly. You should just be able to create L objects and work with them directly. =head2 The Perl Document Object Model The PDOM is a structured collection of data classes that together provide a correct and scalable model for documents that follow the standard Perl syntax. =head2 The PDOM Class Tree The following lists all of the 72 current PDOM classes, listing with indentation based on inheritance. PPI::Element PPI::Node PPI::Document PPI::Document::Fragment PPI::Statement PPI::Statement::Package PPI::Statement::Include PPI::Statement::Sub PPI::Statement::Scheduled PPI::Statement::Compound PPI::Statement::Break PPI::Statement::Given PPI::Statement::When PPI::Statement::Data PPI::Statement::End PPI::Statement::Expression PPI::Statement::Variable PPI::Statement::Null PPI::Statement::UnmatchedBrace PPI::Statement::Unknown PPI::Structure PPI::Structure::Block PPI::Structure::Subscript PPI::Structure::Constructor PPI::Structure::Condition PPI::Structure::List PPI::Structure::For PPI::Structure::Given PPI::Structure::When PPI::Structure::Unknown PPI::Token PPI::Token::Whitespace PPI::Token::Comment PPI::Token::Pod PPI::Token::Number PPI::Token::Number::Binary PPI::Token::Number::Octal PPI::Token::Number::Hex PPI::Token::Number::Float PPI::Token::Number::Exp PPI::Token::Number::Version PPI::Token::Word PPI::Token::DashedWord PPI::Token::Symbol PPI::Token::Magic PPI::Token::ArrayIndex PPI::Token::Operator PPI::Token::Quote PPI::Token::Quote::Single PPI::Token::Quote::Double PPI::Token::Quote::Literal PPI::Token::Quote::Interpolate PPI::Token::QuoteLike PPI::Token::QuoteLike::Backtick PPI::Token::QuoteLike::Command PPI::Token::QuoteLike::Regexp PPI::Token::QuoteLike::Words PPI::Token::QuoteLike::Readline PPI::Token::Regexp PPI::Token::Regexp::Match PPI::Token::Regexp::Substitute PPI::Token::Regexp::Transliterate PPI::Token::HereDoc PPI::Token::Cast PPI::Token::Structure PPI::Token::Label PPI::Token::Separator PPI::Token::Data PPI::Token::End PPI::Token::Prototype PPI::Token::Attribute PPI::Token::Unknown To summarize the above layout, all PDOM objects inherit from the L class. Under this are L, strings of content with a known type, and L, syntactically significant containers that hold other Elements. The three most important of these are the L, the L and the L classes. =head2 The Document, Statement and Structure At the top of all complete PDOM trees is a L object. It represents a complete file of Perl source code as you might find it on disk. There are some specialised types of document, such as L and L but for the purposes of the PDOM they are all just considered to be the same thing. Each Document will contain a number of B, B and B. A L is any series of Tokens and Structures that are treated as a single contiguous statement by perl itself. You should note that a Statement is as close as PPI can get to "parsing" the code in the sense that perl-itself parses Perl code when it is building the op-tree. Because of the isolation and Perl's syntax, it is provably impossible for PPI to accurately determine precedence of operators or which tokens are implicit arguments to a sub call. So rather than lead you on with a bad guess that has a strong chance of being wrong, PPI does not attempt to determine precedence or sub parameters at all. At a fundamental level, it only knows that this series of elements represents a single Statement as perl sees it, but it can do so with enough certainty that it can be trusted. However, for specific Statement types the PDOM is able to derive additional useful information about their meaning. For the best, most useful, and most heavily used example, see L. A L is any series of tokens contained within matching braces. This includes code blocks, conditions, function argument braces, anonymous array and hash constructors, lists, scoping braces and all other syntactic structures represented by a matching pair of braces, including (although it may not seem obvious at first) CREADLINEE> braces. Each Structure contains none, one, or many Tokens and Structures (the rules for which vary for the different Structure subclasses) Under the PDOM structure rules, a Statement can B directly contain another child Statement, a Structure can B directly contain another child Structure, and a Document can B contain another Document anywhere in the tree. Aside from these three rules, the PDOM tree is extremely flexible. =head2 The PDOM at Work To demonstrate the PDOM in use lets start with an example showing how the tree might look for the following chunk of simple Perl code. #!/usr/bin/perl print( "Hello World!" ); exit(); Translated into a PDOM tree it would have the following structure (as shown via the included L). PPI::Document PPI::Token::Comment '#!/usr/bin/perl\n' PPI::Token::Whitespace '\n' PPI::Statement PPI::Token::Word 'print' PPI::Structure::List ( ... ) PPI::Token::Whitespace ' ' PPI::Statement::Expression PPI::Token::Quote::Double '"Hello World!"' PPI::Token::Whitespace ' ' PPI::Token::Structure ';' PPI::Token::Whitespace '\n' PPI::Token::Whitespace '\n' PPI::Statement PPI::Token::Word 'exit' PPI::Structure::List ( ... ) PPI::Token::Structure ';' PPI::Token::Whitespace '\n' Please note that in this example, strings are only listed for the B L that contains that string. Structures are listed with the type of brace characters they represent noted. The L module can be used to generate similar trees yourself. We can make that PDOM dump a little easier to read if we strip out all the whitespace. Here it is again, sans the distracting whitespace tokens. PPI::Document PPI::Token::Comment '#!/usr/bin/perl\n' PPI::Statement PPI::Token::Word 'print' PPI::Structure::List ( ... ) PPI::Statement::Expression PPI::Token::Quote::Double '"Hello World!"' PPI::Token::Structure ';' PPI::Statement PPI::Token::Word 'exit' PPI::Structure::List ( ... ) PPI::Token::Structure ';' As you can see, the tree can get fairly deep at time, especially when every isolated token in a bracket becomes its own statement. This is needed to allow anything inside the tree the ability to grow. It also makes the search and analysis algorithms much more flexible. Because of the depth and complexity of PDOM trees, a vast number of very easy to use methods have been added wherever possible to help people working with PDOM trees do normal tasks relatively quickly and efficiently. =head2 Overview of the Primary Classes The main PPI classes, and links to their own documentation, are listed here in alphabetical order. =over 4 =item L The Document object, the root of the PDOM. =item L A cohesive fragment of a larger Document. Although not of any real current use, it is needed for use in certain internal tree manipulation algorithms. For example, doing things like cut/copy/paste etc. Very similar to a L, but has some additional methods and does not represent a lexical scope boundary. A document fragment is also non-serializable, and so cannot be written out to a file. =item L A simple class for dumping readable debugging versions of PDOM structures, such as in the demonstration above. =item L The Element class is the abstract base class for all objects within the PDOM =item L Implements an instantiable object form of a PDOM tree search. =item L The PPI Lexer. Converts Token streams into PDOM trees. =item L The Node object, the abstract base class for all PDOM objects that can contain other Elements, such as the Document, Statement and Structure objects. =item L The base class for all Perl statements. Generic "evaluate for side-effects" statements are of this actual type. Other more interesting statement types belong to one of its children. See its own documentation for a longer description and list of all of the different statement types and sub-classes. =item L The abstract base class for all structures. A Structure is a language construct consisting of matching braces containing a set of other elements. See the L documentation for a description and list of all of the different structure types and sub-classes. =item L A token is the basic unit of content. At its most basic, a Token is just a string tagged with metadata (its class, and some additional flags in some cases). =item L The L and L classes provide abstract base classes for the many and varied types of quote and quote-like things in Perl. However, much of the actual quote logic is implemented in a separate quote engine, based at L. Classes that inherit from L, L and L are generally parsed only by the Quote Engine. =item L The PPI Tokenizer. One Tokenizer consumes a chunk of text and provides access to a stream of L objects. The Tokenizer is very very complicated, to the point where even the author treads carefully when working with it. Most of the complication is the result of optimizations which have tripled the tokenization speed, at the expense of maintainability. We cope with the spaghetti by heavily commenting everything. =item L The Perl Document Transformation API. Provides a standard interface and abstract base class for objects and classes that manipulate Documents. =back =head1 INSTALLING The core PPI distribution is pure Perl and has been kept as tight as possible and with as few dependencies as possible. It should download and install normally on any platform from within the CPAN and CPANPLUS applications, or directly using the distribution tarball. If installing by hand, you may need to install a few small utility modules first. The exact ones will depend on your version of perl. There are no special install instructions for PPI, and the normal C, C, C, C instructions apply. =head1 EXTENDING The PPI namespace itself is reserved for use by PPI itself. You are recommended to use the PPIx:: namespace for PPI-specific modifications or prototypes thereof, or Perl:: for modules which provide a general Perl language-related functions. If what you wish to implement looks like it fits into the PPIx:: namespace, you should consider contacting the PPI maintainers on GitHub first, as what you want may already be in progress, or you may wish to consider contributing to PPI itself. =head1 TO DO - Many more analysis and utility methods for PDOM classes - Creation of a PPI::Tutorial document - Add many more key functions to PPI::XS - We can B write more and better unit tests - Complete the full implementation of -Eliteral (1.200) - Full understanding of scoping (due 1.300) =head1 SUPPORT The most recent version of PPI is available at the following address. L PPI source is maintained in a GitHub repository at the following address. L Contributions via GitHub pull request are welcome. Bug fixes in the form of pull requests or bug reports with new (failing) unit tests have the best chance of being addressed by busy maintainers, and are B encouraged. If you cannot provide a test or fix, or don't have time to do so, then regular bug reports are still accepted and appreciated via the GitHub bug tracker. L The C utility that is part of the L distribution is a useful tool for demonstrating how PPI is parsing (or misparsing) small code snippets, and for providing information for bug reports. For other issues, questions, or commercial or media-related enquiries, contact the author. =head1 AUTHOR Adam Kennedy Eadamk@cpan.orgE =head1 ACKNOWLEDGMENTS A huge thank you to Phase N Australia (L) for permitting the original open sourcing and release of this distribution from what was originally several thousand hours of commercial work. Another big thank you to The Perl Foundation (L) for funding for the final big refactoring and completion run. Also, to the various co-maintainers that have contributed both large and small with tests and patches and especially to those rare few who have deep-dived into the guts to (gasp) add a feature. - Dan Brook : PPIx::XPath, Acme::PerlML - Audrey Tang : "Line Noise" Testing - Arjen Laarhoven : Three-element ->location support - Elliot Shank : Perl 5.10 support, five-element ->location And finally, thanks to those brave ( and foolish :) ) souls willing to dive in and use, test drive and provide feedback on PPI before version 1.000, in some cases before it made it to beta quality, and still did extremely distasteful things (like eating 50 meg of RAM a second). I owe you all a beer. Corner me somewhere and collect at your convenience. If I missed someone who wasn't in my email history, thank you too :) # In approximate order of appearance - Claes Jacobsson - Michael Schwern - Jeff T. Parsons - CPAN Author "CHOCOLATEBOY" - Robert Rotherberg - CPAN Author "PODMASTER" - Richard Soderberg - Nadim ibn Hamouda el Khemir - Graciliano M. P. - Leon Brocard - Jody Belka - Curtis Ovid - Yuval Kogman - Michael Schilli - Slaven Rezic - Lars Thegler - Tony Stubblebine - Tatsuhiko Miyagawa - CPAN Author "CHROMATIC" - Matisse Enzer - Roy Fulbright - Dan Brook - Johnny Lee - Johan Lindstrom And to single one person out, thanks go to Randal Schwartz who spent a great number of hours in IRC over a critical 6 month period explaining why Perl is impossibly unparsable and constantly shoving evil and ugly corner cases in my face. He remained a tireless devil's advocate, and without his support this project genuinely could never have been completed. So for my schooling in the Deep Magiks, you have my deepest gratitude Randal. =head1 COPYRIGHT Copyright 2001 - 2011 Adam Kennedy. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. The full text of the license can be found in the LICENSE file included with this module. =cut PPI-1.272/lib/PPI/Cache.pm000644 000765 000024 00000014214 14176526434 015016 0ustar00olafstaff000000 000000 package PPI::Cache; =pod =head1 NAME PPI::Cache - The PPI Document Caching Layer =head1 SYNOPSIS # Set the cache use PPI::Cache path => '/var/cache/ppi-cache'; # Manually create a cache my $Cache = PPI::Cache->new( path => '/var/cache/perl/class-PPI', readonly => 1, ); =head1 DESCRIPTION C provides the default caching functionality for L. It integrates automatically with L itself. Once enabled, any attempt to load a document from the filesystem will be cached via cache. Please note that creating a L from raw source or something other object will B be cached. =head2 Using PPI::Cache The most common way of using C is to provide parameters to the C statement at the beginning of your program. # Load the class but do not set a cache use PPI::Cache; # Use a fairly normal cache location use PPI::Cache path => '/var/cache/ppi-cache'; Any of the arguments that can be provided to the C constructor can also be provided to C. =head1 METHODS =cut use strict; use Carp (); use File::Spec (); use File::Path (); use Storable 2.17 (); use Digest::MD5 2.35 (); use Params::Util qw{_INSTANCE _SCALAR}; use PPI::Document (); our $VERSION = '1.272'; use constant VMS => !! ( $^O eq 'VMS' ); sub import { my $class = ref $_[0] ? ref shift : shift; return 1 unless @_; # Create a cache from the params provided my $cache = $class->new(@_); # Make PPI::Document use it unless ( PPI::Document->set_cache( $cache ) ) { Carp::croak("Failed to set cache in PPI::Document"); } 1; } ##################################################################### # Constructor and Accessors =pod =head2 new param => $value, ... The C constructor creates a new standalone cache object. It takes a number of parameters to control the cache. =over =item path The C param sets the base directory for the cache. It must already exist, and must be writable. =item readonly The C param is a true/false flag that allows the use of an existing cache by a less-privileged user (such as the web user). Existing documents will be retrieved from the cache, but new documents will not be written to it. =back Returns a new C object, or dies on error. =cut sub new { my $class = shift; my %params = @_; # Path should exist and be usable my $path = $params{path} or Carp::croak("Cannot create PPI::Cache, no path provided"); unless ( -d $path ) { Carp::croak("Cannot create PPI::Cache, path does not exist"); } unless ( -r $path and -x $path ) { Carp::croak("Cannot create PPI::Cache, no read permissions for path"); } if ( ! $params{readonly} and ! -w $path ) { Carp::croak("Cannot create PPI::Cache, no write permissions for path"); } # Create the basic object my $self = bless { path => $path, readonly => !! $params{readonly}, }, $class; $self; } =pod =head2 path The C accessor returns the path on the local filesystem that is the root of the cache. =cut sub path { $_[0]->{path} } =pod =head2 readonly The C accessor returns true if documents should not be written to the cache. =cut sub readonly { $_[0]->{readonly} } ##################################################################### # PPI::Cache Methods =pod =head2 get_document $md5sum | \$source The C method checks to see if a Document is stored in the cache and retrieves it if so. =cut sub get_document { my $self = ref $_[0] ? shift : Carp::croak('PPI::Cache::get_document called as static method'); my $md5hex = $self->_md5hex(shift) or return undef; $self->_load($md5hex); } =pod =head2 store_document $Document The C method takes a L as argument and explicitly adds it to the cache. Returns true if saved, or C (or dies) on error. FIXME (make this return either one or the other, not both) =cut sub store_document { my $self = shift; my $Document = _INSTANCE(shift, 'PPI::Document') or return undef; # Shortcut if we are readonly return 1 if $self->readonly; # Find the filename to save to my $md5hex = $Document->hex_id or return undef; # Store the file $self->_store( $md5hex, $Document ); } ##################################################################### # Support Methods # Store an arbitrary PPI::Document object (using Storable) to a particular # path within the cache filesystem. sub _store { my ($self, $md5hex, $object) = @_; my ($dir, $file) = $self->_paths($md5hex); # Save the file File::Path::mkpath( $dir, 0, 0755 ) unless -d $dir; if ( VMS ) { Storable::lock_nstore( $object, $file ); } else { Storable::nstore( $object, $file ); } } # Load an arbitrary object (using Storable) from a particular # path within the cache filesystem. sub _load { my ($self, $md5hex) = @_; my (undef, $file) = $self->_paths($md5hex); # Load the file return '' unless -f $file; my $object = VMS ? Storable::retrieve( $file ) : Storable::lock_retrieve( $file ); # Security check unless ( _INSTANCE($object, 'PPI::Document') ) { Carp::croak("Security Violation: Object in '$file' is not a PPI::Document"); } $object; } # Convert a md5 to a dir and file name sub _paths { my $self = shift; my $md5hex = lc shift; my $dir = File::Spec->catdir( $self->path, substr($md5hex, 0, 1), substr($md5hex, 0, 2) ); my $file = File::Spec->catfile( $dir, $md5hex . '.ppi' ); return ($dir, $file); } # Check a md5hex param sub _md5hex { my $either = shift; my $it = _SCALAR($_[0]) ? PPI::Util::md5hex(${$_[0]}) : $_[0]; return (defined $it and ! ref $it and $it =~ /^[[:xdigit:]]{32}\z/s) ? lc $it : undef; } 1; =pod =head1 TO DO - Finish the basic functionality - Add support for use PPI::Cache auto-setting $PPI::Document::CACHE =head1 SUPPORT See the L in the main module. =head1 AUTHOR Adam Kennedy Eadamk@cpan.orgE =head1 COPYRIGHT Copyright 2005 - 2011 Adam Kennedy. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. The full text of the license can be found in the LICENSE file included with this module. =cut PPI-1.272/lib/PPI/Document/000755 000765 000024 00000000000 14176526434 015231 5ustar00olafstaff000000 000000 PPI-1.272/lib/PPI/Statement.pm000644 000765 000024 00000021510 14176526434 015754 0ustar00olafstaff000000 000000 package PPI::Statement; =pod =head1 NAME PPI::Statement - The base class for Perl statements =head1 INHERITANCE PPI::Statement isa PPI::Node isa PPI::Element =head1 DESCRIPTION PPI::Statement is the root class for all Perl statements. This includes (from L) "Declarations", "Simple Statements" and "Compound Statements". The class PPI::Statement itself represents a "Simple Statement" as defined in the L manpage. =head1 STATEMENT CLASSES Please note that unless documented themselves, these classes are yet to be frozen/finalised. Names may change slightly or be added or removed. =head2 L This covers all "scheduled" blocks, chunks of code that are executed separately from the main body of the code, at a particular time. This includes all C, C, C, C and C blocks. =head2 L A package declaration, as defined in L. =head2 L A statement that loads or unloads another module. This includes 'use', 'no', and 'require' statements. =head2 L A named subroutine declaration, or forward declaration =head2 L A variable declaration statement. This could be either a straight declaration or also be an expression. This includes all 'my', 'state', 'local' and 'our' statements. =head2 L This covers the whole family of 'compound' statements, as described in L. This includes all statements starting with 'if', 'unless', 'for', 'foreach' and 'while'. Note that this does NOT include 'do', as it is treated differently. All compound statements have implicit ends. That is, they do not end with a ';' statement terminator. =head2 L A statement that breaks out of a structure. This includes all of 'redo', 'goto', 'next', 'last' and 'return' statements. =head2 L The kind of statement introduced in Perl 5.10 that starts with 'given'. This has an implicit end. =head2 L The kind of statement introduced in Perl 5.10 that starts with 'when' or 'default'. This also has an implicit end. =head2 L A special statement which encompasses an entire C<__DATA__> block, including the initial C<'__DATA__'> token itself and the entire contents. =head2 L A special statement which encompasses an entire __END__ block, including the initial '__END__' token itself and the entire contents, including any parsed PPI::Token::POD that may occur in it. =head2 L L is a little more speculative, and is intended to help represent the special rules relating to "expressions" such as in: # Several examples of expression statements # Boolean conditions if ( expression ) { ... } # Lists, such as for arguments Foo->bar( expression ) =head2 L A null statement is a special case for where we encounter two consecutive statement terminators. ( ;; ) The second terminator is given an entire statement of its own, but one that serves no purpose. Hence a 'null' statement. Theoretically, assuming a correct parsing of a perl file, all null statements are superfluous and should be able to be removed without damage to the file. But don't do that, in case PPI has parsed something wrong. =head2 L Because L is intended for use when parsing incorrect or incomplete code, the problem arises of what to do with a stray closing brace. Rather than die, it is allocated its own "unmatched brace" statement, which really means "unmatched closing brace". An unmatched open brace at the end of a file would become a structure with no contents and no closing brace. If the document loaded is intended to be correct and valid, finding a L in the PDOM is generally indicative of a misparse. =head2 L This is used temporarily mid-parsing to hold statements for which the lexer cannot yet determine what class it should be, usually because there are insufficient clues, or it might be more than one thing. You should never encounter these in a fully parsed PDOM tree. =head1 METHODS C itself has very few methods. Most of the time, you will be working with the more generic L or L methods, or one of the methods that are subclass-specific. =cut use strict; use Scalar::Util (); use Params::Util qw{_INSTANCE}; use PPI::Node (); use PPI::Exception (); use PPI::Singletons '%_PARENT'; our $VERSION = '1.272'; our @ISA = "PPI::Node"; use PPI::Statement::Break (); use PPI::Statement::Compound (); use PPI::Statement::Data (); use PPI::Statement::End (); use PPI::Statement::Expression (); use PPI::Statement::Include (); use PPI::Statement::Null (); use PPI::Statement::Package (); use PPI::Statement::Scheduled (); use PPI::Statement::Sub (); use PPI::Statement::Given (); use PPI::Statement::UnmatchedBrace (); use PPI::Statement::Unknown (); use PPI::Statement::Variable (); use PPI::Statement::When (); # "Normal" statements end at a statement terminator ; # Some are not, and need the more rigorous _continues to see # if we are at an implicit statement boundary. sub __LEXER__normal() { 1 } ##################################################################### # Constructor sub new { my $class = shift; if ( ref $class ) { PPI::Exception->throw; } # Create the object my $self = bless { children => [], }, $class; # If we have been passed what should be an initial token, add it my $token = shift; if ( _INSTANCE($token, 'PPI::Token') ) { # Inlined $self->__add_element(shift); Scalar::Util::weaken( $_PARENT{Scalar::Util::refaddr $token} = $self ); push @{$self->{children}}, $token; } $self; } =pod =head2 label One factor common to most statements is their ability to be labeled. The C