// Path: src/main/java/com/bretpatterson/schemagen/graphql/IGraphQLObjectMapper.java
// public interface IGraphQLObjectMapper {
// 
// 	/**
// 	 * Get the object responsible for naming GraphQL types.
// 	 * @return
// 	 */
// 	ITypeNamingStrategy getTypeNamingStrategy();
// 
// 	/**
// 	 * Get an input definition for the specified type.
// 	 * @param type
// 	 */
// 	GraphQLInputType getInputType(Type type);
// 
// 	/**
// 	 * Get an output definition for the specified type.
// 	 * @param type
// 	 */
// 	GraphQLOutputType getOutputType(Type type);
// 
// 	/**
// 	 * Get the Input Type cache. This is useful for custom type mappers who
// 	 * might need to add TypeReference's to the cache when they need to process
// 	 * an object that contains a two way dependency between itself and another object.
// 	 */
// 	IGraphQLTypeCache<GraphQLInputType> getInputTypeCache();
// 
// 	/**
// 	 * Get the Input Type cache. This is useful for custom type mappers who
// 	 * might need to add TypeReference's to the cache when they need to process
// 	 * an object that contains a two way dependency between itself and another object.
// 	 */
// 	IGraphQLTypeCache<GraphQLOutputType> getOutputTypeCache();
// 
// 	/**
// 	 * Returns the object responsible for object type conversion.
// 	 * @return
// 	 */
// 	ITypeFactory getTypeFactory();
// 
// 	/**
// 	 * Get the raw type of this object for generic types
// 	 * @param type
// 	 * @return
// 	 */
// 	Class<?> getClassFromType(Type type);
// 
// 	/**
// 	 * Returns all input types created.
// 	 * @return
// 	 */
// 	Set<GraphQLType> getInputTypes();
// 
// 	/**
// 	 * Get the datafetcher factory
// 	 * @return
// 	 */
// 	IDataFetcherFactory getDataFetcherFactory() ;
// 
// 	/**
// 	 *
// 	 * @param dataFetcherFactory
// 	 */
// 	void setDataFetcherFactory(IDataFetcherFactory dataFetcherFactory);
// 
// 	/**
// 	 * Get the default datafetcher for methods
// 	 * @return
// 	 */
// 	Class<? extends IDataFetcher> getDefaultMethodDataFetcher();
// 
// 	/**
// 	 * Set the default data fetcher used for methods
// 	 * @param defaultMethodDataFetcher
// 	 */
// 	void setDefaultMethodDataFetcher(Class<? extends IDataFetcher> defaultMethodDataFetcher);
// 
// 	Collection<GraphQLFieldDefinition> getGraphQLFieldDefinitions(Optional<Object> targetObject, Type type, Class<?> classItem, Optional<List<Field>> fields, Optional<List<Method>> methods);
// }


import com.bretpatterson.schemagen.graphql.IGraphQLObjectMapper;
import com.bretpatterson.schemagen.graphql.annotations.GraphQLTypeMapper;
import com.bretpatterson.schemagen.graphql.relay.ConnectionCursor;
import com.bretpatterson.schemagen.graphql.typemappers.IGraphQLTypeMapper;
import graphql.Scalars;
import graphql.schema.GraphQLInputType;
import graphql.schema.GraphQLOutputType;
import java.lang.reflect.Type;
package com.bretpatterson.schemagen.graphql.typemappers.relay;



/**
 * Specification Compliant ConnectionCursor mapper
 *
 * @see <a href="https://facebook.github.io/relay/graphql/connections.htm">Connection Specification</a>
 */
@GraphQLTypeMapper(type = ConnectionCursor.class)
public class ConnectionCursorMapper implements IGraphQLTypeMapper {

    @Override
    public boolean handlesType(IGraphQLObjectMapper graphQLObjectMapper, Type type) {
        return ConnectionCursor.class.isAssignableFrom(graphQLObjectMapper.getClassFromType(type));
    }

    @Override
    public GraphQLOutputType getOutputType(IGraphQLObjectMapper graphQLObjectMapper, Type type) {
        return Scalars.GraphQLString;
    }

