 	 * This is a stack trace from when the callback was removed.
 	 */
 	public var removeCallback_stackTrace:String = null;
+	
+	/**
+	 * Call this when the callback entry is no longer needed.
+	 */
+	public function dispose():void
+	{
+		if (CallbackCollection.debug && callback != null)
+			removeCallback_stackTrace = new Error(STACK_TRACE_REMOVE).getStackTrace();
+		
+		context = null;
+		callback = null;
+	}
 }
 
 /**

	/**
	 * This function gets called once per frame and allows grouped callbacks to run.
	 */
	public static function _handleGroupedCallbacks():void
	{
		var entry:GroupedCallbackEntry;
		
		// Handle grouped callbacks in the order they were triggered,
		// anticipating that more may be added to the end of the list in the process.
		for (var i:int = 0; i < _triggeredEntries.length; i++)
		{
			entry = _triggeredEntries[i] as GroupedCallbackEntry;
			entry.handleGroupedCallback();
		}
		
		// reset for next frame
		for each (entry in _triggeredEntries)
			entry.triggered = false;
		_triggeredEntries.length = 0;
	}
	
	/**
	 * This gets set to true when the static _handleGroupedCallbacks() callback has been added as a frame listener.

						shouldRemoveEntry = WeaveAPI.SessionManager.objectWasDisposed(entry.context);
					if (shouldRemoveEntry)
					{
						entry.dispose();
						// remove the empty callback reference from the list
						var removed:Array = _callbackEntries.splice(i--, 1); // decrease i because remaining entries have shifted
						if (debug)
