added generic support partially (unstable)
refactoring to favor composition over inheritence, added generic version of Once