 
 irMethodTranslate = (ctx, {type, name}) ->
   finalType = substitute ctx.substitution, type
-  resolvedMethod = (for constraint in finalType.constraints
-    if constraint.type instanceof TypeVariable
-      (jsCall (jsAccess constraint.className, name),
-        [ctx.classParamNameFor constraint.type.name])
-    else if _notEmpty constraintsFromInstance ctx, constraint
-      throw new Error "not implemented yet, add other recursively"
-    else
-      (jsAccess (instanceDictFor ctx, constraint), name))
+  resolvedMethod =
+    for dict in dictsForConstraint ctx, finalType.constraints
+      (jsAccess dict, name)
   if resolvedMethod.length > 1
     throw new Error "expected one constraint on a method"
   else if resolvedMethod.length is 1
     resolvedMethod[0]
   else
     method
+
+dictsForConstraint = (ctx, constraints) ->
+  for constraint in constraints
+    dictForConstraint ctx, constraint
+
+dictForConstraint = (ctx, constraint) ->
+  if constraint.type instanceof TypeVariable
+    ctx.classParamNameFor constraint.type.name
+  else if _notEmpty (constraints = constraintsFromInstance ctx, constraint)
+    (jsCall (instanceDictFor ctx, constraint),
+      (dictsForConstraint ctx, constraints))
+  else
+    (instanceDictFor ctx, constraint)
 
 instanceDictFor = (ctx, constraint) ->
   for {name, type} in (ctx.classNamed constraint.className).instances

  #     pair
  #       pattern
  #       result
  match: (ctx, call) ->
    [subject, cases...] = _arguments call
    varNames = []
    if not subject

  else
    compiled

ms = {}
ms.fn = (ctx, call) ->
    # For now expect the curried constructor call
    args = _arguments call
    [paramList, defs...] = args
