1PPI(3)                User Contributed Perl Documentation               PPI(3)
2
3
4

NAME

6       PPI - Parse, Analyze and Manipulate Perl (without perl)
7

SYNOPSIS

9         use PPI;
10
11         # Create a new empty document
12         my $Document = PPI::Document->new;
13
14         # Create a document from source
15         $Document = PPI::Document->new(\'print "Hello World!\n"');
16
17         # Load a Document from a file
18         $Document = PPI::Document->new('Module.pm');
19
20         # Does it contain any POD?
21         if ( $Document->find_any('PPI::Token::Pod') ) {
22             print "Module contains POD\n";
23         }
24
25         # Get the name of the main package
26         $pkg = $Document->find_first('PPI::Statement::Package')->namespace;
27
28         # Remove all that nasty documentation
29         $Document->prune('PPI::Token::Pod');
30         $Document->prune('PPI::Token::Comment');
31
32         # Save the file
33         $Document->save('Module.pm.stripped');
34

DESCRIPTION

36   About this Document
37       This is the PPI manual. It describes its reason for existing, its
38       general structure, its use, an overview of the API, and provides a few
39       implementation samples.
40
41   Background
42       The ability to read, and manipulate Perl (the language)
43       programmatically other than with perl (the application) was one that
44       caused difficulty for a long time.
45
46       The cause of this problem was Perl's complex and dynamic grammar.
47       Although there is typically not a huge diversity in the grammar of most
48       Perl code, certain issues cause large problems when it comes to
49       parsing.
50
51       Indeed, quite early in Perl's history Tom Christenson introduced the
52       Perl community to the quote "Nothing but perl can parse Perl", or as it
53       is more often stated now as a truism:
54
55       "Only perl can parse Perl"
56
57       One example of the sorts of things the prevent Perl being easily parsed
58       are function signatures, as demonstrated by the following.
59
60         @result = (dothis $foo, $bar);
61
62         # Which of the following is it equivalent to?
63         @result = (dothis($foo), $bar);
64         @result = dothis($foo, $bar);
65
66       The first line above can be interpreted in two different ways,
67       depending on whether the &dothis function is expecting one argument, or
68       two, or several.
69
70       A "code parser" (something that parses for the purpose of execution)
71       such as perl needs information that is not found in the immediate
72       vicinity of the statement being parsed.
73
74       The information might not just be elsewhere in the file, it might not
75       even be in the same file at all. It might also not be able to determine
76       this information without the prior execution of a "BEGIN {}" block, or
77       the loading and execution of one or more external modules. Or worse the
78       &dothis function may not even have been written yet.
79
80       When parsing Perl as code, you must also execute it
81
82       Even perl itself never really fully understands the structure of the
83       source code after and indeed as it processes it, and in that sense
84       doesn't "parse" Perl source into anything remotely like a structured
85       document.  This makes it of no real use for any task that needs to
86       treat the source code as a document, and do so reliably and robustly.
87
88       For more information on why it is impossible to parse perl, see Randal
89       Schwartz's seminal response to the question of "Why can't you parse
90       Perl".
91
92       <http://www.perlmonks.org/index.pl?node_id=44722>
93
94       The purpose of PPI is not to parse Perl Code, but to parse Perl
95       Documents. By treating the problem this way, we are able to parse a
96       single file containing Perl source code "isolated" from any other
97       resources, such as libraries upon which the code may depend, and
98       without needing to run an instance of perl alongside or inside the
99       parser.
100
101       Historically, using an embedded perl parser was widely considered to be
102       the most likely avenue for finding a solution to "Parse::Perl". It was
103       investigated from time to time and attempts have generally failed or
104       suffered from sufficiently bad corner cases that they were abandoned.
105
106   What Does PPI Stand For?
107       "PPI" is an acronym for the longer original module name
108       "Parse::Perl::Isolated". And in the spirit or the silly acronym games
109       played by certain unnamed Open Source projects you may have hurd of, it
110       also a reverse backronym of "I Parse Perl".
111
112       Of course, I could just be lying and have just made that second bit up
113       10 minutes before the release of PPI 1.000. Besides, all the cool Perl
114       packages have TLAs (Three Letter Acronyms). It's a rule or something.
115
116       Why don't you just think of it as the Perl Parsing Interface for
117       simplicity.
118
119       The original name was shortened to prevent the author (and you the
120       users) from contracting RSI by having to type crazy things like
121       "Parse::Perl::Isolated::Token::QuoteLike::Backtick" 100 times a day.
122
123       In acknowledgment that someone may some day come up with a valid
124       solution for the grammar problem it was decided at the commencement of
125       the project to leave the "Parse::Perl" namespace free for any such
126       effort.
127
128       Since that time I've been able to prove to my own satisfaction that it
129       is truly impossible to accurately parse Perl as both code and document
130       at once. For the academics, parsing Perl suffers from the "Halting
131       Problem".
132
133       With this in mind "Parse::Perl" has now been co-opted as the title for
134       the SourceForge project that publishes PPI and a large collection of
135       other applications and modules related to the (document) parsing of
136       Perl source code.
137
138       You can find this project at <http://sf.net/projects/parseperl>,
139       however we no longer use the SourceForge CVS server.  Instead, the
140       current development version of PPI is available via SVN at
141       <http://svn.ali.as/cpan/trunk/PPI/>.
142
143   Why Parse Perl?
144       Once you can accept that we will never be able to parse Perl well
145       enough to meet the standards of things that treat Perl as code, it is
146       worth re-examining "why" we want to "parse" Perl at all.
147
148       What are the things that people might want a "Perl parser" for.
149
150       Documentation
151           Analyzing the contents of a Perl document to automatically generate
152           documentation, in parallel to, or as a replacement for, POD
153           documentation.
154
155           Allow an indexer to to locate and process all the comments and
156           documentation from code for "full text search" applications.
157
158       Structural and Quality Analysis
159           Determine quality or other metrics across a body of code, and
160           identify situations relating to particular phrases, techniques or
161           locations.
162
163           Index functions, variables and packages within Perl code, and doing
164           search and graph (in the node/edge sense) analysis of large code
165           bases.
166
167       Refactoring
168           Make structural, syntax, or other changes to code in an automated
169           manner, either independently or in assistance to an editor. This
170           sort of task list includes backporting, forward porting, partial
171           evaluation, "improving" code, or whatever. All the sort of things
172           you'd want from a Perl::Editor.
173
174       Layout
175           Change the layout of code without changing its meaning. This
176           includes techniques such as tidying (like perltidy), obfuscation,
177           compressing and "squishing", or to implement formatting preferences
178           or policies.
179
180       Presentation
181           This includes methods of improving the presentation of code,
182           without changing the content of the code. Modify, improve, syntax
183           colour etc the presentation of a Perl document. Generating
184           "IntelliText"-like functions.
185
186       If we treat this as a baseline for the sort of things we are going to
187       have to build on top of Perl, then it becomes possible to identify a
188       standard for how good a Perl parser needs to be.
189
190   How good is Good Enough(TM)
191       PPI seeks to be good enough to achieve all of the above tasks, or to
192       provide a sufficiently good API on which to allow others to implement
193       modules in these and related areas.
194
195       However, there are going to be limits to this process. Because PPI
196       cannot adapt to changing grammars, any code written using source
197       filters should not be assumed to be parsable.
198
199       At one extreme, this includes anything munged by Acme::Bleach, as well
200       as (arguably) more common cases like Switch. We do not pretend to be
201       able to always parse code using these modules, although as long as it
202       still follows a format that looks like Perl syntax, it may be possible
203       to extend the lexer to handle them.
204
205       The ability to extend PPI to handle lexical additions to the language
206       is on the drawing board to be done some time post-1.0
207
208       The goal for success was originally to be able to successfully parse
209       99% of all Perl documents contained in CPAN. This means the entire file
210       in each case.
211
212       PPI has succeeded in this goal far beyond the expectations of even the
213       author. At time of writing there are only 28 non-Acme Perl modules in
214       CPAN that PPI is incapable of parsing. Most of these are so badly
215       broken they do not compile as Perl code anyway.
216
217       So unless you are actively going out of your way to break PPI, you
218       should expect that it will handle your code just fine.
219
220   Internationalisation
221       PPI provides partial support for internationalisation and localisation.
222
223       Specifically, it allows the use characters from the Latin-1 character
224       set to be used in quotes, comments, and POD. Primarily, this covers
225       languages from Europe and South America.
226
227       PPI does not currently provide support for Unicode, although there is
228       an initial implementation available in a development branch from CVS.
229
230       If you need Unicode support, and would like to help stress test the
231       Unicode support so we can move it to the main branch and enable it in
232       the main release should contact the author. (contact details below)
233
234   Round Trip Safe
235       When PPI parses a file it builds everything into the model, including
236       whitespace. This is needed in order to make the Document fully "Round
237       Trip" safe.
238
239       The general concept behind a "Round Trip" parser is that it knows what
240       it is parsing is somewhat uncertain, and so expects to get things wrong
241       from time to time. In the cases where it parses code wrongly the tree
242       will serialize back out to the same string of code that was read in,
243       repairing the parser's mistake as it heads back out to the file.
244
245       The end result is that if you parse in a file and serialize it back out
246       without changing the tree, you are guaranteed to get the same file you
247       started with. PPI does this correctly and reliably for 100% of all
248       known cases.
249
250       What goes in, will come out. Every time.
251
252       The one minor exception at this time is that if the newlines for your
253       file are wrong (meaning not matching the platform newline format), PPI
254       will localise them for you. (It isn't to be convenient, supporting
255       arbitrary newlines would make some of the code more complicated)
256
257       Better control of the newline type is on the wish list though, and
258       anyone wanting to help out is encouraged to contact the author.
259

