Add `Platform` interface files (#1)

diff --git a/lib/platform.dart b/lib/platform.dart
new file mode 100644
index 0000000..c4eca7c
--- /dev/null
+++ b/lib/platform.dart
@@ -0,0 +1,6 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+export 'src/interface/local_platform.dart';
+export 'src/interface/platform.dart';
diff --git a/lib/src/interface/local_platform.dart b/lib/src/interface/local_platform.dart
new file mode 100644
index 0000000..0cd117d
--- /dev/null
+++ b/lib/src/interface/local_platform.dart
@@ -0,0 +1,46 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:io' as io show Platform;
+
+import 'platform.dart';
+
+/// `Platform` implementation that delegates directly to `dart:io`.
+class LocalPlatform extends Platform {
+  @override
+  int get numberOfProcessors => io.Platform.numberOfProcessors;
+
+  @override
+  String get pathSeparator => io.Platform.pathSeparator;
+
+  @override
+  String get operatingSystem => io.Platform.operatingSystem;
+
+  @override
+  String get localHostname => io.Platform.localHostname;
+
+  @override
+  Map<String, String> get environment => io.Platform.environment;
+
+  @override
+  String get executable => io.Platform.executable;
+
+  @override
+  String get resolvedExecutable => io.Platform.resolvedExecutable;
+
+  @override
+  Uri get script => io.Platform.script;
+
+  @override
+  List<String> get executableArguments => io.Platform.executableArguments;
+
+  @override
+  String get packageRoot => io.Platform.packageRoot;
+
+  @override
+  String get packageConfig => io.Platform.packageConfig;
+
+  @override
+  String get version => io.Platform.version;
+}
diff --git a/lib/src/interface/platform.dart b/lib/src/interface/platform.dart
new file mode 100644
index 0000000..19454d9
--- /dev/null
+++ b/lib/src/interface/platform.dart
@@ -0,0 +1,111 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// Provides API parity with the `Platform` class in `dart:io`, but using
+/// instance properties rather than static properties. This difference enables
+/// the use of these APIs in tests, where you can provide mock implementations.
+abstract class Platform {
+  /// The number of processors of the machine.
+  int get numberOfProcessors;
+
+  /// The path separator used by the operating system to separate
+  /// components in file paths.
+  String get pathSeparator;
+
+  /// A string (`linux`, `macos`, `windows`, `android`, `ios`, or `fuchsia`)
+  /// representing the operating system.
+  String get operatingSystem;
+
+  /// Get the local hostname for the system.
+  String get localHostname;
+
+  /// True if the operating system is Linux.
+  bool get isLinux => (operatingSystem == "linux");
+
+  /// True if the operating system is OS X.
+  bool get isMacOS => (operatingSystem == "macos");
+
+  /// True if the operating system is Windows.
+  bool get isWindows => (operatingSystem == "windows");
+
+  /// True if the operating system is Android.
+  bool get isAndroid => (operatingSystem == "android");
+
+  /// True if the operating system is iOS.
+  bool get isIOS => (operatingSystem == "ios");
+
+  /// True if the operating system is Fuchsia
+  bool get isFuchsia => (operatingSystem == "fuchsia");
+
+  /// The environment for this process.
+  ///
+  /// The returned environment is an unmodifiable map whose content is
+  /// retrieved from the operating system on its first use.
+  ///
+  /// Environment variables on Windows are case-insensitive. The map
+  /// returned on Windows is therefore case-insensitive and will convert
+  /// all keys to upper case. On other platforms the returned map is
+  /// a standard case-sensitive map.
+  Map<String, String> get environment;
+
+  /// The path of the executable used to run the script in this isolate.
+  ///
+  /// The path returned is the literal path used to run the script. This
+  /// path might be relative or just be a name from which the executable
+  /// was found by searching the `PATH`.
+  ///
+  /// To get the absolute path to the resolved executable use
+  /// [resolvedExecutable].
+  String get executable;
+
+  /// The path of the executable used to run the script in this
+  /// isolate after it has been resolved by the OS.
+  ///
+  /// This is the absolute path, with all symlinks resolved, to the
+  /// executable used to run the script.
+  String get resolvedExecutable;
+
+  /// The absolute URI of the script being run in this
+  /// isolate.
+  ///
+  /// If the script argument on the command line is relative,
+  /// it is resolved to an absolute URI before fetching the script, and
+  /// this absolute URI is returned.
+  ///
+  /// URI resolution only does string manipulation on the script path, and this
+  /// may be different from the file system's path resolution behavior. For
+  /// example, a symbolic link immediately followed by '..' will not be
+  /// looked up.
+  ///
+  /// If the executable environment does not support [script] an empty
+  /// [Uri] is returned.
+  Uri get script;
+
+  /// The flags passed to the executable used to run the script in this
+  /// isolate. These are the command-line flags between the executable name
+  /// and the script name. Each fetch of `executableArguments` returns a new
+  /// list containing the flags passed to the executable.
+  List<String> get executableArguments;
+
+  /// The value of the `--package-root` flag passed to the executable
+  /// used to run the script in this isolate.  This is the directory in which
+  /// Dart packages are looked up.
+  ///
+  /// If there is no `--package-root` flag, `null` is returned.
+  String get packageRoot;
+
+  /// The value of the `--packages` flag passed to the executable
+  /// used to run the script in this isolate. This is the configuration which
+  /// specifies how Dart packages are looked up.
+  ///
+  /// If there is no `--packages` flag, `null` is returned.
+  String get packageConfig;
+
+  /// The version of the current Dart runtime.
+  ///
+  /// The returned `String` is formatted as the [semver](http://semver.org)
+  /// version string of the current dart runtime, possibly followed by
+  /// whitespace and other version and build details.
+  String get version;
+}