public EncapsulateFieldUseBackingFieldModel Create(IEncapsulateFieldCandidateSetsProvider contextCollections, IEnumerable <FieldEncapsulationModel> fieldModels)
        {
            var fieldCandidates = contextCollections.EncapsulateFieldUseBackingFieldCandidates.ToList();

            foreach (var fieldModel in fieldModels)
            {
                var candidate = fieldCandidates.Single(c => c.Declaration.Equals(fieldModel.Declaration));
                candidate.EncapsulateFlag = true;
                candidate.IsReadOnly      = fieldModel.IsReadOnly;
                if (fieldModel.PropertyIdentifier != null)
                {
                    candidate.PropertyIdentifier = fieldModel.PropertyIdentifier;
                }
            }

            var conflictsFinder = _conflictFinderFactory.Create(_declarationFinderProvider,
                                                                contextCollections.EncapsulateFieldUseBackingFieldCandidates,
                                                                contextCollections.ObjectStateFieldCandidates);

            fieldCandidates.ForEach(c => c.ConflictFinder = conflictsFinder);

            return(new EncapsulateFieldUseBackingFieldModel(fieldCandidates)
            {
                ConflictFinder = conflictsFinder
            });
        }
        public EncapsulateFieldUseBackingUDTMemberModel Create(IEncapsulateFieldCandidateSetsProvider contextCollections, IEnumerable <FieldEncapsulationModel> fieldModels, Declaration objectStateField = null)
        {
            var fieldCandidates = contextCollections.EncapsulateFieldUseBackingUDTMemberCandidates.ToList();

            if (objectStateField != null &&
                (objectStateField.Accessibility != Accessibility.Private ||
                 !fieldCandidates.Any(c => c.Declaration == objectStateField && c.WrappedCandidate is IUserDefinedTypeCandidate)))
            {
                throw new ArgumentException("The object state Field must be a Private UserDefinedType");
            }

            var objectStateFieldCandidates = contextCollections.ObjectStateFieldCandidates;

            var defaultObjectStateUDT = objectStateFieldCandidates.FirstOrDefault(os => !os.IsExistingDeclaration);

            var targetStateUDT = DetermineObjectStateFieldTarget(defaultObjectStateUDT, objectStateField, objectStateFieldCandidates);

            foreach (var fieldModel in fieldModels)
            {
                var candidate = fieldCandidates.Single(c => c.Declaration.Equals(fieldModel.Declaration));
                candidate.EncapsulateFlag = true;
                candidate.IsReadOnly      = fieldModel.IsReadOnly;
                if (fieldModel.PropertyIdentifier != null)
                {
                    candidate.PropertyIdentifier = fieldModel.PropertyIdentifier;
                }
            }

            var conflictsFinder = _conflictFinderFactory.Create(_declarationFinderProvider,
                                                                contextCollections.EncapsulateFieldUseBackingFieldCandidates,
                                                                contextCollections.ObjectStateFieldCandidates);

            fieldCandidates.ForEach(c => c.ConflictFinder = conflictsFinder);

            if (objectStateField == null && !targetStateUDT.IsExistingDeclaration)
            {
                conflictsFinder.AssignNoConflictIdentifiers(targetStateUDT);
            }

            fieldCandidates.ForEach(c => conflictsFinder.AssignNoConflictIdentifiers(c));

            return(new EncapsulateFieldUseBackingUDTMemberModel(targetStateUDT, fieldCandidates, objectStateFieldCandidates)
            {
                ConflictFinder = conflictsFinder
            });
        }