Move HeroController into heroes.dart and PageRoute into pages.dart
diff --git a/packages/flutter/lib/src/widgets/hero_controller.dart b/packages/flutter/lib/src/widgets/hero_controller.dart
deleted file mode 100644
index 207d743..0000000
--- a/packages/flutter/lib/src/widgets/hero_controller.dart
+++ /dev/null
@@ -1,122 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-import 'package:flutter/animation.dart';
-import 'package:flutter/rendering.dart';
-import 'package:flutter/scheduler.dart';
-
-import 'basic.dart';
-import 'framework.dart';
-import 'heroes.dart';
-import 'navigator.dart';
-import 'overlay.dart';
-import 'routes.dart';
-
-class HeroController extends NavigatorObserver {
-  HeroController() {
-    _party = new HeroParty(onQuestFinished: _handleQuestFinished);
-  }
-
-  HeroParty _party;
-  PerformanceView _performance;
-  ModalRoute _from;
-  ModalRoute _to;
-
-  final List<OverlayEntry> _overlayEntries = new List<OverlayEntry>();
-
-  void didPush(Route route, Route previousRoute) {
-    assert(navigator != null);
-    assert(route != null);
-    if (route is PageRoute) {
-      assert(route.performance != null);
-      if (previousRoute is PageRoute) // could be null
-        _from = previousRoute;
-      _to = route;
-      _performance = route.performance;
-      _checkForHeroQuest();
-    }
-  }
-
-  void didPop(Route route, Route previousRoute) {
-    assert(navigator != null);
-    assert(route != null);
-    if (route is PageRoute) {
-      assert(route.performance != null);
-      if (previousRoute is PageRoute) {
-        _to = previousRoute;
-        _from = route;
-        _performance = route.performance;
-        _checkForHeroQuest();
-      }
-    }
-  }
-
-  void _checkForHeroQuest() {
-    if (_from != null && _to != null && _from != _to) {
-      _to.offstage = _to.performance.status != PerformanceStatus.completed;
-      scheduler.addPostFrameCallback(_updateQuest);
-    }
-  }
-
-  void _handleQuestFinished() {
-    _removeHeroesFromOverlay();
-    _from = null;
-    _to = null;
-    _performance = null;
-  }
-
-  Rect _getAnimationArea(BuildContext context) {
-    RenderBox box = context.findRenderObject();
-    Point topLeft = box.localToGlobal(Point.origin);
-    Point bottomRight = box.localToGlobal(box.size.bottomRight(Point.origin));
-    return new Rect.fromLTRB(topLeft.x, topLeft.y, bottomRight.x, bottomRight.y);
-  }
-
-  void _removeHeroesFromOverlay() {
-    for (OverlayEntry entry in _overlayEntries)
-      entry.remove();
-    _overlayEntries.clear();
-  }
-
-  void _addHeroesToOverlay(Iterable<Widget> heroes, OverlayState overlay) {
-    for (Widget hero in heroes) {
-      OverlayEntry entry = new OverlayEntry(builder: (_) => hero);
-      overlay.insert(entry);
-      _overlayEntries.add(entry);
-    }
-  }
-
-  Set<Key> _getMostValuableKeys() {
-    assert(_from != null);
-    assert(_to != null);
-    Set<Key> result = new Set<Key>();
-    if (_from.settings.mostValuableKeys != null)
-      result.addAll(_from.settings.mostValuableKeys);
-    if (_to.settings.mostValuableKeys != null)
-      result.addAll(_to.settings.mostValuableKeys);
-    return result;
-  }
-
-  void _updateQuest(Duration timeStamp) {
-    Set<Key> mostValuableKeys = _getMostValuableKeys();
-
-    Map<Object, HeroHandle> heroesFrom = _party.isEmpty ?
-        Hero.of(_from.subtreeContext, mostValuableKeys) : _party.getHeroesToAnimate();
-
-    Map<Object, HeroHandle> heroesTo = Hero.of(_to.subtreeContext, mostValuableKeys);
-    _to.offstage = false;
-
-    PerformanceView performance = _performance;
-    Curve curve = Curves.ease;
-    if (performance.status == PerformanceStatus.reverse) {
-      performance = new ReversePerformance(performance);
-      curve = new Interval(performance.progress, 1.0, curve: curve);
-    }
-
-    _party.animate(heroesFrom, heroesTo, _getAnimationArea(navigator.context), curve);
-    _removeHeroesFromOverlay();
-    Iterable<Widget> heroes = _party.getWidgets(navigator.context, performance);
-    _addHeroesToOverlay(heroes, navigator.overlay);
-  }
-}
diff --git a/packages/flutter/lib/src/widgets/heroes.dart b/packages/flutter/lib/src/widgets/heroes.dart
index 27b133d..2ab8e0b 100644
--- a/packages/flutter/lib/src/widgets/heroes.dart
+++ b/packages/flutter/lib/src/widgets/heroes.dart
@@ -4,9 +4,14 @@
 
 import 'package:flutter/animation.dart';
 import 'package:flutter/rendering.dart';
