class ThingsFieldExpressionFactoryImpl implements ThingsFieldExpressionFactory {

    @Override
    public FilterFieldExpression filterBy(final String propertyNameWithOptionalLeadingSlash)
            throws IllegalArgumentException {

        requireNonNull(propertyNameWithOptionalLeadingSlash);
        final String propertyName = stripLeadingSlash(propertyNameWithOptionalLeadingSlash);

        final Supplier<FilterFieldExpression> defaultSupplier = () -> (FilterFieldExpression) common(propertyName);
        return FieldExpressionUtil.parseFeatureField(requireNonNull(propertyName))
                .<FilterFieldExpression>flatMap(f -> f.getProperty()
                        .flatMap(property ->
                                // we have a feature id and a property path
                                f.getFeatureId().map(id -> new FeatureIdPropertyExpressionImpl(id, property))
                        )
                )
                .orElseGet(defaultSupplier);
    }

    public  ThingsFieldExpressionFactoryImpl();
    public  ThingsFieldExpressionFactoryImpl(final Map<String, String> simpleFieldMappings);

}