package fr.openwide.core.wicket.more.link.descriptor.mapper;
import org.apache.wicket.model.IDetachable;
import org.apache.wicket.model.IModel;
import org.javatuples.Tuple;
import fr.openwide.core.wicket.more.link.descriptor.ILinkDescriptor;
import fr.openwide.core.wicket.more.link.descriptor.builder.state.main.common.IMappableParameterDeclarationState;
import fr.openwide.core.wicket.more.link.descriptor.generator.ILinkGenerator;
import fr.openwide.core.wicket.more.link.descriptor.parameter.extractor.ILinkParametersExtractor;
/**
* An object that can create a {@link ILinkDescriptor} using a parameter, generally a single {@link IModel} or a
* {@link Tuple} of {@link IModel}s.
* <p>Link descriptor mappers are mainly a way to define a link independently from the mapped models.
* This may come handy, for example when
* {@link fr.openwide.core.wicket.more.markup.repeater.table.builder.state.IAddedLabelColumnState#withLink(IOneParameterLinkDescriptorMapper)
* defining columns on a table}: mappers may allow one to make reference to the link descriptor (using a mapper)
* without a reference to the mapped models (which will only be known when building the table's rows).
* <p>Note there are also multiple-parameter link descriptor mappers: {@link ITwoParameterLinkDescriptorMapper},
* {@link IThreeParameterLinkDescriptorMapper}, ...
* @see IMappableParameterDeclarationState#model(Class)
*/
public interface ILinkDescriptorMapper<L, P> extends IDetachable {
/**
* Map the given model to a newly-created {@link ILinkDescriptor} (or {@link ILinkGenerator}, or
* {@link ILinkParametersExtractor}, depending on the generic type parameter {@link L}).
* <p>The given model will be used in the {@link ILinkDescriptor} as a sink for
* {@link ILinkParametersExtractor#extract(org.apache.wicket.request.mapper.parameter.PageParameters) parameter
* extraction} and as a parameter source for {@link ILinkGenerator#url() link generation}
* @param param The model(s) to be mapped in the resulting {@link ILinkDescriptor}. Depending on the sub-interface,
* this may be either directly a model (for {@link IOneParameterLinkDescriptorMapper}) or a tuple of models (for
* others, such as {@link ITwoParameterLinkDescriptorMapper} or {@link IThreeParameterLinkDescriptorMapper}).
* @return The resulting {@link ILinkDescriptor}.
*/
L map(P param);
}