Index: trunk/src/ws/fugue88/jpath/Accessor.java
===================================================================
--- trunk/src/ws/fugue88/jpath/Accessor.java	(revision 5)
+++ 	(revision )
@@ -1,24 +1,0 @@
-/*
- * Created on Aug 2, 2005
- * 
- * $Log$
- * Revision 1.1  2005/08/03 00:35:29  dsowen
- * Initial commit.
- *
- */
-package ws.fugue88.jpath;
-
-import java.lang.reflect.InvocationTargetException;
-
-/**
- * @author dsowen
- */
-public interface Accessor {
-
-	public abstract Class getType();
-
-	public abstract Object getValue() throws InvocationTargetException;
-
-	public abstract void setValue(final Object value)
-			throws InvocationTargetException;
-}
Index: trunk/src/ws/fugue88/jpath/BrokenGraphException.java
===================================================================
--- trunk/src/ws/fugue88/jpath/BrokenGraphException.java	(revision 5)
+++ trunk/src/ws/fugue88/jpath/BrokenGraphException.java	(revision 6)
@@ -3,4 +3,8 @@
  * 
  * $Log$
+ * Revision 1.2  2005/09/21 22:00:45  dsowen
+ * Split out the access stuff into accesslib.
+ * New Creator interface off-loads object creation to user.
+ *
  * Revision 1.1  2005/08/12 19:01:46  dsowen
  * Feature: can automatically fill missing parts of a graph.
@@ -14,3 +18,19 @@
 public class BrokenGraphException extends Exception {
 
+	public BrokenGraphException(final Context context, final Path path,
+			final Object parent, final PathPart child)
+	{
+		super("Graph broken for path '" + child + "' on object {" + parent
+				+ "}, accessed from context " + context + " at '" + path + "'.");
+
+		_context = context;
+		_path = path;
+		_parent = parent;
+		_child = child;
+	}
+
+	private final Context _context;
+	private final Path _path;
+	private final Object _parent;
+	private final PathPart _child;
 }
Index: trunk/src/ws/fugue88/jpath/Context.java
===================================================================
--- trunk/src/ws/fugue88/jpath/Context.java	(revision 5)
+++ trunk/src/ws/fugue88/jpath/Context.java	(revision 6)
@@ -3,4 +3,8 @@
  *
  * $Log$
+ * Revision 1.4  2005/09/21 22:00:45  dsowen
+ * Split out the access stuff into accesslib.
+ * New Creator interface off-loads object creation to user.
+ *
  * Revision 1.3  2005/08/19 17:51:17  dsowen
  * Fixed: NPEs when using accessors from paths, &c.  Included tests.
@@ -28,4 +32,8 @@
 import java.util.Map;
 
