Uses WeakReference for callback instead of strong reference