updated to have value/changed semantics