1. @override
dynamic parse(ClassMirror intoType, Request request)

Source

@override
dynamic parse(ClassMirror intoType, Request request) {
  if (request.body.isEmpty) {
    return null;
  }

  if (intoType.isAssignableTo(reflectType(HTTPSerializable))) {
    if (!reflectType(request.body.decodedType)
        .isSubtypeOf(reflectType(Map))) {
      throw new HTTPResponseException(
          400, "Expected Map, got ${request.body.decodedType}");
    }

    var value = intoType.newInstance(new Symbol(""), []).reflectee
        as HTTPSerializable;
    value.readFromMap(request.body.asMap());

    return value;
  } else if (intoType.isSubtypeOf(reflectType(List))) {
    if (!reflectType(request.body.decodedType)
        .isSubtypeOf(reflectType(List))) {
      throw new HTTPResponseException(
          400, "Expected List, got ${request.body.decodedType}");
    }

    var bodyList = request.body.asList();
    if (bodyList.isEmpty) {
      return [];
    }

    var typeArg = intoType.typeArguments.first as ClassMirror;
    return bodyList.map((object) {
      if (!reflectType(object.runtimeType).isSubtypeOf(reflectType(Map))) {
        throw new HTTPResponseException(
            400, "Expected List<Map>, got List<${object.runtimeType}>");
      }

      var value = typeArg.newInstance(new Symbol(""), []).reflectee
          as HTTPSerializable;
      value.readFromMap(object);

      return value;
    }).toList();
  }

  throw new _HTTPBodyBindingException(
      "Failed to bind HTTPBody: ${intoType.reflectedType} is not HTTPSerializable or List<HTTPSerializable>");
}