We also make the code a bit more generic by making callers provide (templated) callbacks that produce the property name and base expression string if any.