code: public static Config stormConfig(Properties source) {
  		Config result = new Config();
  
  		logger.debug("Mapping declared types for Storm properties...");
  		for (Field field : result.getClass().getDeclaredFields()) {
  			if (field.getType() != String.class) continue;
  			if (field.getName().endsWith(CONFIGURATION_TYPE_FIELD_SUFFIX)) continue;
  
  			try {
  				String key = field.get(result).toString();
  				String entry = source.getProperty(key);
  				if (entry == null) continue;
  
  				String typeFieldName = field.getName() + CONFIGURATION_TYPE_FIELD_SUFFIX;
  				Field typeField = result.getClass().getDeclaredField(typeFieldName);
  				Object type = typeField.get(result);
  
  				logger.trace("Detected key '{}' as: {}", key, field);
  				Object value = null;
  				if (type == String.class)
  					value = entry;
  				if (type == ConfigValidation.IntegerValidator.class || type == ConfigValidation.PowerOf2Validator.class)
  					value = Integer.valueOf(entry);
  				if (type == Boolean.class)
  					value = Boolean.valueOf(entry);
  				if (type == ConfigValidation.StringOrStringListValidator.class)
  					value = asList(entry.split(LIST_CONTINUATION_PATTERN));
  
  				if (value == null) {
  					logger.warn("No parser for key '{}' type: {}", key, typeField);
  					value = entry;
  				}
  				result.put(key, value);
  			} catch (ReflectiveOperationException e) {
  				logger.debug("Interpretation failure on {}: {}", field, e);
  			}
  		}
  
  		// Copy remaining
  		for (Map.Entry<Object,Object> e : source.entrySet()) {
  			String key = e.getKey().toString();
  			if (result.containsKey(key)) continue;
  			result.put(key, e.getValue());
  		}
  
  		return result;
  	}
docs: Applies type conversion where needed.
  @return a copy of source ready for Storm.
  @see <a href="https://issues.apache.org/jira/browse/STORM-173">Strom issue 173</a>