     @args = ["--harmony", @sourcePath]
 
 class Go extends Transformer
+  command: 'coffee'
+  compile: ->
+    @extension = 'js'
+    @args = ["-cbp", "--no-header", @sourcePath]
+    super
+
   initialize: ->
     @args = ['run', @sourcePath]
+
+getBaseName = (file) ->
+  path.basename(file, path.extname(file))
+
+class OCaml extends Transformer
+  cleanup: ->
+    baseName = getBaseName(@sourcePath)
+    dirName = path.dirname(@sourcePath)
+    fs.removeSync(path.join(dirName, "#{baseName}.cmi"))
+    fs.removeSync(path.join(dirName, "#{baseName}.cmj"))
+
+  _runCommand: ({command, args, options, editor}) ->
+    new Promise (resolve) ->
+      stdout = stderr = ->
+      exit = (code) -> resolve()
+      options = {command, args, options, stdout, stderr, exit}
+      new BufferedProcess(options)
+
+  compile: ->
+    @command = 'bsc'
+    @extension = 'js'
+
+    dirName = path.dirname(@sourcePath)
+    outputFile = path.join(dirName, getBaseName(@sourcePath) + ".js")
+
+    runBsc = =>
+      new Promise (resolve) =>
+        new BufferedProcess
+          command: 'bsc'
+          args: ["-I", ".", "-c", @sourcePath]
+          options: {@cwd}
+          stdout: ->
+          stderr: ->
+          exit: -> resolve()
+
+    runBsc().then =>
+      @openResultEditor().then (editor) =>
+        @runCommand
+          command: "cat"
+          args: [outputFile]
+          options: {@cwd}
+          editor: editor
+        @cleanup()
 
 class Less extends Transformer
   needSave: false

      command = @getCommand()
      @args ?= [@sourcePath]
      options = {@cwd}
      @runCommand {command, @args, @options, editor}

  compile: ->
    @run()

  JavaScript
  Less
  Go
  OCaml
}
