@SuppressWarnings("unchecked")
	public <T> T get(String key) {
		Preconditions.checkArgument(key != null && !key.isEmpty(), "Parameter 'key' must not be [" + key + "]");
		Context context = factory.enterContext();
		
		try {
			if (values.containsKey(key)) {
				Object value = values.get(key);
				return (T) ((value instanceof Function) 
						? ((Function) value).call(context, scope, (Scriptable) value, null)
						: value);
			}
			
			synchronized (values) {
				if (values.containsKey(key)) {
					Object value = values.get(key);
					return (T) ((value instanceof Function) 
							? ((Function) value).call(context, scope, (Scriptable) value, null)
							: value);
				} else if (key.equals(ENDPOINTS)) {
					Object endpoints = scope.get(ENDPOINTS);
					
					if (endpoints == null && configuration != null) {
						endpoints = Collections2.filter((Collection<Class<?>>) get(COMPONENTS), new Predicate<Class<?>>() {

							@Override
							public boolean apply(Class<?> clazz) {
								return clazz.isAnnotationPresent(Endpoint.class);
							}
							
						});
					}
					
					values.put(ENDPOINTS, endpoints);
					return (T) ((endpoints instanceof Function) 
							? ((Function) endpoints).call(context, scope, (Scriptable) endpoints, null)
							: endpoints);
				} else if (key.equals(PIPELINE)) {
					Object pipeline = scope.get(PIPELINE);
					
					if (pipeline == null && configuration != null) {
						Pipeline<WebContext> p = configuration.pipeline();
						p.remove(2);
						p.set(2, "JaguarInvoke", new Invoke() {
							
							@Override
							protected <E> E instantiate(Class<E> endpoint) throws Exception {
								return component(endpoint);
							}
							
						});
						pipeline = p;
					}
					
					values.put(PIPELINE, pipeline);
					return (T) ((pipeline instanceof Function) 
							? ((Function) pipeline).call(context, scope, (Scriptable) pipeline, null)
							: pipeline);
				} else if (key.equals(REQUEST_TYPES)) {
					Object requestTypes = scope.get(REQUEST_TYPES);
					
					if (requestTypes == null && configuration != null) {
						requestTypes = configuration.requestTypes();
					}
					
					values.put(REQUEST_TYPES, requestTypes);
					return (T) ((requestTypes instanceof Function) 
							? ((Function) requestTypes).call(context, scope, (Scriptable) requestTypes, null)
							: requestTypes);
				} else if (key.equals(RESPONSE_TYPES)) {
					Object responseTypes = scope.get(RESPONSE_TYPES);
					
					if (responseTypes == null && configuration != null) {
						responseTypes = configuration.responseTypes();
					}
					
					values.put(RESPONSE_TYPES, responseTypes);
					return (T) ((responseTypes instanceof Function) 
							? ((Function) responseTypes).call(context, scope, (Scriptable) responseTypes, null)
							: responseTypes);
				} else if (key.equals(ROUTING)) {
					Object routing = scope.get(ROUTING);
					
					if (routing == null && configuration != null) {
						routing = configuration.routing();
					}
					
					values.put(ROUTING, routing);
					return (T) ((routing instanceof Function) 
							? ((Function) routing).call(context, scope, (Scriptable) routing, null)
							: routing);
				} else if (key.equals(DEPLOYMENT)) {
					Object deployment = scope.get(DEPLOYMENT);
					values.put(DEPLOYMENT, deployment);
					return (T) ((deployment instanceof Function) 
							? ((Function) deployment).call(context, scope, (Scriptable) deployment, null)
							: deployment);
				} else if (key.equals(COMPONENTS)) {
					Object components = scope.get(COMPONENTS);
					
					if (components == null) {
						components = components();
					}
					
					values.put(COMPONENTS, components);
					return (T) ((components instanceof Function) 
							? ((Function) components).call(context, scope, (Scriptable) components, null)
							: components);
				} else {
					Object value = scope.get(key);
					
					if (value == null) {
						return null;
					}
					
					values.put(key, value);
					return (T) ((value instanceof Function) 
							? ((Function) value).call(context, scope, (Scriptable) value, null)
							: value);
				}
			}
			
		} finally {
			Context.exit();
		}
	}
