Index: pkg/observe/lib/src/observable.dart |
diff --git a/pkg/observe/lib/src/observable.dart b/pkg/observe/lib/src/observable.dart |
index 35e91c8912e989ececca48a1e89f0f74c384c686..488ae3528d923e8fc7c1c7313fef82ff33213332 100644 |
--- a/pkg/observe/lib/src/observable.dart |
+++ b/pkg/observe/lib/src/observable.dart |
@@ -7,14 +7,15 @@ library observe.src.observable; |
import 'dart:async'; |
import 'dart:collection'; |
+// TODO(sigmund): figure out how to remove this annotation entirely |
// Note: ObservableProperty is in this list only for the unusual use case of |
// dart2js without deploy tool. The deploy tool (see "transformer.dart") will |
// add the @reflectable annotation, which makes it work with Polymer's |
// @published. |
@MirrorsUsed(metaTargets: const [Reflectable, ObservableProperty], |
- override: 'observe.src.observable') |
-import 'dart:mirrors'; |
- |
+ override: 'smoke.mirrors') |
+import 'dart:mirrors' show MirrorsUsed; |
+import 'package:smoke/smoke.dart' as smoke; |
import 'package:observe/observe.dart'; |
// Note: this is an internal library so we can import it from tests. |
@@ -46,7 +47,6 @@ abstract class Observable { |
static void dirtyCheck() => dirtyCheckObservables(); |
StreamController _changes; |
- InstanceMirror _mirror; |
Map<Symbol, Object> _values; |
List<ChangeRecord> _records; |
@@ -75,32 +75,20 @@ abstract class Observable { |
// Register this object for dirty checking purposes. |
registerObservable(this); |
- var mirror = reflect(this); |
var values = new Map<Symbol, Object>(); |
// Note: we scan for @observable regardless of whether the base type |
// actually includes this mixin. While perhaps too inclusive, it lets us |
// avoid complex logic that walks "with" and "implements" clauses. |
- for (var type = mirror.type; type != objectType; type = type.superclass) { |
- for (var field in type.declarations.values) { |
- if (field is! VariableMirror || |
- field.isFinal || |
- field.isStatic || |
- field.isPrivate) continue; |
- |
- for (var meta in field.metadata) { |
- if (meta.reflectee is ObservableProperty) { |
- var name = field.simpleName; |
- // Note: since this is a field, getting the value shouldn't execute |
- // user code, so we don't need to worry about errors. |
- values[name] = mirror.getField(name).reflectee; |
- break; |
- } |
- } |
- } |
+ var queryOptions = new smoke.QueryOptions(includeInherited: true, |
+ includeProperties: false, withAnnotations: const [ObservableProperty]); |
+ for (var decl in smoke.query(this.runtimeType, queryOptions)) { |
+ var name = decl.name; |
+ // Note: since this is a field, getting the value shouldn't execute |
+ // user code, so we don't need to worry about errors. |
+ values[name] = smoke.read(this, name); |
} |
- _mirror = mirror; |
_values = values; |
} |
@@ -109,7 +97,6 @@ abstract class Observable { |
// Note: we don't need to explicitly unregister from the dirty check list. |
// This will happen automatically at the next call to dirtyCheck. |
if (_values != null) { |
- _mirror = null; |
_values = null; |
} |
} |
@@ -145,7 +132,7 @@ abstract class Observable { |
_records = null; |
_values.forEach((name, oldValue) { |
- var newValue = _mirror.getField(name).reflectee; |
+ var newValue = smoke.read(this, name); |
if (oldValue != newValue) { |
if (records == null) records = []; |
records.add(new PropertyChangeRecord(this, name, oldValue, newValue)); |
@@ -202,6 +189,3 @@ notifyPropertyChangeHelper(Observable obj, Symbol field, Object oldValue, |
} |
return newValue; |
} |
- |
-// NOTE: this is not exported publically. |
-final objectType = reflectClass(Object); |