The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
[%  RETURN IF NOT item;
    type = definitions.find_portType( binding.expand( binding.get_type ) );
    port_op = type.find_operation( type.get_targetNamespace, operation.get_name );
    message = definitions.find_message( port_op.first_output.expand( port_op.first_output.get_message ) );
    part_from = message.get_part;
    PERL %]
    my $item = $stash->{ item };
    my $def = $stash->{ definitions };
    my $part_from = $stash->{ message }->get_part();

    my @body_part_from = split m{\s}, $item->get_parts;

    my @parts;
    if (@body_part_from) {
        @parts = map {
            my $part = $_;
            (grep {
                # my ($ns, $lname) = $def->expand( $_ );
                ($_ eq $part->get_name)
                } @body_part_from
            )
            ? do {
                my $name;
                ($name = $part->get_element)
                    ? do {
                        my $element = $def->first_types->find_element($part->expand($name));
                        my $resolver = $context->plugin('XSD');
                        $resolver->create_xsd_name($element);

                    }
                    : ($name = $part->get_type)
                        ? do {
                            my $element = $def->first_types->find_type($part->expand($name));
                            my $resolver = $context->plugin('XSD');
                            $resolver->create_xsd_name($element);
                        }
                    : die "output must have either type or element"
                }
            : ()
        } @{ $part_from };
    }
    else {
        @parts = map {
            my $part = $_;
            my $name;
            ($name = $part->get_element)
               ? do {
                    my $element = $def->first_types->find_element($part->expand($name));
                    my $resolver = $context->plugin('XSD');
                    $resolver->create_xsd_name($element);
               }
               : ($name = $part->get_type)
                    ? do {
                            my $element = $def->first_types->find_type($part->expand($name));
                            my $resolver = $context->plugin('XSD');
                            $resolver->create_xsd_name($element);
                    }
                    : die "output must have either type or element";
        } @{ $part_from };
    }

    warn "Multiple parts detected in message " . $stash->{ message }->get_name() . ".\n",
        "WS-I BP demands 0 to 1 parts in message body\n"
        if (@parts > 1);

    $stash->{ parts } = \@parts;

[% END %]
[% IF item.get_use != 'literal';
    THROW NOT_SUPPORTED "Body: SOAP::WSDL supports literal encoding only - ${ item.get_use } found";
END %]
           'use'            => '[% item.get_use %]',
            namespace       => '[% item.get_namespace %]',
            encodingStyle   => '[% item.get_encodingStyle %]',
            parts           =>  [qw( [% parts.join(' ') %] )],