     aOptions?={}
     aOptions.path = aPath if aPath
     @initialize aOptions
-    throw new TypeError('path must be exist') unless @path?
     if aOptions.load
+      throw new TypeError('path must be exist') unless @path?
       if isFunction(done)
         @load(aOptions, done)
       else
         @loadSync(aOptions)
-
-  isStream: -> @contents instanceof Stream
+  orgIsSame = @::isSame
+  isSame: (obj)->orgIsSame.call @, obj, ['contents', 'history']
+  isStream: -> isStream @contents
   isBuffer: -> isBuffer @contents
   isDirectory: -> @stat? and isFunction(@stat.isDirectory) and @stat.isDirectory()
   toString: -> @path
   _inspect: -> '"'+@relative+'"'
   inspect: -> '<'+ @constructor.name + ' ' + @_inspect() + '>'
   getOptions: (aOptions)->
-    result = @mergeTo(aOptions)
+    result = @mergeTo(aOptions, ['contents','history'])
     result.path = @path
     result.base = @base
     result.cwd = @cwd


  setFS = (value)->
    gfs = value
    path.cwd = value.cwd if value and isFunction value.cwd
    gfs.path = path
    return

  defineProperty @, 'fs', undefined,

      aOptions = null
    aOptions = @getOptions(aOptions)
    checkValid = aOptions.validate isnt false
    loaded = @contents? and @validate(aOptions, false)
    unless @stat?
      @_loadStat aOptions, (err, stat)=>
        @stat = stat
        if !err and checkValid
          try @validate() catch err
        return done.call(@, err) if err
        if aOptions.read and stat? and !loaded
          @_loadContent aOptions, (err, result)=>
            @contents = result unless err
            done.call @, err, result
        else
          done.call @, null, @contents
        return
    else if aOptions.read and !loaded
      if checkValid
        try
          @validate()
        catch e
          done(e)
          return @
      @loadContent(aOptions, done)
    else
      done(null, @contents)
