code: function parseIncludes(field, fieldName, modelName, parent) {
  		// check all attributes are strings and valid fields
  		if (!field.attributes) {
  			field.attributes = [];
  		} else {
  			if (!Array.isArray(field.attributes)) field.attributes = [field.attributes];
  
  			_.forEach(field.attributes, function(attribute) {
  				if (!_.isString(attribute)) throw new Sequelize.VirtualFieldsError("Attribute of virtual field '" + modelName + "'.'" + fieldName + "' is not a string");
  
  				if (!parent.attributes[attribute]) throw new Sequelize.VirtualFieldsError("Attribute of virtual field '" + modelName + "'.'" + fieldName + "' refers to a nonexistent field '" + parent.name + "'.'" + attribute + "'");
  			});
  		}
  
  		// format includes as {model: model, as: as} and convert strings to models
  		if (field.include) {
  			if (!Array.isArray(field.include)) field.include = [field.include];
  
  			_.forEach(field.include, function(include, index) {
  				include = parseClause(field.include, index, 'Include', modelName, fieldName, parent);
  
  				parseIncludes(include, fieldName, modelName, include.model);
  			});
  		}
  	}
docs: parses attributes and include ensuring attributes & includes are valid, formatting includes in {model: model} format and checking associations between models are valid