add once method
add takeUntil functionality