/*
 * Watch for changes to object variables. Usage:
 *
 *   # Watch for changes to all variables on all objects.
 *
 *   world.watch_class { |obj,var| ... }
 *
 *   # Watch for all changes to objects in a particular class.
 *
 *   world.watch_class('classname') { |obj,var| ... }
 *   
 *   # Watch for changes to a particular variable in a particular class.
 *
 *   world.watch_class('classname', 'varname') { |obj,var| ... }	
 *
 * Returns a Callback object representing the callback.
 */

static VALUE world_watch_class(int argc, VALUE *argv, VALUE self)
{
	IrmoWorld *world = unwrap_world(self);
	IrmoCallback *callback;
	char *classname, *varname;
	VALUE proc = BLOCK_PROC();

	classname = varname = NULL;

	if (argc >= 1)
		classname = STR2CSTR(argv[0]);
	if (argc >= 2)
		varname = STR2CSTR(argv[1]);
	if (argc >= 3)
		rb_raise(rb_eNameError, "too many arguments to method");

	callback = irmo_world_watch_class(world, classname, varname, 
					     (IrmoVarCallback) rb_irmo_var_callback,
					     (void *) proc);
	
	return wrap_callback(callback, proc);
}