fetchData = function (data, type, src) {
					var arrayNotation, funcNotation, out, innerSrc;

					if (src !== "") {
						var a = _fnSplitObjNotation(src);

						for (var i = 0, iLen = a.length; i < iLen; i++) {
							// Check if we are dealing with special notation
							arrayNotation = a[i].match(__reArray);
							funcNotation = a[i].match(__reFn);

							if (arrayNotation) {
								// Array notation
								a[i] = a[i].replace(__reArray, '');

								// Condition allows simply [] to be passed in
								if (a[i] !== "") {
									data = data[a[i]];
								}
								out = [];

								// Get the remainder of the nested object to get
								a.splice(0, i + 1);
								innerSrc = a.join('.');

								// Traverse each entry in the array getting the properties requested
								if (Array.isArray(data)) {
									for (var j = 0, jLen = data.length; j < jLen; j++) {
										out.push(fetchData(data[j], type, innerSrc));
									}
								}

								// If a string is given in between the array notation indicators, that
								// is used to join the strings together, otherwise an array is returned
								var join = arrayNotation[0].substring(1, arrayNotation[0].length - 1);
								data = (join === "") ? out : out.join(join);

								// The inner call to fetchData has already traversed through the remainder
								// of the source requested, so we exit from the loop
								break;
							}
							else if (funcNotation) {
								// Function call
								a[i] = a[i].replace(__reFn, '');
								data = data[a[i]]();
								continue;
							}

							if (data === null || data[a[i]] === null) {
								return null;
							}
							else if (data === undefined || data[a[i]] === undefined) {
								return undefined;
							}

							data = data[a[i]];
						}
					}

					return data;
				}
Create a function that will read nested objects from arrays, based on JSON notation
@param {*} source JSON notation string
@returns Value read