Re: Adding support for PAR

William McKee <[email protected]>
Newsgroups gmane.comp.lang.perl.modules.petal
Message-ID <[email protected]>
On Wed, Mar 09, 2005 at 12:42:40PM +0000, Bruno Postle wrote:
> The patch applies cleanly and passes the tests (without PAR 
> installed), though it doesn't contain any changes to 
> MKDoc::XML::Decode?

I was just wanting to get feedback on the code--thanks for the reply.
I've attached the patch to MKDoc to this message which includes your
suggestion.


> Shouldn't it be something like this?:
> 
>  if (ref $include_dir eq 'CODE' and keys %PAR::LibCache)

Yes, that makes more sense. I added the 'next unless' line after
realizing that there is the possibility that the coderef is not a PAR
object. This line really doesn't ensure that it isn't but is the closest
solution I could find.

Basically, it assumes that if PAR is loaded and there are entries in the
%LibCache hash then loop through the entries in the %LibCache and add
them to the @modules list. This will work in most cases. It will
probably add duplicate entries to the @modules list when the programmer
uses coderefs in the @INC in addition to PAR (see `perldoc -f require`
for the details).

I'll admit my ignorance and say that I didn't even know it was possible
to use coderefs until I began using PAR. Is anyone on this list using
coderefs in @INC? Will it matter if @modules contains duplicates when
MKDoc/Petal build up the modules list? It doesn't look like it but I
have not tested this theory.


> You also a moved a '{', this looks like a bugfix?:

Actually I thought it was a '}' that I moved. I did that because the
original code had the foreach loop inside of a different block. I needed
to move it out a level so that PAR modules could be included in the
MODIFIERS hashref. I didn't think it was a bugfix but didn't look too
deeply into the matter before moving it.


Thanks,
William

PS - Is there a publicly accessible CVS repository for MKDoc? Is it the
same as the one for Petal?

-- 
Knowmad Services Inc.
http://www.knowmad.com
Decode.pm.diff (text/plain, 1.9 KB)
--- lib/MKDoc/XML/Decode.pm.orig	2005-03-09 09:35:42.000000000 -0500
+++ lib/MKDoc/XML/Decode.pm	2005-03-09 09:49:15.000000000 -0500
@@ -21,6 +21,24 @@
 # import all plugins once
 foreach my $include_dir (@INC)
 {
+  my @modules;
+  # Support for PAR archives
+  if (ref $include_dir eq 'CODE' && keys %PAR::LibCache)
+  {
+    while (my ($filename, $zip) = each %PAR::LibCache)
+    {
+      my @mods = $zip->membersMatching( "MKDoc/XML/Decode/" );
+      foreach my $mod (@mods)
+      {
+        my $fn = $mod->fileName;
+        my ($pm) = $fn =~ /\/(\w+)\.pm$/;
+        #warn "$fn = $pm";
+        push @modules, $pm;
+      }
+    }
+  }
+  else
+  {
     my $dir = "$include_dir/MKDoc/XML/Decode";
     if (-e $dir and -d $dir)
     {
@@ -29,30 +47,32 @@
             next;
         };
 	
-        my @modules = map { s/\.pm$//; $_ }
+        @modules = map { s/\.pm$//; $_ }
                       grep /\.pm$/,
                       grep !/^\./,
                       readdir (DD);
 
         closedir DD;
-	
-        foreach my $module (@modules)
-        {
-	    $module =~ /^(\w+)$/;
-	    $module = $1;
-	    eval "use MKDoc::XML::Decode::$module";
-            $@ and warn "Cannot import module $module. Reason: $@";
-	    
-	    my $name = "MKDoc::XML::Decode::$module"->can ('module_name') ?
-	               "MKDoc::XML::Decode::$module"->module_name() :
-		       lc ($module);
-	    
-	    $Modules{$name} = "MKDoc::XML::Decode::$module";
-        }
+      }
     }
+
+  foreach my $module (@modules)
+  {
+    $module =~ /^(\w+)$/;
+    $module = $1;
+    eval "use MKDoc::XML::Decode::$module";
+          $@ and warn "Cannot import module $module. Reason: $@";
+    
+    my $name = "MKDoc::XML::Decode::$module"->can ('module_name') ?
+               "MKDoc::XML::Decode::$module"->module_name() :
+         lc ($module);
+    
+    $Modules{$name} = "MKDoc::XML::Decode::$module";
+  }
 }
 
 
+
 sub new
 {
     my $class = shift;
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.