Player movement boundaries

Here is my movement code for the player:

function Go ()
{
horizontal = Input.GetAxis("Horizontal") * speed * Time.deltaTime;
vertical = Input.GetAxis("Vertical") * speed * Time.deltaTime;

if (transform.position.x > 7 || transform.position.x < -7)
{
    if (transform.position.x > 7)
        transform.position.x = 7;
    else
        transform.position.x = -7;

    horizontal = 0;
}
else
    transform.Translate(horizontal,0,0);

if (transform.position.y > 9 || transform.position.y < -1)
    if (transform.position.y > 9)
        transform.position.y = 9;
    else
        transform.position.y = -1;
else
    transform.Translate(0,vertical,0);
}

(WARNING: PSEUDO CODE AHEAD) My problem is when the player attempts to move outside of the boundaries, they do for a split second, THEN the code forces them back. This turns into a player constantly twitching if they constantly try to cross the boundary. What I want, is to grab the player's position from what would happen if they attempted to cross. This is what I mean by what I want:

if(transform.Translate(horizontal,0,0) makes transform.position.x == 7 or -7)
transform.position.x = 7 or -7;
//depending on which side of the screen they're on.

Now I guess that I could make this happen by having a clone box off screen move first, as in:

if(clone.transform.Translate(horizontal,0,0) makes
clone.transform.position.x == 7 or -7)
transform.position.x = 7 or -7;

But I think that would eat up too much resources, and that there is a better solution. Or am I wrong?

function Go() {
    horizontal = Input.GetAxis("Horizontal") * speed * Time.deltaTime;
    vertical = Input.GetAxis("Vertical") * speed * Time.deltaTime;

    var pos : Vector3 = transform.position;
    pos.x = Mathf.Clamp(pos.x + horizontal, -7, 7);
    pos.y = Mathf.Clamp(pos.y + vertical, -7, 7);
    transform.position = pos;
}

The link Lipis gave in comment indeed explains the `Clamp` function. Basically it keeps the value within a certain range so with `Mathf.Clamp(value, -7, 7)`, if `value` is less than `-7`, function returns `-7`, bigger than `7`, function returns `7`, otherwise it just returns `value`.

So by making sure we never set the value outside the allowed range we won't get jittering.

Unity 5 now offers an asset package named ā€œ2Dā€ In this package there is a boundary in which when a tag named player hits this GameObject it resets your position. Hope this helps.