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

import java.lang.invoke.MethodHandle;
import java.lang.reflect.Field;
import net.ranides.assira.generic.Wrapper;
import net.ranides.assira.reflection.impl.FField;

/**
 *
 * @author Ranides Atterwim <ranides@gmail.com>
 */
public interface IField extends IElement {
    
    static IField typeinfo(Field field) {
        return FField.newField(IContext.DEFAULT, field);
    }
    
    @Override
    IFields collect();
    
    IClass<?> type();
    
    @Override
    IClass<?> parent();
    
    Object get(Object that);
    
    void set(Object that, Object value);
    
    Object replace(Object that, Object value);
    
    Wrapper<Object> bind(Object that);
    
    Field reflective();
    
    MethodHandle getter();
    
    MethodHandle setter();
    
}