+import ws.fugue88.access.Accessor;
+import ws.fugue88.access.ListAccessor;
+import ws.fugue88.access.MapAccessor;
+
 /**
  * @author dsowen
@@ -40,15 +48,16 @@
 		Context current = this;
 		for(Iterator i = path.parents().iterator(); i.hasNext();) {
-			Accessor accessor = current.getTargetAccessor((PathPart)i.next());
+			final PathPart part = (PathPart)i.next();
+			Accessor accessor = current.getTargetAccessor(part);
 			Object obj = accessor.getValue();
-			if(obj == null) {
-				if(_modifying) {
-					obj = createBlank(accessor.getType());
-					accessor.setValue(obj);
-				} else {
-					throw new BrokenGraphException();
-				}
-			}
-			current = new Context(obj, _binder, _modifying);
+			if(obj == null)
+					obj = _creator.create(accessor.getType(), current._root,
+							part);
+			if(obj == null)
+					throw new BrokenGraphException(this, path, current._root,
+							part);
+
+			accessor.setValue(obj);
+			current = new Context(obj, _binder, _creator);
 		}
 		return current.getTargetAccessor(path.terminal());
@@ -71,5 +80,5 @@
 	{
 		Object child = getTarget(path);
-		return new Context(child, _binder, _modifying);
+		return new Context(child, _binder, _creator);
 	}
 
@@ -79,13 +88,14 @@
 	}
 
-	Context(final Object root, final Binder binder, final boolean modifying)
+	Context(final Object root, final Binder binder, final GraphCreator creator)
 	{
 		// NPEs
 		root.getClass();
 		binder.getClass();
+		creator.getClass();
 
 		_root = root;
 		_binder = binder;
-		_modifying = modifying;
+		_creator = creator;
 	}
 
@@ -127,4 +137,4 @@
 	private final Object _root;
 	private final Binder _binder;
-	private final boolean _modifying;
+	private final GraphCreator _creator;
 }
Index: trunk/src/ws/fugue88/jpath/ContextFactory.java
===================================================================
--- trunk/src/ws/fugue88/jpath/ContextFactory.java	(revision 5)
+++ trunk/src/ws/fugue88/jpath/ContextFactory.java	(revision 6)
@@ -3,4 +3,8 @@
  * 
  * $Log$
+ * Revision 1.3  2005/09/21 22:00:45  dsowen
+ * Split out the access stuff into accesslib.
+ * New Creator interface off-loads object creation to user.
+ *
  * Revision 1.2  2005/08/12 19:01:46  dsowen
  * Feature: can automatically fill missing parts of a graph.
@@ -17,12 +21,7 @@
 public class ContextFactory {
 
-	public Context createContext(final Object root)
+	public Context createContext(final Object root, final GraphCreator creator)
 	{
-		return new Context(root, _binder, false);
-	}
-
-	public Context createModifyingContext(final Object root)
-	{
-		return new Context(root, _binder, true);
+		return new Context(root, _binder, creator);
 	}
 
Index: trunk/src/ws/fugue88/jpath/DefaultCreator.java
===================================================================
--- trunk/src/ws/fugue88/jpath/DefaultCreator.java	(revision 6)
+++ trunk/src/ws/fugue88/jpath/DefaultCreator.java	(revision 6)
@@ -0,0 +1,33 @@
+/*
+ * Created on Sep 20, 2005
+ * 
+ * $Log$
+ * Revision 1.1  2005/09/21 22:00:45  dsowen
+ * Split out the access stuff into accesslib.
+ * New Creator interface off-loads object creation to user.
+ *
+ */
+package ws.fugue88.jpath;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+
+/**
+ * @author dsowen
+ */
+public class DefaultCreator implements GraphCreator {
+
+	public Object create(final Class type, final Object root,
+			final PathPart part) throws IllegalAccessException,
+			InstantiationException, InvocationTargetException
+	{
+		try {
+			final Constructor ctor = type.getDeclaredConstructor(null);
+			ctor.setAccessible(true);
+			return ctor.newInstance(null);
+		} catch(NoSuchMethodException e) {
+			throw new InstantiationException("Class " + type.getName()
+					+ " must have a no-argument constructor.");
+		}
+	}
+}
Index: trunk/src/ws/fugue88/jpath/GraphCreator.java
===================================================================
--- trunk/src/ws/fugue88/jpath/GraphCreator.java	(revision 6)
+++ trunk/src/ws/fugue88/jpath/GraphCreator.java	(revision 6)
@@ -0,0 +1,25 @@
+/*
+ * Created on Sep 20, 2005
+ * 
+ * $Log$
+ * Revision 1.1  2005/09/21 22:00:45  dsowen
+ * Split out the access stuff into accesslib.
+ * New Creator interface off-loads object creation to user.
+ *
+ */
+package ws.fugue88.jpath;
+
+import java.lang.reflect.InvocationTargetException;
+
+/**
+ * @author dsowen
+ */
+public interface GraphCreator {
+
+	public Object create(final Class type, final Object root,
+			final PathPart part) throws IllegalAccessException,
+			InstantiationException, InvocationTargetException;
+
+	public static final GraphCreator NULL = new NullCreator();
+	public static final GraphCreator DEFAULT = new DefaultCreator();
+}
Index: trunk/src/ws/fugue88/jpath/Identifier.java
===================================================================
--- trunk/src/ws/fugue88/jpath/Identifier.java	(revision 5)
+++ trunk/src/ws/fugue88/jpath/Identifier.java	(revision 6)
@@ -3,4 +3,8 @@
  * 
  * $Log$
+ * Revision 1.2  2005/09/21 22:00:46  dsowen
+ * Split out the access stuff into accesslib.
+ * New Creator interface off-loads object creation to user.
+ *
  * Revision 1.1  2005/08/03 00:35:29  dsowen
  * Initial commit.
