static public bool CanTransition(CookPasta from, CookPasta to)
        {
            switch (from)
            {
            case CookPasta.BoilWater:
                return(to == CookPasta.AddPasta || to == CookPasta.AddSalt);

            case CookPasta.AddPasta:
                return(to == CookPasta.AddSalt || to == CookPasta.Stir);

            case CookPasta.AddSalt:
                return(to == CookPasta.AddPasta);

            case CookPasta.Stir:
                return(to == CookPasta.Strain);

            case CookPasta.Strain:
                return(to == CookPasta.Eat);

            case CookPasta.Eat:
                return(false);

            default:
                throw CodeContractsHelpers.ThrowIfReached <WrongWayOfDoingPasta>("missing case");
            }
        }
        static public void EatAfterStir(CookPasta unknownStep)
        {
            var init = CookPasta.Stir;

            var next = CanTransition(init, unknownStep);

            Contract.Assert(next); // note in this example we ask for "next" instead of "not next" as in the example above
        }
        static public void StrainIsFinal(CookPasta someOtherState)
        {
            var next = CanTransition(CookPasta.Strain, someOtherState);

            Contract.Assert(!next, "We cannot prove it, as it is false");
        }
        static public void EatingIsFinal(CookPasta someOtherState)
        {
            var next = CanTransition(CookPasta.Eat, someOtherState);

            Contract.Assert(!next, "Once you eat your pasta, nothing more left to do");
        }
        static public void BoilWaterIsInitial(CookPasta someState)
        {
            var next = CanTransition(someState, CookPasta.BoilWater);

            Contract.Assert(!next, "there is no way to transition to boiling water");
        }
 static public bool IsTerminal(CookPasta state)
 {
     return(state == CookPasta.Eat);
 }
 static public bool IsInitial(CookPasta state)
 {
     return(state == CookPasta.BoilWater);
 }