001package com.ericlam.mc.eldgui;
002
003import com.ericlam.mc.eldgui.component.ComponentFactory;
004import com.ericlam.mc.eldgui.exception.ExceptionViewHandler;
005import com.ericlam.mc.eldgui.middleware.MiddleWare;
006import com.ericlam.mc.eldgui.view.LoadingView;
007import org.bukkit.event.inventory.InventoryInteractEvent;
008
009import java.lang.annotation.Annotation;
010import java.util.List;
011
012/**
013 * ELDependenci-MVC 安裝器
014 */
015public interface MVCInstallation {
016
017    /**
018     * 安裝界面互動事件自定義過濾
019     *
020     * @param qualifier 指定的標注
021     * @param predicate 指定自定義過濾
022     * @param <A>       標注類
023     */
024    <A extends Annotation> void registerQualifier(Class<A> qualifier, QualifierFilter<A> predicate);
025
026    <A extends Annotation, M extends MiddleWare<A>> void registerMiddleWare(Class<A> qualifier, Class<M> middleWareClass);
027
028    /**
029     * 安裝 controllers (控制器)
030     *
031     * @param controllers controllers
032     */
033    void registerControllers(Class<?>... controllers);
034
035    /**
036     * 新增自定義異常處理器
037     *
038     * @param exceptionHandlers 異常處理器
039     */
040    void addExceptionViewHandlers(List<Class<? extends ExceptionViewHandler>> exceptionHandlers);
041
042    /**
043     * 設置全局異常處理器
044     * @param exceptionHandler 異常處理器
045     */
046    void setGlobalExceptionHandler(Class<? extends ExceptionViewHandler> exceptionHandler);
047
048    /**
049     * 設置全局異步加載界面
050     * @param loadingView 異步加載界面
051     */
052    void setGlobalLoadingView(Class<? extends LoadingView> loadingView);
053
054    /**
055     * 新增自定義組件工廠
056     * @param factory 組件類,必須爲 interface
057     * @param implement 組件實作類
058     * @param <T> 組件工廠類
059     * @param <E> 組件工廠實作類
060     */
061    <T extends ComponentFactory<T>, E extends T> void addComponentFactory(Class<T> factory, Class<E> implement);
062
063    @FunctionalInterface
064    interface QualifierFilter<A extends Annotation> {
065        boolean checkIsPass(InventoryInteractEvent interactEvent, char pattern, A annotation);
066    }
067
068}