Update mem to keep things private
diff --git a/mem/dir.go b/mem/dir.go
index 0767dc9..79cba7a 100644
--- a/mem/dir.go
+++ b/mem/dir.go
@@ -20,3 +20,18 @@
 	Add(File)
 	Remove(File)
 }
+
+func RemoveFromMemDir(dir *File, f *File) {
+	dir.memDir.Remove(*f)
+}
+
+func AddToMemDir(dir *File, f *File) {
+	dir.memDir.Add(*f)
+}
+
+func InitializeDir(d *File) {
+	if d.memDir == nil {
+		d.dir = true
+		d.memDir = &DirMap{}
+	}
+}
diff --git a/mem/file.go b/mem/file.go
index 692077a..33093f5 100644
--- a/mem/file.go
+++ b/mem/file.go
@@ -26,24 +26,45 @@
 
 import "time"
 
+const FilePathSeparator = string(filepath.Separator)
+
 type File struct {
 	// atomic requires 64-bit alignment for struct field access
 	at           int64
 	readDirCount int64
 
-	FileName string
-	MemDir   Dir
-	Dir      bool
-	Mode     os.FileMode
-	Modtime  time.Time
-
 	sync.Mutex
-	closed bool
-	data   []byte
+	name    string
+	data    []byte
+	memDir  Dir
+	dir     bool
+	closed  bool
+	mode    os.FileMode
+	modtime time.Time
 }
 
-func Create(name string) *File {
-	return &File{FileName: name, Mode: os.ModeTemporary, Modtime: time.Now()}
+func CreateFile(name string) *File {
+	return &File{name: name, mode: os.ModeTemporary, modtime: time.Now()}
+}
+
+func CreateDir(name string) *File {
+	return &File{name: name, memDir: &DirMap{}, dir: true}
+}
+
+func ChangeFileName(f *File, newname string) {
+	f.name = newname
+}
+
+func SetMode(f *File, mode os.FileMode) {
+	f.mode = mode
+}
+
+func SetModTime(f *File, mtime time.Time) {
+	f.modtime = mtime
+}
+
+func GetFileInfo(f *File) *FileInfo {
+	return &FileInfo{file: f}
 }
 
 func (f *File) Open() error {
@@ -63,7 +84,7 @@
 }
 
 func (f *File) Name() string {
-	return f.FileName
+	return f.name
 }
 
 func (f *File) Stat() (os.FileInfo, error) {
@@ -78,7 +99,7 @@
 	var outLength int64
 
 	f.Lock()
-	files := f.MemDir.Files()[f.readDirCount:]
+	files := f.memDir.Files()[f.readDirCount:]
 	if count > 0 {
 		if len(files) < count {
 			outLength = int64(len(files))
@@ -198,27 +219,27 @@
 }
 
 func (f *File) Info() *FileInfo {
-	return &FileInfo{File: f}
+	return &FileInfo{file: f}
 }
 
 type FileInfo struct {
-	File *File
+	file *File
 }
 
 // Implements os.FileInfo
 func (s *FileInfo) Name() string {
-	_, name := filepath.Split(s.File.Name())
+	_, name := filepath.Split(s.file.Name())
 	return name
 }
-func (s *FileInfo) Mode() os.FileMode  { return s.File.Mode }
-func (s *FileInfo) ModTime() time.Time { return s.File.Modtime }
-func (s *FileInfo) IsDir() bool        { return s.File.Dir }
+func (s *FileInfo) Mode() os.FileMode  { return s.file.mode }
+func (s *FileInfo) ModTime() time.Time { return s.file.modtime }
+func (s *FileInfo) IsDir() bool        { return s.file.dir }
 func (s *FileInfo) Sys() interface{}   { return nil }
 func (s *FileInfo) Size() int64 {
 	if s.IsDir() {
 		return int64(42)
 	}
-	return int64(len(s.File.data))
+	return int64(len(s.file.data))
 }
 
 var (
diff --git a/memmap.go b/memmap.go
index 327aea1..3a5a918 100644
--- a/memmap.go
+++ b/memmap.go
@@ -48,7 +48,7 @@
 
 		// Root should always exist, right?
 		// TODO: what about windows?
-		m.data[FilePathSeparator] = &mem.File{FileName: FilePathSeparator, MemDir: &mem.DirMap{}, Dir: true}
+		m.data[FilePathSeparator] = mem.CreateDir(FilePathSeparator)
 	}
 	return m.data
 }
@@ -66,7 +66,7 @@
 func (m *MemMapFs) Create(name string) (File, error) {
 	name = normalizePath(name)
 	m.lock()
-	file := mem.Create(name)
+	file := mem.CreateFile(name)
 	m.getData()[name] = file
 	m.registerWithParent(file)
 	m.unlock()
@@ -86,7 +86,8 @@
 		log.Fatal("parent of ", f.Name(), " is nil")
 	}
 	pmem := parent.(*mem.File)
-	pmem.MemDir.Remove(*f.(*mem.File))
+	fmem := f.(*mem.File)
+	mem.RemoveFromMemDir(pmem, fmem)
 }
 
 func (m *MemMapFs) findParent(f File) File {
@@ -118,17 +119,14 @@
 		}
 	}
 	pmem := parent.(*mem.File)
