implement bi-directional bindings