/*
 * Watch for method calls to the world. Usage:
 *
 *   world.watch_method('methodname') { |arg1,arg2| ... }
 *
 * Returns a Callback object representing the callback.
 */

static VALUE world_watch_method(VALUE self, VALUE method_name)
{
	IrmoInterfaceSpec *spec;
	IrmoWorld *world = unwrap_world(self);
	IrmoMethod *method;
	char *c_method_name = STR2CSTR(method_name);
	VALUE proc;
	VALUE method_call_data;
	IrmoCallback *callback;

	spec = irmo_world_get_spec(world);
	
	method = irmo_interface_spec_get_method(spec, c_method_name);

	if (!method)
		rb_raise(rb_eNameError, "unknown method %s", c_method_name);

	proc = BLOCK_PROC();

	method_call_data = rb_ary_new3(2, proc, wrap_method(method));

	callback = irmo_world_method_watch(world, c_method_name,
					      (IrmoInvokeCallback) rb_irmo_invoke_callback,
					      (void *) method_call_data);

	return wrap_callback(callback, method_call_data);
}