AbstractDefinedFunctor.java

package autumn.lang.internals;

import autumn.lang.DefinedFunctor;
import autumn.lang.TypedFunctor;
import autumn.util.F;
import com.google.common.base.Preconditions;
import com.google.common.collect.Lists;
import java.util.List;

/**
 * This class provides a partial implementation of the DefinedFunctor interface.
 *
 * @author Mackenzie High
 */
public abstract class AbstractDefinedFunctor
        extends AbstractTypedFunctor
        implements DefinedFunctor
{
    private final TypedFunctor inner;

    /**
     * Sole Constructor.
     *
     * @param inner is the inner() functor.
     * @throws NullPointerException.
     */
    public AbstractDefinedFunctor(final TypedFunctor inner)
    {
        Preconditions.checkNotNull(inner);

        this.inner = inner;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public final TypedFunctor inner()
    {
        return inner;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public final void apply(ArgumentStack stack)
            throws Throwable
    {
        inner().apply(stack);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public final String toString()
    {
        final StringBuilder string = new StringBuilder();

        final List<String> params = Lists.newLinkedList();

        for (Class param : parameterTypes())
        {
            params.add(param.getSimpleName());
        }

        string.append("functor ");
        string.append(F.str(params, "(", ", ", ")"));
        string.append(" : ");
        string.append(returnType().getSimpleName());

        return string.toString();
    }
}