The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

use Test;
BEGIN { plan tests => 1 };

use strict;
BEGIN { eval { require warnings } ? 'warnings'->import : ( $^W = 1 ) }

require Waft;

{
    package Waft::Test::D;

    sub html_escape {
        my ($self, $value) = @_;

        $self->output('d');

        return $self->next( $value . 'D' );
    }
}

{
    package Waft::Test::C;

    sub html_escape {
        my ($self, $value) = @_;

        $self->output('c');

        return $self->next( $value . 'C' );
    }
}

{
    package Waft::Test::B::Base;

    sub html_escape {
        my ($self, $value) = @_;

        return $self->next( $value . 'B' );
    }
}

{
    package Waft::Test::B;

    use base qw( Waft::Test::B::Base );

    sub html_escape {
        my ($self, $value) = @_;

        my ($content, $return_value) = $self->get_content( sub {

            return $self->SUPER::html_escape($value);
        } );

        return $return_value . $content;
    }
}

{
    package Waft::Test::A;

    use base qw( Waft::Test::B Waft::Test::C Waft::Test::D Waft );

    sub html_escape {
        my ($self, $value) = @_;

        return $self->next( $value . 'A' );
    }
}

ok( Waft::Test::A->new->html_escape(q{}) eq 'ABCDcd' );