implement delegate instead of live