| Index: pkg/barback/lib/src/asset_cascade.dart | 
| diff --git a/pkg/barback/lib/src/asset_cascade.dart b/pkg/barback/lib/src/asset_cascade.dart | 
| index 802c8fd6f953a8671848d08eab27a65604490f40..323c83ff3d7be7773ec8d8ca04f3a5ab57e8167e 100644 | 
| --- a/pkg/barback/lib/src/asset_cascade.dart | 
| +++ b/pkg/barback/lib/src/asset_cascade.dart | 
| @@ -84,25 +84,9 @@ class AssetCascade { | 
|  | 
| /// Creates a new [AssetCascade]. | 
| /// | 
| -  /// It loads source assets within [package] using [provider] and then uses | 
| -  /// [transformerPhases] to generate output files from them. | 
| -  //TODO(rnystrom): Better way of specifying transformers and their ordering. | 
| -  AssetCascade(this.graph, this.package, | 
| -      Iterable<Iterable<Transformer>> transformerPhases) { | 
| -    // Flatten the phases to a list so we can traverse backwards to wire up | 
| -    // each phase to its next. | 
| -    var phases = transformerPhases.toList(); | 
| -    if (phases.isEmpty) phases = [[]]; | 
| - | 
| -    Phase nextPhase = null; | 
| -    for (var transformers in phases.reversed) { | 
| -      nextPhase = new Phase(this, transformers.toList(), nextPhase); | 
| -      nextPhase.onDirty.listen((_) { | 
| -        _newChanges = true; | 
| -        _waitForProcess(); | 
| -      }); | 
| -      _phases.insert(0, nextPhase); | 
| -    } | 
| +  /// It loads source assets within [package] using [provider]. | 
| +  AssetCascade(this.graph, this.package) { | 
| +    _addPhase(new Phase(this, [])); | 
| } | 
|  | 
| /// Gets the asset identified by [id]. | 
| @@ -185,11 +169,42 @@ class AssetCascade { | 
| }); | 
| } | 
|  | 
| +  /// Sets this cascade's transformer phases to [transformers]. | 
| +  void updateTransformers(Iterable<Iterable<Transformer>> transformers) { | 
| +    transformers = transformers.toList(); | 
| + | 
| +    for (var i = 0; i < transformers.length; i++) { | 
| +      if (_phases.length > i) { | 
| +        _phases[i].updateTransformers(transformers[i]); | 
| +        continue; | 
| +      } | 
| + | 
| +      _addPhase(_phases.last.addPhase(transformers[i])); | 
| +    } | 
| + | 
| +    if (transformers.length < _phases.length) { | 
| +      for (var i = transformers.length; i < _phases.length; i++) { | 
| +        // TODO(nweiz): actually remove phases rather than emptying them of | 
| +        // transformers. | 
| +        _phases[i].updateTransformers([]); | 
| +      } | 
| +    } | 
| +  } | 
| + | 
| void reportError(BarbackException error) { | 
| _accumulatedErrors.add(error); | 
| _errorsController.add(error); | 
| } | 
|  | 
| +  /// Add [phase] to the end of [_phases] and watch its [onDirty] stream. | 
| +  void _addPhase(Phase phase) { | 
| +    phase.onDirty.listen((_) { | 
| +      _newChanges = true; | 
| +      _waitForProcess(); | 
| +    }); | 
| +    _phases.add(phase); | 
| +  } | 
| + | 
| /// Starts the build process asynchronously if there is work to be done. | 
| /// | 
| /// Returns a future that completes with the background processing is done. | 
|  |