public void MakeChange(decimal productCost)
        {
            var coins = new List <ICoin>();

            var cost                 = productCost;
            var deposited            = DepositedCoins.TotalValue();
            var amountOwedToCustomer = deposited - cost;
            var refundRemaining      = amountOwedToCustomer;

            if ((amountOwedToCustomer % new decimal(0.25)) < amountOwedToCustomer)
            {
                var numOfCoins = (int)(amountOwedToCustomer / new decimal(0.25));
                for (var i = 0; i < numOfCoins; i++)
                {
                    coins.Add(Coin.Quarter);
                }

                refundRemaining      = refundRemaining % new decimal(0.25);
                amountOwedToCustomer = refundRemaining;
            }

            if ((amountOwedToCustomer % new decimal(0.10)) < amountOwedToCustomer)
            {
                var numOfCoins = (int)(amountOwedToCustomer / new decimal(0.10));
                for (var i = 0; i <= numOfCoins; i++)
                {
                    coins.Add(Coin.Dime);
                }

                refundRemaining      = refundRemaining % new decimal(0.10);
                amountOwedToCustomer = refundRemaining;
            }

            if ((amountOwedToCustomer % new decimal(0.05)) < amountOwedToCustomer)
            {
                var numOfCoins = (int)(amountOwedToCustomer / new decimal(0.05));
                for (var i = 0; i <= numOfCoins; i++)
                {
                    coins.Add(Coin.Nickel);
                }

                refundRemaining      = refundRemaining % new decimal(0.05);
                amountOwedToCustomer = refundRemaining;
            }

            foreach (var coin in coins)
            {
                CoinInventory.Remove(coin);
                CoinReturn.Deposit(coin.ToMetal());
            }
        }
 public void InvalidCoin(IMetal metal)
 {
     CoinReturn.Deposit(metal);
     StartState();
 }