class MetaDispatcher<Session extends BackendSession> {

    protected final Map<String, MetaHandler<Session>> metaHandlers;

    public MetaDispatcher() {
        this.metaHandlers = new ConcurrentHashMap<>();
    }

    public void registerMetaHandler(String meta, MetaHandler<Session> handler) {
        this.metaHandlers.put(meta, handler);
    }

    @SuppressWarnings("unchecked")
    public <R> R dispatchMetaHandler(Session session,
                                     String meta, Object[] args) {<FILL_FUNCTION_BODY>}
}

        if (!this.metaHandlers.containsKey(meta)) {
            throw new NotSupportException("metadata '%s'", meta);
        }
        return (R) this.metaHandlers.get(meta).handle(session, meta, args);
    
<no_super_class>