The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
[%
    simple = element.simple_type;
    very_simple = element.very_simple_type;
    is_array = element.max_occurs == 'unbounded'
        || ( element.max_occurs && element.max_occurs > 1 )
        || ( element.min_occurs && element.min_occurs > 1 );
    is_nillable = element.nillable;
    type_name = simple || element.type_module;
    serialize = '';

    IF very_simple == 'xs:boolean';
        serialize = "sub { \$_ ? 'true' : 'false' }";
    ELSIF very_simple == 'xs:date';
        serialize = "sub {
        return \$_->ymd if \$_->time_zone->isa('DateTime::TimeZone::Floating');
        my \$d = DateTime::Format::Strptime::strftime('%F%z', \$_);
        \$d =~ s/([+-]\\d\\d)(\\d\\d)\$/\$1:\$2/;
        return \$d
    }";
    ELSIF very_simple == 'xs:time';
        serialize = "sub { \$_->hms }";
    END;
%]
has [% element.perl_name || '' %] => (
    is              => 'rw',
    isa             => __PACKAGE__->xsd_subtype( [% simple ? 'parent' : 'module' %] => '[% type_name %]'[% IF is_array %], list => 1[% END %][% IF is_nillable %], nillable => 1[% END %][% IF simple.list %], simple_list => 1[% END %] ),
    predicate       => 'has_[% element.perl_name %]',
[%- IF !element.nillable && 0 %]
[%# TODO nillable should be handled by type not attribute %]
    required        => 1, #[%- element.nillable %]
[%- END %]
    coerce          => 1,
[%- IF config.alias && element.name.replace('^\w+:', '') != element.perl_name %]
    alias           => '[% element.name.replace('^\w+:', '') %]',
[%- END %]
    traits          => [qw{ W3C::SOAP::XSD }],
[%- IF !simple %]
    xs_perl_module  => '[% element.type_module %]',
[%- END %]
    xs_name         => '[% element.name         %]',
    xs_ns           => '[% !complex || xsd.element_form_default == 'qualified' ? xsd.target_namespace : '' %]',
    xs_type         => '[% element.type         %]',
    xs_min_occurs   => '[% element.min_occurs   %]',
    xs_max_occurs   => '[% element.max_occurs  == 'unbounded' ? 0 : element.max_occurs %]',
[%- IF element.choice_group %]
    xs_choice_group => [% element.choice_group %],
[%- END %]
[%- IF serialize %]
    xs_serialize    => [% serialize %],
[%- END %]
);