             @emit("skip", {file:opts.file, name, dirname:dir ? dirname})
             (@skip[name] ?= []).push(dir ? @dirname)
             return this
-        body = opts.body ? @readFile(opts.file)
+        if opts.body?
+            {source, body} = opts
+        else
+            {source, body} = @readFile(opts.file)
 
         try required = @detective.find(body)
         catch err

        return this

    readFile: (file) ->
        body = fs.readFileSync(file, 'utf-8')
        for fn in @filters
            body = fn.call(this, body, file)
        return body

    addEntry: (filename, opts = {}, callback) ->
        dirname = opts.dirname ? @dirname
        file = path.resolve(dirname, filename)
        body = opts.body ? @readFile(file)

        try required = @detective.find(body)
        catch err



        dirname = path.dirname(file)
        entry = @append(filename, source ? body, {dirname})
        entry.target = opts.target if opts.target?
        entry.name = name = opts.name ? "main"

