public function assemble(ColumnMetaData $column) {
        $expression = NULL;
        
        if ($column->persistence == FormulaMetaData::PERSISTENCE__CALCULATED) {
            $this->columnAssemblingStack = array();

            array_push($this->columnAssemblingStack, $column->name);

            try {
                if (!isset($column->source)) {
                    throw new IllegalStateException(t('Formula expression is not provided'));
                }

                $language = isset($column->expressionLanguage) ? $column->expressionLanguage : NULL;
                $parser = new FormulaExpressionParser($language);

                $expression = $parser->expressionLanguageHandler->clean($column->source);

                $expression = $parser->parse($expression, array($this, 'replaceColumnNames'));
                $expression = $parser->insertMarker('', 0, $expression, TRUE);

                $lexemes = $parser->expressionLanguageHandler->lex($expression);
                $syntaxTree = $parser->expressionLanguageHandler->parse($lexemes);
                $expression = $parser->expressionLanguageHandler->generate($syntaxTree);
            }
            catch (Exception $e) {
                LogHelper::log_error($e);
                throw new IllegalStateException(t(
                    "Cannot assemble expression for %columnName formula: %error",
                    array('%columnName' => $column->publicName, '%error' => $e->getMessage())));
            }

            array_pop($this->columnAssemblingStack);
        }
        else {
            $expression = $column->name;
        }

        return $expression;
    }