public EncapsulateFieldCandidateSetsProvider(IDeclarationFinderProvider declarationFinderProvider,
                                                     IEncapsulateFieldCandidateFactory encapsulateFieldCandidateFactory,
                                                     QualifiedModuleName qualifiedModuleName)
        {
            EncapsulateFieldUseBackingFieldCandidates = declarationFinderProvider.DeclarationFinder.Members(qualifiedModuleName, DeclarationType.Variable)
                                                        .Where(v => v.ParentDeclaration is ModuleDeclaration &&
                                                               !v.IsWithEvents)
                                                        .Select(f => encapsulateFieldCandidateFactory.CreateFieldCandidate(f))
                                                        .ToList();

            var objectStateUDTCandidates = EncapsulateFieldUseBackingFieldCandidates
                                           .OfType <IUserDefinedTypeCandidate>()
                                           .Where(fc => fc.Declaration.Accessibility == Accessibility.Private &&
                                                  fc.Declaration.AsTypeDeclaration.Accessibility == Accessibility.Private)
                                           .Select(udtc => encapsulateFieldCandidateFactory.CreateObjectStateField(udtc))
                                           //If multiple fields of the same UserDefinedType exist, they are all disqualified as candidates to host a module's state.
                                           .ToLookup(objectStateUDTCandidate => objectStateUDTCandidate.Declaration.AsTypeDeclaration.IdentifierName)
                                           .Where(osc => osc.Count() == 1)
                                           .SelectMany(osc => osc)
                                           .ToList();

            var defaultObjectStateUDT = encapsulateFieldCandidateFactory.CreateDefaultObjectStateField(qualifiedModuleName);

            objectStateUDTCandidates.Add(defaultObjectStateUDT);
            ObjectStateFieldCandidates = objectStateUDTCandidates;

            EncapsulateFieldUseBackingUDTMemberCandidates = EncapsulateFieldUseBackingFieldCandidates
                                                            .Select(fc => encapsulateFieldCandidateFactory.CreateUDTMemberCandidate(fc, defaultObjectStateUDT))
                                                            .ToList();
        }
 public EncapsulateFieldUseBackingFieldModelFactory(IDeclarationFinderProvider declarationFinderProvider,
                                                    IEncapsulateFieldCandidateFactory candidatesFactory,
                                                    IEncapsulateFieldCandidateSetsProviderFactory candidateSetsFactory,
                                                    IEncapsulateFieldConflictFinderFactory encapsulateFieldConflictFinderFactory)
 {
     _declarationFinderProvider = declarationFinderProvider;
     _candidatesFactory         = candidatesFactory;
     _candidateSetsFactory      = candidateSetsFactory;
     _conflictFinderFactory     = encapsulateFieldConflictFinderFactory;
 }