(function (tree) {

tree.Operation = function (op, operands) {

this.op = op.trim();
this.operands = operands;

}; tree.Operation.prototype.eval = function (env) {

var a = this.operands[0].eval(env),
    b = this.operands[1].eval(env),
    temp;

if (a instanceof tree.Dimension && b instanceof tree.Color) {
    if (this.op === '*' || this.op === '+') {
        temp = b, b = a, a = temp;
    } else {
        throw { name: "OperationError",
                message: "Can't substract or divide a color from a number" };
    }
}
return a.operate(this.op, b);

};

tree.operate = function (op, a, b) {

switch (op) {
    case '+': return a + b;
    case '-': return a - b;
    case '*': return a * b;
    case '/': return a / b;
}

};

})(require('../tree'));