public Expression evaluate(BinaryExpression input) {
Expression leftValue = evaluate(input.getLeft());
Expression rightValue = evaluate(input.getRight());
if (leftValue.isFaulty() || rightValue.isFaulty())
return new FaultyExpression(input);
if (arithmeticCalculator.accepts(input.getOperator(), leftValue, rightValue))
return arithmeticCalculator.evalute(input, leftValue, rightValue);
if (colorsCalculator.accepts(input.getOperator(), leftValue, rightValue))
return colorsCalculator.evalute(input, leftValue, rightValue);
problemsHandler.cannotEvaluate(input);
return new FaultyExpression(input);
}