add WeakEvent implementation