package org.nutz.ioc.java;
import org.nutz.ioc.IocMaking;
import org.nutz.lang.Lang;
public abstract class ChainNode {
private ChainNode next;
public void setNext(ChainNode next) {
this.next = next;
}
protected abstract Object getValue(IocMaking ing, Object obj) throws Exception;
protected abstract String asString();
public Object eval(IocMaking ing) {
return eval(ing, null);
}
private Object eval(IocMaking ing, Object obj) {
try {
Object v = getValue(ing, obj);
if (null == next)
return v;
return next.eval(ing, v);
}
catch (Exception e) {
throw Lang.wrapThrow(e);
}
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder(asString());
if (null != next)
sb.append('.').append(next.toString());
return sb.toString();
}
}