@VisibleForTesting
    public static ParametricAggregation parseFunctionDefinitionWithTypesConstraint(Class<?> clazz, TypeSignature returnType, List<TypeSignature> argumentTypes)
    {
        requireNonNull(returnType, "returnType is null");
        requireNonNull(argumentTypes, "argumentTypes is null");
        for (ParametricAggregation aggregation : parseFunctionDefinitions(clazz)) {
            if (aggregation.getSignature().getReturnType().equals(returnType) &&
                    aggregation.getSignature().getArgumentTypes().equals(argumentTypes)) {
                return aggregation;
            }
        }
        throw new IllegalArgumentException(String.format("No method with return type %s and arguments %s", returnType, argumentTypes));
    }
@ VisibleForTesting public static ParametricAggregation parseFunctionDefinitionWithTypesConstraint ( Class < ? > clazz , TypeSignature returnType , List < TypeSignature > argumentTypes ) { requireNonNull ( returnType , "returnType is null" ) ; requireNonNull ( argumentTypes , "argumentTypes is null" ) ; for ( ParametricAggregation aggregation : parseFunctionDefinitions ( clazz ) ) { if ( aggregation . getSignature ( ) . getReturnType ( ) . equals ( returnType ) && aggregation . getSignature ( ) . getArgumentTypes ( ) . equals ( argumentTypes ) ) { return aggregation ; } } throw new IllegalArgumentException ( String . format ( "No method with return type %s and arguments %s" , returnType , argumentTypes ) ) ; }
General purpose function matching is done through FunctionRegistry.