final Object[] result = {null};  if (!getObjectType(obj).hasKey()) { return getProperties(obj).get(prop); }  prop.dispatch(new Property.Switch() { public void onRole(Role role) { PropertyData pd = fetchPropertyData(obj, role); result[0] = pd.get(); }  public void onAlias(Alias alias) { result[0] = get(obj, alias.getTarget()); }  public void onLink(Link link) { throw new Error("Not implemented yet"); } });  if (LOG.isDebugEnabled()) { untrace("get", result[0]); }  return result[0];
    Object get(Object start, Path path) {        if (path.getParent() == null) {            return get(start,                       getObjectType(start).getProperty(path.getName()));        } else {            Object value = get(start, path.getParent());            return get(value,                       getObjectType(value).getProperty(path.getName()));        }    }