from cpython cimport PyObject

cdef extern from "callbacks.h":
    cdef cppclass callback_test:
        PyObject *object_ptr 
    cdef cppclass caller:
        void set_callback(callback_test *)
        void say_hello(int i)

cdef class Callback:
    cdef callback_test *obj
    def __cinit__(self):
        self.obj = new callback_test()
        self.obj.object_ptr = <PyObject *>self

    def __dealloc__(self):
        del self.obj

cdef class Caller:
    cdef caller *obj
    cdef Callback pycallback
    def __cinit__(self):
        self.obj = new caller()

    def __dealloc__(self):
        del self.obj

    def set_callback(self, Callback cb):
        self.pycallback = cb
        self.obj.set_callback(cb.obj)

    def say_hello(self, int i):
        if self.pycallback is not None:
            self.obj.say_hello(i)

cdef public void callback_test_hello(object object_ptr, int i):
    cb = <Callback>object_ptr
    cb.hello(i)
