

    public class Main {
        
        public static void main(String args[]) {
            Page page = new Page();
            writeBody(page);
            page.show();
            
        }
        
        static void writeBody(Page page) {
            try (BodyTag bodyTag = new BodyTag(page)) {
                writeText(page);
                writeList(page);
            }
        }

        static void writeText(Page page) {
            try (StrongTag strongTag = new StrongTag(page)) {
                strongTag.append(" some text ");
            }
        }
        
        static void writeList(Page page) {
            try (ListTag list = new ListTag(page)) {
                // A twisted way to write a, b and c as elements
                for (char c=97; c<100; ++c) {
                    appendElem(page, String.valueOf(c));
                }
            }
        }
    
        static void appendElem(Page page, String elem) {
            try (ListElem li = new ListElem(page)) {
                li.append(elem);
            }        
        }
    }
    
    class Page {
        
        StringBuilder content = new StringBuilder();
        
        void append(String text) {
            content.append(text);
        }
        
        void show() {
            System.out.println(content);
        }
    }
    
    abstract class Tag implements AutoCloseable {
        
        String name;
        Page content;
        
        Tag(Page parent, String tagName) {
            name = tagName;
            content = parent;
            content.append("<");
            content.append(name);
            content.append(">");        
        }
        
        public void append(String text) {
            content.append(text);
        }
        
        @Override
        final public void close() {
            content.append("</");
            content.append(name);
            content.append(">");
        }
    }
    
    final class StrongTag extends Tag {
    
        public StrongTag(Page parent) {
            super(parent, "strong");
        }
    }
    
    final class BodyTag extends Tag {
    
        public BodyTag(Page parent) {
            super(parent, "body");
        }
    }
    
    final class ListTag extends Tag {
        
        public ListTag(Page parent) {
            super(parent, "ol");
        }
    }
    
    final class ListElem extends Tag {
        
        public ListElem(Page parent) {
            super(parent, "li");
        }
    }
    