/// <summary>
        /// Adds a connection field.
        /// Example usage:
        /// <code>
        ///     this.AddConnectionField<Order, ObjectType<Order>>(context =>
        ///     {
        ///         return new Connection<Order>(orderRepository.GetOrders());
        ///     });
        /// </code>
        /// </summary>
        /// <typeparam name="T">The type of the model.</typeparam>
        /// <typeparam name="TT">The type of the GraphQL type (i.e. ObjectType<Model>)</typeparam>
        /// <param name="type"></param>
        /// <param name="resolve">The resolving func that retuns a connection model.</param>
        /// <param name="name">The name of the field.</param>
        public static FieldType AddConnectionField <T, TT>(this ComplexGraphType <object> type, Func <ResolveFieldContext <object>, object> resolve, string name = null, QueryArgument[] arguments = null) where T : class where TT : ComplexGraphType <object>, IGraphType <T>
        {
            // create name if non is given
            var lowerCaseName = name != null ? name : $"{typeof(T).Name.ToFirstLower()}s";

            // build argument list... first default ones
            var args = new QueryArguments(
                new QueryArgument <IdGraphType> {
                Name = "after"
            },
                new QueryArgument <IntGraphType> {
                Name = "first"
            },
                new QueryArgument <IdGraphType> {
                Name = "before"
            },
                new QueryArgument <IntGraphType> {
                Name = "last"
            });

            // construct order by type
            // create a class type "additionsType" and add a property for each item in "arguments"
            // if any custom arguments are set
            if (arguments != null)
            {
                var additionsType = TypeExtensions.CreateAdditionsTypeForType(typeof(T), arguments.Select(a => a.Name).ToArray());

                // create a type like OrderByType<T, additionsType> and use it below
                var orderByType = typeof(OrderByType <,>).MakeGenericType(new[] { typeof(T), additionsType });
                args.Add(new QueryArgument(orderByType)
                {
                    Name = "orderBy"
                });
            }
            else
            {
                args.Add(new QueryArgument <OrderByType <T> > {
                    Name = "orderBy"
                });
            }

            // ... then add an optional argument for each property of T
            var properties = typeof(T).GetExactProperies();

            foreach (var property in properties.Where(p => p.PropertyType.IsSimpleType()))
            {
                var propertyName = property.Name.ToFirstLower();
                args.Add(new QueryArgument(property.PropertyType.MapToGraphType())
                {
                    Name = propertyName
                });
            }

            // .. then add custom added arguments
            if (arguments != null)
            {
                args.AddRange(arguments);
            }

            // create field
            return(type.Field <ConnectionType <T, TT> >(lowerCaseName, $"The {lowerCaseName} connection.", args, resolve));
        }