/**
 * Copyright (C) the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package ninja;

import ninja.ControllerMethods.ControllerMethod;
import ninja.ControllerMethods.ControllerMethod0;
import ninja.ControllerMethods.ControllerMethod1;
import ninja.ControllerMethods.ControllerMethod10;
import ninja.ControllerMethods.ControllerMethod2;
import ninja.ControllerMethods.ControllerMethod3;
import ninja.ControllerMethods.ControllerMethod4;
import ninja.ControllerMethods.ControllerMethod5;
import ninja.ControllerMethods.ControllerMethod6;
import ninja.ControllerMethods.ControllerMethod7;
import ninja.ControllerMethods.ControllerMethod8;
import ninja.ControllerMethods.ControllerMethod9;

/**
 * Interface that exposes multiple with methods that accept a large number of
 * various argument combinations.
 * @param <T> The result to return
 */
public interface WithControllerMethod<T> {
    
    T with(ControllerMethod controllerMethod);
    
    default T with(ControllerMethod0 controllerMethod) {
        return with((ControllerMethod)controllerMethod);
    }
    
    default <A> T with(ControllerMethod1<A> controllerMethod) {
        return with((ControllerMethod)controllerMethod);
    }
    
    default <A,B> T with(ControllerMethod2<A,B> controllerMethod) {
        return with((ControllerMethod)controllerMethod);
    }
    
    default <A,B,C> T with(ControllerMethod3<A,B,C> controllerMethod) {
        return with((ControllerMethod)controllerMethod);
    }
    
    default <A,B,C,D> T with(ControllerMethod4<A,B,C,D> controllerMethod) {
        return with((ControllerMethod)controllerMethod);
    }
    
    default <A,B,C,D,E> T with(ControllerMethod5<A,B,C,D,E> controllerMethod) {
        return with((ControllerMethod)controllerMethod);
    }
    
    default <A,B,C,D,E,F> T with(ControllerMethod6<A,B,C,D,E,F> controllerMethod) {
        return with((ControllerMethod)controllerMethod);
    }
    
    default <A,B,C,D,E,F,G> T with(ControllerMethod7<A,B,C,D,E,F,G> controllerMethod) {
        return with((ControllerMethod)controllerMethod);
    }
    
    default <A,B,C,D,E,F,G,H> T with(ControllerMethod8<A,B,C,D,E,F,G,H> controllerMethod) {
        return with((ControllerMethod)controllerMethod);
    }
    
    default <A,B,C,D,E,F,G,H,I> T with(ControllerMethod9<A,B,C,D,E,F,G,H,I> controllerMethod) {
        return with((ControllerMethod)controllerMethod);
    }
    
    default <A,B,C,D,E,F,G,H,I,J> T with(ControllerMethod10<A,B,C,D,E,F,G,H,I,J> controllerMethod) {
        return with((ControllerMethod)controllerMethod);
    }
    
}
