class IO::Path::Parts
  does Positional   # all of these can go as soon as we don't need
  does Associative  # the compatibility with the original "List of
  does Iterable     # Pairs" and Map implemention anymore.
{
    has str $.volume;
    has str $.dirname;
    has str $.basename;

    method !SET-SELF($!volume, $!dirname, $!basename) { self }
    method new($volume, $dirname, $basename) {
        nqp::create(self)!SET-SELF($volume, $dirname, $basename)
    }

    multi method raku(IO::Path::Parts:D:) {
        'IO::Path::Parts.new('
          ~ $!volume.raku
          ~ ','
          ~ $!dirname.raku
          ~ ','
          ~ $!basename.raku
          ~ ')'
    }

#-------------------------------------------------------------------------------
# all of the code below is just to provide a compatibility layer with the
# original List of Pairs / Map implementation.  As soon as this is no longer
# needed, this can go.

    method of() { Str }

    method iterator() { (:$!volume, :$!dirname, :$!basename).iterator }

    method AT-POS(int $pos) {
        $pos == 2
          ?? :$!basename
          !! $pos == 1
            ?? :$!dirname
            !! $pos
              ?? Nil
              !! :$!volume
    }

    method AT-KEY(str $key) {
        $key eq 'basename'
          ?? $!basename
          !! $key eq 'dirname'
            ?? $!dirname
            !! $key eq 'volume'
              ?? $!volume
              !! Nil
    }
}

# vim: expandtab shiftwidth=4
