class SolidityFunctionWrapper extends Generator {

    void buildEventFunctions(
            AbiDefinition functionDefinition,
            TypeSpec.Builder classBuilder) throws ClassNotFoundException {

        String functionName = functionDefinition.getName();
        List<AbiDefinition.NamedType> inputs = functionDefinition.getInputs();
        String responseClassName = Strings.capitaliseFirstLetter(functionName) + "EventResponse";

        List<org.web3j.codegen.SolidityFunctionWrapper.NamedTypeName> indexedParameters = new ArrayList<NamedTypeName>();
        List<org.web3j.codegen.SolidityFunctionWrapper.NamedTypeName> nonIndexedParameters = new ArrayList<NamedTypeName>();
        for (AbiDefinition.NamedType namedType : inputs) {

            if (namedType.isIndexed()) {
                indexedParameters.add(
                        new org.web3j.codegen.SolidityFunctionWrapper.NamedTypeName(
                                namedType.getName(),
                                buildTypeName(namedType.getType())));
            } else {
                nonIndexedParameters.add(
                        new org.web3j.codegen.SolidityFunctionWrapper.NamedTypeName(
                                namedType.getName(),
                                buildTypeName(namedType.getType())));
            }
        }

        classBuilder.addType(buildEventResponseObject(responseClassName, indexedParameters,
                nonIndexedParameters));

        classBuilder.addMethod(buildEventTransactionReceiptFunction(responseClassName,
                functionName, indexedParameters, nonIndexedParameters));
        classBuilder.addMethod(buildEventObservableFunction(responseClassName, functionName,
                indexedParameters, nonIndexedParameters));
    }

    public  SolidityFunctionWrapper(boolean useNativeJavaTypes);

}