public abstract FuzzyBoolean match(Shadow shadow);
public final FuzzyBoolean match(Shadow shadow) { if (shadow.shadowId == lastMatchedShadowId) return lastMatchedShadowResult; FuzzyBoolean ret;  if (couldMatchKinds().contains(shadow.getKind())) { ret = matchInternal(shadow); } else { ret = FuzzyBoolean.NO; } lastMatchedShadowId = shadow.shadowId; lastMatchedShadowResult = ret; return ret; }
	public abstract FuzzyBoolean match(Shadow shadow);