From deb69b00f3dd09a24d5cb8001048d8fa7cdcd9f2 Mon Sep 17 00:00:00 2001 From: sinnus Date: Fri, 15 Dec 2017 16:07:15 +0300 Subject: [PATCH] Fixed inheritance issue for bindAll and unbindAll --- src/bindx/SignalTools.hx | 50 +++++++++++++++++++++++----------------- test/InheritanceTest.hx | 25 ++++++++++++++++++++ 2 files changed, 54 insertions(+), 21 deletions(-) diff --git a/src/bindx/SignalTools.hx b/src/bindx/SignalTools.hx index 563fec7..91447d6 100644 --- a/src/bindx/SignalTools.hx +++ b/src/bindx/SignalTools.hx @@ -12,18 +12,22 @@ class SignalTools { * @param bindable - target object */ static public function unbindAll(bindable:bindx.IBindable):Void { - var meta = haxe.rtti.Meta.getFields(std.Type.getClass(bindable)); - if (meta != null) for (m in std.Reflect.fields(meta)) { - var data = std.Reflect.field(meta, m); - if (std.Reflect.hasField(data, BIND_SIGNAL_META)) { - var signal:bindx.BindSignal.Signal = cast std.Reflect.field(bindable, m); - if (signal != null) { - signal.removeAll(); - var args:Array = std.Reflect.field(data, BIND_SIGNAL_META); - var lazy:Bool = args[1]; - if (lazy) std.Reflect.setField(bindable, m, null); + var clazz:Class = std.Type.getClass(bindable); + while (clazz != null) { + var meta = haxe.rtti.Meta.getFields(clazz); + if (meta != null) for (m in std.Reflect.fields(meta)) { + var data = std.Reflect.field(meta, m); + if (std.Reflect.hasField(data, BIND_SIGNAL_META)) { + var signal:bindx.BindSignal.Signal = cast std.Reflect.field(bindable, m); + if (signal != null) { + signal.removeAll(); + var args:Array = std.Reflect.field(data, BIND_SIGNAL_META); + var lazy:Bool = args[1]; + if (lazy) std.Reflect.setField(bindable, m, null); + } } } + clazz = std.Type.getSuperClass(clazz); } } @@ -68,19 +72,23 @@ class SignalTools { */ static public function getSignals(bindable:bindx.IBindable, force = true):Map> { var signals = new Map>(); - var meta = haxe.rtti.Meta.getFields(std.Type.getClass(bindable)); - if (meta != null) for (m in std.Reflect.fields(meta)) { - var data = std.Reflect.field(meta, m); - if (std.Reflect.hasField(data, BIND_SIGNAL_META)) { - var args:Array = std.Reflect.field(data, BIND_SIGNAL_META); - var signal:bindx.BindSignal.Signal = cast std.Reflect.field(bindable, m); - if (signal == null && force) { - var lazy:Bool = args[1]; - if (lazy) signal = cast std.Reflect.getProperty(bindable, m.substr(1)); + var clazz:Class = std.Type.getClass(bindable); + while (clazz != null) { + var meta = haxe.rtti.Meta.getFields(clazz); + if (meta != null) for (m in std.Reflect.fields(meta)) { + var data = std.Reflect.field(meta, m); + if (std.Reflect.hasField(data, BIND_SIGNAL_META)) { + var args:Array = std.Reflect.field(data, BIND_SIGNAL_META); + var signal:bindx.BindSignal.Signal = cast std.Reflect.field(bindable, m); + if (signal == null && force) { + var lazy:Bool = args[1]; + if (lazy) signal = cast std.Reflect.getProperty(bindable, m.substr(1)); + } + var name = args[0]; + signals.set(name, signal); } - var name = args[0]; - signals.set(name, signal); } + clazz = std.Type.getSuperClass(clazz); } return signals; } diff --git a/test/InheritanceTest.hx b/test/InheritanceTest.hx index e4589d6..7deb96a 100644 --- a/test/InheritanceTest.hx +++ b/test/InheritanceTest.hx @@ -36,6 +36,31 @@ class InheritanceTest extends BuddySuite { bp.i = 2; callNum.should.be(3); }); + + it("bindx should support class inheritance for bindAll", function () { + b.s = "a"; + Bind.bindAll(b, function (_, _, _) callNum++, true); + b.s = "b"; + callNum.should.be(1); + b.i = 1; + callNum.should.be(2); + }); + + it("bindx should support class inheritance for unbindAll", function () { + b.i = 1; + b.s = "a"; + Bind.bind(b.i, function (_, _) callNum++); + Bind.bind(b.s, function (_, _) callNum++); + + b.i = 2; + b.s = "b"; + callNum.should.be(2); + Bind.unbindAll(b); + + b.i = 3; + b.s = "c"; + callNum.should.be(2); + }); }); } }