import com.github.sormuras.bach.Bach;
import com.github.sormuras.bach.Call;

class hello {
  public static void main(String... args) throws Exception {
    try (var bach = new Bach()) {
      bach.log("CAPTION:Restore external tool layers");
      bach.run(
          "restore",
          bach.path()
                  .externalToolLayer(
                      "sormuras-hello@1-ea+1", "com.github.sormuras.hello@1-ea+1.jar")
              + "=https://github.com/sormuras/hello/releases/download/1-ea+1/com.github.sormuras.hello@1-ea+1.jar#SIZE=1803");

      bach.log("CAPTION:Restore external tool programs");
      bach.runParallel(
          Call.tool(
              "restore",
              bach.path().externalToolProgram("sormuras-hello@07819f3ee7", "Hello.java")
                  + "=https://github.com/sormuras/hello/raw/07819f3ee7/Hello.java#SIZE=200"),
          Call.tool(
              "restore",
              bach.path().externalToolProgram("sormuras-hello@1-ea+1.java", "Hello.java")
                  + "=https://github.com/sormuras/hello/releases/download/1-ea+1/Hello.java#SIZE=203"),
          Call.tool(
              "restore",
              bach.path().externalToolProgram("sormuras-hello@1-ea+1.jar", "hello-1-ea+1.jar")
                  + "=https://github.com/sormuras/hello/releases/download/1-ea+1/hello-1-ea+1.jar#SIZE=909"));

      bach.log("CAPTION:Greet current user");
      bach.run("hello");
      bach.run("sormuras-hello@07819f3ee7");
      bach.run("sormuras-hello@1-ea+1.java");
      bach.run("sormuras-hello@1-ea+1.jar");
    }
  }
}

@@ -34,46 +34,8 @@
 ach;
-%0Aimport com.github.sormuras.bach.Call;
 %0A%0Acl
@@ -207,38 +207,63 @@
     
-bach.run(%0A  
+var restorer = bach.restorer();%0A
       
-  %22
 restore
-%22,
+r.restore(
 %0A   
@@ -269,27 +269,24 @@
         
-bach.path()
+restorer
 %0A       
@@ -296,14 +296,18 @@
     
-    .e
+.describeE
 xter
@@ -323,55 +323,76 @@
 yer(
-%0A                      %22sormuras-hello@1-ea+1%22,
+%22sormuras-hello@1-ea+1%22)%0A              .withAsset(%0A                 
  %22co
@@ -418,33 +418,33 @@
 ello@1-ea+1.jar%22
-)
+,
 %0A              +
@@ -434,36 +434,37 @@
 ,%0A              
-+
+   
  %22
-=
 https://github.c
@@ -554,16 +554,17 @@
 E=1803%22)
+)
 ;%0A%0A     
@@ -626,45 +626,24 @@
     
-bach.runParallel(%0A          Call.tool
+restorer.restore
 (%0A  
@@ -646,38 +646,32 @@
 (%0A          
-    %22
 restore
-%22,
+r
 %0A           
@@ -669,37 +669,34 @@
             
-bach.path().e
+.describeE
 xternalToolP
@@ -729,17 +729,61 @@
 19f3ee7%22
-,
+)%0A              .withAsset(%0A                 
  %22Hello.
@@ -779,33 +779,33 @@
     %22Hello.java%22
-)
+,
 %0A               
@@ -799,36 +799,33 @@
                 
-+ %22=
+%22
 https://github.c
@@ -882,55 +882,297 @@
 00%22)
-,%0A          Call.tool(%0A              %22
+%0A              .withAsset(%0A                  %22README.md%22,%0A                  %22%22%22%0A                  string:%0A                  # Hello.java Program%0A%0A                  Find source code at %3Chttps://github.com/sormuras/hello/blob/07819f3ee7/Hello.java%3E%0A                  %22%22%22),%0A          
 restore
-%22,
+r
 %0A   
@@ -1178,37 +1178,34 @@
             
-bach.path().e
+.describeE
 xternalToolP
@@ -1239,17 +1239,61 @@
 +1.java%22
-,
+)%0A              .withAsset(%0A                 
  %22Hello.
@@ -1293,25 +1293,25 @@
 %22Hello.java%22
-)
+,
 %0A           
@@ -1309,36 +1309,33 @@
                 
-+ %22=
+%22
 https://github.c
@@ -1414,43 +1414,16 @@
     
-Call.tool(%0A              %22
 restore
-%22,
+r
 %0A   
@@ -1437,21 +1437,18 @@
     
-bach.path().e
+.describeE
 xter
@@ -1489,17 +1489,61 @@
 a+1.jar%22
-,
+)%0A              .withAsset(%0A                 
  %22hello-
@@ -1545,33 +1545,33 @@
 ello-1-ea+1.jar%22
-)
+,
 %0A               
@@ -1577,12 +1577,9 @@
     
-+ %22=
+%22
 http

Use Restorer's API in hello demo