"Represents a file, link, or directory located at a 
 certain path, or the absence of a file or directory 
 at that path."
shared interface Resource 
        of ExistingResource|Nil {
    "The path of the file, link, or directory."
	shared formal Path path;
    "If this resource is a link, resolve the link."
    shared formal File|Directory|Nil linkedResource;

"A resource that actually exists—that is one that is
 not `Nil`."
shared interface ExistingResource 
        of File|Directory|Link
        satisfies Resource {
    "Delete this resource."
    shared formal Nil delete();
    "The principal name of the owner of the file."
    throws(`class NoSuchPrincipalException`,
            "If set to a name for which there is no 
             corresponding user.")
    shared formal variable String owner;
    "Get the value of a filesystem attribute."
    shared formal Object readAttribute(Attribute attribute);

    "Set the value of a filesystem attribute."
    shared formal void writeAttribute(Attribute attribute, 
                            Object attributeValue);

"Thrown if there is no principal with the specified name."
shared class NoSuchPrincipalException(name, Exception cause) 
        extends Exception(name, cause) {
    "The specified principal name."
    shared String name;