public Computation compute(TypeManager types, SerializedValueVisitor<Computation> compiler) {
    Class<?> clazz = constructorParams.getType();
    List<String> statements = new ArrayList<>();

    List<Computation> computedParams =
        constructorParams
            .getValues()
            .stream()
            .map(value -> value.accept(compiler))
            .collect(toList());

    statements.addAll(
        computedParams
            .stream()
            .flatMap(computation -> computation.getStatements().stream())
            .collect(toList()));

    String[] params =
        computedParams.stream().map(computation -> computation.getValue()).toArray(String[]::new);

    String bean = newObject(types.getBestName(clazz), params);
    String constructorStatement =
        assignLocalVariableStatement(types.getSimpleName(clazz), name, bean);
    statements.add(constructorStatement);

    for (SetterParam param : setterParams) {
      Computation fieldComputation = param.computeValue().accept(compiler);
      statements.addAll(fieldComputation.getStatements());

      String setStatement = callMethodStatement(name, param.getName(), fieldComputation.getValue());
      statements.add(setStatement);
    }

    return new Computation(name, true, statements);
  }
 public Object execute() {
   try {
     Object base = constructorParams.apply();
     for (SetterParam param : setterParams) {
       param.apply(base);
     }
     return base;
   } catch (ReflectiveOperationException e) {
     return null;
   }
 }