Module: Libcouchbase::Callbacks::ClassMethods

Defined in:
lib/libcouchbase/callbacks.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#callback_funcsObject (readonly)

Provide accessor methods to the class level instance variables



39
40
41
# File 'lib/libcouchbase/callbacks.rb', line 39

def callback_funcs
  @callback_funcs
end

#callback_lockObject (readonly)

Provide accessor methods to the class level instance variables



39
40
41
# File 'lib/libcouchbase/callbacks.rb', line 39

def callback_lock
  @callback_lock
end

#callback_lookupObject (readonly)

Provide accessor methods to the class level instance variables



39
40
41
# File 'lib/libcouchbase/callbacks.rb', line 39

def callback_lookup
  @callback_lookup
end

Instance Method Details

#default_lookup(req, *args) ⇒ Object

This function is used to work out the instance the callback is for



43
44
45
# File 'lib/libcouchbase/callbacks.rb', line 43

def default_lookup(req, *args)
    req.address
end

#define_callback(function:, params: [:pointer, :int, :pointer], ret_val: :void, lookup: :default_lookup) ⇒ Object



23
24
25
26
27
# File 'lib/libcouchbase/callbacks.rb', line 23

def define_callback(function:, params: [:pointer, :int, :pointer], ret_val: :void, lookup: :default_lookup)
    @callback_funcs[function] = ::FFI::Function.new(ret_val, params) do |*args|
        dispatch_callback(function, lookup, args)
    end
end

#dispatch_callback(func_name, lookup, args) ⇒ Object



14
15
16
17
18
19
20
21
# File 'lib/libcouchbase/callbacks.rb', line 14

def dispatch_callback(func_name, lookup, args)
    instance_id = __send__(lookup, *args)
    inst = @callback_lookup[instance_id]
    if inst.respond_to? func_name, true
        # Wrap all callbacks in a fiber
        Fiber.new { inst.__send__(func_name, *args) }.resume
    end
end

#inherited(subclass) ⇒ Object

Much like include to support inheritance properly We keep existing callbacks and inherit the lookup (as this will never clash)



31
32
33
34
35
# File 'lib/libcouchbase/callbacks.rb', line 31

def inherited(subclass)
    subclass.instance_variable_set(:@callback_funcs, {}.merge(@callback_funcs))
    subclass.instance_variable_set(:@callback_lookup, @callback_lookup)
    subclass.instance_variable_set(:@callback_lock, @callback_lock)
end