           ret
 
         else
-          null
-
-      evalAssign: (exp) -> throw new Error 'BUG: Not implemented yet'
-      evalLiteral: (exp) -> throw new Error 'BUG: Not implemented yet'
-      evalObj: (exp) -> throw new Error 'BUG: Not implemented yet'
-      evalAccess: (exp) -> throw new Error 'BUG: Not implemented yet'
-
+          type: 'function'
+          doc: @commentLines[lineMapping[exp.locationData.first_line] - 1]
+          startLineNumber:  lineMapping[exp.locationData.first_line]
+          endLineNumber:    lineMapping[exp.locationData.last_line]
+
+
+      evalError: (str, exp) ->
+        throw new Error "BUG: Not implemented yet: #{str}. Line #{exp.locationData.first_line}"
+      evalAssign: (exp) -> @eval(exp.value) # Support x = y = z
+      evalLiteral: (exp) -> @evalError 'evalLiteral', exp
+      evalObj: (exp) -> @evalError 'evalObj', exp
+      evalAccess: (exp) -> @evalError 'evalAccess', exp
+
+      evalUnknown: (exp) -> exp
+      evalIf: -> @evalUnknown(arguments)
+      visitIf: ->
+      visitOp: ->
+      visitArr: ->
+      visitNull: ->
+      visitBool: ->
+      visitIndex: ->
+      visitParens: ->
+
+      evalOp: (exp) -> exp
+
+    # console.log 'Visiting ' + file
 
     {defs:unindexedObjects, exports:exports} = new Visitor(root)
     objects = {}

        variable = @eval(exp.variable)
        value = @eval(exp.value)

        baseName = variable.base.value
        switch baseName
          when 'module'
            unless variable.properties?[0]?.name?.value is 'exports'
              throw new Error 'BUG: Does not support module.somthingOtherThanExports'
            baseName = 'exports'
            firstProp = variable.properties[1]
          when 'exports'
            firstProp = variable.properties[0]

        switch baseName
          when 'exports'

        startLineNumber:  lineMapping[exp.locationData.first_line]
        endLineNumber:    lineMapping[exp.locationData.last_line]

      evalValue: (exp) ->
        if exp.base
          type: 'primitive'
          name: exp.base?.value
          doc: @commentLines[lineMapping[exp.locationData.first_line] - 1]
          startLineNumber:  lineMapping[exp.locationData.first_line]
          endLineNumber:    lineMapping[exp.locationData.last_line]
        else
          throw new Error 'BUG? Not sure how to evaluate this value if it does not have .base'

      evalCall: (exp) ->
        # The only interesting call is `require('foo')`
        if exp.variable.base.value is 'require'
