register listener using vector
type_info refactor to remove virtual function
add event support