public StateSystem(IInputEventer input, Controller baseController)
            : base()
        {
            Input = input;
            States = new LinkedList<Controller>();
            States.AddLast(baseController);

            Input.KeyPressed += new KeyboardKeyStateChanged(KeyPressed);
            Input.KeyReleased += new KeyboardKeyStateChanged(KeyReleased);
            Input.MouseMoved += new MouseMoved(MouseMoved);
            Input.MouseScrollWheelMoved += new MouseScrollWheelChanged(MouseScrollWheelMoved);
            Input.MouseButtonPressed += new MouseButtonStateChanged(MouseButtonPressed);
            Input.MouseButtonReleased += new MouseButtonStateChanged(MouseButtonReleased);
            Input.ControllerConnected += new GamePadConnectionChanged(ControllerConnected);
            Input.ControllerDisconnected += new GamePadConnectionChanged(ControllerDisconnected);
            Input.ControllerLeftThumbstickMoved += new GamePadThumbStickMoved(ControllerLeftThumbstickMoved);
            Input.ControllerRightThumbstickMoved += new GamePadThumbStickMoved(ControllerRightThumbstickMoved);
            Input.ControllerLeftTriggerMoved += new GamePadTriggerMoved(ControllerLeftTriggerMoved);
            Input.ControllerRightTriggerMoved += new GamePadTriggerMoved(ControllerRightTriggerMoved);
            Input.ControllerButtonPressed += new GamePadButtonStateChanged(ControllerButtonPressed);
            Input.ControllerButtonReleased += new GamePadButtonStateChanged(ControllerButtonReleased);
        }
        public void Push(Controller controller)
        {
            if (controller.IsDisposed)
            {
                throw new InvalidOperationException("You cannot push back onto the stack a previously popped state.");
            }

            controller.LoadContent();

            if (this.OnControllerPush != null)
                this.OnControllerPush(controller, States.Last.Value);

            States.AddLast(controller);
        }
 /// <summary>
 /// Pops the previous top of the state stack and replaces it with a new one. Useful for switching maps,
 /// etc. where you'd rather not keep the old one around.
 /// </summary>
 public Controller PopAndPush(Controller controller)
 {
     Controller c = this.Pop();
     this.Push(controller);
     return c;
 }