     /** Creates a new vector. All three X, Y, Z parameters are optional. */
     public function Vector3 (x :Number = 0, y :Number = 0, z :Number = 0)
     {
+        set(x, y, z);
+    }
+
+    /** Assigns values to the three parameters of this vector. */
+    public function set (x :Number, y :Number, z :Number) :void
+    {
         this.x = x;
         this.y = y;
         this.z = z;

    /** Duplicates a vector. */
    public function clone() :Vector3
    {
        return new Vector3 (this.x, this.y, this.z);
    }

    /** Returns this vector's length. */
    public function length () :Number
    {
        if (this == INFINITE || x == Infinity || y == Infinity || z == Infinity) {
            return Infinity;
        } else {
            return Math.sqrt(x * x + y * y + z * z);
        }
    }

    /** Returns a new vector that is a normalized version of this vector. */
    public function normalize () :Vector3
    {
        var len :Number = length();
        return new Vector3 (x / len, y / len, z / len);
    }

    /** Returns the dot product of this vector with vector v. */
    public function dot (v :Vector3) :Number
    {
        return x * v.x + y * v.y + z * v.z;
    }

    /** Returns a new vector that is the cross product of this vector with vector v. */
    public function cross (v :Vector3) :Vector3
    {
        return new Vector3(y * v.z - z * v.y, z * v.x - x * v.z, x * v.y - y * v.x);
    }

    /** Returns a new vector that is the summation of this vector with vector v. */
    public function add (v :Vector3) :Vector3
    {
        return new Vector3(x + v.x, y + v.y, z + v.z);
    }

    /** Returns a new vector that is the subtraction of vector v from this vector.*/
    public function subtract (v :Vector3) :Vector3
    {
        return new Vector3(x - v.x, y - v.y, z - v.z);
    }

    /**

            return INFINITE; // the two shall never meet
        } else {
            var r :Number = rray / rplane;
            return s.add(this.scale(r));
        }
    }
    
