/// <summary>
        /// Build a segment to predicate mapper
        /// </summary>
        /// <param name="propertyInfo"></param>
        /// <returns></returns>
        public virtual IRelativeRouteToPredicateMapper BuildMapper(PropertyInfo propertyInfo)
        {
            if (propertyInfo.PropertyType == typeof(DateTime))
            {
                return(new RouteDateSegmentAttribute.DateUrlSegmentMapper(DateSegmentFormat.YearMonthDay));
            }

            if (propertyInfo.GetCustomAttributes <ForeignKeyAttribute>().Any())
            {
                var foreignKeyInfo = DataReferenceFacade.GetForeignKeyProperties(propertyInfo.DeclaringType)
                                     .FirstOrDefault(p => p.SourcePropertyName == propertyInfo.Name);

                if (foreignKeyInfo != null)
                {
                    var targetType     = foreignKeyInfo.TargetType;
                    var dataTypeMapper = AttributeBasedRoutingHelper.GetPredicateMapper(targetType);
                    if (dataTypeMapper != null)
                    {
                        var typeConst = typeof(DataReferenceRelativeRouteToPredicateMapper <,>)
                                        .MakeGenericType(targetType, foreignKeyInfo.SourcePropertyInfo.PropertyType)
                                        .GetConstructors().Single();

                        return((IRelativeRouteToPredicateMapper)typeConst.Invoke(new object[] { dataTypeMapper }));
                    }
                }
            }

            var type        = typeof(DefaultRelativeRouteToPredicateMapper <>).MakeGenericType(propertyInfo.PropertyType);
            var constructor = type.GetConstructor(new Type[0]);

            return(constructor.Invoke(null) as IRelativeRouteToPredicateMapper);
        }
        public static AttributeBasedRoutedDataUrlMapper GetDataUrlMapper(Type dataType, Guid pageId)
        {
            var mapper = AttributeBasedRoutingHelper.GetPredicateMapper(dataType);
            if (mapper == null)
            {
                return null;
            }

            return new AttributeBasedRoutedDataUrlMapper(dataType, pageId, mapper);
        }