interface Display {  String asText() } trait Entity {  Integer id } class Product implements Entity, Display {  public String name  public Boolean available  public Float price  private String key  protected String data  /**  * Creates a new product instance.  * @param id Product ID.  * @param name Product name.  * @param available Product availability.  * @param price Product price.  * @param key Product key.  * @param data Product internal data.  */  Product(id, name, available, price, key = "key", data = "internal") {  this.id = id  this.name = name  this.available = available  this.price = price  this.key = key  this.data = data  }  /**@  * Returns product data as text.  * @return Data string.  */  String asText() {  return """ID [${id}] Name [${name}] Available [${available}] Price [${price}]"""  } } /* Creates a new product instance */ def product = new Product(1, "T-Shirt", true, 15.00) println(product.asText()) product.available = false product.price = 0.0 // Check values assert product.asText() == "ID [1] Name [T-Shirt] Available [false] Price [0.0]" def factorial(Integer value) {  if (value <= 1) {  return 1  } else {  return value * factorial(value - 1)  } } assert factorial(5) == 120 static String join(List list, String separator) {  String data = ""  list.each { item ->  data += item + separator  }  data = data.substring(0, data.length() - 1)  return data } assert join(["g", "r", "o", "o", "v", "y"], " ") == "g r o o v y"