diff --git a/src/bindx/SignalTools.hx b/src/bindx/SignalTools.hx index 809ae37..563fec7 100644 --- a/src/bindx/SignalTools.hx +++ b/src/bindx/SignalTools.hx @@ -1,10 +1,16 @@ package bindx; +import haxe.Constraints.Function; + class SignalTools { static public inline var BIND_SIGNAL_META = "BindSignal"; static public inline var SIGNAL_POSTFIX = "Changed"; + /** + * Remove all subscriptions from target, useful for release object (use reflection api) + * @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)) { @@ -21,12 +27,20 @@ class SignalTools { } } + /** + * Bind all bindable fields/methods (use reflection api) + * @param bindable - target object + * @param callback - + * @param force = true - force instantiate all lazy signals + * @return Void -> Void + */ static public function bindAll(bindable:bindx.IBindable, callback:String -> Dynamic -> Dynamic -> Void, force = true):Void -> Void { - var listeners = new Map, Dynamic>(); + var listeners = new Map, Function>(); var signals = getSignals(bindable, force); for (name in signals.keys()) { var signal = signals.get(name); + if (signal == null) continue; if (std.Std.is(signal, bindx.BindSignal.FieldSignal)) { var listener = function (from:Dynamic, to:Dynamic) callback(name, from, to); listeners.set(signal, listener); @@ -41,28 +55,31 @@ class SignalTools { return function () { for (signal in listeners.keys()) { var listener = listeners.get(signal); - if (Std.is(signal, bindx.BindSignal.FieldSignal)) signal.remove(listener); - else signal.remove(listener); + signal.remove(listener); } } } - static function getSignals(bindable:bindx.IBindable, force = true):Map> { - var signals = new Map>(); + /** + * Get all binding signals (use reflection api) + * @param bindable - target object + * @param force = true - force instantiate all lazy signals + * @return Map> + */ + 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); + 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)); } - if (signal != null) { - var name = args[0]; - signals.set(name, signal); - } + var name = args[0]; + signals.set(name, signal); } } return signals;