   IndexingReader
   (get-line-number [reader] (int line))
   (get-column-number [reader] (int column))
-  (get-file-name [reader] file-name))
+  (get-file-name [reader] file-name)
+
+  Closeable
+  (close [this]
+    (when (instance? Closeable rdr)
+      (.close ^Closeable rdr))))
+
+;; Java interop
 
 (extend-type java.io.PushbackReader
   Reader

  IndexingReader
  (get-line-number [reader] (int line))
  (get-column-number [reader] (int column))
  (get-file-name [reader] file-name))

(defn log-source*
  [reader f]

    (when ch
      (if (zero? buf-pos) (throw (RuntimeException. "Pushback buffer is full")))
      (update! buf-pos dec)
      (aset buf buf-pos ch)))
  Closeable
  (close [this]
    (when (instance? Closeable rdr)
      (.close ^Closeable rdr))))

(defn- normalize-newline [rdr ch]
  (if (identical? \return ch)