+import 'package:flutter/scheduler.dart';
 
 import 'basic.dart';
 import 'framework.dart';
+import 'navigator.dart';
+import 'overlay.dart';
+import 'pages.dart';
+import 'routes.dart';
 import 'transitions.dart';
 
 // Heroes are the parts of an application's screen-to-screen transitions where a
@@ -412,3 +417,111 @@
 
   String toString() => '$_heroes';
 }
+
+class HeroController extends NavigatorObserver {
+  HeroController() {
+    _party = new HeroParty(onQuestFinished: _handleQuestFinished);
+  }
+
+  HeroParty _party;
+  PerformanceView _performance;
+  ModalRoute _from;
+  ModalRoute _to;
+
+  final List<OverlayEntry> _overlayEntries = new List<OverlayEntry>();
+
+  void didPush(Route route, Route previousRoute) {
+    assert(navigator != null);
+    assert(route != null);
+    if (route is PageRoute) {
+      assert(route.performance != null);
+      if (previousRoute is PageRoute) // could be null
+        _from = previousRoute;
+      _to = route;
+      _performance = route.performance;
+      _checkForHeroQuest();
+    }
+  }
+
+  void didPop(Route route, Route previousRoute) {
+    assert(navigator != null);
+    assert(route != null);
+    if (route is PageRoute) {
+      assert(route.performance != null);
+      if (previousRoute is PageRoute) {
+        _to = previousRoute;
+        _from = route;
+        _performance = route.performance;
+        _checkForHeroQuest();
+      }
+    }
+  }
+
+  void _checkForHeroQuest() {
+    if (_from != null && _to != null && _from != _to) {
+      _to.offstage = _to.performance.status != PerformanceStatus.completed;
+      scheduler.addPostFrameCallback(_updateQuest);
+    }
+  }
+
+  void _handleQuestFinished() {
+    _removeHeroesFromOverlay();
+    _from = null;
+    _to = null;
+    _performance = null;
+  }
+
+  Rect _getAnimationArea(BuildContext context) {
+    RenderBox box = context.findRenderObject();
+    Point topLeft = box.localToGlobal(Point.origin);
+    Point bottomRight = box.localToGlobal(box.size.bottomRight(Point.origin));
+    return new Rect.fromLTRB(topLeft.x, topLeft.y, bottomRight.x, bottomRight.y);
+  }
+
+  void _removeHeroesFromOverlay() {
+    for (OverlayEntry entry in _overlayEntries)
+      entry.remove();
+    _overlayEntries.clear();
+  }
+
+  void _addHeroesToOverlay(Iterable<Widget> heroes, OverlayState overlay) {
+    for (Widget hero in heroes) {
+      OverlayEntry entry = new OverlayEntry(builder: (_) => hero);
+      overlay.insert(entry);
+      _overlayEntries.add(entry);
+    }
+  }
+
+  Set<Key> _getMostValuableKeys() {
+    assert(_from != null);
+    assert(_to != null);
+    Set<Key> result = new Set<Key>();
+    if (_from.settings.mostValuableKeys != null)
+      result.addAll(_from.settings.mostValuableKeys);
+    if (_to.settings.mostValuableKeys != null)
+      result.addAll(_to.settings.mostValuableKeys);
+    return result;
+  }
+
+  void _updateQuest(Duration timeStamp) {
+    Set<Key> mostValuableKeys = _getMostValuableKeys();
+
+    Map<Object, HeroHandle> heroesFrom = _party.isEmpty ?
+        Hero.of(_from.subtreeContext, mostValuableKeys) : _party.getHeroesToAnimate();
+
+    Map<Object, HeroHandle> heroesTo = Hero.of(_to.subtreeContext, mostValuableKeys);
+    _to.offstage = false;
+
+    PerformanceView performance = _performance;
+    Curve curve = Curves.ease;
+    if (performance.status == PerformanceStatus.reverse) {
+      performance = new ReversePerformance(performance);
+      curve = new Interval(performance.progress, 1.0, curve: curve);
+    }
+
+    _party.animate(heroesFrom, heroesTo, _getAnimationArea(navigator.context), curve);
+    _removeHeroesFromOverlay();
+    Iterable<Widget> heroes = _party.getWidgets(navigator.context, performance);
+    _addHeroesToOverlay(heroes, navigator.overlay);
+  }
+}
diff --git a/packages/flutter/lib/src/widgets/pages.dart b/packages/flutter/lib/src/widgets/pages.dart
new file mode 100644
index 0000000..e2d9bec
--- /dev/null
+++ b/packages/flutter/lib/src/widgets/pages.dart
@@ -0,0 +1,22 @@
+// Copyright 2015 The Chromium Authors. 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:async';
+
+import 'heroes.dart';
+import 'navigator.dart';
+import 'overlay.dart';
+import 'routes.dart';
+
+/// A modal route that replaces the entire screen.
+abstract class PageRoute<T> extends ModalRoute<T> {
+  PageRoute({
+    Completer<T> completer,
+    NamedRouteSettings settings: const NamedRouteSettings()
+  }) : super(completer: completer, settings: settings);
+  bool get opaque => true;
+  bool get barrierDismissable => false;
+  bool canTransitionTo(TransitionRoute nextRoute) => nextRoute is PageRoute;
+  bool canTransitionFrom(TransitionRoute nextRoute) => nextRoute is PageRoute;
+}
diff --git a/packages/flutter/lib/src/widgets/routes.dart b/packages/flutter/lib/src/widgets/routes.dart
index fa40771..e22deb2 100644
--- a/packages/flutter/lib/src/widgets/routes.dart
+++ b/packages/flutter/lib/src/widgets/routes.dart
@@ -13,6 +13,7 @@
 import 'navigator.dart';
 import 'overlay.dart';
 import 'page_storage.dart';
