data-binding, inspired by @remy