Based on chapter06-01, but with following changes from the main text:


Removed imperative validation from Car#RegistrationNumer
- validateRegistrationNumber

Reimplemented as specification
- RegistrationNumberSpecification
- applied @MustSatisfy annotation to Car#RegistrationNumer
- applied @MustSatisfy annotation to Customer#newCar (RegistrationNumber param)



Disabled Car#RegistrationNumer
- applied @Disabled annotation

Disabled Customer#Cars collection
- applied @Disabled annotation

Disabled Car#OwningCustomer property
- applied @Disabled annotation

Disabled Car#Services collection
- applied @Disabled annotation

Disabled Service#Car property
- applied @Disabled annotation

Disabled Car#Model property
- applied @Disabled annotation



Disabled Customer#deleteCar imperatively
- disableDeleteCar()

Disabled Customer#Notes imperatively
- disableNotes

Factored out Customer#doesntOwnAnyCars




Refactored CustomerRepository#findByName
- replaced CustomerRepository#matches with Customer#matches
- annotated Customer#matches action as @Hidden



Added Customer#Feedback property with imperative hiding
- hideFeedback() method



Reimplemented Customer#newCar with new no-arg version
- deleted Customer#newCar(Model,String)
- add     Customer#newCar()
- added   Customer#persisting() lifecycle callback method

Annotated Car#Model and Car#RegistrationNumber as @Disabled(When.ONCE_PERSISTED)




Added Car#bookService, with corresponding persisting() callback method

Annotated Car#Services and Service#Car as @Disabled(When.ONCE_PERSISTED)

Added defaults for Service's BookedIn and EstimatedReady properties
- defaultBookedIn
- defaultEstimatedReady

Added object-level validation to Service
- validate() method

