function ExpressionValue(elementProp, mult, type) {
    mult = mult || 1;
    var expressionValue, arrayValue;

	if (elementProp.k) {
        elementProp.getValue();
    }
    var i, len, arrValue, val;
    if (type) {
    	if(type === 'color') {
    		len = 4;
            expressionValue = createTypedArray('float32', len);
            arrValue = createTypedArray('float32', len);
	        for (i = 0; i < len; i += 1) {
	            expressionValue[i] = arrValue[i] = (i < 3) ? elementProp.v[i] * mult : 1;
	        }
        	expressionValue.value = arrValue;
    	}
    } else if (elementProp.propType === 'unidimensional'){
        val = elementProp.v * mult;
        expressionValue = new Number(val);
        expressionValue.value = val;
    } else {
    	len = elementProp.pv.length;
        expressionValue = createTypedArray('float32', len);
        arrValue = createTypedArray('float32', len);
        for (i = 0; i < len; i += 1) {
            expressionValue[i] = arrValue[i] = elementProp.v[i] * mult;
        }
        expressionValue.value = arrValue;
    }
    
    expressionValue.numKeys = elementProp.keyframes ? elementProp.keyframes.length : 0;
    expressionValue.key = function(pos) {
        if (!expressionValue.numKeys) {
            return 0;
        } else {
            return elementProp.keyframes[pos-1].t;
        }
    };
    expressionValue.valueAtTime = elementProp.getValueAtTime;
    expressionValue.speedAtTime = elementProp.getSpeedAtTime;
    expressionValue.velocityAtTime = elementProp.getVelocityAtTime;
    expressionValue.propertyGroup = elementProp.propertyGroup;
    Object.defineProperty(expressionValue, 'velocity', {
        get: function(){
            return elementProp.getVelocityAtTime(elementProp.comp.currentFrame);
        }
    });
    return expressionValue;
};