Author: wayland
Date: 2009-02-18 04:30:33 +0100 (Wed, 18 Feb 2009)
New Revision: 25371

Modified:
   docs/Perl6/Spec/S16-io.pod
Log:
S16: Redid things in terms of trees, at least somewhat.  


Modified: docs/Perl6/Spec/S16-io.pod
===================================================================
--- docs/Perl6/Spec/S16-io.pod  2009-02-17 21:05:38 UTC (rev 25370)
+++ docs/Perl6/Spec/S16-io.pod  2009-02-18 03:30:33 UTC (rev 25371)
@@ -204,21 +204,6 @@
 the $.locale, or the undefined value at end of file, or if there was
 an error (in the latter case C<$!> is set).
 
-=item our List multi method lines (IO $handle:) is export;
-
-=item our List multi lines (Str $filename);
-
-Returns all the lines of a file as a (lazy) List regardless of context.
-See also C<slurp>.
-
-=item our Item multi method slurp (IO $handle: *%opts) is export;
-
-=item our Item multi slurp (Str $filename, *%opts);
-
-Slurps the entire file into a Str or Buf regardless of context.
-(See also C<lines>.)  Whether a Str or Buf is returned depends on
-the options.
-
 =back
 
 =head2 IO::Writeable::Encoded
@@ -314,19 +299,6 @@
 
 =back
 
-=head2 IO::FileDescriptor
-
-This role indicates that this object actually represents an open file
-descriptor in the os level.
-
-=over
-
-=item method int fileno()
-
-File descriptors are always native integers, conforming to C89.
-
-=back
-
 =head2 IO::Closeable
 
 This role indicates that this object can be closed.
@@ -350,26 +322,17 @@
 
 =head2 IO::Socket
 
