package tc.oc.pgm.filters.matcher; import tc.oc.commons.core.reflect.TypeParameterCache; import tc.oc.pgm.filters.Filter; import tc.oc.pgm.filters.query.IQuery; /** * A filter that NEVER responds to queries outside of {@link #queryType()}, * and SOMETIMES responds to queries extending {@link #queryType()}. * * Queries of the latter type are passed to {@link #queryTyped(IQuery)}. * * The runtime type of {@link Q} is detected automatically if it * is specified by a subclass. */ public interface WeakTypedFilter<Q extends IQuery> extends Filter { TypeParameterCache<WeakTypedFilter, ? extends IQuery> Q_CACHE = new TypeParameterCache<>(WeakTypedFilter.class, "Q"); default Class<? extends Q> queryType() { return (Class<Q>) Q_CACHE.resolveRaw(getClass()); } default QueryResponse query(IQuery query) { return queryType().isInstance(query) ? queryTyped((Q) query) : QueryResponse.ABSTAIN; } QueryResponse queryTyped(Q query); }