Provided by: libppi-perl_1.270-1_all bug


       PPI::Find - Object version of the Element->find method


         # Create the Find object
         my $Find = PPI::Find->new( \&wanted );

         # Return all matching Elements as a list
         my @found = $Find->in( $Document );

         # Can we find any matching Elements
         if ( $Find->any_matches($Document) ) {
               print "Found at least one matching Element";

         # Use the object as an iterator
         $Find->start($Document) or die "Failed to execute search";
         while ( my $token = $Find->match ) {


       PPI::Find is the primary PDOM searching class in the core PPI package.

       It became quite obvious during the development of PPI that many of the modules that would
       be built on top of it were going to need large numbers of saved, storable or easily
       creatable search objects that could be reused a number of times.

       Although the internal ->find method provides a basic ability to search, it is by no means
       thorough. PPI::Find attempts to resolve this problem.

   Structure and Style
       PPI::Find provides a similar API to the popular File::Find::Rule module for file
       searching, but without the ability to assemble queries.

       The implementation of a separate PPI::Find::Rule sub-class that does provide this ability
       is left as an exercise for the reader.

   The &wanted function
       At the core of each PPI::Find object is a "wanted" function that is passed a number of
       arguments and returns a value which controls the flow of the search.

       As the search executes, each Element will be passed to the wanted function in depth-first

       It will be provided with two arguments. The current Element to test as $_[0], and the top-
       level Element of the search as $_[1].

       The &wanted function is expected to return 1 (positive) if the Element matches the
       condition, 0 (false) if it does not, and undef (undefined) if the condition does not
       match, and the Find search should not descend to any of the current Element's children.

       Errors should be reported from the &wanted function via die, which will be caught by the
       Find object and returned as an error.


   new &wanted
       The "new" constructor takes a single argument of the &wanted function, as described above
       and creates a new search.

       Returns a new PPI::Find object, or "undef" if not passed a CODE reference.

       The "clone" method creates another instance of the same Find object.

       The cloning is done safely, so if your existing Find object is in the middle of an
       iteration, the cloned Find object will not also be in the iteration and can be safely used

       Returns a duplicate PPI::Find object.

   in $Document [, array_ref => 1 ]
       The "in" method starts and completes a full run of the search.

       It takes as argument a single PPI::Element object which will serve as the top of the
       search process.

       Returns a list of PPI::Element objects that match the condition described by the &wanted
       function, or the null list on error.

       You should check the ->errstr method for any errors if you are returned the null list,
       which may also mean simply that no Elements were found that matched the condition.

       Because of this need to explicitly check for errors, an alternative return value mechanism
       is provide. If you pass the "array_ref => 1" parameter to the method, it will return the
       list of matched Elements as a reference to an ARRAY. The method will return false if no
       elements were matched, or "undef" on error.

       The ->errstr method can still be used to get the error message as normal.

   start $Element
       The "start" method lets the Find object act as an iterator. The method is passed the
       parent PPI::Element object as for the "in" method, but does not accept any parameters.

       To simplify error handling, the entire search is done at once, with the results cached and
       provided as-requested.

       Returns true if the search completes, and false on error.

       The "match" method returns the next matching Element in the iteration.

       Returns a PPI::Element object, or "undef" if there are no remaining Elements to be

       The "finish" method provides a mechanism to end iteration if you wish to stop the
       iteration prematurely. It resets the Find object and allows it to be safely reused.

       A Find object will be automatically finished when "match" returns false.  This means you
       should only need to call "finish" when you stop iterating early.

       You may safely call this method even when not iterating and it will return without

       Always returns true

       The "errstr" method returns the error messages when a given PPI::Find object fails any

       Returns a string, or "undef" if there is no error.


       - Implement the PPI::Find::Rule class


       See the support section in the main module.


       Adam Kennedy <>


       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.