support events instead of functions and begin supporting scope