text: (function(global){ 'use strict';
  
  var Vector = function(x, y){
  	this.x = x || 0;
  	this.y = y || 0;
  };
  
  Vector.prototype = {
  
  	clone: function(){
  		return new Vector(this.x, this.y);
  	},
  
  	add: function(vec){
  		this.x += vec.x;
  		this.y += vec.y;
  		return this;
  	},
  
  	sub: function(vec){
  		this.x -= vec.x;
  		this.y -= vec.y;
  		return this;
  	},
  
  	subVal: function(val){
  		this.x -= val;
  		this.y -= val;
  		return this;
  	},
  
  	mult: function(mul){
  		this.x *= mul;
  		this.y *= mul;
  		return this;
  	},
  
  	div: function(div){
  		if (div === 0) {
  			return this;
  		}
  		this.x /= div;
  		this.y /= div;
  		return this;
  	},
  
  	mag: function(){
  		return Math.sqrt(
  			this.x * this.x +
  			this.y * this.y
  		);
  	},
  
  	limit: function(max){
  		if (this.mag() > max) {
  			this.normalize();
  			this.mult(max);
  		}
  		return this;
  	},
  
  	normalize: function(){
  		var mag = this.mag();
  		if (mag === 0) {
  			return this;
  		}
  		this.div(mag);
  		return this;
  	},
  
  	heading: function(){
  		return Math.atan2(this.y, this.x);
  	},
  
  	set: function(vec){
  		this.x = vec.x;
  		this.y = vec.y;
  		return this;
  	}
  
  };
  
  Vector.add = function(vec1, vec2){
  	return vec1.clone().add(vec2.clone());
  };
  
  Vector.sub = function(vec1, vec2){
  	return vec1.clone().sub(vec2.clone());
  };
  
  Vector.mult = function(vec, mult){
  	return vec.clone().mult(mult);
  };
  
  Vector.div = function(vec, div){
  	return vec.clone().div(div);
  };
  
  // Ripped from processing
  Vector.random2D = function(){
  	var angle = Math.random(0, 1) * Math.PI * 2;
  	return new Vector(Math.cos(angle), Math.sin(angle));
  };
  
  Vector.coerce = function(obj){
  	return new Vector(obj.x, obj.y);
  };
  
  global.Vector = Vector;
  
  })(this);
  