class FilterProperty {

    protected PropertySupport.Reflection property;
    protected Filter filter;
    protected PropertyExecutor propertyExecutor;

    FilterProperty(Filter filter) {
        this.filter = filter;
        propertyExecutor = Lookup.getDefault().lookup(PropertyExecutor.class);
    }

    /**
     * Creates a property.
     *
     * @param filter       The filter instance
     * @param valueType    The type of the property value, ex:
     *                     <code>Double.class</code>
     * @param propertyName The display name of the property
     * @param getMethod    The name of the get method for this property, must exist
     *                     to make Java reflexion working.
     * @param setMethod    The name of the set method for this property, must exist
     *                     to make Java reflexion working.
     * @return the created property
     * @throws NoSuchMethodException if the getter or setter methods cannot be
     *                               found
     */
    public static FilterProperty createProperty(Filter filter, Class valueType, String propertyName, String getMethod,
                                                String setMethod) throws NoSuchMethodException {<FILL_FUNCTION_BODY>}

    /**
     * Creates a property.
     *
     * @param filter    filter instance
     * @param valueType type of the property value, ex:
     *                  <code>Double.class</code>
     * @param fieldName java field name of the property
     * @return the created property
     * @throws NoSuchMethodException if the getter or setter methods cannot be
     *                               found
     */
    public static FilterProperty createProperty(Filter filter, Class valueType, String fieldName)
        throws NoSuchMethodException {
        if (valueType == Boolean.class) {
            valueType = boolean.class;
        }
        final FilterProperty filterProperty = new FilterProperty(filter);
        PropertySupport.Reflection property = new PropertySupport.Reflection(filter, valueType, fieldName);
        property.setName(fieldName);
        filterProperty.property = property;

        return filterProperty;
    }

    /**
     * Returns property's name
     *
     * @return property's name
     */
    public String getName() {
        return property.getDisplayName();
    }

    /**
     * Returns property's value, can be <code>null</code>
     *
     * @return property's value
     */
    public Object getValue() {
        try {
            return property.getValue();
        } catch (Exception e) {
            Logger.getLogger("").log(Level.SEVERE, "Error while getting value for property '" + getName() + "'", e);
        }
        return null;
    }

    /**
     * Set property's value. The type of <code>value</code> must match with this
     * property value type.
     *
     * @param value the value that is to be set
     */
    public void setValue(Object value) {
        if (propertyExecutor != null) {
            propertyExecutor.setValue(this, value, new PropertyExecutor.Callback() {

                @Override
                public void setValue(Object value) {
                    try {
                        property.setValue(value);
                    } catch (Exception e) {
                        Logger.getLogger("")
                            .log(Level.SEVERE, "Error while setting value for property '" + getName() + "'", e);
                    }
                }
            });
        } else {
            try {
                property.setValue(value);
            } catch (Exception e) {
                Logger.getLogger("").log(Level.SEVERE, "Error while setting value for property '" + getName() + "'", e);
            }
        }
    }

    /**
     * Returns the <code>PropertyEditor</code> associated to the property value.
     *
     * @return the property editor
     */
    public PropertyEditor getPropertyEditor() {
        return property.getPropertyEditor();
    }

    /**
     * Sets the property editor class. The class must implement
     * {@link PropertyEditor}.
     *
     * @param clazz the property editor class
     */
    public void setPropertyEditorClass(Class<? extends PropertyEditor> clazz) {
        property.setPropertyEditorClass(clazz);
    }

    /**
     * Returns the property's value type.
     *
     * @return the value type
     */
    public Class getValueType() {
        return property.getValueType();
    }

    /**
     * Returns the filter instance this property is associated to.
     *
     * @return the filter this property belongs to
     */
    public Filter getFilter() {
        return filter;
    }
}

        final FilterProperty filterProperty = new FilterProperty(filter);
        PropertySupport.Reflection property = new PropertySupport.Reflection(filter, valueType, getMethod, setMethod);
        property.setName(propertyName);
        filterProperty.property = property;

        return filterProperty;
    
<no_super_class>