sub _elem { my ( $elem_name, $content_fn ) = @_; # an element is represented by the triple [name, attrs, children] my $elem = [ $elem_name, undef, undef ]; my $ret = { local $__frag = $elem; $content_fn->(); }; #! keep retval push @{ $elem[2] }, $ret if defined $ret and not @{ $elem[2] }; #! new line push @{ $__frag->[2] }, $elem; } #### html { head { title { "Lorem ipsum" } }; body { # ... }; }