@ SuppressWarnings ( "unchecked" ) public < T > T get ( String key ) { Preconditions . checkArgument ( key != null && ! key . isEmpty ( ) , "Parameter 'key' must not be [" + key + "]" ) ; Context context = factory . enterContext ( ) ; try { if ( values . containsKey ( key ) ) { Object value = values . get ( key ) ; return ( T ) ( ( value instanceof Function ) ? ( ( Function ) value ) . call ( context , scope , ( Scriptable ) value , null ) : value ) ; } synchronized ( values ) { if ( values . containsKey ( key ) ) { Object value = values . get ( key ) ; return ( T ) ( ( value instanceof Function ) ? ( ( Function ) value ) . call ( context , scope , ( Scriptable ) value , null ) : value ) ; } else if ( key . equals ( ENDPOINTS ) ) { Object endpoints = scope . get ( ENDPOINTS ) ; if ( endpoints == null && configuration != null ) { endpoints = Collections2 . filter ( ( Collection < Class < ? > > ) get ( COMPONENTS ) , new Predicate < Class < ? > > ( ) { @ Override public boolean apply ( Class < ? > clazz ) { return clazz . isAnnotationPresent ( Endpoint . class ) ; } } ) ; } values . put ( ENDPOINTS , endpoints ) ; return ( T ) ( ( endpoints instanceof Function ) ? ( ( Function ) endpoints ) . call ( context , scope , ( Scriptable ) endpoints , null ) : endpoints ) ; } else if ( key . equals ( PIPELINE ) ) { Object pipeline = scope . get ( PIPELINE ) ; if ( pipeline == null && configuration != null ) { Pipeline < WebContext > p = configuration . pipeline ( ) ; p . remove ( 2 ) ; p . set ( 2 , "JaguarInvoke" , new Invoke ( ) { @ Override protected < E > E instantiate ( Class < E > endpoint ) throws Exception { return component ( endpoint ) ; } } ) ; pipeline = p ; } values . put ( PIPELINE , pipeline ) ; return ( T ) ( ( pipeline instanceof Function ) ? ( ( Function ) pipeline ) . call ( context , scope , ( Scriptable ) pipeline , null ) : pipeline ) ; } else if ( key . equals ( REQUEST_TYPES ) ) { Object requestTypes = scope . get ( REQUEST_TYPES ) ; if ( requestTypes == null && configuration != null ) { requestTypes = configuration . requestTypes ( ) ; } values . put ( REQUEST_TYPES , requestTypes ) ; return ( T ) ( ( requestTypes instanceof Function ) ? ( ( Function ) requestTypes ) . call ( context , scope , ( Scriptable ) requestTypes , null ) : requestTypes ) ; } else if ( key . equals ( RESPONSE_TYPES ) ) { Object responseTypes = scope . get ( RESPONSE_TYPES ) ; if ( responseTypes == null && configuration != null ) { responseTypes = configuration . responseTypes ( ) ; } values . put ( RESPONSE_TYPES , responseTypes ) ; return ( T ) ( ( responseTypes instanceof Function ) ? ( ( Function ) responseTypes ) . call ( context , scope , ( Scriptable ) responseTypes , null ) : responseTypes ) ; } else if ( key . equals ( ROUTING ) ) { Object routing = scope . get ( ROUTING ) ; if ( routing == null && configuration != null ) { routing = configuration . routing ( ) ; } values . put ( ROUTING , routing ) ; return ( T ) ( ( routing instanceof Function ) ? ( ( Function ) routing ) . call ( context , scope , ( Scriptable ) routing , null ) : routing ) ; } else if ( key . equals ( DEPLOYMENT ) ) { Object deployment = scope . get ( DEPLOYMENT ) ; values . put ( DEPLOYMENT , deployment ) ; return ( T ) ( ( deployment instanceof Function ) ? ( ( Function ) deployment ) . call ( context , scope , ( Scriptable ) deployment , null ) : deployment ) ; } else if ( key . equals ( COMPONENTS ) ) { Object components = scope . get ( COMPONENTS ) ; if ( components == null ) { components = components ( ) ; } values . put ( COMPONENTS , components ) ; return ( T ) ( ( components instanceof Function ) ? ( ( Function ) components ) . call ( context , scope , ( Scriptable ) components , null ) : components ) ; } else { Object value = scope . get ( key ) ; if ( value == null ) { return null ; } values . put ( key , value ) ; return ( T ) ( ( value instanceof Function ) ? ( ( Function ) value ) . call ( context , scope , ( Scriptable ) value , null ) : value ) ; } } } finally { Context . exit ( ) ; } }
Returns the configuration setting corresponding to the specified key.

@param key The key to the configuration setting.
@return The configuration setting corresponding to the specified key.