/// <summary>
 /// General purpous HasNext method that returns based on the Patten paramiter
 /// </summary>
 /// <param name="patten"></param>
 /// <returns></returns>
 private bool HasNext(Patten patten)
 {
     if (_current_active_patten.Equals(patten))
     {
         return(_next_match.Success);
     }
     else
     {
         return(new Regex(patten.ToString(),
                          RegexOptions.Compiled | RegexOptions.IgnoreCase).Match(_working_string).Success);
     }
 }
        // Constructors

        // Methods

        /// <summary>
        /// This method is used by the constructor in the set up phase and also
        /// when a next call is made for a different patten that the one
        /// currently in use
        /// </summary>
        /// <param name="inputString">
        /// Ether the inital string or a copy of the
        /// working string
        /// </param>
        /// <param name="patten">The desired patten to be used</param>
        protected void SetMatchs(string inputString, Patten patten)
        {
            Regex rx = new Regex(patten.ToString(),
                                 RegexOptions.Compiled | RegexOptions.IgnoreCase);

            _current_match = rx.Match(inputString);

            if (!_current_match.Success)
            {
                throw new NoMatchFoundException();
            }

            _next_match            = _current_match.NextMatch();
            _current_active_patten = patten;
        }
 /// <summary>
 /// General perpous next method use to contain repeated code
 /// </summary>
 /// <param name="patten">Patten of what you would like returned</param>
 /// <param name="name">Name of the regex variable</param>
 /// <returns>String version of the match made by the regex</returns>
 private string Next(Patten patten, string name)
 {
     if (_current_active_patten.Equals(patten))
     {
         if (_current_match.Success == true)
         {
             return(GetMatch(name));
         }
         else
         {
             throw new NoMoreDataException("There is no more lines left to return");
         }
     }
     else
     {
         SwitchMatchs(patten);
         return(Next(patten, name));
     }
 }
 /// <summary>
 /// Swaps the current match patten and updates the current match and
 /// next match. Should only be used when nessisary.
 /// </summary>
 /// <param name="patten">Desired patten</param>
 private void SwitchMatchs(Patten patten)
 {
     SetMatchs(_working_string, patten);
 }