+ public Modifier modify() {
+ return new Modifier() {
+ private Optional<String> firstName = name.getFirst();
+ private Optional<String> middleName = name.getMiddle();
+ private Optional<String> lastName = name.getLast();
+ private Optional<Integer> birthYear = birthDate.getYear();
+ private Optional<Integer> birthMonth = birthDate.getMonth();
+ private Optional<Integer> birthDay = birthDate.getDay();
+
+ @Override
+ public Modifier setFirstName(String firstName) {
+ this.firstName = fromNullable(firstName);
+ return this;
+ }
+
+ @Override
+ public Modifier setMiddleName(String middleName) {
+ this.middleName = fromNullable(middleName);
+ return this;
+ }
+
+ @Override
+ public Modifier setLastName(String lastName) {
+ this.lastName = fromNullable(lastName);
+ return this;
+ }
+
+ @Override
+ public Modifier setBirthYear(Integer birthYear) {
+ this.birthYear = fromNullable(birthYear);
+ return this;
+ }
+
+ @Override
+ public Modifier setBirthMonth(Integer birthMonth) {
+ this.birthMonth = fromNullable(birthMonth);
+ return this;
+ }
+
+ @Override
+ public Modifier setBirthDay(Integer birthDay) {
+ this.birthDay = fromNullable(birthDay);
+ return this;
+ }
+
+ @Override
+ public Profile update() {
+ Profile.this.name = new Name(firstName, middleName, lastName);
+ Profile.this.birthDate = new BirthDate(birthYear, birthMonth, birthDay);
+ return Profile.this;
+ }
+ };
+ }
+
+ public interface Modifier {
+
+ Modifier setFirstName(String firstName);
+ Modifier setMiddleName(String middleName);
+ Modifier setLastName(String lastName);
+ Modifier setBirthYear(Integer birthYear);
+ Modifier setBirthMonth(Integer birthMonth);
+ Modifier setBirthDay(Integer birthDay);
+ Profile update();
+