public V8Callback(IV8Plugin plugin, CefV8Value callback, V8CallbackType callbackType, Action <V8Callback> disposeHandler = null)
 {
     _plugin          = plugin;
     CallbackFunction = callback;
     _callbackType    = callbackType;
     _disposeHandler  = disposeHandler;
     Identifier       = Guid.NewGuid();
 }
        public V8Callback GetOrCreateCallback(IV8Plugin plugin, string memberName, CefV8Value callback, V8CallbackType callbackType)
        {
            V8Callback adapter = null;

            _callbacksByMemberName.AddOrUpdate(
                memberName,
                key =>
            {
                var disposeCallback = new Action <V8Callback>(cb => DisposeCallback(memberName, cb));
                adapter             = new V8Callback(plugin, callback, callbackType, disposeCallback);
                return(new List <V8Callback> {
                    adapter
                });
            },
                (key, list) =>
            {
                adapter = list.FirstOrDefault(c => c.CallbackFunction != null && c.CallbackFunction.IsSame(callback));
                if (adapter == null)
                {
                    var disposeCallback = new Action <V8Callback>(cb => DisposeCallback(memberName, cb));
                    adapter             = new V8Callback(plugin, callback, callbackType, disposeCallback);
                    list.Add(adapter);
                }

                return(list);
            });

            return(adapter);
        }