#import "uml.typ"

#set page(width: auto, height: auto, margin: 1cm)

#uml.diagram({
  import uml: *
  
  class("Person", abstract, {
    attr("name", "str")
    attr("phoneNumber", "str")
    attr("emailAddress", "str")
    method("purchaseParkingPass")
  })
  class("Address", {
    attr("street", "str")
    attr("city", "str")
    attr("state", "str")
    attr("postalCode", "int")
    attr("country", "str")
    method("validate", "bool", private)
    method("outputAsLabel", "str")
  })
  class("Student", {
    attr("studentNumber", "int")
    attr("averageMark", "int")
    method("isEligibleToEnroll", "bool", ("str",))
    method("getSeminarsTaken", "int")
  })
  class("Professor", {
    attr("salary", "int", package)
    attr("staffNumber", "int", protected)
    attr("yearsOfService", "int", private)
    attr("numberOfClasses", "int")
  })
})

#pagebreak()

#uml.diagram({
  import uml: *

  class("Pageable", interface, {
    attr("UNKNOWN_N_OF_PAGES", "int", default: -1)
  })

  class("SQLStatement", {
    method("executeQuery", "ResultSet", (sql: "String"))
    method("isPoolable", "Boolean")
    method("getQueryTimeout", "int")
    method("clearWarnings")
  })

  class("SearchService", {
    attr("config", "Configuration", private)
    attr("engine", "SearchEngine", private)
    method("search", "SearchResult", (query: "SearchRequest"))
    method("createEngine", "SearchEngine", private, static)
  })

  class("SearchService", grouped: true, {
    attr("config", "Configuration", private)
    attr("engine", "SearchEngine", private)
    method("search", "SearchResult", (query: "SearchRequest"))
    method("createEngine", "SearchEngine", private, static)
  })
})

#pagebreak()

#import "parser.typ": parse
#parse(```
@class-grouped=true
class Button {
  -theController : Controller*
  +press() : void
  +setTheController(p : Controller*) : void
}

abstract class Controller {
  -theLight : Light*
  -lampState : boolean
  +evButtonPressed() : void
  +setTheLight(p : Light*) : void
  -toggle() : void
}

class Light {
  +on() : void
  +off() : void
}
```)

#pagebreak()

#parse(```
class City {
  +resources: HashMap[ResourceType, Int]
  +globalHappiness: Double
}

abstract class Building {
  +getResourcesOnBuilt(): HashMap[ResourceType, Int]
}
```)