class ValidatingConfigurationListener implements ConfigurationListener {
    private final Object mojo;

    private final ConfigurationListener delegate;

    private final Map<String, Parameter> missingParameters;

    ValidatingConfigurationListener(Object mojo, MojoDescriptor mojoDescriptor, ConfigurationListener delegate) {
        this.mojo = mojo;
        this.delegate = delegate;
        this.missingParameters = new HashMap<>();

        if (mojoDescriptor.getParameters() != null) {
            for (Parameter param : mojoDescriptor.getParameters()) {
                if (param.isRequired()) {
                    missingParameters.put(param.getName(), param);
                }
            }
        }
    }

    public Collection<Parameter> getMissingParameters() {
        return missingParameters.values();
    }

    public void notifyFieldChangeUsingSetter(String fieldName, Object value, Object target) {<FILL_FUNCTION_BODY>}

    public void notifyFieldChangeUsingReflection(String fieldName, Object value, Object target) {
        delegate.notifyFieldChangeUsingReflection(fieldName, value, target);

        if (mojo == target) {
            notify(fieldName, value);
        }
    }

    private void notify(String fieldName, Object value) {
        if (value != null) {
            missingParameters.remove(fieldName);
        }
    }
}

        delegate.notifyFieldChangeUsingSetter(fieldName, value, target);

        if (mojo == target) {
            notify(fieldName, value);
        }
    
<no_super_class>