private boolean callInitMethods(final Plugin spawnedPlugin, final Method[] methods)
	        throws IllegalAccessException {
		log("callinit/start", new OptionInfo("plugin", spawnedPlugin.getClass().getCanonicalName()));


		for (final Method method : methods) {
			log("callinit/method", new OptionInfo("method", method.getName()));

			// Init methods will be marked by the corresponding annotation.
			final Init annotation = method.getAnnotation(Init.class);
			if (annotation != null) {
				log("callinit/method/initannotation", new OptionInfo("method", method.getName()));

				try {
					final Object invoke = method.invoke(spawnedPlugin, new Object[0]);
					if (invoke != null && invoke instanceof Boolean) {
						// Check if any init method returns false.
						if (((Boolean) invoke).booleanValue() == false)
							return false;
					}
				} catch (final IllegalArgumentException e) {
					log("callinit/exception/illegalargument",
					        new OptionInfo("method", method.getName()),
					        new OptionInfo("message", e.getMessage()));
					log("callinit/end/abnormal", new OptionInfo("plugin", spawnedPlugin.getClass()
					        .getCanonicalName()));
					e.printStackTrace();
					return false;
				} catch (final InvocationTargetException e) {
					log("callinit/exception/invocationtargetexception", new OptionInfo("method",
					        method.getName()), new OptionInfo("message", e.getMessage()));
					log("callinit/end/abnormal", new OptionInfo("plugin", spawnedPlugin.getClass()
					        .getCanonicalName()));
					e.printStackTrace();
					return false;
				} catch (final Exception e) {
					log("callinit/exception/exception", new OptionInfo("method", method.getName()),
					        new OptionInfo("message", e.getMessage()));
					log("callinit/end/abnormal", new OptionInfo("plugin", spawnedPlugin.getClass()
					        .getCanonicalName()));
					e.printStackTrace();
					return false;
				}
			}
		}

		log("callinit/end", new OptionInfo("plugin", spawnedPlugin.getClass().getCanonicalName()));
		return true;
	}