// Path: src/main/java/com/nfl/glitr/registry/datafetcher/AnnotationBasedDataFetcherFactory.java
// public interface AnnotationBasedDataFetcherFactory {
// 
//     DataFetcher create(@Nullable Field field, @Nonnull Method method, @Nonnull Class declaringClass, @Nonnull Annotation annotation);
// }
// 
// Path: src/main/java/com/nfl/glitr/relay/Relay.java
// public interface Relay {
// 
//     GraphQLInterfaceType nodeInterface(TypeResolver typeResolver);
//     GraphQLFieldDefinition nodeField(GraphQLInterfaceType nodeInterface, DataFetcher nodeDataFetcher);
// 
//     List<GraphQLArgument> getConnectionFieldArguments();
//     List<GraphQLArgument> getBackwardPaginationConnectionFieldArguments();
//     List<GraphQLArgument> getForwardPaginationConnectionFieldArguments();
// 
//     GraphQLObjectType edgeType(String name,
//                                GraphQLOutputType nodeType,
//                                GraphQLInterfaceType nodeInterface,
//                                List<GraphQLFieldDefinition> edgeFields);
//     GraphQLObjectType connectionType(String name,
//                                      GraphQLObjectType edgeType,
//                                      List<GraphQLFieldDefinition> connectionFields);
// 
//     String toGlobalId(String type, String id);
//     graphql.relay.Relay.ResolvedGlobalId fromGlobalId(String globalId);
// 
//     GraphQLFieldDefinition mutationWithClientMutationId(String name, String fieldName,
//                                                         List<GraphQLInputObjectField> inputFields,
//                                                         List<GraphQLFieldDefinition> outputFields,
//                                                         DataFetcher dataFetcher);
// 
//     class ResolvedGlobalId {
//         public ResolvedGlobalId(String type, String id) {
//             this.type = type;
//             this.id = id;
//         }
// 
//         public String type;
//         public String id;
//     }
// }
// 
// Path: src/main/java/com/nfl/glitr/relay/RelayConfig.java
// public class RelayConfig {
// 
//     public static final boolean EXPLICIT_RELAY_NODE_SCAN_DEFAULT = false;
//     private final Relay relay;
//     private final boolean explicitRelayNodeScanEnabled;
// 
// 
//     private RelayConfig(Relay relay, boolean explicitRelayNodeScanEnabled) {
//         this.relay = relay;
//         this.explicitRelayNodeScanEnabled = explicitRelayNodeScanEnabled;
//     }
// 
//     public static RelayConfigBuilder newRelayConfig() {
//         return new RelayConfigBuilder();
//     }
// 
//     public static class RelayConfigBuilder {
// 
//         private Relay relay = null;
//         private boolean explicitRelayNodeScanEnabled = EXPLICIT_RELAY_NODE_SCAN_DEFAULT;
// 
//         public RelayConfigBuilder withRelay(Relay relay) {
//             this.relay = relay;
//             return this;
//         }
// 
//         public RelayConfigBuilder withExplicitRelayNodeScan() {
//             this.explicitRelayNodeScanEnabled = true;
//             return this;
//         }
// 
//         public RelayConfig build() {
//             if (relay == null) {
//                 this.relay = new RelayImpl();
//             }
// 
//             return new RelayConfig(relay, explicitRelayNodeScanEnabled);
//         }
//     }
// 
//     public Relay getRelay() {
//         return relay;
//     }
// 
//     public boolean isExplicitRelayNodeScanEnabled() {
//         return explicitRelayNodeScanEnabled;
//     }
// }


import com.nfl.glitr.registry.datafetcher.AnnotationBasedDataFetcherFactory;
import com.nfl.glitr.relay.Relay;
import com.nfl.glitr.relay.RelayConfig;
import graphql.schema.DataFetcher;
import graphql.schema.GraphQLArgument;
import graphql.schema.GraphQLOutputType;
import graphql.schema.GraphQLType;
import rx.functions.Func4;
import rx.functions.Func5;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
package com.nfl.glitr.registry;



public class TypeRegistryBuilder {