@@ -24,4 +28,9 @@
 	}
 
+	public String toString()
+	{
+		return "/" + _name;
+	}
+
 	private final String _name;
 }
Index: trunk/src/ws/fugue88/jpath/ListAccessor.java
===================================================================
--- trunk/src/ws/fugue88/jpath/ListAccessor.java	(revision 5)
+++ 	(revision )
@@ -1,42 +1,0 @@
-/*
- * Created on Aug 2, 2005
- * 
- * $Log$
- * Revision 1.1  2005/08/03 00:35:29  dsowen
- * Initial commit.
- *
- */
-package ws.fugue88.jpath;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.List;
-
-/**
- * @author dsowen
- */
-public class ListAccessor implements Accessor {
-
-	public Class getType()
-	{
-		throw new UnsupportedOperationException();
-	}
-
-	public Object getValue() throws InvocationTargetException
-	{
-		return _idx >= _list.size() ? null : _list.get(_idx);
-	}
-
-	public void setValue(final Object value) throws InvocationTargetException
-	{
-		_list.set(_idx, value);
-	}
-
-	ListAccessor(final List list, final int idx)
-	{
-		_list = list;
-		_idx = idx;
-	}
-
-	private final List _list;
-	private final int _idx;
-}
Index: trunk/src/ws/fugue88/jpath/MapAccessor.java
===================================================================
--- trunk/src/ws/fugue88/jpath/MapAccessor.java	(revision 5)
+++ 	(revision )
@@ -1,42 +1,0 @@
-/*
- * Created on Aug 2, 2005
- * 
- * $Log$
- * Revision 1.1  2005/08/03 00:35:29  dsowen
- * Initial commit.
- *
- */
-package ws.fugue88.jpath;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.Map;
-
-/**
- * @author dsowen
- */
-public class MapAccessor implements Accessor {
-
-	public Class getType()
-	{
-		return _map.get(_key) == null ? null : _map.get(_key).getClass();
-	}
-
-	public Object getValue() throws InvocationTargetException
-	{
-		return _map.get(_key);
-	}
-
-	public void setValue(final Object value) throws InvocationTargetException
-	{
-		_map.put(_key, value);
-	}
-
-	MapAccessor(final Map map, final Object key)
-	{
-		_map = map;
-		_key = key;
-	}
-
-	private final Map _map;
-	private final Object _key;
-}
Index: trunk/src/ws/fugue88/jpath/NullCreator.java
===================================================================
--- trunk/src/ws/fugue88/jpath/NullCreator.java	(revision 6)
+++ trunk/src/ws/fugue88/jpath/NullCreator.java	(revision 6)
@@ -0,0 +1,22 @@
+/*
+ * Created on Sep 20, 2005
+ * 
+ * $Log$
+ * Revision 1.1  2005/09/21 22:00:46  dsowen
+ * Split out the access stuff into accesslib.
+ * New Creator interface off-loads object creation to user.
+ *
+ */
+package ws.fugue88.jpath;
+
+/**
+ * @author dsowen
+ */
+public class NullCreator implements GraphCreator {
+
+	public Object create(final Class type, final Object root,
+			final PathPart part)
+	{
+		return null;
+	}
+}
Index: trunk/src/ws/fugue88/jpath/NumberSelector.java
===================================================================
--- trunk/src/ws/fugue88/jpath/NumberSelector.java	(revision 5)
+++ trunk/src/ws/fugue88/jpath/NumberSelector.java	(revision 6)
@@ -3,4 +3,8 @@
  * 
  * $Log$
+ * Revision 1.2  2005/09/21 22:00:45  dsowen
+ * Split out the access stuff into accesslib.
+ * New Creator interface off-loads object creation to user.
+ *
  * Revision 1.1  2005/08/03 00:35:29  dsowen
  * Initial commit.
@@ -29,4 +33,9 @@
 	}
 
+	public String toString()
+	{
+		return "[" + _number + "]";
+	}
+
 	private final Integer _number;
 }
Index: trunk/src/ws/fugue88/jpath/Path.java
===================================================================
--- trunk/src/ws/fugue88/jpath/Path.java	(revision 5)
+++ trunk/src/ws/fugue88/jpath/Path.java	(revision 6)
@@ -3,4 +3,8 @@
  *
  * $Log$
