Added convenience methods in `Directory`... (#46)

... for creating child entities.
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 4162b26..c9cc3c0 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,10 @@
+#### 2.3.0
+
+* Added the following convenience methods in `Directory`:
+  * `Directory.childDirectory(String basename)`
+  * `Directory.childFile(String basename)`
+  * `Directory.childLink(String basename)`
+
 #### 2.2.0
 
 * Added `ErrorCodes` class, which holds errno values.
diff --git a/lib/src/backends/chroot/chroot_directory.dart b/lib/src/backends/chroot/chroot_directory.dart
index 102a1c1..3cfaa61 100644
--- a/lib/src/backends/chroot/chroot_directory.dart
+++ b/lib/src/backends/chroot/chroot_directory.dart
@@ -5,7 +5,7 @@
 part of file.src.backends.chroot;
 
 class _ChrootDirectory extends _ChrootFileSystemEntity<Directory, io.Directory>
-    with ForwardingDirectory {
+    with ForwardingDirectory, common.DirectoryAddOnsMixin {
   _ChrootDirectory(ChrootFileSystem fs, String path) : super(fs, path);
 
   factory _ChrootDirectory.wrapped(
diff --git a/lib/src/backends/local.dart b/lib/src/backends/local.dart
index a76c41c..b5ef405 100644
--- a/lib/src/backends/local.dart
+++ b/lib/src/backends/local.dart
@@ -6,6 +6,7 @@
 
 import 'dart:async';
 
+import 'package:file/src/common.dart' as common;
 import 'package:file/src/forwarding.dart';
 import 'package:file/src/io.dart' as io;
 import 'package:file/file.dart';
diff --git a/lib/src/backends/local/local_directory.dart b/lib/src/backends/local/local_directory.dart
index 1b7ecbd..2f3f238 100644
--- a/lib/src/backends/local/local_directory.dart
+++ b/lib/src/backends/local/local_directory.dart
@@ -6,7 +6,7 @@
 
 class _LocalDirectory
     extends _LocalFileSystemEntity<_LocalDirectory, io.Directory>
-    with ForwardingDirectory {
+    with ForwardingDirectory, common.DirectoryAddOnsMixin {
   _LocalDirectory(FileSystem fs, io.Directory delegate) : super(fs, delegate);
 
   @override
diff --git a/lib/src/backends/memory/memory_directory.dart b/lib/src/backends/memory/memory_directory.dart
index 3a3cbb1..da41c96 100644
--- a/lib/src/backends/memory/memory_directory.dart
+++ b/lib/src/backends/memory/memory_directory.dart
@@ -4,7 +4,9 @@
 
 part of file.src.backends.memory;
 
-class _MemoryDirectory extends _MemoryFileSystemEntity implements Directory {
+class _MemoryDirectory extends _MemoryFileSystemEntity
+    with common.DirectoryAddOnsMixin
+    implements Directory {
   static int _tempCounter = 0;
 
   _MemoryDirectory(MemoryFileSystem fileSystem, String path)
diff --git a/lib/src/backends/record_replay/recording_directory.dart b/lib/src/backends/record_replay/recording_directory.dart
index 52334b1..d38abe9 100644
--- a/lib/src/backends/record_replay/recording_directory.dart
+++ b/lib/src/backends/record_replay/recording_directory.dart
@@ -24,6 +24,9 @@
       #createTempSync: _createTempSync,
       #list: _list,
       #listSync: _listSync,
+      #childDirectory: _childDirectory,
+      #childFile: _childFile,
+      #childLink: _childLink,
     });
   }
 
@@ -63,4 +66,11 @@
     }
     throw new FileSystemException('Unsupported type: $entity', entity.path);
   }
+
+  Directory _childDirectory(String basename) =>
+      wrapDirectory(delegate.childDirectory(basename));
+
+  File _childFile(String basename) => wrapFile(delegate.childFile(basename));
+
+  Link _childLink(String basename) => wrapLink(delegate.childLink(basename));
 }
diff --git a/lib/src/backends/record_replay/replay_directory.dart b/lib/src/backends/record_replay/replay_directory.dart
index 2d264e5..b6130be 100644
--- a/lib/src/backends/record_replay/replay_directory.dart
+++ b/lib/src/backends/record_replay/replay_directory.dart
@@ -36,6 +36,9 @@
       #createTempSync: reviveDirectory,
       #list: reviveEntities.fuse(const ToStream<FileSystemEntity>()),
       #listSync: reviveEntities,
+      #childDirectory: reviveDirectory,
+      #childFile: new ReviveFile(fileSystem),
+      #childLink: new ReviveLink(fileSystem),
     });
 
     properties.addAll(<Symbol, Converter<dynamic, dynamic>>{
diff --git a/lib/src/common.dart b/lib/src/common.dart
index 87148c5..39b647f 100644
--- a/lib/src/common.dart
+++ b/lib/src/common.dart
@@ -63,3 +63,22 @@
 FileSystemException _fsException(String path, String msg, int errorCode) {
   return new FileSystemException(msg, path, new OSError(msg, errorCode));
 }
+
+/// Mixin containing implementations of [Directory] methods that are common
+/// to all implementations.
+abstract class DirectoryAddOnsMixin implements Directory {
+  @override
+  Directory childDirectory(String basename) {
+    return fileSystem.directory(fileSystem.path.join(path, basename));
+  }
+
+  @override
+  File childFile(String basename) {
+    return fileSystem.file(fileSystem.path.join(path, basename));
+  }
+
+  @override
+  Link childLink(String basename) {
+    return fileSystem.link(fileSystem.path.join(path, basename));
+  }
+}
diff --git a/lib/src/interface/directory.dart b/lib/src/interface/directory.dart
index f19c67f..f96e515 100644
--- a/lib/src/interface/directory.dart
+++ b/lib/src/interface/directory.dart
@@ -4,7 +4,9 @@
 
 import 'dart:async';
 
+import 'file.dart';
 import 'file_system_entity.dart';
+import 'link.dart';
 import '../io.dart' as io;
 
 /// A reference to a directory on the file system.
@@ -35,4 +37,16 @@
   @override
   List<FileSystemEntity> listSync(
       {bool recursive: false, bool followLinks: true});
+
+  /// Returns a reference to a [Directory] that exists as a child of this
+  /// directory and has the specified [basename].
+  Directory childDirectory(String basename);
+
+  /// Returns a reference to a [File] that exists as a child of this directory
+  /// and has the specified [basename].
+  File childFile(String basename);
+
+  /// Returns a reference to a [Link] that exists as a child of this directory
+  /// and has the specified [basename].
+  Link childLink(String basename);
 }
diff --git a/lib/src/interface/file_system.dart b/lib/src/interface/file_system.dart
index 084ba82..18f5a51 100644
--- a/lib/src/interface/file_system.dart
+++ b/lib/src/interface/file_system.dart
@@ -4,7 +4,7 @@
 
 import 'dart:async';
 
-import 'package:path/path.dart' as path;
+import 'package:path/path.dart' as p;
 
 import 'directory.dart';
 import 'file.dart';
@@ -38,7 +38,7 @@
   Link link(dynamic path);
 
   /// An object for manipulating paths in this file system.
-  path.Context get path;
+  p.Context get path;
 
   /// Gets the system temp directory.
   ///
diff --git a/pubspec.yaml b/pubspec.yaml
index 3001c16..047b297 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,5 +1,5 @@
 name: file
-version: 2.2.0
+version: 2.3.0
 authors:
 - Matan Lurey <matanl@google.com>
 - Yegor Jbanov <yjbanov@google.com>
diff --git a/test/common_tests.dart b/test/common_tests.dart
index e89b02d..468a263 100644
--- a/test/common_tests.dart
+++ b/test/common_tests.dart
@@ -1101,6 +1101,16 @@
           }
         });
       });
+
+      test('childEntities', () {
+        Directory dir = fs.directory(ns('/foo'))..createSync();
+        dir.childDirectory('bar').createSync();
+        dir.childFile('baz').createSync();
+        dir.childLink('qux').createSync('bar');
+        expect(fs.directory(ns('/foo/bar')), exists);
+        expect(fs.file(ns('/foo/baz')), exists);
+        expect(fs.link(ns('/foo/qux')), exists);
+      });
     });
 
     group('File', () {