The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl

use warnings;
use strict;

# just to make it work without installing the module
use lib '../../lib';

# general debugging of XML::Compile modules
#use Log::Report mode => 3;

# Data::Dumper is your friend in understanding the answer
use Data::Dumper;
$Data::Dumper::Indent = 1;

# The features we use
use XML::Compile::WSDL11;
use XML::Compile::SOAP11;
use XML::Compile::Transport::SOAPHTTP;  # we fake an HTTP server

#
# During initiation 'compile time'
#

my $wsdl = XML::Compile::WSDL11->new('element.wsdl');
my $call = $wsdl->compileClient('using_element'
  , transport_hook => \&fake_server # hook simulates a remote server at test
  );

#
# Reuse often at 'run time'
#

my %request =
 ( item =>
   [ { id => 1, name => 'aap'  }
   , { id => 2, name => 'noot' }
   , { id => 3, name => 'mies' }
   ]
 );

my $answer = $call->(list => \%request);

# Useful for debugging.  Also useful to report to syslog
#    my ($answer, $trace) = $call->(\%request);
#    $trace->printTimings;

# When you do not know how the answer is structured
print Dumper $answer;

if($answer->{Fault})
{   print "Oops\n";
}
else
{   print "*** RESULT=$answer->{using_elementResponse}{result}\n";
}

exit 0;

#
# The below is to simulate a remote server.  All code you need in
# practice is ABOVE this comment.
#

sub fake_server($$)
{  my ($request, $trace) = @_;
   my $content = $request->decoded_content;
   print "*** REQUEST RECEIVED BY SERVER=\n", $content;

   use XML::Compile::SOAP::Util qw/SOAP11ENV/;
   my $soapenv = SOAP11ENV;

   my $server_answer = <<_ANSWER;
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="$soapenv">
  <SOAP-ENV:Body xmlns:call="urn:sonae:elegibilidade:exp">
    <call:using_elementResponse>
      <exp:result xmlns:exp="urn:example:wsdl">3</exp:result>
    </call:using_elementResponse>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>
_ANSWER

   print "*** ANSWER SENT BY SERVER=\n", $server_answer;
   HTTP::Response->new(200, 'answer manually created'
    , [ 'Content-Type' => 'text/xml' ], $server_answer);
}