public static IBAN compose(String country, String... parts) {
		
		if( country == null ) throw new IllegalArgumentException();
		else {
			
			final StringBuilder sb = new StringBuilder();
			
			if( !normalize(country, sb) ) throw new FormatException(country, INVALID_CHARACTER);
			else {
				
				final String code = sb.toString();
			
				if( !isValidCountry(code) ) throw new FormatException(country, INVALID_SYNTAX);
				else {
				
					sb.append("00");
		
					for( String part: parts ) {
						
						if( part == null ) throw new IllegalArgumentException();
						else {
							
							if( !normalize(part, sb) ) throw new FormatException(part, INVALID_CHARACTER);
						}
					}
					
					final int length = sb.length();
					final Integer size = lengthTable.get(code);
					
					if( size != null && size.intValue() != length ) throw new FormatException(sb.toString(), INVALID_LENGTH);
					else {
					
						final int digit = 98 - internallyComputeCheckSum(sb.toString());
						
						sb.setCharAt(2, "0123456789".charAt(digit / 10));
						sb.setCharAt(3, "0123456789".charAt(digit % 10));
						
						return new IBAN(sb.toString());
					}
				}
			}
		}
	}