private FilterDef CreateFilterDefinition(FullTextFilterDefAttribute att)
		{
			try
			{
			    Activator.CreateInstance(att.Impl);
			}
			catch (Exception ex)
			{
				throw new SearchException("Unable to create Filter class: " + att.Impl.FullName, ex);
			}

			var filterDefinition = new FilterDef
			{
				Name = att.Name, 
				Cache = att.Cache, 
				Impl = att.Impl
			};

			foreach (var method in filterDefinition.Impl.GetMethods())
			{
				if (AttributeUtil.HasAttribute<FactoryAttribute>(method))
				{
					if (filterDefinition.FactoryMethod != null)
						throw new SearchException("Multiple Factory methods found " + filterDefinition.Name + ":" +
												  filterDefinition.Impl.FullName + "." + method.Name);
					filterDefinition.FactoryMethod = method;
				}

				if (AttributeUtil.HasAttribute<KeyAttribute>(method))
				{
					if (filterDefinition.KeyMethod != null)
						throw new SearchException("Multiple Key methods found " + filterDefinition.Name + ":" +
												  filterDefinition.Impl.FullName + "." + method.Name);
					filterDefinition.KeyMethod = method;
				}
			}

			foreach (var prop in filterDefinition.Impl.GetProperties())
			{
				if (AttributeUtil.HasAttribute<FilterParameterAttribute>(prop))
				{
					filterDefinition.Setters[prop.Name] = prop;
				}
			}

			return filterDefinition;
		}
        private FilterDef BuildFilterDef(FullTextFilterDefAttribute attribute)
        {
            var filterDef = new FilterDef
            {
                Name = attribute.Name,
                Impl = attribute.Impl,
                Cache = attribute.Cache
            };

            try {
                Activator.CreateInstance(filterDef.Impl);
            }
            catch (Exception e) {
                throw new SearchException("Unable to create Filter class: " + filterDef.Impl.FullName, e);
            }

            foreach (var method in filterDef.Impl.GetMethods())
            {
                if (AttributeUtil.HasAttribute<FactoryAttribute>(method))
                {
                    if (filterDef.FactoryMethod != null)
                        throw new SearchException("Multiple Factory methods found " + filterDef.Name + ":" +
                                                  filterDef.Impl.FullName + "." + method.Name);
                    filterDef.FactoryMethod = method;
                }

                if (AttributeUtil.HasAttribute<KeyAttribute>(method))
                {
                    if (filterDef.KeyMethod != null)
                        throw new SearchException("Multiple Key methods found " + filterDef.Name + ":" +
                                                  filterDef.Impl.FullName + "." + method.Name);
                    filterDef.KeyMethod = method;
                }
            }

            // Use properties rather than the Java setter logic idea
            foreach (PropertyInfo prop in filterDef.Impl.GetProperties())
            {
                if (AttributeUtil.HasAttribute<FilterParameterAttribute>(prop))
                {
                    filterDef.AddSetter(prop);
                }
            }

            return filterDef;
        }
        private void BindFilterDef(FullTextFilterDefAttribute defAnn, System.Type mappedClass)
        {
            if (filterDefinitions.ContainsKey(defAnn.Name))
                throw new SearchException("Multiple definitions of FullTextFilterDef.Name = " + defAnn.Name + ":" +
                                          mappedClass.FullName);

            FilterDef filterDef = new FilterDef();
            filterDef.Impl = defAnn.Impl;
            filterDef.Cache = defAnn.Cache;
            try
            {
                Activator.CreateInstance(filterDef.Impl);
            }
            catch (Exception e)
            {
                throw new SearchException("Unable to create Filter class: " + filterDef.Impl.FullName, e);
            }

            foreach (MethodInfo method in filterDef.Impl.GetMethods())
            {
                if (AttributeUtil.HasAttribute<FactoryAttribute>(method))
                {
                    if (filterDef.FactoryMethod != null)
                        throw new SearchException("Multiple Factory methods found " + defAnn.Name + ":" +
                                                  filterDef.Impl.FullName + "." + method.Name);
                    filterDef.FactoryMethod = method;
                }

                if (AttributeUtil.HasAttribute<KeyAttribute>(method))
                {
                    if (filterDef.KeyMethod != null)
                        throw new SearchException("Multiple Key methods found " + defAnn.Name + ":" +
                                                  filterDef.Impl.FullName + "." + method.Name);
                    filterDef.KeyMethod = method;
                }
            }

            // Use properties rather than the Java setter logic idea
            foreach (PropertyInfo prop in filterDef.Impl.GetProperties())
            {
                if (AttributeUtil.HasAttribute<FilterParameterAttribute>(prop))
                {
                    filterDef.AddSetter(prop);
                }
            }

            filterDefinitions[defAnn.Name] = filterDef;
        }