IMPLEMENTATION

261   General Layout
262       PPI is built upon two primary "parsing" components, PPI::Tokenizer and
263       PPI::Lexer, and a large tree of about 50 classes which implement the
264       various the Perl Document Object Model (PDOM).
265
266       The PDOM is conceptually similar in style and intent to the regular DOM
267       or other code Abstract Syntax Trees (ASTs), but contains some
268       differences to handle perl-specific cases, and to assist in treating
269       the code as a document. Please note that it is not an implementation of
270       the official Document Object Model specification, only somewhat similar
271       to it.
272
273       On top of the Tokenizer, Lexer and the classes of the PDOM, sit a
274       number of classes intended to make life a little easier when dealing
275       with PDOM trees.
276
277       Both the major parsing components were hand-coded from scratch with
278       only plain Perl code and a few small utility modules. There are no
279       grammar or patterns mini-languages, no YACC or LEX style tools and only
280       a small number of regular expressions.
281
282       This is primarily because of the sheer volume of accumulated cruft that
283       exists in Perl. Not even perl itself is capable of parsing Perl
284       documents (remember, it just parses and executes it as code).
285
286       As a result, PPI needed to be cruftier than perl itself. Feel free to
287       shudder at this point, and hope you never have to understand the
288       Tokenizer codebase. Speaking of which...
289
290   The Tokenizer
291       The Tokenizer takes source code and converts it into a series of
292       tokens. It does this using a slow but thorough character by character
293       manual process, rather than using a pattern system or complex regexes.
294
295       Or at least it does so conceptually. If you were to actually trace the
296       code you would find it's not truly character by character due to a
297       number of regexps and optimisations throughout the code. This lets the
298       Tokenizer "skip ahead" when it can find shortcuts, so it tends to jump
299       around a line a bit wildly at times.
300
301       In practice, the number of times the Tokenizer will actually move the
302       character cursor itself is only about 5% - 10% higher than the number
303       of tokens contained in the file. This makes it about as optimal as it
304       can be made without implementing it in something other than Perl.
305
306       In 2001 when PPI was started, this structure made PPI quite slow, and
307       not really suitable for interactive tasks. This situation has improved
308       greatly with multi-gigahertz processors, but can still be painful when
309       working with very large files.
310
311       The target parsing rate for PPI is about 5000 lines per gigacycle. It
312       is currently believed to be at about 1500, and main avenue for making
313       it to the target speed has now become PPI::XS, a drop-in XS accelerator
314       for PPI.
315
316       Since PPI::XS has only just gotten off the ground and is currently only
317       at proof-of-concept stage, this may take a little while. Anyone
318       interested in helping out with PPI::XS is highly encouraged to contact
319       the author. In fact, the design of PPI::XS means it's possible to port
320       one function at a time safely and reliably. So every little bit will
321       help.
322
323   The Lexer
324       The Lexer takes a token stream, and converts it to a lexical tree.
325       Because we are parsing Perl documents this includes whitespace,
326       comments, and all number of weird things that have no relevance when
327       code is actually executed.
328
329       An instantiated PPI::Lexer consumes PPI::Tokenizer objects and produces
330       PPI::Document objects. However you should probably never be working
331       with the Lexer directly. You should just be able to create
332       PPI::Document objects and work with them directly.
333
334   The Perl Document Object Model
335       The PDOM is a structured collection of data classes that together
336       provide a correct and scalable model for documents that follow the
337       standard Perl syntax.
338
339   The PDOM Class Tree
340       The following lists all of the 67 current PDOM classes, listing with
341       indentation based on inheritance.
342
343          PPI::Element
344             PPI::Node
345                PPI::Document
346                   PPI::Document::Fragment
347                PPI::Statement
348                   PPI::Statement::Package
349                   PPI::Statement::Include
350                   PPI::Statement::Sub
351                      PPI::Statement::Scheduled
352                   PPI::Statement::Compound
353                   PPI::Statement::Break
354                   PPI::Statement::Given
355                   PPI::Statement::When
356                   PPI::Statement::Data
357                   PPI::Statement::End
358                   PPI::Statement::Expression
359                      PPI::Statement::Variable
360                   PPI::Statement::Null
361                   PPI::Statement::UnmatchedBrace
362                   PPI::Statement::Unknown
363                PPI::Structure
364                   PPI::Structure::Block
365                   PPI::Structure::Subscript
366                   PPI::Structure::Constructor
367                   PPI::Structure::Condition
368                   PPI::Structure::List
369                   PPI::Structure::For
370                   PPI::Structure::Given
371                   PPI::Structure::When
372                   PPI::Structure::Unknown
373             PPI::Token
374                PPI::Token::Whitespace
375                PPI::Token::Comment
376                PPI::Token::Pod
377                PPI::Token::Number
378                   PPI::Token::Number::Binary
379                   PPI::Token::Number::Octal
380                   PPI::Token::Number::Hex
381                   PPI::Token::Number::Float
382                      PPI::Token::Number::Exp
383                   PPI::Token::Number::Version
384                PPI::Token::Word
385                PPI::Token::DashedWord
386                PPI::Token::Symbol
387                   PPI::Token::Magic
388                PPI::Token::ArrayIndex
389                PPI::Token::Operator
390                PPI::Token::Quote
391                   PPI::Token::Quote::Single
392                   PPI::Token::Quote::Double
393                   PPI::Token::Quote::Literal
394                   PPI::Token::Quote::Interpolate
395                PPI::Token::QuoteLike
396                   PPI::Token::QuoteLike::Backtick
397                   PPI::Token::QuoteLike::Command
398                   PPI::Token::QuoteLike::Regexp
399                   PPI::Token::QuoteLike::Words
400                   PPI::Token::QuoteLike::Readline
401                PPI::Token::Regexp
402                   PPI::Token::Regexp::Match
403                   PPI::Token::Regexp::Substitute
404                   PPI::Token::Regexp::Transliterate
405                PPI::Token::HereDoc
406                PPI::Token::Cast
407                PPI::Token::Structure
408                PPI::Token::Label
409                PPI::Token::Separator
410                PPI::Token::Data
411                PPI::Token::End
412                PPI::Token::Prototype
413                PPI::Token::Attribute
414                PPI::Token::Unknown
415
416       To summarize the above layout, all PDOM objects inherit from the
417       PPI::Element class.
418
419       Under this are PPI::Token, strings of content with a known type, and
420       PPI::Node, syntactically significant containers that hold other
421       Elements.
422
423       The three most important of these are the PPI::Document, the
424       PPI::Statement and the PPI::Structure classes.
425
426   The Document, Statement and Structure
427       At the top of all complete PDOM trees is a PPI::Document object. It
428       represents a complete file of Perl source code as you might find it on
429       disk.
430
431       There are some specialised types of document, such as
432       PPI::Document::File and PPI::Document::Normalized but for the purposes
433       of the PDOM they are all just considered to be the same thing.
434
435       Each Document will contain a number of Statements, Structures and
436       Tokens.
437
438       A PPI::Statement is any series of Tokens and Structures that are
439       treated as a single contiguous statement by perl itself. You should
440       note that a Statement is as close as PPI can get to "parsing" the code
441       in the sense that perl-itself parses Perl code when it is building the
442       op-tree.
443
444       Because of the isolation and Perl's syntax, it is provably impossible
445       for PPI to accurately determine precedence of operators or which tokens
446       are implicit arguments to a sub call.
447
448       So rather than lead you on with a bad guess that has a strong chance of
449       being wrong, PPI does not attempt to determine precedence or sub
450       parameters at all.
451
452       At a fundamental level, it only knows that this series of elements
453       represents a single Statement as perl sees it, but it can do so with
454       enough certainty that it can be trusted.
455
456       However, for specific Statement types the PDOM is able to derive
457       additional useful information about their meaning. For the best, most
458       useful, and most heavily used example, see PPI::Statement::Include.
459
460       A PPI::Structure is any series of tokens contained within matching
461       braces.  This includes code blocks, conditions, function argument
462       braces, anonymous array and hash constructors, lists, scoping braces
463       and all other syntactic structures represented by a matching pair of
464       braces, including (although it may not seem obvious at first)
465       "<READLINE>" braces.
466
467       Each Structure contains none, one, or many Tokens and Structures (the
468       rules for which vary for the different Structure subclasses)
469
470       Under the PDOM structure rules, a Statement can never directly contain
471       another child Statement, a Structure can never directly contain another
472       child Structure, and a Document can never contain another Document
473       anywhere in the tree.
474
475       Aside from these three rules, the PDOM tree is extremely flexible.
476
477   The PDOM at Work
478       To demonstrate the PDOM in use lets start with an example showing how
479       the tree might look for the following chunk of simple Perl code.
480
481         #!/usr/bin/perl
482
483         print( "Hello World!" );
484
485         exit();
486
487       Translated into a PDOM tree it would have the following structure (as
488       shown via the included PPI::Dumper).
489
490         PPI::Document
491           PPI::Token::Comment                '#!/usr/bin/perl\n'
492           PPI::Token::Whitespace             '\n'
493           PPI::Statement::Expression
494             PPI::Token::Bareword             'print'
495             PPI::Structure::List             ( ... )
496               PPI::Token::Whitespace         ' '
497               PPI::Statement::Expression
498                 PPI::Token::Quote::Double    '"Hello World!"'
499               PPI::Token::Whitespace         ' '
500             PPI::Token::Structure            ';'
501           PPI::Token::Whitespace             '\n'
502           PPI::Token::Whitespace             '\n'
503           PPI::Statement::Expression
504             PPI::Token::Bareword             'exit'
505             PPI::Structure::List             ( ... )
506             PPI::Token::Structure            ';'
507           PPI::Token::Whitespace             '\n'
508
509       Please note that in this this example, strings are only listed for the
510       actual PPI::Token that contains that string. Structures are listed with
511       the type of brace characters it represents noted.
512
513       The PPI::Dumper module can be used to generate similar trees yourself.
514
515       We can make that PDOM dump a little easier to read if we strip out all
516       the whitespace. Here it is again, sans the distracting whitespace
517       tokens.
518
519         PPI::Document
520           PPI::Token::Comment                '#!/usr/bin/perl\n'
521           PPI::Statement::Expression
522             PPI::Token::Bareword             'print'
523             PPI::Structure::List             ( ... )
524               PPI::Statement::Expression
525                 PPI::Token::Quote::Double    '"Hello World!"'
526             PPI::Token::Structure            ';'
527           PPI::Statement::Expression
528             PPI::Token::Bareword             'exit'
529             PPI::Structure::List             ( ... )
530             PPI::Token::Structure            ';'
531
532       As you can see, the tree can get fairly deep at time, especially when
533       every isolated token in a bracket becomes its own statement. This is
534       needed to allow anything inside the tree the ability to grow. It also
535       makes the search and analysis algorithms much more flexible.
536
537       Because of the depth and complexity of PDOM trees, a vast number of
538       very easy to use methods have been added wherever possible to help
539       people working with PDOM trees do normal tasks relatively quickly and
540       efficiently.
541
542   Overview of the Primary Classes
543       The main PPI classes, and links to their own documentation, are listed
544       here in alphabetical order.
545
546       PPI::Document
547           The Document object, the root of the PDOM.
548
549       PPI::Document::Fragment
550           A cohesive fragment of a larger Document. Although not of any real
551           current use, it is needed for use in certain internal tree
552           manipulation algorithms.
553
554           For example, doing things like cut/copy/paste etc. Very similar to
555           a PPI::Document, but has some additional methods and does not
556           represent a lexical scope boundary.
557
558           A document fragment is also non-serializable, and so cannot be
559           written out to a file.
560
561       PPI::Dumper
562           A simple class for dumping readable debugging versions of PDOM
563           structures, such as in the demonstration above.
564
565       PPI::Element
566           The Element class is the abstract base class for all objects within
567           the PDOM
568
569       PPI::Find
570           Implements an instantiable object form of a PDOM tree search.
571
572       PPI::Lexer
573           The PPI Lexer. Converts Token streams into PDOM trees.
574
575       PPI::Node
576           The Node object, the abstract base class for all PDOM objects that
577           can contain other Elements, such as the Document, Statement and
578           Structure objects.
579
580       PPI::Statement
581           The base class for all Perl statements. Generic "evaluate for side-
582           effects" statements are of this actual type. Other more interesting
583           statement types belong to one of its children.
584
585           See it's own documentation for a longer description and list of all
586           of the different statement types and sub-classes.
587
588       PPI::Structure
589           The abstract base class for all structures. A Structure is a
590           language construct consisting of matching braces containing a set
591           of other elements.
592
593           See the PPI::Structure documentation for a description and list of
594           all of the different structure types and sub-classes.
595
596       PPI::Token
597           A token is the basic unit of content. At its most basic, a Token is
598           just a string tagged with metadata (its class, and some additional
599           flags in some cases).
600
601       PPI::Token::_QuoteEngine
602           The PPI::Token::Quote and PPI::Token::QuoteLike classes provide
603           abstract base classes for the many and varied types of quote and
604           quote-like things in Perl. However, much of the actual quote login
605           is implemented in a separate quote engine, based at
606           PPI::Token::_QuoteEngine.
607
608           Classes that inherit from PPI::Token::Quote, PPI::Token::QuoteLike
609           and PPI::Token::Regexp are generally parsed only by the Quote
610           Engine.
611
612       PPI::Tokenizer
613           The PPI Tokenizer. One Tokenizer consumes a chunk of text and
614           provides access to a stream of PPI::Token objects.
615
616           The Tokenizer is very very complicated, to the point where even the
617           author treads carefully when working with it.
618
619           Most of the complication is the result of optimizations which have
620           tripled the tokenization speed, at the expense of maintainability.
621           We cope with the spaghetti by heavily commenting everything.
622
623       PPI::Transform
624           The Perl Document Transformation API. Provides a standard interface
625           and abstract base class for objects and classes that manipulate
626           Documents.
627

