@startuml
!include style.puml
skinparam arrowThickness 1.1
skinparam arrowColor MODEL_COLOR
skinparam classBackgroundColor MODEL_COLOR

Package Model <<Rectangle>>{
Interface ReadOnlyAddressBook <<Interface>>
Interface Model <<Interface>>
Interface ObservableList <<Interface>>
Interface ReadOnlyDatesBook <<Interface>>
Interface ReadOnlyLessonBook <<Interface>>
Class AddressBook
Class ReadOnlyAddressBook
Class Model
Class ModelManager
Class UserPrefs
Class ReadOnlyUserPrefs
Class DatesBook
Class LessonBook

Package Person {
Class Person
Class Address
Class Email
Class Name
Class Phone
Class School
Class UniquePersonList
}

Package Tag {
Class Tag
}

Package Lesson {
Class Lesson
Class Day
Class Time
Class UniqueLessonList
}

Package Date {
Class Description
Class Details
Class ImportantDate
Class UniqueDateList
}
}

Class HiddenOutside #FFFFFF
HiddenOutside ..> Model

AddressBook .up.|> ReadOnlyAddressBook

ModelManager .up.|> Model
Model .right.> ObservableList
ModelManager o--> "1" AddressBook
ModelManager o-left-> "1" UserPrefs
UserPrefs .up.|> ReadOnlyUserPrefs
ModelManager o-right-> "1" DatesBook
DatesBook .up.|> ReadOnlyDatesBook
ModelManager o-right-> "1" LessonBook
LessonBook .up.|> ReadOnlyLessonBook

AddressBook *--> "1" UniquePersonList
UniquePersonList o--> "*" Person
Person *--> Name
Person *--> Phone
Person *--> Email
Person *--> Address
Person *--> School
Person *--> "*" Tag
Person *--> "*" Lesson

Name -[hidden]right-> Phone
Phone -[hidden]right-> Address
Address -[hidden]right-> Email

DatesBook *--> "1" UniqueDateList
UniqueDateList o--> "*" ImportantDate
ImportantDate *--> Description
ImportantDate *--> Details

LessonBook *--> "1" UniqueLessonList
UniqueLessonList o--> "*" Lesson
Lesson *--> Day
Lesson *--> Time
Lesson *--> "*" Person

ModelManager ----->" ~* filtered and observable list" Person
ModelManager ----->" ~* filtered and observable list" Lesson
@enduml
