File Coverage

blib/lib/Pod/WSDL/Type.pm
Criterion Covered Total %
statement 35 67 52.2
branch 6 20 30.0
condition 4 4 100.0
subroutine 7 8 87.5
pod 2 2 100.0
total 54 101 53.4


line stmt bran cond sub pod time code
1             package Pod::WSDL::Type;
2              
3 8     8   103676 use strict;
  8         19  
  8         381  
4 8     8   45 use warnings;
  8         17  
  8         377  
5 8     8   5340 use Pod::WSDL::Attr;
  8         22  
  8         248  
6 8     8   1583 use Pod::WSDL::Utils qw(:writexml :namespaces :types);
  8         19  
  8         2623  
7 8     8   58 use Pod::WSDL::AUTOLOAD;
  8         19  
  8         12771  
8              
9             our $VERSION = "0.05";
10             our @ISA = qw/Pod::WSDL::AUTOLOAD/;
11              
12             our %FORBIDDEN_METHODS = (
13             name => {get => 1, set => 0},
14             wsdlName => {get => 1, set => 0},
15             array => {get => 1, set => 1},
16             descr => {get => 1, set => 0},
17             attrs => {get => 1, set => 0},
18             writer => {get => 0, set => 0},
19             );
20              
21             sub new {
22 6     6 1 1250 my ($pkg, %data) = @_;
23            
24 6 100       52 die "A type needs a name, died" unless $data{name};
25              
26 4         11 my $wsdlName = $data{name};
27 4         37 $wsdlName =~ s/(?:^|::)(.)/uc $1/eg;
  6         2194  
28            
29 4   100     93 my $me = bless {
      100        
30             _name => $data{name},
31             _wsdlName => ucfirst $wsdlName,
32             _array => $data{array} || 0,
33             _attrs => [],
34             _descr => $data{descr} || '',
35             _writer => $data{writer},
36             _reftype => 'HASH',
37             }, $pkg;
38              
39 4 100       21 $me->_initPod($data{pod}) if $data{pod};
40              
41 4         17 return $me;
42             }
43              
44             sub _initPod {
45 1     1   3 my $me = shift;
46 1         3 my $pod = shift;
47            
48 1         17 my @data = split "\n", $pod;
49            
50             # Preprocess wsdl pod: trim all lines and concatenate lines not
51             # beginning with wsdl type tokens to previous line.
52             # Ignore first element, if it does not begin with wsdl type token.
53 1         7 for (my $i = $#data; $i >= 0; $i--) {
54            
55 6 50       77 if ($data[$i] !~ /^\s*(?:_ATTR|_REFTYPE)/i) {
56 0 0       0 if ($i > 0) {
57 0         0 $data[$i - 1] .= " $data[$i]";
58 0         0 $data[$i] = '';
59             }
60             }
61             }
62              
63 1         4 for (@data) {
64 6         78 s/\s+/ /g;
65 6         19 s/^ //;
66 6         21 s/ $//;
67              
68 6 50       90 if (/^\s*_ATTR\s+/i) {
    0          
69 6         7 push @{$me->{_attrs}}, new Pod::WSDL::Attr($_);
  6         40  
70             } elsif (/^\s*_REFTYPE\s+(HASH|ARRAY)/i) {
71 0           $me->reftype(uc $1);
72             }
73             }
74            
75             }
76              
77             sub writeComplexType {
78 0     0 1   my $me = shift;
79 0           my $ownTypes = shift;
80              
81 0           $me->writer->wrElem($START_PREFIX_NAME, "complexType", name => $me->wsdlName);
82 0           $me->writer->wrDoc($me->descr, useAnnotation => 1);
83            
84 0 0         if ($me->reftype eq 'HASH') {
    0          
85            
86 0           $me->writer->wrElem($START_PREFIX_NAME, "sequence");
87            
88 0           for my $attr (@{$me->attrs}) {
  0            
89 0           my %tmpArgs = (name => $attr->name,
90             type => Pod::WSDL::Utils::getTypeDescr($attr->type, $attr->array, $ownTypes->{$attr->type}));
91            
92 0 0         $tmpArgs{nillable} = $attr->nillable if $attr->nillable;
93            
94 0           $me->writer->wrElem($START_PREFIX_NAME, "element", %tmpArgs);
95 0           $me->writer->wrDoc($attr->descr, useAnnotation => 1);
96 0           $me->writer->wrElem($END_PREFIX_NAME, "element");
97             }
98            
99 0           $me->writer->wrElem($END_PREFIX_NAME, "sequence");
100             } elsif ($me->reftype eq 'ARRAY') {
101 0           $me->writer->wrElem($START_PREFIX_NAME, "complexContent");
102 0           $me->writer->wrElem($START_PREFIX_NAME, "restriction", base => "soapenc:Array");
103 0           $me->writer->wrElem($EMPTY_PREFIX_NAME, "attribute", ref => $TARGET_NS_DECL . ':' . $me->wsdlName, "wsdl:arrayType" => 'xsd:anyType[]');
104 0           $me->writer->wrElem($END_PREFIX_NAME, "restriction");
105 0           $me->writer->wrElem($END_PREFIX_NAME, "complexContent");
106             }
107            
108 0           $me->writer->wrElem($END_PREFIX_NAME, "complexType");
109              
110 0 0         if ($me->array) {
111 0           $me->writer->wrElem($START_PREFIX_NAME, "complexType", name => $ARRAY_PREFIX_NAME . ucfirst $me->wsdlName);
112 0           $me->writer->wrElem($START_PREFIX_NAME, "complexContent");
113 0           $me->writer->wrElem($START_PREFIX_NAME, "restriction", base => "soapenc:Array");
114 0           $me->writer->wrElem($EMPTY_PREFIX_NAME, "attribute", ref => "soapenc:arrayType", "wsdl:arrayType" => $TARGET_NS_DECL . ':' . $me->wsdlName . '[]');
115 0           $me->writer->wrElem($END_PREFIX_NAME, "restriction");
116 0           $me->writer->wrElem($END_PREFIX_NAME, "complexContent");
117 0           $me->writer->wrElem($END_PREFIX_NAME, "complexType");
118             }
119             }
120              
121             1;
122             __END__