private static Entity getEntity(String[] names, double simTime, Entity thisEnt, Entity objEnt)
      throws Error {

    Entity ent;
    if (names[0].equals("this")) ent = thisEnt;
    else if (names[0].equals("obj")) ent = objEnt;
    else ent = Entity.getNamedEntity(names[0]);

    if (ent == null) {
      throw new Error(String.format("Could not find entity: %s", names[0]));
    }
    // Run the output chain up to the second last name
    for (int i = 1; i < names.length - 1; ++i) {
      String outputName = names[i];
      OutputHandle oh = ent.getOutputHandle(outputName);
      if (oh == null) {
        throw new Error(
            String.format("Output '%s' not found on entity '%s'", outputName, ent.getInputName()));
      }
      if (!Entity.class.isAssignableFrom(oh.getReturnType())) {
        throw new Error(String.format("Output '%s' is not an entity output", outputName));
      }

      ent = oh.getValue(simTime, Entity.class);
    }
    return ent;
  }
    @Override
    public ExpResult getVariableValue(String[] names) {
      try {
        errorString = null;
        Entity ent = getEntity(names, simTime, thisEnt, objEnt);
        String outputName = names[names.length - 1];
        OutputHandle oh = ent.getOutputHandle(outputName);
        if (oh == null) {
          errorString =
              String.format(
                  "Could not find output '%s' on entity '%s'", outputName, ent.getInputName());
          return null;
        }
        return new ExpResult(oh.getValueAsDouble(simTime, 0));

      } catch (Exception e) {
        errorString = e.getMessage();
      }
      return null;
    }