markDirty
void markDirty()
A builder becomes dirty whenever a field is modified -- including fields
in nested builders -- and becomes clean when build() is called. Thus,
when a builder becomes dirty, all its parents become dirty as well, and
when it becomes clean, all its children become clean. The dirtiness
state is used to invalidate certain cached values.
To this end, a builder calls markAsDirty() on its parent whenever it
transitions from clean to dirty. The parent must propagate this call to
its own parent, unless it was already dirty, in which case the
grandparent must necessarily already be dirty as well. The parent can
only transition back to "clean" after calling build() on all children.