    private Map<Class, List<Object>> overrides = new HashMap<>();
    private Map<Class<? extends Annotation>, Func4<Field, Method, Class, Annotation, List<GraphQLArgument>>> annotationToArgumentsProviderMap = new HashMap<>();
    private Map<Class<? extends Annotation>, Func5<TypeRegistry, Field, Method, Class, Annotation, GraphQLOutputType>> annotationToGraphQLOutputTypeMap = new HashMap<>();
    private Map<Class<? extends Annotation>, AnnotationBasedDataFetcherFactory> annotationToDataFetcherFactoryMap = new HashMap<>();
    private Map<Class<? extends Annotation>, DataFetcher> annotationToDataFetcherMap = new HashMap<>();
    private Map<Class, GraphQLType> javaTypeDeclaredAsScalarMap = new HashMap<>();


// Path: src/main/java/com/nfl/glitr/registry/datafetcher/AnnotationBasedDataFetcherFactory.java
// public interface AnnotationBasedDataFetcherFactory {
// 
//     DataFetcher create(@Nullable Field field, @Nonnull Method method, @Nonnull Class declaringClass, @Nonnull Annotation annotation);
// }
// 
// Path: src/main/java/com/nfl/glitr/relay/Relay.java
// public interface Relay {
// 
//     GraphQLInterfaceType nodeInterface(TypeResolver typeResolver);
//     GraphQLFieldDefinition nodeField(GraphQLInterfaceType nodeInterface, DataFetcher nodeDataFetcher);
// 
//     List<GraphQLArgument> getConnectionFieldArguments();
//     List<GraphQLArgument> getBackwardPaginationConnectionFieldArguments();
//     List<GraphQLArgument> getForwardPaginationConnectionFieldArguments();
// 
//     GraphQLObjectType edgeType(String name,
//                                GraphQLOutputType nodeType,
//                                GraphQLInterfaceType nodeInterface,
//                                List<GraphQLFieldDefinition> edgeFields);
//     GraphQLObjectType connectionType(String name,
//                                      GraphQLObjectType edgeType,
//                                      List<GraphQLFieldDefinition> connectionFields);
// 
//     String toGlobalId(String type, String id);
//     graphql.relay.Relay.ResolvedGlobalId fromGlobalId(String globalId);
// 
//     GraphQLFieldDefinition mutationWithClientMutationId(String name, String fieldName,
//                                                         List<GraphQLInputObjectField> inputFields,
//                                                         List<GraphQLFieldDefinition> outputFields,
//                                                         DataFetcher dataFetcher);
// 
//     class ResolvedGlobalId {
//         public ResolvedGlobalId(String type, String id) {
//             this.type = type;
//             this.id = id;
//         }
// 
//         public String type;
//         public String id;
//     }
// }
// 
// Path: src/main/java/com/nfl/glitr/relay/RelayConfig.java
// public class RelayConfig {
// 
//     public static final boolean EXPLICIT_RELAY_NODE_SCAN_DEFAULT = false;
//     private final Relay relay;
//     private final boolean explicitRelayNodeScanEnabled;
// 
// 
//     private RelayConfig(Relay relay, boolean explicitRelayNodeScanEnabled) {
//         this.relay = relay;
//         this.explicitRelayNodeScanEnabled = explicitRelayNodeScanEnabled;
//     }
// 
//     public static RelayConfigBuilder newRelayConfig() {
//         return new RelayConfigBuilder();
//     }
// 
//     public static class RelayConfigBuilder {
// 
//         private Relay relay = null;
//         private boolean explicitRelayNodeScanEnabled = EXPLICIT_RELAY_NODE_SCAN_DEFAULT;
// 
//         public RelayConfigBuilder withRelay(Relay relay) {
//             this.relay = relay;
//             return this;
//         }
// 
//         public RelayConfigBuilder withExplicitRelayNodeScan() {
//             this.explicitRelayNodeScanEnabled = true;
//             return this;
//         }
// 
//         public RelayConfig build() {
//             if (relay == null) {
//                 this.relay = new RelayImpl();
//             }
// 
//             return new RelayConfig(relay, explicitRelayNodeScanEnabled);
//         }
//     }
// 
//     public Relay getRelay() {
//         return relay;
//     }
// 
//     public boolean isExplicitRelayNodeScanEnabled() {
//         return explicitRelayNodeScanEnabled;
//     }
// }


// Path: src/main/java/com/nfl/glitr/registry/TypeRegistryBuilder.java
import com.nfl.glitr.registry.datafetcher.AnnotationBasedDataFetcherFactory;
import com.nfl.glitr.relay.Relay;
import com.nfl.glitr.relay.RelayConfig;
import graphql.schema.DataFetcher;
import graphql.schema.GraphQLArgument;
import graphql.schema.GraphQLOutputType;
import graphql.schema.GraphQLType;
import rx.functions.Func4;
import rx.functions.Func5;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

package com.nfl.glitr.registry;



public class TypeRegistryBuilder {

    private Map<Class, List<Object>> overrides = new HashMap<>();
    private Map<Class<? extends Annotation>, Func4<Field, Method, Class, Annotation, List<GraphQLArgument>>> annotationToArgumentsProviderMap = new HashMap<>();
    private Map<Class<? extends Annotation>, Func5<TypeRegistry, Field, Method, Class, Annotation, GraphQLOutputType>> annotationToGraphQLOutputTypeMap = new HashMap<>();
    private Map<Class<? extends Annotation>, AnnotationBasedDataFetcherFactory> annotationToDataFetcherFactoryMap = new HashMap<>();
    private Map<Class<? extends Annotation>, DataFetcher> annotationToDataFetcherMap = new HashMap<>();
    private Map<Class, GraphQLType> javaTypeDeclaredAsScalarMap = new HashMap<>();


    private Relay relay = null;