def METHOD_NAME(self, ns):
    """
    Dimensionally independent face-number calculation.
    >>> from fipy.meshes.builders import *
    >>> gb = _Grid1DBuilder()
    >>> gb._calcGlobalNumFaces([1])
    2
    >>> gb2 = _Grid2DBuilder()
    >>> gb2._calcGlobalNumFaces([2, 3])
    17
    >>> gb3 = _Grid3DBuilder()
    >>> gb3._calcGlobalNumFaces([2, 3, 2])
    52
    """
    assert isinstance(ns, list)
    # `permutations` is the cleanest way to do this, but it's new in
    # python 2.6, so we can't rely on it.
    if hasattr(itertools, "permutations"):
        nIter = list(itertools.permutations(list(range(len(ns)))))
        # ensure len(nIter) == len(ns) && nIter[i][0] unique
        if len(ns) == 3:
            nIter = nIter[::2]
    else:
        nIter = [[[0]],
                 [[0, 1], [1, 0]],
                 [[0, 1, 2], [1, 0, 2], [2, 0, 1]]][len(ns) - 1]
    numFaces = 0
    for idx in nIter:
        temp = ns[idx[0]] + 1 # base of (n_1 + 1)
        for otherIdx in idx[1:]: # for any extra dimensions beyond x
            temp *= ns[otherIdx] # build (n_x * ... + (n_1 + 1))
                                 # for each valid ordering
        numFaces += temp
    return numFaces