docs: public S fillFrom( Properties parms ) {
      // Get passed-in fields, assign into Schema
      Class clz = getClass();
      for( String key : parms.stringPropertyNames() ) {
        try {
          Field f = clz.getDeclaredField(key); // No such field error, if parm is junk
          int mods = f.getModifiers();
          if( Modifier.isTransient(mods) || Modifier.isStatic(mods) )
            // Attempting to set a transient or static; treat same as junk fieldname
            throw new IllegalArgumentException("Unknown argument "+key);
          // Only support a single annotation which is an API, and is required
          API api = (API)f.getAnnotations()[0]; 
          // Must have one of these set to be an input field
          if( api.validation().length()==0 && 
              api.values    ().length()==0 && 
              api.dependsOn ().length  ==0 ) 
            throw new IllegalArgumentException("Attempting to set output field "+key);
  
          // Primitive parse by field type
          f.set(this,parse(parms.getProperty(key),f.getType()));
          
        } catch( NoSuchFieldException nsfe ) { // Convert missing-field to IAE
          throw new IllegalArgumentException("Unknown argument "+key);
        } catch( ArrayIndexOutOfBoundsException aioobe ) {
          // Come here if missing annotation
          throw new RuntimeException("Broken internal schema; missing API annotation: "+key);
        } catch( IllegalAccessException iae ) {
          // Come here if field is final or private
          throw new RuntimeException("Broken internal schema; cannot be private nor final: "+key);
        }
      }
      // Here every thing in 'parms' was set into some field - so we have already
      // checked for unknown or extra parms.
  
      // Confirm required fields are set
      do {
        for( Field f : clz.getDeclaredFields() ) {
          int mods = f.getModifiers();
          if( Modifier.isTransient(mods) || Modifier.isStatic(mods) )
            continue;             // Ignore transient & static
          API api = (API)f.getAnnotations()[0]; 
          if( api.validation().length() > 0 ) {
            // TODO: execute "validation language" in the BackEnd, which includes a "required check", if any
            if( parms.getProperty(f.getName()) == null )
              throw new IllegalArgumentException("Required field "+f.getName()+" not specified");
          }      
        }
        clz = clz.getSuperclass();
      } while( Iced.class.isAssignableFrom(clz.getSuperclass()) );
      return (S)this;
    }