class ServientConfig {

    static ProtocolServer initializeServer(Config config,
                                           String serverName) throws ServientConfigException {
        try {
            Class<ProtocolServer> serverKlass = (Class<ProtocolServer>) Class.forName(serverName);
            Constructor<ProtocolServer> constructor;
            ProtocolServer server;
            if (hasConstructor(serverKlass, Config.class)) {
                constructor = serverKlass.getConstructor(Config.class);
                server = constructor.newInstance(config);
            }
            else {
                constructor = serverKlass.getConstructor();
                server = constructor.newInstance();
            }
            return server;
        }
        catch (ClassCastException | ClassNotFoundException | NoSuchMethodException | InstantiationException | IllegalAccessException | InvocationTargetException e) {
            throw new ServientConfigException(e);
        }
    }

      ServientConfig(List<ProtocolServer> servers,
                   Map<String, ProtocolClientFactory> clientFactories,
                   Map<String, Object> credentialStore);
    public  ServientConfig(Config config);

}