next unless (m/^my \%supported_methods/ .. m/^\);/);
 
-  push @actions, [ 'action',  $1, $2, $3 ] if m/^ \s+ '? ([a-zA-Z_:]+) '? \s*=>\s* (\d+) , (?: \s* \# \s+ (.+))? $/x;
+  push @actions, [ 'action',  $1, $2, $3 ] if m/^ \s+ '? ([a-zA-Z_:]+) '? \s*=>\s* (-? \d+) , (?: \s* \# \s+ (.+))? $/x;
   push @actions, [ 'comment', $1, $2     ] if m/^ \s+\# \s+ (.+?) (?: \s* pattern: \s+ (.+))? $/x;
 }
 
     $pattern = $action->[2] eq '<DEFAULT>' ? $default_pattern : $action->[2] if $action->[2];
 
   } else {
-    my $args = $action->[2] == 1 ? '' : join(', ', map { "action[$_]" } (2..$action->[2]));
+    my $args = $action->[2] == 1 ? ''
+             : $action->[2] <  0 ? 'action.slice(2, action.length)'
+             :                     join(', ', map { "action[$_]" } (2..$action->[2]));
 
     $output .= sprintf('      %s if (action[0] == \'%s\')%s ',
                        $first ? '    ' : 'else',
     $call        =~ s/<TARGET>/'action[1]'/eg;
     $call        =~ s/<FUNCTION>/$function/eg;
     $call        =~ s/<ARGS>/$args/eg;
+    $call        =~ s/<ARG(\d+)>/'action[' . ($1 + 1) . ']'/eg;
 
     $output .= $call . ";\n";
     $first   = 0;