private void ImplementContractForAbstractClass(IClassDeclaration contractClass,
                                                       IClassDeclaration abstractClass)
        {
            Contract.Requires(contractClass != null);
            Contract.Requires(contractClass.DeclaredElement != null);
            Contract.Requires(abstractClass != null);
            Contract.Requires(abstractClass.DeclaredElement != null);

            using (var workflow = GeneratorWorkflowFactory.CreateWorkflowWithoutTextControl(
                       GeneratorStandardKinds.Overrides,
                       contractClass,
                       abstractClass))
            {
                Contract.Assert(workflow != null);

                // By default this input for this workflow contains too many members:
                // It contains member from the base class (required) and
                // members from the other base classes (i.e. from System.Object).
                // Using some hack to get only members defined in the "abstractClass"

                // So I'm trying to find required elements myself.

                var missingMembers = contractClass.GetMissingMembersOf(abstractClass);

                if (_requiredFunction != null)
                {
                    var requiredDeclaration = _requiredFunction.DeclaredElement;
                    missingMembers =
                        missingMembers.Where(x => GetMembers(x).Any(m => m.Equals(requiredDeclaration)))
                        .ToList();

                    Contract.Assert(missingMembers.Count != 0, "Should be at least one method to add!");
                }

                var membersToOverride =
                    missingMembers
                    .Select(x => new GeneratorDeclaredElement <IOverridableMember>(x.Member, x.Substitution))
                    .ToList();

                workflow.Context.InputElements.Clear();

                workflow.Context.ProvidedElements.Clear();
                workflow.Context.ProvidedElements.AddRange(membersToOverride);

                workflow.Context.InputElements.AddRange(workflow.Context.ProvidedElements);

                workflow.Generate("Generate contract class", NullProgressIndicator.Instance);
            }
        }
        private void ImplementContractForAbstractClass(IClassDeclaration contractClass,
            IClassDeclaration abstractClass)
        {
            Contract.Requires(contractClass != null);
            Contract.Requires(contractClass.DeclaredElement != null);
            Contract.Requires(abstractClass != null);
            Contract.Requires(abstractClass.DeclaredElement != null);

            using (var workflow = GeneratorWorkflowFactory.CreateWorkflowWithoutTextControl(
                GeneratorStandardKinds.Overrides,
                contractClass,
                abstractClass))
            {
                Contract.Assert(workflow != null);

                // By default this input for this workflow contains too many members:
                // It contains member from the base class (required) and
                // members from the other base classes (i.e. from System.Object).
                // Using some hack to get only members defined in the "abstractClass"

                // So I'm trying to find required elements myself.

                var missingMembers = contractClass.GetMissingMembersOf(abstractClass);
                
                if (_requiredFunction != null)
                {
                    var requiredDeclaration = _requiredFunction.DeclaredElement;
                    missingMembers = 
                        missingMembers.Where(x => GetMembers(x).Any(m => m.Equals(requiredDeclaration)))
                            .ToList();

                    Contract.Assert(missingMembers.Count != 0, "Should be at least one method to add!");
                }

                var membersToOverride =
                    missingMembers
                        .Select(x => new GeneratorDeclaredElement<IOverridableMember>(x.Member, x.Substitution))
                        .ToList();

                workflow.Context.InputElements.Clear();

                workflow.Context.ProvidedElements.Clear();
                workflow.Context.ProvidedElements.AddRange(membersToOverride);

                workflow.Context.InputElements.AddRange(workflow.Context.ProvidedElements);

                workflow.Generate("Generate contract class", NullProgressIndicator.Instance);
            }
        }