	public void before(Method method, Object[] args, Object target) throws Throwable {
		String methodName = method.getName();
		if (methodName.startsWith("save") || methodName.startsWith("create")) {
			if (args == null || args.length == 0)
				return;
			Object mainArgument = args[0];
			if (mainArgument == null)
				return;
			Reflect reflect = new Reflect(OpenmrsObject.class);
			if (reflect.isSuperClass(mainArgument)) {
				String other = null;
				if (args.length > 1)
					other = (String) args[1];
				recursivelyHandle(SaveHandler.class, (OpenmrsObject) mainArgument, other);
			}
			else if (Reflect.isCollection(mainArgument) && isOpenmrsObjectCollection(mainArgument)) {
				String other = null;
				if (args.length > 1)
					other = (String) args[1];
				Collection<OpenmrsObject> openmrsObjects = (Collection<OpenmrsObject>) mainArgument;
				for (OpenmrsObject object : openmrsObjects) {
					recursivelyHandle(SaveHandler.class, object, other);
				}
			}
		} else if (methodName.startsWith("void")) {
			Voidable voidable = (Voidable) args[0];
			String voidReason = (String) args[1];
			recursivelyHandle(VoidHandler.class, voidable, voidReason);
		} else if (methodName.startsWith("unvoid")) {
			Voidable voidable = (Voidable) args[0];
			Date originalDateVoided = voidable.getDateVoided();
			recursivelyHandle(UnvoidHandler.class, voidable, Context.getAuthenticatedUser(), originalDateVoided, null, null);
		} else if (methodName.startsWith("retire")) {
			Retireable retirable = (Retireable) args[0];
			String retireReason = (String) args[1];
			recursivelyHandle(RetireHandler.class, retirable, retireReason);
		} else if (methodName.startsWith("unretire")) {
			Retireable retirable = (Retireable) args[0];
			Date originalDateRetired = retirable.getDateRetired();
			recursivelyHandle(UnretireHandler.class, retirable, Context.getAuthenticatedUser(), originalDateRetired, null,
			    null);
		}
	}

	public void before(Method method, Object[] args, Object target) throws Throwable {
		String methodName = method.getName();
		if (methodName.startsWith("save") || methodName.startsWith("create")) {
			if (args == null || args.length == 0)
				return;
			Object mainArgument = args[0];
			if (mainArgument == null)
				return;
			Reflect reflect = new Reflect(OpenmrsObject.class);
			if (reflect.isSuperClass(mainArgument)) {
				String other = null;
				if (args.length > 1 && args[1] instanceof String)
					other = (String) args[1];
				recursivelyHandle(SaveHandler.class, (OpenmrsObject) mainArgument, other);
			}
			else if (Reflect.isCollection(mainArgument) && isOpenmrsObjectCollection(mainArgument)) {
				String other = null;
				if (args.length > 1)
					other = (String) args[1];
				Collection<OpenmrsObject> openmrsObjects = (Collection<OpenmrsObject>) mainArgument;
				for (OpenmrsObject object : openmrsObjects) {
					recursivelyHandle(SaveHandler.class, object, other);
				}
			}
		} else if (methodName.startsWith("void")) {
			Voidable voidable = (Voidable) args[0];
			String voidReason = (String) args[1];
			recursivelyHandle(VoidHandler.class, voidable, voidReason);
		} else if (methodName.startsWith("unvoid")) {
			Voidable voidable = (Voidable) args[0];
			Date originalDateVoided = voidable.getDateVoided();
			recursivelyHandle(UnvoidHandler.class, voidable, Context.getAuthenticatedUser(), originalDateVoided, null, null);
		} else if (methodName.startsWith("retire")) {
			Retireable retirable = (Retireable) args[0];
			String retireReason = (String) args[1];
			recursivelyHandle(RetireHandler.class, retirable, retireReason);
		} else if (methodName.startsWith("unretire")) {
			Retireable retirable = (Retireable) args[0];
			Date originalDateRetired = retirable.getDateRetired();
			recursivelyHandle(UnretireHandler.class, retirable, Context.getAuthenticatedUser(), originalDateRetired, null,
			    null);
		}
	}
