builder: internal props change listeners