      - returns: returns self for field declaration chaining
      */
     public func optional<R: Rule>(name: String, _ rule: R, _ bind: ((RefT, R.V)->Void)? = nil, dump: (T)->R.V?) -> Self {
-        optionalRules[name] = storeRule(name, rule, bind)
-        optionalDumpRules[name] = { struc in
+        optionalRules.append((name, storeRule(name, rule, bind)))
+        optionalDumpRules.append((name, { struc in
             if let v = dump(struc) {
                 return try rule.dump(v)
             }
             return nil
-        }
+        }))
         return self
     }
     

     - returns: returns self for field declaration chaining
     */
    public func expect<R: Rule>(name: String, _ rule: R, _ bind: ((RefT, R.V)->Void)? = nil, dump: (T)->R.V) -> Self {
        mandatoryRules[name] = storeRule(name, rule, bind)
        mandatoryDumpRules[name] = { struc in
            return try rule.dump(dump(struc))
        }
        return self
    }
    

     - returns: returns self for field declaration chaining
     */
    public func required<R: Rule>(name: String, _ rule: R, requirement: (R.V)->Bool) -> Self {
        requirements.append((name,  { requirement(try rule.validate($0)) }))
        return self
    }