+ * Revision 1.3  2005/09/21 22:00:45  dsowen
+ * Split out the access stuff into accesslib.
+ * New Creator interface off-loads object creation to user.
+ *
  * Revision 1.2  2005/08/19 17:51:17  dsowen
  * Fixed: NPEs when using accessors from paths, &c.  Included tests.
@@ -16,12 +20,7 @@
 package ws.fugue88.jpath;
 
-import java.nio.CharBuffer;
-import java.text.ParseException;
 import java.util.Collections;
 import java.util.Iterator;
-import java.util.LinkedList;
 import java.util.List;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
 
 /**
@@ -30,37 +29,7 @@
 public class Path {
 
-	public static String quote(final String s)
+	Path(final List parts)
 	{
-		return s.replaceAll("'", "\\\\'");
-	}
-
-	public static String unquote(final String s)
-	{
-		return s.replaceAll("\\\\'", "'");
-	}
-
-	public Path(final String path) throws ParseException
-	{
-		_parts = new LinkedList();
-
-		CharSequence buff = CharBuffer.wrap(path);
-		do {
-			Matcher m;
-			final PathPart pp;
-			if((m = IDENT.matcher(buff)).find()) {
-				pp = new Identifier(m.group(1));
-			} else if((m = NUM_SEL.matcher(buff)).find()) {
-				pp = new NumberSelector(m.group(1));
-			} else if((m = STR_SEL.matcher(buff)).find()) {
-				pp = new StringSelector(unquote(m.group(1)));
-			} else {
-				throw new ParseException(
-						"Expected identifier or selector, found '"
-								+ (buff.length() > 40 ? buff.subSequence(0, 37)
-										+ "..." : buff) + "'.", -1);
-			}
-			_parts.add(pp);
-			buff = buff.subSequence(m.end(), buff.length());
-		} while(buff.length() > 0);
+		_parts = parts;
 	}
 
@@ -68,4 +37,14 @@
 	{
 		return new Path(_parts.subList(0, _parts.size() - 1));
+	}
+
+	public Path children()
+	{
+		return new Path(_parts.subList(1, _parts.size()));
+	}
+
+	public PathPart head()
+	{
+		return (PathPart)_parts.get(0);
 	}
 
@@ -80,22 +59,18 @@
 	}
 
-	protected Path(final List list)
+	public boolean isEmpty()
 	{
-		_parts = list;
+		return _parts.isEmpty();
+	}
+
+	public String toString()
+	{
+		final StringBuffer buff = new StringBuffer();
+		for(final Iterator i = _parts.iterator(); i.hasNext();) {
+			buff.append(i.next());
+		}
+		return buff.toString();
 	}
 
 	private final List _parts;
-
-	private static final String IDENT_START = "A-Za-z_";
-	private static final String IDENT_END = IDENT_START + "0-9";
-	private static final Pattern IDENT = Pattern.compile("^/([" + IDENT_START
-			+ "][" + IDENT_END + "]*)");
-
-	private static final String NUM_LIT = "-?[0-9]+";
-	private static final Pattern NUM_SEL = Pattern.compile("^\\[(" + NUM_LIT
-			+ ")\\]");
-
-	private static final String STR_LIT = "'((?:[^']|\\\\')*)'";
-	private static final Pattern STR_SEL = Pattern.compile("^\\[" + STR_LIT
-			+ "\\]");
 }
Index: trunk/src/ws/fugue88/jpath/PathParser.java
===================================================================
--- trunk/src/ws/fugue88/jpath/PathParser.java	(revision 6)
+++ trunk/src/ws/fugue88/jpath/PathParser.java	(revision 6)
@@ -0,0 +1,30 @@
+/*
+ * Created on Aug 31, 2005
+ * 
+ * $Log$
+ * Revision 1.1  2005/09/21 22:00:45  dsowen
+ * Split out the access stuff into accesslib.
+ * New Creator interface off-loads object creation to user.
+ *
+ */
+package ws.fugue88.jpath;
+
+import java.text.ParseException;
+
+/**
+ * @author dsowen
+ */
+public abstract class PathParser {
+
+	public static String quote(final String s)
+	{
+		return s.replaceAll("'", "\\\\'");
+	}
+
+	public static String unquote(final String s)
+	{
+		return s.replaceAll("\\\\'", "'");
+	}
+
+	public abstract Path parse(final String path) throws ParseException;
+}
Index: trunk/src/ws/fugue88/jpath/PathPart.java
===================================================================
--- trunk/src/ws/fugue88/jpath/PathPart.java	(revision 5)
+++ trunk/src/ws/fugue88/jpath/PathPart.java	(revision 6)
@@ -3,4 +3,8 @@
  * 
  * $Log$
