public ChordRank readFromFile( String fileName ) throws IOException {
		ChordRank mock = new ChordRank();
		mock.metaLocation = fileName;
				
		// Read properties file. 
		Properties properties = new Properties();
		properties.load(new FileInputStream( fileName ));

		// Convert from properties to object
		for ( Iterator<Object> it = properties.keySet().iterator(); it.hasNext(); ) {
			String key = (String) it.next();
			String value = properties.getProperty( key );
			if ( "chordrank.name".equals( key ) ) {
				mock.metaName = value;
			} else if ( "chordrank.description".equals( key ) ) {
				mock.metaDescription = value;
			} else if ( "chordrank.minFret".equals( key ) ) {
				mock.minFret = Integer.parseInt( value );
			} else if ( "chordrank.maxFret".equals( key ) ) {
				mock.maxFret = Integer.parseInt( value );
			} else if ( "chordrank.skipStringPenalty".equals( key ) ) {
				mock.skipStringPenalty = Integer.parseInt( value );
			} else if ( "chordrank.sameStringPenalty".equals( key ) ) {
				mock.sameStringPenalty = Integer.parseInt( value );
			} else {
				throw new IllegalArgumentException( "Class=\"" + ChordRank.class.getName() + "\" key \"" + key + "\" not handled, value=\"" + value + "\"." );
			} 
		}
		return mock;
	}