INSTALLING

629       The core PPI distribution is pure Perl and has been kept as tight as
630       possible and with as few dependencies as possible.
631
632       It should download and install normally on any platform from within the
633       CPAN and CPANPLUS applications, or directly using the distribution
634       tarball. If installing by hand, you may need to install a few small
635       utility modules first. The exact ones will depend on your version of
636       perl.
637
638       There are no special install instructions for PPI, and the normal "Perl
639       Makefile.PL", "make", "make test", "make install" instructions apply.
640

EXTENDING

642       The PPI namespace itself is reserved for the sole use of the modules
643       under the umbrella of the "Parse::Perl" SourceForge project.
644
645       <http://sf.net/projects/parseperl>
646
647       You are recommended to use the PPIx:: namespace for PPI-specific
648       modifications or prototypes thereof, or Perl:: for modules which
649       provide a general Perl language-related functions.
650
651       If what you wish to implement looks like it fits into PPIx:: namespace,
652       you should consider contacting the "Parse::Perl" mailing list (detailed
653       on the SourceForge site) first, as what you want may already be in
654       progress, or you may wish to consider joining the team and doing it
655       within the "Parse::Perl" project itself.
656

TO DO

658       - Many more analysis and utility methods for PDOM classes
659
660       - Creation of a PPI::Tutorial document
661
662       - Add many more key functions to PPI::XS
663
664       - We can always write more and better unit tests
665
666       - Complete the full implementation of ->literal (1.200)
667
668       - Full understanding of scoping (due 1.300)
669

