# Copyright (c) 2023 Yuki Kimoto
# MIT License

class File::Spec::Instance {
  version_from File::Spec;
  
  use Sys;
  use File::Spec::Instance::Unix;
  use File::Spec::Instance::Win32;
  use Sys::OS;
  
  # Class Methods
  static method new : File::Spec::Instance () {
    
    my $self : File::Spec::Instance;
    
    if (Sys::OS->is_windows) {
      $self = File::Spec::Instance::Win32->new;
    }
    else {
      $self = File::Spec::Instance::Unix->new;
    }
    
    return $self;
  }
  
  # Instance Methods
  method has_interfaces : int () { return 1; }
  
  method canonpath : string ($path : string) { die "Not implemented"; }
  
  method catdir : string ($parts : string[]) { die "Not implemented"; }
  
  method catfile : string ($parts : string[]) { die "Not implemented"; }
  
  method curdir : string () { die "Not implemented"; }
  
  method devnull : string () { die "Not implemented"; }
  
  method rootdir : string () { die "Not implemented"; }
  
  method tmpdir : string () { die "Not implemented"; }
  
  method updir : string () { die "Not implemented"; }
  
  method no_upwards : string[] ($parts : string[]) { die "Not implemented"; }
  
  method file_name_is_absolute : int ($path : string) { die "Not implemented"; }
  
  method path : string[] () { die "Not implemented"; }
  
  method join : string ($parts : string[]) { die "Not implemented"; }
  
  method splitpath : string[] ($path : string, $no_file : int = 0) { die "Not implemented"; }
  
  method splitdir : string[] ($path : string) { die "Not implemented"; }
   
  method catpath : string ($volume : string, $dir : string, $file : string) { die "Not implemented"; }
  
  method abs2rel : string ($path : string, $base : string = undef) { die "Not implemented"; }
  
  method rel2abs : string ($path : string, $base : string = undef) { die "Not implemented"; }
  
}