[svn:mod_parrot] r526 - mod_parrot/trunk/languages/perl6/lib

[email protected] Fri, 5 Dec 2008 12:14:42 -0800 (PST)
Newsgroups perl.cvs.mod_parrot
Message-ID <[email protected]>
Author: jhorwitz
Date: Fri Dec  5 12:14:42 2008
New Revision: 526

Modified:
   mod_parrot/trunk/languages/perl6/lib/mod_perl6.pm

Log:
properly merge server & directory configs


Modified: mod_parrot/trunk/languages/perl6/lib/mod_perl6.pm
==============================================================================
--- mod_parrot/trunk/languages/perl6/lib/mod_perl6.pm	(original)
+++ mod_parrot/trunk/languages/perl6/lib/mod_perl6.pm	Fri Dec  5 12:14:42 2008
@@ -28,6 +28,10 @@
     enable
     parseheaders
 >.map({($_,1)});
+our @server_phases = <open_logs post_config child_init pre_connection
+     process_connection post_read_request map_to_storage trans>;
+our @dir_phases = <header_parser access authen authz response type fixup log
+         cleanup>;
 
 sub load($handler)
 {
@@ -47,9 +51,8 @@
 
     # server-scope config
     # XXX we shouldn't need to prepopulate these, but things segfault otherwise
-    for <open_logs post_config child_init pre_connection process_connection
-         post_read_request map_to_storage trans> -> $phase {
-        %cfg{$phase ~ '_handler'} = undef;
+    for @server_phases.map({$_ ~ '_handler'}) -> $h {
+        %cfg{$h} = undef;
     }
 
     return %cfg;
@@ -61,9 +64,8 @@
 
     # section-scope config
     # XXX we shouldn't need to prepopulate these, but things segfault otherwise
-    for <header_parser access authen authz response type fixup log
-         cleanup> -> $phase {
-        %cfg{$phase ~ '_handler'} = undef;
+    for @dir_phases.map({$_ ~ '_handler'}) -> $h {
+        %cfg{$h} = undef;
     }
 
     # options set with Perl6Options
@@ -74,16 +76,37 @@
     return %cfg;
 }
 
+sub server_merge(%base, %new)
+{
+    my %merged;
+
+    # XXX what to do with preloaded modules & postconfig requires???
+
+    # merge handlers -- never inherit
+    for @server_phases.map({$_ ~ '_handler'}) -> $h {
+        %merged{$h} = %new{$h};
+    }
+
+    return %merged;
+}
+
 sub dir_merge(%base, %new)
 {
+    my %merged;
+
     # merge options -- inherit only if not set
-    for %base<options>.keys -> $k {
-        unless %new<options>.exists($k) {
-            %new<options>{$k} = %base<options>{$k};
-        }
+    %merged<options> = {};
+    for %valid_options.keys -> $k {
+        %merged<options>{$k} = %new<options>.exists($k) ??
+            %new<options>{$k} !! %base<options>{$k};
+    }
+
+    # merge handlers -- never inherit
+    for @dir_phases.map({$_ ~ '_handler'}) -> $h {
+        %merged{$h} = %new{$h};
     }
 
-    return %new;
+    return %merged;
 }
 
 # XXX should cache the handler form during configuration