class WFSGovernor extends TimeSpanGovernor implements QueryTrackerListener {

    @Override
    protected boolean performRequest(List<? extends TimeSpan> spans)
    {
        DataModelCategory category = new DataModelCategory(null, MapDataElement.class.getName(), myWfsLayer.getTypeKey());

        GeneralIntervalPropertyMatcher<DataFilter> filter = null;
        if (myRegion.getTypeKeyToFilterMap().get(myWfsLayer.getTypeKey()) != null)
        {
            filter = new GeneralIntervalPropertyMatcher<>(WFSDataRegistryHelper.DATA_FILTER_PROPERTY_DESCRIPTOR,
                    myRegion.getTypeKeyToFilterMap().get(myWfsLayer.getTypeKey()));
        }

        for (Polygon poly : JTSCoreGeometryUtilities.convertToJTSPolygonsAndSplit(myRegion.getGeometries()))
        {
            GeometryMatcher geometry = new GeometryMatcher(GeometryAccessor.GEOMETRY_PROPERTY_NAME,
                    GeometryMatcher.OperatorType.INTERSECTS, poly);

            for (TimeSpan span : spans)
            {
                TimeSpan toUse = span;

                // When span is all of eternity, this means the layer we are querying is timeless so we want to send timeless in the query.
                if (span.equals(ourAllTime))
                {
                    toUse = TimeSpan.TIMELESS;
                }

                TimeSpanMatcher time = new TimeSpanMatcher(TimeSpanAccessor.TIME_PROPERTY_NAME, toUse);

                List<PropertyMatcher<?>> matchers = New.list(geometry, time);
                if (filter != null)
                {
                    matchers.add(filter);
                }
                DefaultQuery query = new DefaultQuery(category, Collections.emptyList(), matchers, null);
                QueryTracker tracker = myDataRegistry.submitQuery(query);
                tracker.addListener(this);
            }
        }

        return true;
    }

    public  WFSGovernor(MantleToolbox mantle, DataRegistry dataRegistry, DataTypeInfo wfsLayer, QueryRegion region);

}