package fr.openwide.core.wicket.more.link.descriptor.mapper;
import org.apache.wicket.model.IModel;
import org.javatuples.Pair;
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 two {@link IModel}s.
* @see ILinkDescriptorMapper
* @see IMappableParameterDeclarationState#model(Class)
*/
public interface ITwoParameterLinkDescriptorMapper<L, T1, T2>
extends ILinkDescriptorMapper<L, Pair<? extends IModel<T1>, ? extends IModel<T2>>> {
/**
* {@inheritDoc}
* @deprecated Provided in order to implement {@link ILinkDescriptorMapper}. When you're using a
* {@link ITwoParameterLinkDescriptorMapper}, please use {@link #map(IModel, IModel)} instead.
*/
@Override
@Deprecated
L map(Pair<? extends IModel<T1>, ? extends IModel<T2>> param);
/**
* Map the given models to a newly-created {@link ILinkDescriptor}.
* @see #map(Pair)
*/
L map(IModel<T1> model1, IModel<T2> model2);
IOneParameterLinkDescriptorMapper<L, T2> setParameter1(final IModel<T1> model1);
IOneParameterLinkDescriptorMapper<L, T2> setParameter1(Function<T2, T1> function);
<U1 extends T1> ITwoParameterLinkDescriptorMapper<L, U1, T2> castParameter1();
IOneParameterLinkDescriptorMapper<L, T2> ignoreParameter1();
IOneParameterLinkDescriptorMapper<L, T1> setParameter2(final IModel<T2> model2);
IOneParameterLinkDescriptorMapper<L, T1> setParameter2(Function<T1, T2> function);
<U2 extends T2> ITwoParameterLinkDescriptorMapper<L, T1, U2> castParameter2();
IOneParameterLinkDescriptorMapper<L, T1> ignoreParameter2();
}