/*
 * @author Ranides Atterwim <ranides@gmail.com>
 * @copyright Ranides Atterwim
 * @license WTFPL
 * @url http://ranides.net/projects/assira
 */

package net.ranides.assira.reflection;

import java.util.List;
import java.util.concurrent.Callable;

/**
 *
 * @author Mariusz Sieron <m.sieron@samsung.com>
 */
public interface GenericMethod<R> extends Callable<R>, Runnable {
    
    String name();

    GenericClass type();
    
    List<GenericParam> params();
    
    int paramsize();
    
    GenericMethod<R> bind(Object that);
    
    // @todo (prev # 5) zrobić klasę MethodCall, parametry in builder-like style
    
    @Override
    void run();
    
    @Override
    R call();
    
    R call(Object... arguments);
    
    R invoke(Object that, Object... arguments);
    
    boolean canCall(Object... arguments);
    
    boolean canInvoke(Object that, Object... arguments);
    
    @Override
    String toString();
    
}
