docs: public static MediaEncoder getInstance(EncodingContext context, MediaType contentType, MediaType containerType) throws MediaException {
  		final MediaEncoder encoder;
  		switch(contentType) {
  			case JAVASCRIPT :
  				switch(containerType) {
  					case JAVASCRIPT :
  					case JSON :
  					case LD_JSON :         return null;
  					case TEXT :            return null;
  					case XHTML :           encoder = JavaScriptInXhtmlEncoder.javaScriptInXhtmlEncoder; break;
  					case XHTML_ATTRIBUTE : encoder = JavaScriptInXhtmlAttributeEncoder.javaScriptInXhtmlAttributeEncoder; break;
  					default :              throw new MediaException(ApplicationResources.accessor.getMessage("MediaWriter.unableToFindEncoder", contentType.getContentType(), containerType.getContentType()));
  				}
  				break;
  			case JSON :
  				switch(containerType) {
  					case JAVASCRIPT :
  					case JSON :
  					case LD_JSON :         return null;
  					case TEXT :            return null;
  					case XHTML :           encoder = JavaScriptInXhtmlEncoder.jsonInXhtmlEncoder; break;
  					case XHTML_ATTRIBUTE : encoder = JavaScriptInXhtmlAttributeEncoder.javaScriptInXhtmlAttributeEncoder; break;
  					default :              throw new MediaException(ApplicationResources.accessor.getMessage("MediaWriter.unableToFindEncoder", contentType.getContentType(), containerType.getContentType()));
  				}
  				break;
  			case LD_JSON :
  				switch(containerType) {
  					case JAVASCRIPT :
  					case JSON :
  					case LD_JSON :         return null;
  					case TEXT :            return null;
  					case XHTML :           encoder = JavaScriptInXhtmlEncoder.ldJsonInXhtmlEncoder; break;
  					case XHTML_ATTRIBUTE : encoder = JavaScriptInXhtmlAttributeEncoder.javaScriptInXhtmlAttributeEncoder; break;
  					default :              throw new MediaException(ApplicationResources.accessor.getMessage("MediaWriter.unableToFindEncoder", contentType.getContentType(), containerType.getContentType()));
  				}
  				break;
  			case MYSQL :
  				switch(containerType) {
  					case MYSQL :           return null;
  					case TEXT :            return null;
  					default :              throw new MediaException(ApplicationResources.accessor.getMessage("MediaWriter.unableToFindEncoder", contentType.getContentType(), containerType.getContentType()));
  				}
  				//break;
  			case PSQL :
  				switch(containerType) {
  					case PSQL :            return null;
  					case TEXT :            return null;
  					default :              throw new MediaException(ApplicationResources.accessor.getMessage("MediaWriter.unableToFindEncoder", contentType.getContentType(), containerType.getContentType()));
  				}
  				//break;
  			case SH :
  				switch(containerType) {
  					case SH :              return null;
  					case TEXT :            return null;
  					default :              throw new MediaException(ApplicationResources.accessor.getMessage("MediaWriter.unableToFindEncoder", contentType.getContentType(), containerType.getContentType()));
  				}
  				//break;
  			case TEXT:
  				switch(containerType) {
  					case JAVASCRIPT :      encoder = TextInJavaScriptEncoder.textInJavaScriptEncoder; break;
  					case JSON :            encoder = TextInJavaScriptEncoder.textInJsonEncoder; break;
  					case LD_JSON :         encoder = TextInJavaScriptEncoder.textInLdJsonEncoder; break;
  					case MYSQL :           encoder = TextInMysqlEncoder.textInMysqlEncoder; break;
  					case PSQL :            encoder = TextInPsqlEncoder.textInPsqlEncoder; break;
  					case SH :              encoder = TextInShEncoder.textInShEncoder; break;
  					case TEXT :            return null;
  					case XHTML :           encoder = TextInXhtmlEncoder.textInXhtmlEncoder; break;
  					case XHTML_ATTRIBUTE : encoder = TextInXhtmlAttributeEncoder.textInXhtmlAttributeEncoder; break;
  					default :              throw new MediaException(ApplicationResources.accessor.getMessage("MediaWriter.unableToFindEncoder", contentType.getContentType(), containerType.getContentType()));
  				}
  				break;
  			case URL :
  				switch(containerType) {
  					case JAVASCRIPT :
  					case JSON :
  					case LD_JSON :         encoder = new UrlInJavaScriptEncoder(containerType, context); break;
  					case TEXT :            return null;
  					case URL :             return null;
  					case XHTML :           encoder = new UrlInXhtmlEncoder(context); break;
  					case XHTML_ATTRIBUTE : encoder = new UrlInXhtmlAttributeEncoder(context); break;
  					default :              throw new MediaException(ApplicationResources.accessor.getMessage("MediaWriter.unableToFindEncoder", contentType.getContentType(), containerType.getContentType()));
  				}
  				break;
  			case XHTML :
  				switch(containerType) {
  					case TEXT :            return null;
  					case XHTML :           return null;
  					default :              throw new MediaException(ApplicationResources.accessor.getMessage("MediaWriter.unableToFindEncoder", contentType.getContentType(), containerType.getContentType()));
  				}
  				//break;
  			case XHTML_ATTRIBUTE :
  				switch(containerType) {
  					case TEXT :            return null;
  					case XHTML :           return null;
  					case XHTML_ATTRIBUTE : return null;
  					default :              throw new MediaException(ApplicationResources.accessor.getMessage("MediaWriter.unableToFindEncoder", contentType.getContentType(), containerType.getContentType()));
  				}
  				//break;
  			default : throw new MediaException(ApplicationResources.accessor.getMessage("MediaWriter.unableToFindEncoder", contentType.getContentType(), containerType.getContentType()));
  		}
  		// Make sure types match - bug catching
  		assert encoder.getValidMediaOutputType()==containerType : "encoder.getValidMediaOutputType()!=containerType: "+encoder.getValidMediaOutputType()+"!="+containerType;
  		assert encoder.isValidatingMediaInputType(contentType) : "encoder="+encoder.getClass().getName()+" is not a validator for contentType="+contentType;
  		return encoder;
  	}