+ * Revision 1.2  2005/09/21 22:00:45  dsowen
+ * Split out the access stuff into accesslib.
+ * New Creator interface off-loads object creation to user.
+ *
  * Revision 1.1  2005/08/03 00:35:29  dsowen
  * Initial commit.
@@ -12,4 +16,6 @@
  * @author dsowen
  */
-public class PathPart {
+public abstract class PathPart {
+
+	public abstract String toString();
 }
Index: trunk/src/ws/fugue88/jpath/PropertyAccessor.java
===================================================================
--- trunk/src/ws/fugue88/jpath/PropertyAccessor.java	(revision 5)
+++ trunk/src/ws/fugue88/jpath/PropertyAccessor.java	(revision 6)
@@ -3,4 +3,8 @@
  * 
  * $Log$
+ * Revision 1.2  2005/09/21 22:00:45  dsowen
+ * Split out the access stuff into accesslib.
+ * New Creator interface off-loads object creation to user.
+ *
  * Revision 1.1  2005/08/03 00:35:29  dsowen
  * Initial commit.
@@ -10,4 +14,6 @@
 
 import java.lang.reflect.InvocationTargetException;
+
+import ws.fugue88.access.Accessor;
 
 /**
@@ -19,4 +25,9 @@
 	{
 		return _prop.getType();
+	}
+
+	public void clearValue() throws InvocationTargetException
+	{
+		_prop.setValue(_that, null);
 	}
 
Index: trunk/src/ws/fugue88/jpath/SimplePathParser.java
===================================================================
--- trunk/src/ws/fugue88/jpath/SimplePathParser.java	(revision 6)
+++ trunk/src/ws/fugue88/jpath/SimplePathParser.java	(revision 6)
@@ -0,0 +1,63 @@
+/*
+ * Created on Aug 31, 2005
+ * 
+ * $Log$
+ * Revision 1.1  2005/09/21 22:00:45  dsowen
+ * Split out the access stuff into accesslib.
+ * New Creator interface off-loads object creation to user.
+ *
+ */
+package ws.fugue88.jpath;
+
+import java.nio.CharBuffer;
+import java.text.ParseException;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * @author dsowen
+ */
+public class SimplePathParser extends PathParser {
+
+	public Path parse(final String path) throws ParseException
+	{
+		final List parts = new LinkedList();
+
+		CharSequence buff = CharBuffer.wrap(path);
+		do {
+			final PathPart pp;
+			Matcher m;
+			if((m = IDENT.matcher(buff)).find()) {
+				pp = new Identifier(m.group(1));
+			} else if((m = NUM_SEL.matcher(buff)).find()) {
+				pp = new NumberSelector(m.group(1));
+			} else if((m = STR_SEL.matcher(buff)).find()) {
+				pp = new StringSelector(unquote(m.group(1)));
+			} else {
+				throw new ParseException(
+						"Expected identifier or selector, found '"
+								+ (buff.length() > 40 ? buff.subSequence(0, 37)
+										+ "..." : buff) + "'.", -1);
+			}
+			parts.add(pp);
+			buff = buff.subSequence(m.end(), buff.length());
+		} while(buff.length() > 0);
+
+		return new Path(parts);
+	}
+
+	private static final String IDENT_START = "A-Za-z_";
+	private static final String IDENT_END = IDENT_START + "0-9";
+	private static final Pattern IDENT = Pattern.compile("^/([" + IDENT_START
+			+ "][" + IDENT_END + "]*)");
+
+	private static final String NUM_LIT = "-?[0-9]+";
+	private static final Pattern NUM_SEL = Pattern.compile("^\\[(" + NUM_LIT
+			+ ")\\]");
+
+	private static final String STR_LIT = "'((?:[^']|\\\\')*)'";
+	private static final Pattern STR_SEL = Pattern.compile("^\\[" + STR_LIT
+			+ "\\]");
+}
Index: trunk/src/ws/fugue88/jpath/StringSelector.java
===================================================================
--- trunk/src/ws/fugue88/jpath/StringSelector.java	(revision 5)
+++ trunk/src/ws/fugue88/jpath/StringSelector.java	(revision 6)
@@ -3,4 +3,8 @@
  * 
  * $Log$
+ * Revision 1.2  2005/09/21 22:00:45  dsowen
+ * Split out the access stuff into accesslib.
+ * New Creator interface off-loads object creation to user.
+ *
  * Revision 1.1  2005/08/03 00:35:29  dsowen
  * Initial commit.
@@ -24,4 +28,9 @@
 	}
 
