From: Simon McVittie <smcv@debian.org>
Date: Wed, 12 Nov 2014 20:41:26 +0000
Subject: Avoid unneeded warning from CGI.pm 4.05 or newer

Based on earlier patches by Amitai Schlair, but modified to retain
support for objects like Catalyst::Request that mimic the CGI interface
but do not have a param_fetch method.

--- a/lib/CGI/FormBuilder.pm
+++ b/lib/CGI/FormBuilder.pm
@@ -855,7 +855,18 @@
 
     # Make sure to get all values
     for my $p (@keep) {
-        for my $v ($self->{params}->param($p)) {
+        my @values;
+        if ($self->{params}->can('param_fetch')) {
+            @values = @{$self->{params}->param_fetch($p)};
+        }
+        else {
+            # array-context calls to param($p) are deprecated in
+            # CGI.pm, but some other objects that mimic
+            # its interface don't have param_fetch
+            @values = $self->{params}->param($p);
+        }
+
+        for my $v (@values) {
             debug 1, "keepextras: saving hidden param $p = $v";
             push @html, htmltag('input', name => $p, type => 'hidden', value => $v);
         }
--- a/lib/CGI/FormBuilder/Field.pm
+++ b/lib/CGI/FormBuilder/Field.pm
@@ -189,7 +189,19 @@
     my $self = shift;
     debug 2, "$self->{name}: called \$field->cgi_value";
     puke "Cannot set \$field->cgi_value manually" if @_;
-    if (my @v = $self->{_form}{params}->param($self->name)) {
+
+    my @v;
+    if ($self->{_form}{params}->can('param_fetch')) {
+        @v = @{$self->{_form}{params}->param_fetch($self->name)};
+    }
+    else {
+        # array-context calls to param($p) are deprecated in
+        # CGI.pm, but some other objects that mimic
+        # its interface don't have param_fetch
+        @v = $self->{_form}{params}->param($self->name);
+    }
+
+    if (@v) {
         for my $v (@v) {
             if ($self->other && $v eq $self->othername) {
                 debug 1, "$self->{name}: redoing value from _other field";
--- a/lib/CGI/FormBuilder/Multi.pm
+++ b/lib/CGI/FormBuilder/Multi.pm
@@ -218,7 +218,19 @@
         }
         for my $k (@{$self->{keepextras}}) {
             next if $k eq $pnam;
-            for my $v ($self->{params}->param($k)) {
+
+            my @values;
+            if ($self->{params}->can('param_fetch')) {
+                @values = @{$self->{params}->param_fetch($k)};
+            }
+            else {
+                # array-context calls to param($k) are deprecated in
+                # CGI.pm, but some other objects that mimic
+                # its interface don't have param_fetch
+                @values = $self->{params}->param($k);
+            }
+
+            for my $v (@values) {
                 push @keep, { name => $k, value => $v };
             }
         }
