public boolean matchUsage (ArgNode usageNode) {
        
        // Get the number of operands.
        // If zero, return success.
        int argCount = nonOptionList.size();
        if (argCount == 0) {
            return true;
        }
        
        // Pattern loop.
        patternMatch = null;
        ArgNode start = usageNode.getEast();
        for (String pat = first(start); pat != null; pat = next(start)) {
            if (pat.isEmpty()) {
                break;
            }
            String text = String.format("%d-%d (%d) %-30.30s %s", patternMin,
                                  patternMax, argCount, patternSpec(pat),
                                  pat);
            trace("pattern", text);
            if (patternWatch) {
                if (patternMin <= argCount && argCount <= patternMax) {
                    System.out.println("Try pattern: " + patternSpec(pat));
                }
            }
            if (match(pat)) {
                patternMatch = patternSpec(pat);
                if (patternWatch) {
                        System.out.println("Pattern match found");
                }
                addTargetOperands(pat);
                return true;
            } else if (failBase == null) {
                break;
            }
        }
        help.addProblem(usageNode, "No matching operand pattern");
        return false;
    }