sub body { my ($tab,$code,$opt) = @_; my $tag = 'body'; my $open = open_tag($tag,$opt,[@ics,@java]); line($tab,"<$open>"); &$code; line($tab,""); } #### body( sub { header( sub { ... some header code for the body ... }); ... some random code in the body ... article( sub { header( sub { ... some header code for the section... }); ... some random code in the article ... section( sub { header( sub { ... some header code for the section ... }); ... some random code in the section ... aside( sub { header( sub { ... some header code for the aside ... }); ... some random code in the aside... footer( sub { ... some footer code for the aside ... }); }); ... some random code in the section... footer( sub { ... some footer code for the section... }); }); ... some random code in the article... section( sub { header( sub { ... some heading code for this section... }); ... some random code for this section... footer( sub { ... some footer code for this section... }); }); aside( sub { header( sub { ... some header code for this aside ... }); ... some random code for this aside ... footer( sub { ... some footer code for this aside ... }); }); footer( sub { ... some footer code for the article ... }); }); footer( sub { ... some footer code for the body ... }); }); #### sub body { my ($tab,$opt) = @_; my $tag = 'body'; my $open = open_tag($tag,$opt,[@ics,@java]); line($tab,"<$open>"); header($tab + 1, @{$opt->{header}}) if $opt->{header}; &{$opt->{contents}}; footer($tab + 1, @{$opt->{footer}}) if $opt->{footter}; line($tab,""); } #### body( header => sub { ... header code for body ... }, footer => sub { address( sub { ... adress code for the footer of the body ... }); ... footer code for body ... }, contents => sub { ... random code for body ... article( header => sub { ... header code for article ... }, footer => sub { ... footer code for article ... }, contents => sub { ... random code for article ... section( header => sub { ... header code for section ... }, footer => sub { ... footer code for section ... }, contents => sub { ... random code for section ... aside( header => sub { ... header code for aside ... }, footer => sub { ... footer code for aside ... }, contents => sub { ... random code for aside ... }, ); }, ); ... random code for article ... section( header => sub { ... header code for section ... }, footer => sub { ... footer code for section ... }, contents => sub { ... random code for section ... }, ); ... random code for article ... aside( header => sub { ... header code for aside ... }, footer => sub { ... footer code for aside ... }, contents => sub { ... random code for aside ... }, ); ... random code for article ... }, ); }, );