package fr.openwide.core.wicket.more.link.descriptor.mapper;
import org.apache.wicket.model.IModel;
import org.javatuples.Pair;
import org.javatuples.Triplet;
import com.google.common.base.Function;
import fr.openwide.core.wicket.more.link.descriptor.ILinkDescriptor;
import fr.openwide.core.wicket.more.link.descriptor.builder.state.main.common.IMappableParameterDeclarationState;
/**
* An object that can create a {@link ILinkDescriptor} using three {@link IModel}s.
* @see ILinkDescriptorMapper
* @see IMappableParameterDeclarationState#model(Class)
*/
public interface IThreeParameterLinkDescriptorMapper<L, T1, T2, T3>
extends ILinkDescriptorMapper<L, Triplet<? extends IModel<T1>, ? extends IModel<T2>, ? extends IModel<T3>>> {
/**
* {@inheritDoc}
* @deprecated Provided in order to implement {@link ILinkDescriptorMapper}. When you're using a
* {@link IThreeParameterLinkDescriptorMapper}, please use {@link #map(IModel, IModel, IModel)} instead.
*/
@Override
@Deprecated
L map(Triplet<? extends IModel<T1>, ? extends IModel<T2>, ? extends IModel<T3>> param);
/**
* Map the given models to a newly-created {@link ILinkDescriptor}.
* @see #map(Triplet)
*/
L map(IModel<T1> model1, IModel<T2> model2, IModel<T3> model3);
ITwoParameterLinkDescriptorMapper<L, T2, T3> setParameter1(final IModel<T1> model1);
ITwoParameterLinkDescriptorMapper<L, T2, T3> setParameter1(Function<Pair<T2, T3>, T1> function);
<U1 extends T1> IThreeParameterLinkDescriptorMapper<L, U1, T2, T3> castParameter1();
ITwoParameterLinkDescriptorMapper<L, T2, T3> ignoreParameter1();
ITwoParameterLinkDescriptorMapper<L, T1, T3> setParameter2(final IModel<T2> model2);
ITwoParameterLinkDescriptorMapper<L, T1, T3> setParameter2(Function<Pair<T1, T3>, T2> function);
<U2 extends T2> IThreeParameterLinkDescriptorMapper<L, T1, U2, T3> castParameter2();
ITwoParameterLinkDescriptorMapper<L, T1, T3> ignoreParameter2();
ITwoParameterLinkDescriptorMapper<L, T1, T2> setParameter3(final IModel<T3> model3);
ITwoParameterLinkDescriptorMapper<L, T1, T2> setParameter3(Function<Pair<T1, T2>, T3> function);
<U3 extends T3> IThreeParameterLinkDescriptorMapper<L, T1, T2, U3> castParameter3();
ITwoParameterLinkDescriptorMapper<L, T1, T2> ignoreParameter3();
}