public function traverse(callable $callable)
    {
        foreach ($this->getField() as $field) {
            $this->_traverseValue($field, $callable);
        }

        $value = $this->getValue();
        if ($value instanceof ExpressionInterface) {
            $callable($value);
            $value->traverse($callable);

            return;
        }

        foreach ($value as $i => $val) {
            if ($this->isMulti()) {
                foreach ($val as $v) {
                    $this->_traverseValue($v, $callable);
                }
            } else {
                $this->_traverseValue($val, $callable);
            }
        }
    }