+	fmem := f.(*mem.File)
 
 	// TODO(mbertschler): memDir is only nil when it was not made with Mkdir
 	// or lockfreeMkdir. In this case the parent is also not a real directory.
 	// This currently only happens for the file ".".
 	// This is a quick hack to make the library usable with relative paths.
-	if pmem.MemDir == nil {
-		pmem.Dir = true
-		pmem.MemDir = &mem.DirMap{}
-	}
-
-	pmem.MemDir.Add(*f.(*mem.File))
+	mem.InitializeDir(pmem)
+	mem.AddToMemDir(pmem, fmem)
 }
 
 func (m *MemMapFs) lockfreeMkdir(name string, perm os.FileMode) error {
@@ -144,7 +142,7 @@
 			return err
 		}
 	} else {
-		item := &mem.File{FileName: name, MemDir: &mem.DirMap{}, Dir: true}
+		item := mem.CreateDir(name)
 		m.getData()[name] = item
 		m.registerWithParent(item)
 	}
@@ -168,7 +166,7 @@
 		}
 	} else {
 		m.lock()
-		item := &mem.File{FileName: name, MemDir: &mem.DirMap{}, Dir: true}
+		item := mem.CreateDir(name)
 		m.getData()[name] = item
 		m.registerWithParent(item)
 		m.unlock()
@@ -305,7 +303,7 @@
 			m.unRegisterWithParent(oldname)
 			file := m.getData()[oldname].(*mem.File)
 			delete(m.getData(), oldname)
-			file.FileName = newname
+			mem.ChangeFileName(file, newname)
 			m.getData()[newname] = file
 			m.registerWithParent(file)
 			m.unlock()
@@ -324,7 +322,8 @@
 	if err != nil {
 		return nil, err
 	}
-	return &mem.FileInfo{File: f.(*mem.File)}, nil
+	fi := mem.GetFileInfo(f.(*mem.File))
+	return fi, nil
 }
 
 func (m *MemMapFs) Chmod(name string, mode os.FileMode) error {
@@ -337,7 +336,7 @@
 	ff, ok := f.(*mem.File)
 	if ok {
 		m.lock()
-		ff.Mode = mode
+		mem.SetMode(ff, mode)
 		m.unlock()
 	} else {
 		return errors.New("Unable to Chmod Memory File")
@@ -355,7 +354,7 @@
 	ff, ok := f.(*mem.File)
 	if ok {
 		m.lock()
-		ff.Modtime = mtime
+		mem.SetModTime(ff, mtime)
 		m.unlock()
 	} else {
 		return errors.New("Unable to Chtime Memory File")