public Object eval(final Reader reader, final ScriptContext context) {

    String line;
    Iterable result;
    StringBuilder script = new StringBuilder();
    BufferedReader bReader = new BufferedReader(reader);

    try {
      // read whole script before evaluation
      while ((line = bReader.readLine()) != null) {
        script.append(line).append("\n");
      }

      // evaluate script
      result = this.evaluate(script.toString(), convertContext(context));

      // flushing output streams
      context.getWriter().flush();
      typeCastContextBindings(context);

    } catch (SyntaxErrorException e) {
      throw e;
    } catch (Exception e) {
      throw new RuntimeException(e.getMessage());
    }

    return result;
  }