'Apply on a list of vector_fields.
The expression is rewritten internally in terms of tensor products and evaluated.'

def __call__(self, *fields):

    orders = ((covariant_order(e) + contravariant_order(e)) for e in self.args)
    mul = (1 / Mul(*(factorial(o) for o in orders)))
    perms = permutations(fields)
    perms_par = (Permutation(p).signature() for p in permutations(list(range(len(fields)))))
    tensor_prod = TensorProduct(*self.args)
    return (mul * Add(*[(tensor_prod(*p[0]) * p[1]) for p in zip(perms, perms_par)]))
