diff --git a/test/all_test.dart b/example/list.dart
similarity index 60%
rename from test/all_test.dart
rename to example/list.dart
index 113924b..7a40694 100644
--- a/test/all_test.dart
+++ b/example/list.dart
@@ -3,12 +3,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:pubcache/pubcache.dart';
-import 'package:unittest/unittest.dart';
 
-main() {
-  group('A group of tests', () {
-    test('First Test', () {
+void main(List<String> args) {
+  PubCache cache = new PubCache();
 
-    });
+  print('activated applications:');
+
+  cache.getGlobalApplications().forEach((app) {
+    print('  ${app}');
   });
 }
diff --git a/lib/pubcache.dart b/lib/pubcache.dart
index 50b808e..e9516ce 100644
--- a/lib/pubcache.dart
+++ b/lib/pubcache.dart
@@ -4,4 +4,193 @@
 
 library pubcache;
 
-main() => print('foo');
+import 'dart:io';
+
+import 'package:path/path.dart' as path;
+import 'package:pub_semver/pub_semver.dart';
+import 'package:yaml/yaml.dart' as yaml;
+
+// TODO: do things like get all the versions for a package?
+
+// TODO: get the latest version for a package?
+
+// TODO: get the latest non-dev version for a package?
+
+// TODO: get all the packages (id's only) in the pubcache
+
+/**
+ * TODO:
+ */
+class PubCache {
+
+  static Directory getSystemCacheLocation() {
+    if (Platform.environment.containsKey('PUB_CACHE')) {
+      return new Directory(Platform.environment['PUB_CACHE']);
+    } else if (Platform.operatingSystem == 'windows') {
+      var appData = Platform.environment['APPDATA'];
+      return new Directory(path.join(appData, 'Pub', 'Cache'));
+    } else {
+      return new Directory('${Platform.environment['HOME']}/.pub-cache');
+    }
+  }
+
+  final Directory location;
+
+  List<Application> _applications;
+  List<PackageRef> _packageRefs;
+
+  PubCache([Directory dir]) :
+      location = dir == null ? getSystemCacheLocation() : dir {
+    _parse();
+  }
+
+  /**
+   * Return the contents of `bin/` - the scripts for the activated applications.
+   */
+  List<File> getBinaries() {
+    Directory dir = _getSubDir(location, 'bin');
+    return dir.existsSync() ? dir.listSync() : [];
+  }
+
+  List<Application> getGlobalApplications() => _applications;
+
+  List<PackageRef> getPackageRefs() => _packageRefs;
+
+  void _parse() {
+    // Read the activated applications.
+    _applications = [];
+
+    Directory globalPackagesDir = _getSubDir(location, 'global_packages');
+    if (globalPackagesDir.existsSync()) {
+      _applications = globalPackagesDir.listSync().map(
+          (dir) => new Application._(this, dir)).toList();
+    }
+
+    // TODO: Scan for git packages.
+
+    // Scan hosted packages - just pub.dartlang.org for now.
+    _packageRefs = [];
+
+    Directory dartlangDir = new Directory(
+        path.join(location.path, 'hosted', 'pub.dartlang.org'));
+    if (dartlangDir.existsSync()) {
+      _packageRefs = dartlangDir.listSync()
+          .where((dir) => dir is Directory)
+          .map((dir) => new _DirectoryPackageRef('hosted', dir))
+          .toList();
+    }
+  }
+
+  Directory _getSubDir(Directory dir, String name) =>
+      new Directory(path.join(dir.path, name));
+}
+
+class Application {
+  final PubCache _cache;
+  final Directory _dir;
+
+  List<PackageRef> _packageRefs;
+  Version _version;
+
+  Application._(this._cache, this._dir);
+
+  String get name => path.basename(_dir.path);
+
+  Version get version {
+    if (_packageRefs == null) _parsePubspecLock();
+    return _version;
+  }
+
+  List<PackageRef> getPackageRefs() {
+    if (_packageRefs == null) _parsePubspecLock();
+    return _packageRefs;
+  }
+
+  String toString() => '${name} ${version}';
+
+  void _parsePubspecLock() {
+    File pubspecLock = new File(path.join(_dir.path, 'pubspec.lock'));
+    Map doc = yaml.loadYaml(pubspecLock.readAsStringSync());
+    Map packages = doc['packages'];
+    _packageRefs = packages.keys.map((key) {
+      Map m = packages[key];
+      return new _AppPackageRef(_cache, m['source'], key, m['version']);
+    }).toList();
+
+    String name = this.name;
+
+    for (PackageRef ref in _packageRefs) {
+      if (ref.name == name) {
+        _version = ref.version;
+        break;
+      }
+    }
+  }
+}
+
+abstract class PackageRef {
+  String get sourceType;
+  String get name;
+  Version get version;
+
+  Package resolve();
+
+  bool operator ==(other) {
+    return this.sourceType == other.sourceType
+        && this.name == other.name
+        && this.version == other.version;
+  }
+
+  String toString() => '${name} ${version}';
+}
+
+class _AppPackageRef extends PackageRef {
+  final PubCache cache;
+  final String sourceType;
+  final String name;
+  final Version version;
+
+  _AppPackageRef(this.cache, this.sourceType, this.name, String ver) :
+      version = new Version.parse(ver);
+
+  Package resolve() {
+    for (PackageRef ref in cache.getPackageRefs()) {
+      if (ref == this) return ref.resolve();
+    }
+
+    return null;
+  }
+}
+
+class _DirectoryPackageRef extends PackageRef {
+  final String sourceType;
+  final Directory directory;
+
+  String _name;
+  Version _version;
+
+  _DirectoryPackageRef(this.sourceType, this.directory) {
+    _name = path.basename(this.directory.path);
+
+    int index = _name.indexOf('-');
+    if (index != -1) {
+      _version = new Version.parse(_name.substring(index + 1));
+      _name = _name.substring(0, index);
+    }
+  }
+
+  String get name => _name;
+  Version get version => _version;
+
+  Package resolve() => new Package(directory, name, version);
+}
+
+class Package {
+  final Directory location;
+  final String name;
+  final Version version;
+
+  Package(this.location, this.name, this.version);
+
+  String toString() => '${name} ${version}';
+}
diff --git a/pubspec.yaml b/pubspec.yaml
index 0ac7238..6a3a6a0 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -7,7 +7,10 @@
 environment:
   sdk: '>=1.0.0 <2.0.0'
 
-#dependencies:
-#  lib_name: any
+dependencies:
+  path: '^1.0.0'
+  pub_semver: '^1.0.0'
+  yaml: '^2.0.0'
+
 dev_dependencies:
   unittest: any
diff --git a/test/all.dart b/test/all.dart
new file mode 100644
index 0000000..e32f7d9
--- /dev/null
+++ b/test/all.dart
@@ -0,0 +1,9 @@
+// Copyright (c) 2015, 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 'pubcache_test.dart' as pubcache_test;
+
+void main() {
+  pubcache_test.defineTests();
+}
diff --git a/test/pubcache_test.dart b/test/pubcache_test.dart
new file mode 100644
index 0000000..187f8dc
--- /dev/null
+++ b/test/pubcache_test.dart
@@ -0,0 +1,35 @@
+// Copyright (c) 2015, 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.
+
+library pubcache_test;
+
+import 'dart:io';
+
+import 'package:path/path.dart' as path;
+import 'package:pubcache/pubcache.dart';
+import 'package:unittest/unittest.dart';
+
+void main() => defineTests();
+
+void defineTests() {
+  group('PubCache', () {
+    test('getSystemCacheLocation', () {
+      Directory cacheDir = PubCache.getSystemCacheLocation();
+      expect(cacheDir, isNotNull);
+      expect(path.basename(cacheDir.path), contains('pub-cache'));
+    });
+
+    test('PubCache', () {
+      PubCache cache = new PubCache();
+      expect(cache, isNotNull);
+      expect(cache.location, isNotNull);
+      expect(path.basename(cache.location.path), contains('pub-cache'));
+    });
+
+    test('getBinaries', () {
+      PubCache cache = new PubCache();
+      expect(cache.getBinaries(), isNotNull);
+    });
+  });
+}
diff --git a/tool/travis.sh b/tool/travis.sh
index 70ea632..a71870a 100755
--- a/tool/travis.sh
+++ b/tool/travis.sh
@@ -9,7 +9,9 @@
 
 # Verify that the libraries are error free.
 dartanalyzer --fatal-warnings \
-  lib/sample.dart
+  example/list.dart
+  lib/pubcache.dart
+  test/all.dart
 
 # Run the tests.
 dart test/all.dart
