/// <summary>
        /// Creates the cross reference source field.
        /// </summary>
        /// <param name="field">The field.</param>
        /// <param name="owner">The owner.</param>
        /// <returns>SourceField.</returns>
        private static SourceField CreateCrossReferenceSourceField(FieldEdit field, ExpressionObjectBase owner)
        {
            var dataType = field.IsSingleCrossReference()
                               ? NodeDataType.CrossReference
                               : NodeDataType.List;

            var requiredStep = (CrossRefRequiredStepEdit)field.StepList.FirstOrDefault(s => s is CrossRefRequiredStepEdit);

            IExpressionFieldsRetriever subfieldsRetriever = null;

            if (requiredStep != null && requiredStep.CrossRefProcessId.HasValue)
            {
                subfieldsRetriever = new CrossReferenceSubfieldsRetriever(requiredStep.CrossRefProcessId.Value, CanBeSourceField, CreateSourceField);
            }

            var sf = new SourceField(owner)
                {
                    DataType = dataType,
                    Name = field.Name,
                    ConnectorOut = { DataType = dataType, Name = field.Name },
                    SystemName = field.SystemName,
                    SetName = SourceFieldSetNames.DataTriggerSourceItem,
                    SubfieldsRetriever = subfieldsRetriever
                };

            return sf;
        }
        private static IExpressionFieldsRetriever GetSourceFieldsRetriever(FieldEdit field)
        {
            switch (field.ColumnType)
            {
                case ColumnTypes.Reference:
                case ColumnTypes.MultiReference:
                    {
                        var requiredStep = field.GetStep<CrossRefRequiredStepEdit>();
                        IExpressionFieldsRetriever subfieldsRetriever = null;
                        if (requiredStep != null && requiredStep.CrossRefProcessId.HasValue)
                        {
                            subfieldsRetriever = new CrossReferenceSubfieldsRetriever(requiredStep.CrossRefProcessId.Value, CanBeSourceField, CreateSourceField);
                        }

                        return subfieldsRetriever;
                    }

                case ColumnTypes.Sample:
                    return new SampleSubfieldsRetriever(SourceFieldSetNames.DataTriggerSourceItem);

                case ColumnTypes.File:
                    return new FileSubfieldsRetriever(SourceFieldSetNames.DataTriggerSourceItem);

                default:
                    return null;
            }
        }