1[%  RETURN IF NOT item;
2    type = definitions.find_portType( binding.expand( binding.get_type ) );
3    port_op = type.find_operation( type.get_targetNamespace, operation.get_name );
4    message = definitions.find_message( port_op.first_input.expand( port_op.first_input.get_message ) );
5    part_from = message.get_part;
6    PERL %]
7    my $item = $stash->{ item };
8    my $def = $stash->{ definitions };
9    my $part_from = $stash->{ message }->get_part();
10
11    my @body_part_from = split m{\s}, $item->get_parts;
12
13    my @parts;
14    if (@body_part_from) {
15        @parts = map {
16            my $part = $_;
17            (grep {
18                # my ($ns, $lname) = $def->expand( $_ );
19                ($_ eq $part->get_name)
20                } @body_part_from
21            )
22            ? do {
23                my $name;
24                ($name = $part->get_element)
25                    ? do {
26                        my $element = $def->first_types->find_element($part->expand($name));
27                        my $resolver = $context->plugin('XSD');
28                        $resolver->create_xsd_name($element);
29
30                    }
31                    : ($name = $part->get_type)
32                        ? do {
33                            my $element = $def->first_types->find_type($part->expand($name));
34                            my $resolver = $context->plugin('XSD');
35                            $resolver->create_xsd_name($element);
36                        }
37                    : die "input must have either type or element"
38                }
39            : ()
40        } @{ $part_from };
41    }
42    else {
43        @parts = map {
44            my $part = $_;
45            my $name;
46            ($name = $part->get_element)
47               ? do {
48                    my $element = $def->first_types->find_element($part->expand($name));
49                    my $resolver = $context->plugin('XSD');
50                    $resolver->create_xsd_name($element);
51               }
52               : ($name = $part->get_type)
53                    ? do {
54                            my $element = $def->first_types->find_type($part->expand($name));
55                            my $resolver = $context->plugin('XSD');
56                            $resolver->create_xsd_name($element);
57                    }
58                    : die "input must have either type or element";
59        } @{ $part_from };
60    }
61
62    warn "Multiple parts detected in message " . $stash->{ message }->get_name() . ".\n",
63        "WS-I BP demands 0 to 1 parts in message body\n"
64        if (@parts > 1);
65
66    $stash->{ parts } = \@parts;
67
68[% END %]
69[% IF item.get_use != 'literal';
70    THROW NOT_SUPPORTED "Body: SOAP::WSDL supports literal encoding only - ${ item.get_use } found";
71END %]
72           'use'            => '[% item.get_use %]',
73            namespace       => '[% item.get_namespace %]',
74            encodingStyle   => '[% item.get_encodingStyle %]',
75            parts           =>  [qw( [% parts.join(' ') %] )],