+import 'pages.dart';
 
 const _kTransparent = const Color(0x00000000);
 
@@ -458,15 +459,3 @@
     super.didPushNext(nextRoute);
   }
 }
-
-/// A modal route that replaces the entire screen.
-abstract class PageRoute<T> extends ModalRoute<T> {
-  PageRoute({
-    Completer<T> completer,
-    NamedRouteSettings settings: const NamedRouteSettings()
-  }) : super(completer: completer, settings: settings);
-  bool get opaque => true;
-  bool get barrierDismissable => false;
-  bool canTransitionTo(TransitionRoute nextRoute) => nextRoute is PageRoute;
-  bool canTransitionFrom(TransitionRoute nextRoute) => nextRoute is PageRoute;
-}
diff --git a/packages/flutter/lib/widgets.dart b/packages/flutter/lib/widgets.dart
index b27116f..4ddc8cf 100644
--- a/packages/flutter/lib/widgets.dart
+++ b/packages/flutter/lib/widgets.dart
@@ -17,7 +17,6 @@
 export 'src/widgets/framework.dart';
 export 'src/widgets/gesture_detector.dart';
 export 'src/widgets/gridpaper.dart';
-export 'src/widgets/hero_controller.dart';
 export 'src/widgets/heroes.dart';
 export 'src/widgets/homogeneous_viewport.dart';
 export 'src/widgets/media_query.dart';
@@ -28,6 +27,7 @@
 export 'src/widgets/notification_listener.dart';
 export 'src/widgets/overlay.dart';
 export 'src/widgets/page_storage.dart';
+export 'src/widgets/pages.dart';
 export 'src/widgets/placeholder.dart';
 export 'src/widgets/routes.dart';
 export 'src/widgets/scrollable.dart';