 import org.openscales.proj4as.ProjProjection;
 
 import weave.api.WeaveAPI;
+import weave.api.core.IDisposableObject;
 import weave.api.data.ColumnMetadata;
 import weave.api.data.DataTypes;
 import weave.api.data.IAttributeColumn;
 import weave.api.data.IColumnWrapper;
 import weave.api.data.IProjector;
 import weave.api.data.IQualifiedKey;
+import weave.api.newDisposableChild;
+import weave.api.registerDisposableChild;
 import weave.data.AttributeColumns.GeometryColumn;
 import weave.data.AttributeColumns.ProxyColumn;
 import weave.data.AttributeColumns.StreamedGeometryColumn;



		/**
		 * This is a multi-dimensional lookup:   unprojectedColumn -> Object, destinationSRS -> ProxyColumn
		 * Example: _reprojectedColumnCache[column][destinationSRS] is a ProxyColumn containing geometries reprojected to the given SRS.
		 */		
		private const _reprojectedColumnCache:Dictionary = new Dictionary(true); // weak links to be gc-friendly
		
		/**
		 * @inheritDoc

			if (destinationProjectionSRS == null || destinationProjectionSRS == '')
				return geometryColumn;
			
			// check the cache
			var worker:WorkerThread = _reprojectedColumnCache_d2d_col_srs.get(geometryColumn, destinationProjectionSRS);
			
			// if worker doesn't exist yet or was disposed, (re)create it
			if (!worker || objectWasDisposed(worker))
			{
				worker = new WorkerThread(this, geometryColumn, destinationProjectionSRS);
				_reprojectedColumnCache_d2d_col_srs.set(geometryColumn, destinationProjectionSRS, worker);
			}

			return worker.reprojectedColumn;
		}
		
		/**
