'Apply on a list of fields.
If the number of input fields supplied is not equal to the order of
the tensor product field, the list of arguments is padded with ``None``\'s.
The list of arguments is divided in sublists depending on the order of
the forms inside the tensor product. The sublists are provided as
arguments to these forms and the resulting expressions are given to the
constructor of ``TensorProduct``.'

def __call__(self, *fields):

    tot_order = (covariant_order(self) + contravariant_order(self))
    tot_args = len(fields)
    if (tot_args != tot_order):
        fields = (list(fields) + ([None] * (tot_order - tot_args)))
    orders = [(covariant_order(f) + contravariant_order(f)) for f in self._args]
    indices = [sum(orders[:(i + 1)]) for i in range((len(orders) - 1))]
    fields = [fields[i:j] for (i, j) in zip(([0] + indices), (indices + [None]))]
    multipliers = [t[0].rcall(*t[1]) for t in zip(self._args, fields)]
    return TensorProduct(*multipliers)
