public override DomainServiceDescription GetDescription()
        {
            DomainServiceDescription description = base.GetDescription();

            // get all type-level attributes
            description.Attributes = ReflectionDomainServiceDescriptionProvider.GetDomainServiceTypeAttributes(description.DomainServiceType);

            // get all public candidate methods and create the operations
            List <ReflectionDomainOperationEntry> operationEntries = new List <ReflectionDomainOperationEntry>();
            IEnumerable <MethodInfo> methodsToInspect =
                description.DomainServiceType.GetMethods(BindingFlags.Instance | BindingFlags.Public)
                .Where(p => (p.DeclaringType != typeof(DomainService) && (p.DeclaringType != typeof(object))) && !p.IsSpecialName);

            foreach (MethodInfo method in methodsToInspect)
            {
                // We need to ensure the buddy metadata provider is registered before we
                // attempt to do convention, since we rely on IsEntity which relies on
                // KeyAttributes being present
                RegisterAssociatedMetadataProvider(method);

                if (method.GetCustomAttributes(typeof(IgnoreAttribute), false).Length > 0)
                {
                    continue;
                }

                if (method.IsVirtual && method.GetBaseDefinition().DeclaringType == typeof(DomainService))
                {
                    // don't want to infer overrides of DomainService virtual methods as
                    // operations
                    continue;
                }

                ReflectionDomainOperationEntry operation = new ReflectionDomainOperationEntry(description.DomainServiceType, method, (DomainOperation)(-1));
                if (this.ClassifyDomainOperation(operation))
                {
                    operationEntries.Add(operation);
                }
            }

            foreach (DomainOperationEntry operation in operationEntries)
            {
                description.AddOperation(operation);
            }

            return(description);
        }