Added FileSystem.nqp, Path.nqp. Completed use case #1 on ticket
[kakapo:kakapo.git] / src / FileSystem.nqp
1 # Copyright (C) 2010, Austin Hastings. See accompanying LICENSE file, or 
2 # http://www.opensource.org/licenses/artistic-license-2.0.php for license.
3
4 # Provides a conventional framework for program execution. 
5 class FileSystem;
6
7 has     $!file;
8 has     $!os;
9
10 INIT {
11         Parrot::define_multisub('exists', :method, :starting_with('exists'));
12 }
13
14 our method chdir($path = '') {
15         $path := ~$path;
16         $!os.chdir($path);
17 }
18
19 our method cwd() {
20         $!os.cwd;
21 }
22
23 our method directory_separator() { '/' }
24
25 our method exists__Path($path) {
26         $!file.exists( ~ $path );
27 }
28
29 our method exists__String($path) {
30         $!file.exists($path);
31 }
32
33 our method exists__ANY($ignored) {
34         die( "Don't know how to check if ", pir::typeof__SP($ignored), " exists. Use a String or Path");
35 }
36
37 my method _init_obj(*@pos, *%named) {
38         $!file := pir::new__PS( 'File' );
39         $!os := pir::new__PS( 'OS' );
40         
41         self._init_args(|@pos, |%named);
42 }
43
44 our method instance($value?) {
45         if $value.defined {
46                 our $_Instance := $value;
47         }
48         elsif ! our $_Instance.defined {
49                 $_Instance := self.new;
50         }
51         else {
52                 $_Instance;
53         }
54 }
55
56 our method open($path, *%named) {
57         
58         my $fh  := pir::new__PS('FileHandle');
59         my $mode        := '' ~ %named<mode> // 'r';
60
61         $fh.open(~ $path, $mode);
62
63         # Not a loop because of prefix ops (+, ~)
64         $fh.buffer_size( +%named<buffer_size> )
65                 if %named.contains( <buffer_size> );
66         $fh.buffer_type( ~%named<buffer_type> )
67                 if %named.contains( <buffer_type> );
68         $fh.encoding( ~%named<encoding> )
69                 if %named.contains( <encoding> );
70
71         $fh;
72 }
73
74 our method slurp($path, *%named) {
75         %named<mode> := 'r';
76         my $fh := self.open($path, |%named);
77         my $slurp := $fh.readall;
78         $fh.close;
79         $slurp;
80 }
81
82 our method volume_separator() { ':' }