use call_user_func over $callback(), add tests