SUPPORT

671       This module is stored in an Open Repository at the following address.
672
673       <http://svn.ali.as/cpan/trunk/PPI>
674
675       Write access to the repository is made available automatically to any
676       published CPAN author, and to most other volunteers on request.
677
678       If you are able to submit your bug report in the form of new (failing)
679       unit tests, or can apply your fix directly instead of submitting a
680       patch, you are strongly encouraged to do so, as the author currently
681       maintains over 100 modules and it can take some time to deal with
682       non-"Critical" bug reports or patches.
683
684       This will also guarentee that your issue will be addressed in the next
685       release of the module.
686
687       For large changes though, please consider creating a branch so that
688       they can be properly reviewed and trialed before being applied to the
689       trunk.
690
691       If you cannot provide a direct test or fix, or don't have time to do
692       so, then regular bug reports are still accepted and appreciated via the
693       CPAN bug tracker.
694
695       <http://rt.cpan.org/NoAuth/ReportBug.html?Queue=PPI>
696
697       For other issues or questions, contact the "Parse::Perl" project
698       mailing list.
699
700       For commercial or media-related enquiries, or to have your SVN commit
701       bit enabled, contact the author.
702

AUTHOR

704       Adam Kennedy <adamk@cpan.org>
705

ACKNOWLEDGMENTS

