public <T> T getProperty( String key, Class<T> type ) {
		Object value = parsed.get( key );
		if ( value != null ) {
			try {
				return type.cast( value );
			} catch ( ClassCastException cce ) {
				// fall through to ParseException below
			}
		} else {
			try {
				Method method = this.getClass().getMethod( "get" + type.getSimpleName(), String.class );
				value = method.invoke( this, key );
				if ( value == null ) {
					return null;
				}
				return type.cast( value );
			} catch (NoSuchMethodException e) {
				// fall through to ParseException below 
			} catch (IllegalArgumentException e) {
				// 
			} catch (IllegalAccessException e) {
				// 
			} catch (InvocationTargetException e) {
				// 
			}
		}
		throw new IllegalArgumentException( "\"" + key + "\": can't parse value \""
		+ getProperty( key ) + " as " + type.getSimpleName() );
	}