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

use Test::More tests => 2;

use MooseX::Declare;

class Document::Page {
    has 'body' => (
        is      => 'rw',
        isa     => 'Str',
        default => '',
    );

    method create {
        $self->open_page;
        inner;
        $self->close_page;
    }

    method append_body ($appendage) {
        $self->body($self->body . $appendage);
    }

    method open_page  { $self->append_body('<page>') }
    method close_page { $self->append_body('</page>') }
}

class Document::PageWithHeadersAndFooters extends Document::Page {
    augment create {
        $self->create_header;
        inner;
        $self->create_footer;
    }

    method create_header { $self->append_body('<header/>') }
    method create_footer { $self->append_body('<footer/>') }
}

class TPSReport extends Document::PageWithHeadersAndFooters {
    augment create {
        $self->create_tps_report;
    }

    method create_tps_report {
       $self->append_body('<report type="tps"/>');
    }
}

my $tps_report = TPSReport->new;
isa_ok($tps_report, 'TPSReport');

is(
$tps_report->create,
q{<page><header/><report type="tps"/><footer/></page>},
'... got the right TPS report');