/// <summary>
		/// Populates the email template according to the values of the 
		/// variables within the EmailScope.
		/// </summary>
		/// <param name="scope">The scope containing all the populated variables
		/// to insert into the template.</param>
		/// <returns></returns>
		public EmailScope FinalizeTemplate(EmailScope scope)
		{
			//First, let's build a list of each of the string variables that actually has a value now.
			var stringVarList = scope.StringVariables.Where(a => !string.IsNullOrWhiteSpace(a.Value)).ToList();

			//Now, go through the scope email body and populate all the string variables.
			var htmlBody = PopulateStringVariables(stringVarList, scope.HtmlEmailBody);
			var plainBody = PopulateStringVariables(stringVarList, scope.PlainEmailBody);
			var subject = PopulateStringVariables(stringVarList, scope.Subject);

			//Next, go through and populate all the boolean logics
			htmlBody = PopulateBooleanVariables(scope.BooleanLogics.ToList(), htmlBody);
			plainBody = PopulateBooleanVariables(scope.BooleanLogics.ToList(), plainBody);
			subject = PopulateBooleanVariables(scope.BooleanLogics.ToList(), subject);

			//Create the new email scope
			var newTemplateScope = new EmailScope
			{
				Subject = subject,
				HtmlEmailBody = htmlBody,
				PlainEmailBody = plainBody
			};

			//And we're done!
			return newTemplateScope;
		}
		/// <summary>
		/// Initially parses the email for each of the tags, then
		/// creates an email scope object for storing this information.
		/// </summary>
		/// <param name="template">Email template to parse.</param>
		/// <returns></returns>
		public EmailScope InitializeEmail(IEmailTemplate template)
		{
			//Iterate through the emailbody and identify each of the tags
			var result = new EmailScope
			{
				HtmlEmailBody = template.HtmlTemplate,
				PlainEmailBody = template.TextTemplate,
				Subject = template.Subject,
				BooleanLogics = new List<BooleanLogic>(),
				StringVariables = new List<StringVariable>()
			};

			var searchIndex = 0;
			//Run this once for the HTML body, again for the plain body and once more for the subject.
			if (!string.IsNullOrEmpty(template.HtmlTemplate))
			{
				while (searchIndex < template.HtmlTemplate.Length)
				{
					//Retrieve the index of the next occurence of {{ in the email
					var startIndexValue = GetIndexOfNextOpenTag(template.HtmlTemplate, searchIndex);
					if (startIndexValue == null)
					{
						//No more start tags
						searchIndex = template.HtmlTemplate.Length;
						break;
						//return result;
					}

					//Set the search index to this value now
					searchIndex = (int) startIndexValue;

					//Get the end index value of this tag
					var endIndexValue = GetIndexOfCloseTag(template.HtmlTemplate, searchIndex);

					//Verify that this tag has an ending
					if (endIndexValue == null)
					{
						//This tag doesn't actually end, let's bow out of this loop
						break;
					}

					//Now, set the search index to this value
					searchIndex = (int) endIndexValue;

					//Extract the contents of the tag
					var tagBody = template.HtmlTemplate.Substring((int) startIndexValue + 2,
						(int) endIndexValue - (int) startIndexValue - 2);

					//Set the values of the name and comment
					var tagName = tagBody;
					var tagDescription = "";

					//Identify if there's a comment in the tag
					if (tagBody.Contains("|"))
					{
						var splitValues = tagBody.Split('|');
						tagName = splitValues[0];
						tagDescription = splitValues[1];
					}

					//Look at the first character in the tag name (and see if it's a special character)
					if (tagName[0] == '#')
					{
						//This is a boolean logic tag
						var booleanTag = new BooleanLogic
						{
							Name = tagName.Substring(1), //Remove the # from the name
							Description = tagDescription
						};

						//Check to see that this tag doesn't already exist (name search)
						if (result.BooleanLogics.All(t => t.Name != booleanTag.Name))
						{
							//Append this tag to the email scope object
							result.BooleanLogics.Add(booleanTag);
						}
					}
					else if (tagName[0] == '/')
					{
						//This is a close tag for a boolean statement - ignore
					}
					else
					{
						//This is a variable tag
						var variableTag = new StringVariable()
						{
							Name = tagName,
							Description = tagDescription
						};

						//Check to see that this tag doesn't already exist (name match)
						if (result.StringVariables.All(t => t.Name != variableTag.Name))
						{
							//Append this tag to the email scope object
							result.StringVariables.Add(variableTag);
						}
					}
				}
			}

			//Now for the plain text body
			searchIndex = 0;
			if (!string.IsNullOrEmpty(template.TextTemplate))
			{
				while (searchIndex < template.TextTemplate.Length)
				{
					//Retrieve the index of the next occurence of {{ in the email
					var startIndexValue = GetIndexOfNextOpenTag(template.TextTemplate, searchIndex);
					if (startIndexValue == null)
					{
						//No more start tags
						searchIndex = template.TextTemplate.Length;
						break;
						//return result;
					}

					//Set the search index to this value now
					searchIndex = (int) startIndexValue;

					//Get the end index value of this tag
					var endIndexValue = GetIndexOfCloseTag(template.TextTemplate, searchIndex);

					//Verify that this tag has an ending
					if (endIndexValue == null)
					{
						//This tag doesn't actually end - let's bow out of this loop
						break;
					}

					//Now, set the search index to this value
					searchIndex = (int) endIndexValue;

					//Extract the contents of the tag
					var tagBody = template.TextTemplate.Substring((int) startIndexValue + 2,
						(int) endIndexValue - (int) startIndexValue - 2);

					//Set the values of the name and comment
					var tagName = tagBody;
					var tagDescription = "";

					//Identify if there's a comment in the tag
					if (tagBody.Contains("|"))
					{
						var splitValues = tagBody.Split('|');
						tagName = splitValues[0];
						tagDescription = splitValues[1];
					}

					//Look at the first character in the tag name (and see if it's a special character)
					if (tagName[0] == '#')
					{
						//This is a boolean logic tag
						var booleanTag = new BooleanLogic
						{
							Name = tagName.Substring(1), //Remove the # from the name
							Description = tagDescription
						};

						//Check to see that this tag doesn't already exist (name search)
						if (result.BooleanLogics.All(t => t.Name != booleanTag.Name))
						{
							//Append this tag to the email scope object
							result.BooleanLogics.Add(booleanTag);
						}
					}
					else if (tagName[0] == '/')
					{
						//This is a close tag for a boolean statement - ignore
					}
					else
					{
						//This is a variable tag
						var variableTag = new StringVariable()
						{
							Name = tagName,
							Description = tagDescription
						};

						//Check to see that this tag doesn't already exist (name match)
						if (result.StringVariables.All(t => t.Name != variableTag.Name))
						{
							//Append this tag to the email scope object
							result.StringVariables.Add(variableTag);
						}
					}
				}
			}

			//Finally for the subject
			searchIndex = 0;
			if (!string.IsNullOrEmpty(template.Subject))
			{
				while (searchIndex < template.Subject.Length)
				{
					//Retrieve the index of the next occurence of {{ in the email
					var startIndexValue = GetIndexOfNextOpenTag(template.Subject, searchIndex);
					if (startIndexValue == null)
					{
						//No more start tags
						searchIndex = template.Subject.Length;
						break;
						//return result;
					}

					//Set the search index to this value now
					searchIndex = (int) startIndexValue;

					//Get the end index value of this tag
					var endIndexValue = GetIndexOfCloseTag(template.Subject, searchIndex);

					//Verify that this tag has an ending
					if (endIndexValue == null)
					{
						//This tag doesn't actually end - let's bow out of this loop
						break;
					}

					//Now, set the search index to this value
					searchIndex = (int) endIndexValue;

					//Extract the contents of the tag
					var tagBody = template.Subject.Substring((int) startIndexValue + 2,
						(int) endIndexValue - (int) startIndexValue - 2);

					//Set the values of the name and comment
					var tagName = tagBody;
					var tagDescription = "";

					//Identify if there's a comment in the tag
					if (tagBody.Contains("|"))
					{
						var splitValues = tagBody.Split('|');
						tagName = splitValues[0];
						tagDescription = splitValues[1];
					}

					//Look at the first character in the tag name (and see if it's a special character)
					if (tagName[0] == '#')
					{
						//This is a boolean logic tag
						var booleanTag = new BooleanLogic
						{
							Name = tagName.Substring(1), //Remove the # from the name
							Description = tagDescription
						};

						//Check to see that this tag doesn't already exist (name search)
						if (result.BooleanLogics.All(t => t.Name != booleanTag.Name))
						{
							//Append this tag to the email scope object
							result.BooleanLogics.Add(booleanTag);
						}
					}
					else if (tagName[0] == '/')
					{
						//This is a close tag for a boolean statement - ignore
					}
					else
					{
						//This is a variable tag
						var variableTag = new StringVariable()
						{
							Name = tagName,
							Description = tagDescription
						};

						//Check to see that this tag doesn't already exist (name match)
						if (result.StringVariables.All(t => t.Name != variableTag.Name))
						{
							//Append this tag to the email scope object
							result.StringVariables.Add(variableTag);
						}
					}
				}
			}

			return result;
		}