@startuml package com.iluwatar.currying { class App { + App() + main(args : String[]) {static} } class Book { ~ BOOK_CREATOR : Function>>> {static} - author : String - genre : Genre - publicationDate : LocalDate - title : String ~ Book(genre : Genre, author : String, title : String, publicationDate : LocalDate) + builder() : AddGenre {static} } interface AddAuthor { + withAuthor(String) : AddTitle {abstract} } interface AddGenre { + withGenre(Genre) : AddAuthor {abstract} } interface AddPublicationDate { + withPublicationDate(LocalDate) : Book {abstract} } interface AddTitle { + withTitle(String) : AddPublicationDate {abstract} } enum Genre { + FANTASY {static} + HORROR {static} + SCI_FI {static} } } Book --> "-genre" Genre AddPublicationDate ..+ Book AddAuthor ..+ Book AddTitle ..+ Book AddGenre ..+ Book @enduml