package org.nutz.trans;

/**
 * Atom接口的另外一种变种实现
 * @author wendal(wendal1985@gmail.com)
 *
 * @param <T> 返回值的类型
 */
public abstract class Proton<T> implements Atom {

    private T obj;
    
    /**
     * 通常在匿名内部类中初始化
     */
    public Proton() {}

    /**
     * exec方法的返回值
     * @return 方法返回值
     */
    public T get() {
        return obj;
    }

    /**
     * 用户代码的开始
     */
    public void run() {
        obj = exec();
    }
    
    public T invoke() {
        this.run();
        return this.get();
    }

    /**
     * 需要子类实现的逻辑
     * @return 方法返回值
     */
    protected abstract T exec();

}
