func (cf ContractFunction) Call(ctx reflect.Value, supplementaryMetadata *metadata.TransactionMetadata, components *metadata.ComponentMetadata, serializer serializer.TransactionSerializer, params ...string) (string, interface{}, error) {
	var parameterMetadata []metadata.ParameterMetadata
	if supplementaryMetadata != nil {
		parameterMetadata = supplementaryMetadata.Parameters
	}
	values, err := cf.formatArgs(ctx, parameterMetadata, components, params, serializer)
	if err != nil {
		return "", nil, err
	}
	someResp := cf.function.Call(values)
	var returnsMetadata *metadata.ReturnMetadata
	if supplementaryMetadata != nil {
		returnsMetadata = &supplementaryMetadata.Returns
	}
	return cf.handleResponse(someResp, returnsMetadata, components, serializer)
}
Call calls function in a contract using string args and handles formatting the response into useful types
package internal
import (
	"errors"
	"fmt"
	"reflect"
	"github.com/hyperledger/fabric-contract-api-go/internal/types"
	metadata "github.com/hyperledger/fabric-contract-api-go/metadata"
	"github.com/hyperledger/fabric-contract-api-go/serializer"
)
type contractFunctionParams struct {
	context reflect.Type
	fields  []reflect.Type
}
type contractFunctionReturns struct {
	success reflect.Type
	error   bool
}
type CallType int
const (
	CallTypeNA = iota
	CallTypeSubmit
	CallTypeEvaluate
)
type ContractFunction struct {
	function reflect.Value
	callType CallType
	params   contractFunctionParams
	returns  contractFunctionReturns
}