f = function(chain, context)
        {
            if (!chain || chain.length == 0)
            {
                return;
            }

            var current = chain[0];

            var entry = {};
            entry.id = current.getId();
            entry.field = current;
            entry.path = current.path;

            // BEFORE field validation status
            var beforeStatus = current.isValid();
            if (current.isContainer())
            {
                beforeStatus = current.isValid(true);
            }

            entry.before = beforeStatus;

            // step down into chain
            if (chain.length > 1)
            {
                // copy array
                var childChain = chain.slice(0);
                childChain.shift();
                f(childChain, context);
            }

            var previouslyValidated = current._previouslyValidated;

            // now run the validation for just this one field
            current.validate();

            // apply custom validation (if exists) for just this one field
            current._validateCustomValidator(function() {

                // AFTER field validation state
                var afterStatus = current.isValid();
                if (current.isContainer())
                {
                    afterStatus = current.isValid(true);
                }

                entry.after = afterStatus;

                // if this field's validation status flipped, fire triggers
                entry.validated = false;
                entry.invalidated = false;
                if (!beforeStatus && afterStatus)
                {
                    entry.validated = true;
                }
                else if (beforeStatus && !afterStatus)
                {
                    entry.invalidated = true;
                }
                // special case for fields that have not yet been validated
                else if (!previouslyValidated && !afterStatus)
                {
                    entry.invalidated = true;
                }

                entry.container = current.isContainer();;
                entry.valid = entry.after;

                context.push(entry);
            });
        }
Compiles the validation context for the chain of fields from the top-most down to the given field.
Each validation context entry is a field in the chain which describes the following:

   {
      "field": the field instance,
      "before": the before value (boolean)
      "after": the after value (boolean)
      "validated": (optional) if the field validated (switches state from invalid to valid)
      "invalidated": (optional) if the field invalidated (switches state from valid to invalid)
   }

This hands back an array of entries with the child field first and continuing up the parent chain.
The last entry in the array is the top most parent field.

@param field
@returns {Array}