    @Override
// Path: src/main/java/com/bretpatterson/schemagen/graphql/IGraphQLObjectMapper.java
// public interface IGraphQLObjectMapper {
// 
// 	/**
// 	 * Get the object responsible for naming GraphQL types.
// 	 * @return
// 	 */
// 	ITypeNamingStrategy getTypeNamingStrategy();
// 
// 	/**
// 	 * Get an input definition for the specified type.
// 	 * @param type
// 	 */
// 	GraphQLInputType getInputType(Type type);
// 
// 	/**
// 	 * Get an output definition for the specified type.
// 	 * @param type
// 	 */
// 	GraphQLOutputType getOutputType(Type type);
// 
// 	/**
// 	 * Get the Input Type cache. This is useful for custom type mappers who
// 	 * might need to add TypeReference's to the cache when they need to process
// 	 * an object that contains a two way dependency between itself and another object.
// 	 */
// 	IGraphQLTypeCache<GraphQLInputType> getInputTypeCache();
// 
// 	/**
// 	 * Get the Input Type cache. This is useful for custom type mappers who
// 	 * might need to add TypeReference's to the cache when they need to process
// 	 * an object that contains a two way dependency between itself and another object.
// 	 */
// 	IGraphQLTypeCache<GraphQLOutputType> getOutputTypeCache();
// 
// 	/**
// 	 * Returns the object responsible for object type conversion.
// 	 * @return
// 	 */
// 	ITypeFactory getTypeFactory();
// 
// 	/**
// 	 * Get the raw type of this object for generic types
// 	 * @param type
// 	 * @return
// 	 */
// 	Class<?> getClassFromType(Type type);
// 
// 	/**
// 	 * Returns all input types created.
// 	 * @return
// 	 */
// 	Set<GraphQLType> getInputTypes();
// 
// 	/**
// 	 * Get the datafetcher factory
// 	 * @return
// 	 */
// 	IDataFetcherFactory getDataFetcherFactory() ;
// 
// 	/**
// 	 *
// 	 * @param dataFetcherFactory
// 	 */
// 	void setDataFetcherFactory(IDataFetcherFactory dataFetcherFactory);
// 
// 	/**
// 	 * Get the default datafetcher for methods
// 	 * @return
// 	 */
// 	Class<? extends IDataFetcher> getDefaultMethodDataFetcher();
// 
// 	/**
// 	 * Set the default data fetcher used for methods
// 	 * @param defaultMethodDataFetcher
// 	 */
// 	void setDefaultMethodDataFetcher(Class<? extends IDataFetcher> defaultMethodDataFetcher);
// 
// 	Collection<GraphQLFieldDefinition> getGraphQLFieldDefinitions(Optional<Object> targetObject, Type type, Class<?> classItem, Optional<List<Field>> fields, Optional<List<Method>> methods);
// }


// Path: src/main/java/com/bretpatterson/schemagen/graphql/typemappers/relay/ConnectionCursorMapper.java
import com.bretpatterson.schemagen.graphql.IGraphQLObjectMapper;
import com.bretpatterson.schemagen.graphql.annotations.GraphQLTypeMapper;
import com.bretpatterson.schemagen.graphql.relay.ConnectionCursor;
import com.bretpatterson.schemagen.graphql.typemappers.IGraphQLTypeMapper;
import graphql.Scalars;
import graphql.schema.GraphQLInputType;
import graphql.schema.GraphQLOutputType;
import java.lang.reflect.Type;

package com.bretpatterson.schemagen.graphql.typemappers.relay;



/**
 * Specification Compliant ConnectionCursor mapper
 *
 * @see <a href="https://facebook.github.io/relay/graphql/connections.htm">Connection Specification</a>
 */
@GraphQLTypeMapper(type = ConnectionCursor.class)
public class ConnectionCursorMapper implements IGraphQLTypeMapper {

    @Override
    public boolean handlesType(IGraphQLObjectMapper graphQLObjectMapper, Type type) {
        return ConnectionCursor.class.isAssignableFrom(graphQLObjectMapper.getClassFromType(type));
    }

    @Override
    public GraphQLOutputType getOutputType(IGraphQLObjectMapper graphQLObjectMapper, Type type) {
        return Scalars.GraphQLString;
    }

    @Override
    public GraphQLInputType getInputType(IGraphQLObjectMapper graphQLObjectMapper, Type type) {