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


        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;
    }