public ShapeDetails GetFlyweight(string color, TextureType texture, byte[] textureFile, string textureFilename)
        {
            string key = String.Join("#", color.ToLower(), texture.ToString("G"), textureFile.Length, textureFilename.ToLower());

            if (flyweights.ContainsKey(key))
            {
                Console.WriteLine("Flyweight exists! Returns existing one!");
            }
            else
            {
                var shapeDetails = new ShapeDetails(color, texture, textureFile, textureFilename);
                flyweights.Add(key, shapeDetails);

                Console.WriteLine("Creating a new Flyweight!");
            }
            return(flyweights[key]);
        }
        /// <summary>
        /// Functions processes the input
        /// </summary>
        /// <param name="inputReceived">Input to be processed </param>
        /// <returns>details of the processing and result</returns>
        public static ShapeDetails ProcessInput(string inputReceived)
        {
            ShapeDetails initializeShape = new ShapeDetails
            {
                Dimensions = new Dictionary <string, string>(),
                Error      = ""
            };
            int     state         = 1;
            decimal amount        = 0.0m;
            string  dimensionName = "";

            String[] wordsParsed = inputReceived.Split(new char[] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries);
            for (int i = 0; i < wordsParsed.Length; i++)
            {
                switch (state)
                {
                case 1: if (startIdentifier.Equals(wordsParsed[i].ToLower(), StringComparison.OrdinalIgnoreCase))
                    {
                        state = 2;
                    }
                    else
                    {
                        state = 6;
                    }
                    break;

                case 2: if (ignoreIdentifiers.Any(identifier => identifier.Equals(wordsParsed[i].ToLower(), StringComparison.OrdinalIgnoreCase)))
                    {
                        state = 2;
                    }
                    else if (supportedShapes.Any(shape => shape.Equals(wordsParsed[i].ToLower(), StringComparison.OrdinalIgnoreCase)))
                    {
                        state = 3;
                        initializeShape.ShapeType = wordsParsed[i];
                    }
                    else
                    {
                        state = 6;
                    }
                    break;

                case 3: if (state3IgnoreIdentifier.Any(identifier => identifier.Equals(wordsParsed[i].ToLower(), StringComparison.OrdinalIgnoreCase)) ||
                            ignoreIdentifiers.Any(identifier => identifier.Equals(wordsParsed[i].ToLower(), StringComparison.OrdinalIgnoreCase)))
                    {
                        state = 3;
                    }
                    else if (supportedDimensions.Any(dimension => dimension.Equals(wordsParsed[i].ToLower(), StringComparison.OrdinalIgnoreCase)))
                    {
                        state         = 4;
                        dimensionName = wordsParsed[i];
                        initializeShape.Dimensions.Add(wordsParsed[i], "");
                    }
                    else
                    {
                        state = 6;
                    }
                    break;

                case 4: if (state4IgnoreIdentifier.Equals(wordsParsed[i].ToLower(), StringComparison.OrdinalIgnoreCase))
                    {
                        state = 4;
                    }
                    else if (decimal.TryParse(wordsParsed[i], out amount))
                    {
                        state = 5;
                        initializeShape.Dimensions[dimensionName] = wordsParsed[i];
                    }
                    else
                    {
                        state = 6;
                    }
                    break;

                case 5: if (state3ReachableIdentifier.Equals(wordsParsed[i].ToLower(), StringComparison.OrdinalIgnoreCase))
                    {
                        state = 3;
                    }
                    break;

                case 6:
                    initializeShape.Error = errorMessage;
                    break;
                }
            }
            return(initializeShape);
        }