diff --git a/as-pom.xml b/as-pom.xml
index 648ae659a..fbcb9abd4 100644
--- a/as-pom.xml
+++ b/as-pom.xml
@@ -17,6 +17,10 @@
as3corelib-repo
https://github.com/samskivert/as3corelib/raw/master/repository
+
+ as3-signals-repo
+ https://github.com/groves/as3-signals/raw/master/repository
+
@@ -34,5 +38,11 @@
compile
swc
+
+ org.osflash
+ signals
+ 0.8
+ swc
+
diff --git a/src/main/java/com/threerings/presents/tools/GenActionScriptStreamableTask.java b/src/main/java/com/threerings/presents/tools/GenActionScriptStreamableTask.java
index 5465f052c..cd086227c 100644
--- a/src/main/java/com/threerings/presents/tools/GenActionScriptStreamableTask.java
+++ b/src/main/java/com/threerings/presents/tools/GenActionScriptStreamableTask.java
@@ -82,6 +82,11 @@ public class GenActionScriptStreamableTask extends GenTask
ActionScriptUtils.addImportAndGetShortType(sclass.getSuperclass(), false, imports);
}
+ boolean isDObject = DObject.class.isAssignableFrom(sclass);
+ if (isDObject) {
+ imports.add("org.osflash.signals.Signal");
+ }
+
Set implemented = Sets.newLinkedHashSet();
for (Class> iface : sclass.getInterfaces()) {
implemented.add(ActionScriptUtils.addImportAndGetShortType(iface, false, imports));
@@ -99,7 +104,7 @@ public class GenActionScriptStreamableTask extends GenTask
"implements", Joiner.on(", ").join(implemented),
"superclassStreamable", reqs.superclassStreamable,
"fields", fields,
- "dobject", DObject.class.isAssignableFrom(sclass));
+ "dobject", isDObject);
File outputLocation = ActionScriptUtils.createActionScriptPath(_asroot, sclass);
if (outputLocation.exists()) {
diff --git a/src/main/resources/com/threerings/presents/tools/streamable_as.tmpl b/src/main/resources/com/threerings/presents/tools/streamable_as.tmpl
index a7ac3860c..369e4390b 100644
--- a/src/main/resources/com/threerings/presents/tools/streamable_as.tmpl
+++ b/src/main/resources/com/threerings/presents/tools/streamable_as.tmpl
@@ -21,6 +21,10 @@ public class {{classname}} {{^extends.isEmpty}}extends {{extends}}
{{/fields}}
{{#dobject}}
+{{#fields}}
+ public var {{name}}Changed :Signal = new Signal({{simpleType}}, {{simpleType}});
+{{/fields}}
+
{{#fields}}
public static const {{dobjectField}} :String = "{{name}}";
@@ -47,7 +51,52 @@ public class {{classname}} {{^extends.isEmpty}}extends {{extends}}
{{/fields}}
}
{{/dobject}}
+
+{{#dobject}}
+ public function {{classname}} ()
+ {
+ new Signaller(this);
+ }
+{{/dobject}}
// GENERATED STREAMING END
+// GENERATED CLASSFINISH START
}
}
+// GENERATED CLASSFINISH END
+
+{{#dobject}}
+// GENERATED SIGNALLER START
+import org.osflash.signals.Signal;
+
+import com.threerings.presents.dobj.AttributeChangedEvent;
+import com.threerings.presents.dobj.AttributeChangeListener;
+
+import {{package}}.{{classname}};
+
+class Signaller
+ implements AttributeChangeListener
+{
+ public function Signaller (obj :{{classname}})
+ {
+ _obj = obj;
+ _obj.addListener(this);
+ }
+
+ public function attributeChanged (event :AttributeChangedEvent) :void
+ {
+ var signal :Signal;
+ switch (event.getName()) {
+{{#fields}}
+ case "{{name}}":
+ signal = _obj.{{name}}Changed;
+ break;
+{{/fields}}
+ }
+ signal.dispatch(event.getValue(), event.getOldValue());
+ }
+
+ protected var _obj :{{classname}};
+}
+// GENERATED SIGNALLER END
+{{/dobject}}