707       A huge thank you to Phase N Australia (<http://phase-n.com/>) for
708       permitting the original open sourcing and release of this distribution
709       from what was originally several thousand hours of commercial work.
710
711       Another big thank you to The Perl Foundation
712       (<http://www.perlfoundation.org/>) for funding for the final big
713       refactoring and completion run.
714
715       Also, to the various co-maintainers that have contributed both large
716       and small with tests and patches and especially to those rare few who
717       have deep-dived into the guts to (gasp) add a feature.
718
719         - Dan Brook       : PPIx::XPath, Acme::PerlML
720         - Audrey Tang     : "Line Noise" Testing
721         - Arjen Laarhoven : Three-element ->location support
722         - Elliot Shank    : Perl 5.10 support, five-element ->location
723
724       And finally, thanks to those brave ( and foolish :) ) souls willing to
725       dive in and use, test drive and provide feedback on PPI before version
726       1.000, in some cases before it made it to beta quality, and still did
727       extremely distasteful things (like eating 50 meg of RAM a second).
728
729       I owe you all a beer. Corner me somewhere and collect at your
730       convenience.  If I missed someone who wasn't in my email history, thank
731       you too :)
732
733         # In approximate order of appearance
734         - Claes Jacobsson
735         - Michael Schwern
736         - Jeff T. Parsons
737         - CPAN Author "CHOCOLATEBOY"
738         - Robert Rotherberg
739         - CPAN Author "PODMASTER"
740         - Richard Soderberg
741         - Nadim ibn Hamouda el Khemir
742         - Graciliano M. P.
743         - Leon Brocard
744         - Jody Belka
745         - Curtis Ovid
746         - Yuval Kogman
747         - Michael Schilli
748         - Slaven Rezic
749         - Lars Thegler
750         - Tony Stubblebine
751         - Tatsuhiko Miyagawa
752         - CPAN Author "CHROMATIC"
753         - Matisse Enzer
754         - Roy Fulbright
755         - Dan Brook
756         - Johnny Lee
757         - Johan Lindstrom
758
759       And to single one person out, thanks go to Randal Schwartz who spent a
760       great number of hours in IRC over a critical 6 month period explaining
761       why Perl is impossibly unparsable and constantly shoving evil and ugly
762       corner cases in my face. He remained a tireless devil's advocate, and
763       without his support this project genuinely could never have been
764       completed.
765
766       So for my schooling in the Deep Magiks, you have my deepest gratitude
767       Randal.
768
770       Copyright 2001 - 2009 Adam Kennedy.
771
772       This program is free software; you can redistribute it and/or modify it
773       under the same terms as Perl itself.
774
775       The full text of the license can be found in the LICENSE file included
776       with this module.
777
778
779
780perl v5.10.1                      2009-08-08                            PPI(3)
Impressum