docs: static public List<MatchingDefinition> load(Map<? extends Object, ? extends Object> props){
  		List<MatchingDefinition> result = new LinkedList<MatchingDefinition>();
  		
  		Map<String, Map<String, Object>> defs = new PutIfAbsentMap<String, Map<String, Object>>(new HashMap<String, Map<String, Object>>(), new MapValueFactory<String, Map<String, Object>>(){
  			@Override
  			public Map<String, Object> createValue(String key) {
  				return new HashMap<String, Object>();
  			}
  		});
  		
  		// classify
  		for (Map.Entry<? extends Object,? extends Object> entry: props.entrySet()){
  			String key = (String)entry.getKey();
  			String name = StringUtils.substringBefore(key, ".");
  			String postfix = StringUtils.substringAfter(key, ".");
  			defs.get(name).put(postfix, entry.getValue());
  		}
  		
  		// process
  		for (Map.Entry<String, Map<String, Object>> entry: defs.entrySet()){
  			Map<String, Object> def = entry.getValue();
  			String expression = null;
  			Object attachment = null;
  			List<String> examples = new LinkedList<String>();
  			for (Map.Entry<String, Object> defEntry: def.entrySet()){
  				String key = defEntry.getKey();
  				Object value = defEntry.getValue();
  				if (key != null){
  					if (key.equalsIgnoreCase("expression")){
  						expression = (String)value;
  					}else if (key.startsWith("example")){
  						examples.add((String)value);
  					}else if (key.equalsIgnoreCase("attachment")){
  						attachment = value;
  					}else{
  						// ignore
  					}
  				}
  			}
  			if (expression != null){
  				MatchingDefinition mDef = new MatchingDefinition();
  				mDef.setRegularExpression(expression);
  				mDef.setExactMatchExamples(examples);
  				mDef.setAttachment(attachment);
  				result.add(mDef);
  			}
  		}
  		
  		return result;
  	}