+	public String toString()
+	{
+		return "['" + PathParser.quote(_str) + "']";
+	}
+
 	private final String _str;
 }
Index: trunk/src/ws/fugue88/jpath/URLPathParser.java
===================================================================
--- trunk/src/ws/fugue88/jpath/URLPathParser.java	(revision 6)
+++ trunk/src/ws/fugue88/jpath/URLPathParser.java	(revision 6)
@@ -0,0 +1,62 @@
+/*
+ * Created on Aug 31, 2005
+ * 
+ * $Log$
+ * Revision 1.1  2005/09/21 22:00:45  dsowen
+ * Split out the access stuff into accesslib.
+ * New Creator interface off-loads object creation to user.
+ *
+ */
+package ws.fugue88.jpath;
+
+import java.nio.CharBuffer;
+import java.text.ParseException;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * @author dsowen
+ */
+public class URLPathParser extends PathParser {
+
+	public Path parse(final String path) throws ParseException
+	{
+		final List parts = new LinkedList();
+
+		CharSequence buff = CharBuffer.wrap(path);
+		do {
+			final PathPart pp;
+			Matcher m;
+			if((m = IDENT.matcher(buff)).find()) {
+				pp = new Identifier(m.group(1));
+			} else if((m = NUM_SEL.matcher(buff)).find()) {
+				pp = new NumberSelector(m.group(1));
+			} else if((m = STR_SEL.matcher(buff)).find()) {
+				pp = new StringSelector(unquote(m.group(1)));
+			} else {
+				throw new ParseException(
+						"Expected identifier or selector, found '"
+								+ (buff.length() > 40 ? buff.subSequence(0, 37)
+										+ "..." : buff) + "'.", -1);
+			}
+			parts.add(pp);
+			buff = buff.subSequence(m.end(), buff.length());
+		} while(buff.length() > 0);
+
+		return new Path(parts);
+	}
+
+	private static final String IDENT_START = "A-Za-z_";
+	private static final String IDENT_END = IDENT_START + "0-9";
+	private static final Pattern IDENT = Pattern.compile("^/([" + IDENT_START
+			+ "][" + IDENT_END + "]*)");
+
+	private static final String NUM_LIT = "-?[0-9]+";
+	private static final Pattern NUM_SEL = Pattern.compile("^/(" + NUM_LIT
+			+ ")");
+
+	private static final String STR_LIT = "'((?:[^']|\\\\')*)'";
+	private static final Pattern STR_SEL = Pattern.compile("^/" + STR_LIT);
+}
Index: trunk/src/ws/fugue88/jpath/package.html
===================================================================
--- trunk/src/ws/fugue88/jpath/package.html	(revision 6)
+++ trunk/src/ws/fugue88/jpath/package.html	(revision 6)
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html lang="en-us">
+<head>
+<meta name="generator" content="HTML Tidy for Linux/x86 (vers 1st August 2004), see www.w3.org">
+<meta content="text/html; charset=us-ascii" http-equiv="content-type">
+<title>JPath</title>
+</head>
+<body>
+<p>jpathlib.</p>
+<h1>JPath design decisions.</h1>
+<h2>Use cases.</h2>
+<p>I would like to support the following use cases:</p>
+<ol>
+<li>No creation of missing edges;</li>
+<li>Automatic creation of missing edges; and,</li>
+<li>Delegated creation of missing edges.</li>
+</ol>
+<h2>Design.</h2>
+<p>To emulate a filesystem. &nbsp;Different features:</p>
+<ul>
+<li>There is a context (current working directory);</li>
+<li>Paths are parseable independent of any context;</li>
+<li>Paths are evaluated against a context.</li>
+</ul>
+</body>
+</html>
