private void ProcessAttributes(Type type, ICompiledExportStrategy strategy)
        {
            foreach (var customAttribute in type.GetTypeInfo().GetCustomAttributes())
            {
                var lifestyleAttribute = customAttribute as ILifestyleProviderAttribute;

                if (lifestyleAttribute != null)
                {
                    strategy.Lifestyle = lifestyleAttribute.ProvideLifestyle(type);
                }

                var condition = (customAttribute as IExportConditionAttribute)?.ProvideCondition(type);

                if (condition != null)
                {
                    strategy.AddCondition(condition);
                }

                var metadata = (customAttribute as IExportMetadataAttribute)?.ProvideMetadata(type);

                if (metadata != null)
                {
                    foreach (var keyValuePair in metadata)
                    {
                        strategy.SetMetadata(keyValuePair.Key, keyValuePair.Value);
                    }
                }
            }

            foreach (var property in type.GetRuntimeProperties())
            {
                foreach (var attribute in property.GetCustomAttributes())
                {
                    var importAttribute = attribute as IImportAttribute;

                    if (importAttribute != null)
                    {
                        var injecitonInfo = importAttribute.ProvideImportInfo(property.PropertyType, property.Name);

                        if (injecitonInfo != null)
                        {
                            strategy.MemberInjectionSelector(new KnownMemberInjectionSelector(
                                                                 new MemberInjectionInfo
                            {
                                MemberInfo = property,
                                IsRequired = injecitonInfo.IsRequired,
                                LocateKey  = injecitonInfo.ImportKey
                            }));
                        }
                    }
                }
            }

            foreach (var method in type.GetRuntimeMethods())
            {
                foreach (var attribute in method.GetCustomAttributes())
                {
                    var importAttribute = attribute as IImportAttribute;

                    var injectionInfo = importAttribute?.ProvideImportInfo(null, method.Name);

                    if (injectionInfo != null)
                    {
                        strategy.MethodInjectionInfo(new MethodInjectionInfo {
                            Method = method
                        });
                    }
                }
            }
        }
        /// <summary>
        /// Add a condition for property export
        /// </summary>
        /// <param name="condition">condition to add</param>
        /// <returns></returns>
        public IFluentExportMemberConfiguration <T> WithCondition(ICompiledCondition condition)
        {
            _exportStrategy.AddCondition(condition);

            return(this);
        }