-role   IO::Socket  {
+role   IO::Socket {
+       has %.options;
 ...
 }
 
+Accessing the %.options would on Unix be done with getsockopt/setsockopt.
+
 =over
 
-=item socket
+=item pair
 
-=item IO.setsockopt
-
-=item IO.shutdown
-
-(should IO::Socket.close() call shutdown, instead of having a different name?)
-
-=item IO.accept
-
-=item IO.bind
-
-=item Socket.pair
-
     our List of IO method pair(Int $domain, Int $type, Int $protocol)
 
 A wrapper for socketpair(2), returns a pair of IO objects representing the
@@ -381,18 +344,89 @@
 
 =back
 
-=head1 Filehandles, files, and directories
+=head2 IO::Listening
 
-=over 4
+=item open
 
-=item IO.fcntl
+ method open()
 
-Available only as a handle method.
+ Does a bind() and a listen().  
 
-=item IO.ioctl
+=item accept
 
-Available only as a handle method.
+ method IO::Socket accept()
 
+=head2 Tree Roles and Classes
+
+To support the filesystem, it is also useful to define some generic tree 
roles, which 
+could equally well be used for XML or LDAP as well as filesystem 
representation.  However, 
+while the roles are generic, the comments and documentation in this section 
refers 
+specifically to filesystems.  
+
+=head3 Tree::Name
+
+ class Tree::Name {
+       has $.namespace;
+       has $.prefix;
+
+       # Call this for stringifying
+       method fullname()
+ }
+
+ fullname for XML does "$namespace:$prefix"
+
+=head3 Tree::Node
+
+This should be an ancestor role to filesystems, their elements, their 
attributes, and the 
+like.  
+
+ role  Tree::Node does Array {
+       has Tree::Name $.name; # would usually be File or Directory on a 
filesystem
+       has $.ownerNode; # This is the IO::FileSystem
+       has $.rootNode; This is the root of the filesystem
+       has $.parent; # Another Tree::Node
+       has @.children handles <Array List Container>; # This is all the child 
notes
+       has $.path is ro; # Accessor does a getpath
+       has $.depth is ro; # depth from $ownerNode
+
+       method infix:<===>(...)
+       method infix:<==>(...)
+       multi method *infix:</>(Tree::Node @nodes: Matcher $test);
+       multi method postfix:<//>(Tree::Node @parents: Matcher $test);
+       method path(Str $.quitcriteria); # This allows the path call to quit 
eg. when it 
+               # gets to the filesystem root, instead of the overall root
+ }
+
+Array operations on this are entirely capable of moving files and directories, 
+
+=head3 Tree
+
+ role  Tree does Tree::Node {
+       has Tree::Node $root; # The root directory
+       has Tree::Node $cwn; # The current working directory (node)
+ }
+
+=head3 Tree::Element
+
+ role  Tree::Element does Tree::Node {
+       has %.attributes; # This is all the attributes, including Name
+       has Str $!defaultattributename;
+       method postcircumfix:<{ }>($selector, $node(s)); # Accesses stuff in 
%attributes
+       method pathelement();
+ }
+
+=head3 Tree::Attribute
+
+ role Tree::Attribute does Tree::Node {
+       has $.value;
+
+        method pathelement();
+ }
+
+=head1 Filehandles, files, and directories
+
+=over 4
+
 =item IO.name
 
 The C<.name> method returns the name of the file/socket/uri the handle
@@ -442,40 +476,37 @@
 
 =item IO.truncate
 
+=item IO.fcntl
+
+Available only as a handle method.
+
 =back
 
 =head2 IO::FileSystem
 
 This reads directories, deletes filesystem entries, creates links, and the 
like.  
 
-class  IO::FileSystem does IO::Streamable {
-       has     IO::FileSystemEntry $.cwd; # Current working directory
-       has     IO::FileSystemEntry $.basepath; # The Unix mount point, or 
Windows drive letter, or whatever
-       has     Str $.type; # ext3, ntfs, vfat, reiserfs, etc
+class  IO::FileSystem does IO::Streamable does Tree {
+       has     Str $.fstype; # ext3, ntfs, vfat, reiserfs, etc
        has     Str $.illegal_chars; # ie. /\x0
        has     Int $.max_path;
 ...
 }
 
+It inherits $cwn and $root from Tree.  
+
 =over 4
 
 =item glob
 
-Returns FileSystemEntry objects
+Returns FSNode objects
 
 =item find
 
-Returns FileSystemEntry objects
+Returns FSNode objects
 
 =item link
 
-=item lstat
-
-Returns a stat buffer.  If the lstat succeeds, the stat buffer evaluates
-to true, and additional file tests may be performed on the value.  If
-the stat fails, all subsequent tests on the stat buffer also evaluate
-to false.
-
 =item mkdir
 
 =item IO::Dir::open EXPR
@@ -518,11 +549,10 @@
 
 =back
 
-=head2 IO::FilesystemEntry
+=head2 IO::FSNode
 
-class  IO::FileSystemEntry {
-       has     Str $path;
-       has     IO::FileSystemEntryACL @.acls;
+class  IO::FSNode does Tree::Node {
+       has Array of IO::FSNodeACL @.ACLs;
 ...
 }
 
@@ -621,100 +651,33 @@
   if $filename.TEST(:e,:x) {...}
 
 
-=item chown
-
-    our Int multi chown ($uid = -1, $gid = -1, *...@files)
-
-Changes the owner (and group) of a list of files.  The first
-two elements of the list must be the numeric uid and gid, in
-that order.  A value of -1 in either position is interpreted by
-most systems to leave that value unchanged.  Returns the number
-of files successfully changed.
-
-    $count = chown $uid, $gid, ’foo’, ’bar’;
-    chown $uid, $gid, @filenames;
-
-On systems that support C<fchown>, you might pass file handles
-among the files.  On systems that don’t support C<fchown>, passing
-file handles produces a fatal error at run time.
-
-Here’s an example that looks up nonnumeric uids in the passwd
-file:
-
-   $user = prompt "User: ";
-   $pattern = prompt "Files: ";
-
-   ($login,$pass,$uid,$gid) = getpwnam($user)
-       or die "$user not in passwd file";
-
-   @ary = glob($pattern);      # expand filenames
-   chown $uid, $gid, @ary;
-
-On most systems, you are not allowed to change the ownership of
-the file unless you’re the superuser, although you should be
-able to change the group to any of your secondary groups.  On
-insecure systems, these restrictions may be relaxed, but this
-is not a portable assumption.  On POSIX systems, you can detect
-this condition this way:
-
-    use POSIX qw(sysconf _PC_CHOWN_RESTRICTED);
-    $can_chown_giveaway = not sysconf(_PC_CHOWN_RESTRICTED);
-
-=item chmod LIST
-X<chmod> X<permission> X<mode>
-
-Changes the permissions of a list of files.  The first element of the
-list must be the numerical mode, which should probably be an octal
-number, and which definitely should I<not> be a string of octal digits:
-C<0o644> is okay, C<0644> is not.  Returns the number of files
-successfully changed.
-
-    $cnt = chmod 0o755, 'foo', 'bar';
-    chmod 0o755, @executables;
-    $mode = '0644'; chmod $mode, 'foo';      # !!! sets mode to --w----r-T
-    $mode = '0o644'; chmod $mode, 'foo';     # this is better
-    $mode = 0o644;   chmod $mode, 'foo';     # this is best
-
-=item stat
-
-=item IO.stat
-
-Returns a stat buffer.  If the lstat succeeds, the stat buffer evaluates
-to true, and additional file tests may be performed on the value.  If
-the stat fails, all subsequent tests on the stat buffer also evaluate
-to false.
-
 =item realpath
 
  method Str realpath();
 
 Gets the real path to the object, resolving softlinks/shortcuts, etc
 
-=item parent
+=item === operator
 
- method IO::FileSystemEntry parent();
+ method infix:<===>(Str $filename);
 
-=item isSameFile
-
- method isSameFile(Str $filename);
-
 Test whether the specified filename is the same file as this file.  On a Unix 
system, 
 this would presumably be done by comparing inode numbers or something.  
 
 =back
 
-=head2 IO::FileSystemEntryACL
+=head2 IO::FSNodeACL
 
 This is a basic abstraction; for better control, use the operating-system 
specific 
-interfaces [not designed yet], over which this is a thin veneer.  
+interfaces, over which this is a thin veneer.  
 
-class  IO::FileSystemEntryACL {
+class  IO::FSNodeACL {
        has     Str $.type; # "User", "Group", "Everyone", ???
        has     Str $.id; # username or groupname; unused for $type eq 
"Everyone"
        has     %.permissions;
                # Unsupported values may (or may not) throw 
                # UnsupportedPermission when set or read
-       has     IO::FileSystemEntry $.owningObject;
+       has     IO::FSNode $.owningObject;
 ...
 }
 
@@ -734,7 +697,8 @@
 
 =item Executeable
 
-Supported on most Unix systems, anyway
+Supported on most Unix systems, anyway.  Windows should be able to guess when 
this is 
+read, and throw an exception if written to.  
 
 =item Default
 
@@ -743,9 +707,40 @@
 
 =back
 
-The $.owningObject attribute of FileSystemEntryACL shows what the ACL is set 
on.  On a 
+The $.owningObject attribute of FSNodeACL shows what the ACL is set on.  On a 
 Windows system, this can be a parent directory, as permissions are inherited.  
 
+=head2 IO::FileNode
+
+ role  IO::FileNode does IO::FSNode {
+...
+ }
+
+=over
+
+=item our List multi method lines (IO $handle:) is export;
+
+=item our List multi lines (Str $filename);
+
+Returns all the lines of a file as a (lazy) List regardless of context.
+See also C<slurp>.
+
+=item our Item multi method slurp (IO $handle: *%opts) is export;
+
+=item our Item multi slurp (Str $filename, *%opts);
+
+Slurps the entire file into a Str or Buf regardless of context.
+(See also C<lines>.)  Whether a Str or Buf is returned depends on
+the options.
+
+=back
+
+=head2 IO::DirectoryNode
+
+ role  IO::DirectoryNode does IO::FSNode {
+...
+ }
+
 =head2 IO::Socket::TCP
 
 class  IO::Socket::TCP does IO::Socket does IO::Streamable {
@@ -762,12 +757,25 @@
 
 =item has $.LocalPort
 
-=item method Bool open($Listen?);
+=item init
 
-If $Listen is 2, it does a listen(), but no connect().  
-If $Listen is any other true value, it does a connect() and a listen().  
-If $Listen is false, it does a connect(), but no listen().
+ method Bool init(
+       $RemoteHost, $RemotePort, 
+       $LocalHost?, $LocalPort?, 
+       $Blocking?, 
+       $NoOpen?
+ );
 
+The creation of the object will also open the connection, unless NoOpen is 
specified.  
+
+=item open
+
+ method open()
+
+If it's not an IO::Listening, it does a connect().
+
+It's intended for the case where the creation of the object didn't do one.  
+
 =item method Int read($buf is rw, Int $length)
 
 Does a recv().  
@@ -782,25 +790,6 @@
 
 =back
 
-=head2 IO::POSIX
-
-Indicates that this object can perform standard posix IO
-operations. It implies IO::Readable and IO::Writeable.
-
-=over
-
-=item method IO dup()
-
-=item has Bool $.blocking is rw
-
-=item method Bool flock(:$r,:$w)
-
-=item method Bool funlock()
-
-=item ...
-
-=back
-
 =head2 IO::Pipe
 
 class  IO::Pipe does IO::Streamable {
@@ -860,12 +849,124 @@
 
 =back
 
+=head1 OS-specific classes
+
+=head2 Unix
+
+=head2 IO::FileDescriptor
+
+This role indicates that this object actually represents an open file
+descriptor in the os level.
+
+=over
+
+=item method int fileno()
+
+File descriptors are always native integers, conforming to C89.
+
+=back
+
+=head2 IO::FSNode::Unix
+
+=item chown
+
+    our Int multi chown ($uid = -1, $gid = -1, *...@files)
+
+Changes the owner (and group) of a list of files.  The first
+two elements of the list must be the numeric uid and gid, in
+that order.  A value of -1 in either position is interpreted by
+most systems to leave that value unchanged.  Returns the number
+of files successfully changed.
+
+    $count = chown $uid, $gid, ’foo’, ’bar’;
+    chown $uid, $gid, @filenames;
+
+On systems that support C<fchown>, you might pass file handles
+among the files.  On systems that don’t support C<fchown>, passing
+file handles produces a fatal error at run time.
+
+Here’s an example that looks up nonnumeric uids in the passwd
+file:
+
+   $user = prompt "User: ";
+   $pattern = prompt "Files: ";
+
+   ($login,$pass,$uid,$gid) = getpwnam($user)
+       or die "$user not in passwd file";
+
+   @ary = glob($pattern);      # expand filenames
+   chown $uid, $gid, @ary;
+
+On most systems, you are not allowed to change the ownership of
+the file unless you’re the superuser, although you should be
+able to change the group to any of your secondary groups.  On
+insecure systems, these restrictions may be relaxed, but this
+is not a portable assumption.  On POSIX systems, you can detect
+this condition this way:
+
+    use POSIX qw(sysconf _PC_CHOWN_RESTRICTED);
+    $can_chown_giveaway = not sysconf(_PC_CHOWN_RESTRICTED);
+
+=item chmod LIST
+X<chmod> X<permission> X<mode>
+
+Changes the permissions of a list of files.  The first element of the
+list must be the numerical mode, which should probably be an octal
+number, and which definitely should I<not> be a string of octal digits:
+C<0o644> is okay, C<0644> is not.  Returns the number of files
+successfully changed.
+
+    $cnt = chmod 0o755, 'foo', 'bar';
+    chmod 0o755, @executables;
+    $mode = '0644'; chmod $mode, 'foo';      # !!! sets mode to --w----r-T
+    $mode = '0o644'; chmod $mode, 'foo';     # this is better
+    $mode = 0o644;   chmod $mode, 'foo';     # this is best
+
+=item lstat
+
+Returns a stat buffer.  If the lstat succeeds, the stat buffer evaluates
+to true, and additional file tests may be performed on the value.  If
+the stat fails, all subsequent tests on the stat buffer also evaluate
+to false.
+
+=item stat
+
+=item IO.stat
+
+Returns a stat buffer.  If the lstat succeeds, the stat buffer evaluates
+to true, and additional file tests may be performed on the value.  If
+the stat fails, all subsequent tests on the stat buffer also evaluate
+to false.
+
+=head2 IO::POSIX
+
+Indicates that this object can perform standard posix IO
+operations. It implies IO::Readable and IO::Writeable.
+
+=over
+
+=item method IO dup()
+
+=item has Bool $.blocking is rw
+
+=item method Bool flock(:$r,:$w)
+
+=item method Bool funlock()
+
+=item ...
+
+=back
+
 =head1 Unfiled
 
 =over 4
 
 =item IO.fileno
 
+=item IO.ioctl
+
+Available only as a handle method.
+
 =item alarm
 
 =item prompt
@@ -874,12 +975,8 @@
 
 =item Str.readpipe
 
-=item IO.sysread
-
 =item IO.sysseek
 
-=item IO.syswrite
-
 =back
 
 =head1 Removed functions
@@ -898,10 +995,22 @@
 
 Gone.  (Note: for subsecond sleep, just use sleep with a fractional argument.)
 
+=item IO.shutdown()
+
+Gone, see IO::Socket.close()
+
 =item socketpair
 
 Gone, see Socket.pair
 
+=item IO.sysread
+
+Gone, see IO::Readable.read()
+
+=item IO.syswrite
+
+Gone, see IO::Writeable.read()
+
 =back
 
 =head1 Additions

Reply via email to