private void Update()
        {
            var gravityTranslation = Vector3.down * (view.fallSpeed * Time.deltaTime);
            var data = new AttemptGridModelMoveData(view.GridType, view.transform.position, gravityTranslation);

            attemptGridModelMove.Dispatch(data, result =>
            {
                if (result)
                {
                    view.transform.position += gravityTranslation;
                }
            });
        }
        public override void OnRegister()
        {
            // add listener for when entire grid gets replaced
            replaceGridInView.AddListener((type, centroid, list) =>
            {
                if (type == view.GridType)
                {
                    view.Setup(centroid, list.Select(a => new GridView.BlockViewItem(a)));
                }
            });

            // listen to player move events (from control classes)
            playerMove.AddListener(dir =>
            {
                // figure out world-space translation based on direction
                var translation = Vector3.zero;
                switch (dir)
                {
                case PlayerMoveDetachedGridSignal.Direction.Left:
                    translation = Vector3.left * (view.moveSpeed * Time.deltaTime);
                    break;

                case PlayerMoveDetachedGridSignal.Direction.Right:
                    translation = Vector3.right * (view.moveSpeed * Time.deltaTime);
                    break;

                case PlayerMoveDetachedGridSignal.Direction.Down:
                    translation = Vector3.down * (view.pushSpeed * Time.deltaTime);
                    break;
                }

                // construct data for the signal
                var data = new AttemptGridModelMoveData(view.GridType, view.transform.position, translation);

                // send signal about the attempted move
                attemptGridModelMove.Dispatch(data, result =>
                {
                    if (result)
                    {
                        // model-layer permits this move, therefore update the actual view position
                        view.transform.position += translation;
                    }
                });
            });
        }