package Seis::IO::Path;
use strict;
use warnings;
use utf8;
use 5.010_001;
package IO::Path;
use File::Basename ();
use File::Path ();
use File::Spec ();
use overload (
q{""} => sub {
$_[0]->{fullpath}
},
fallback => 1,
);
sub _file_spec { 'File::Spec' }
sub new {
my $class = shift;
my $fullpath = shift;
bless {
fullpath => $fullpath
}, $class;
}
sub basename { File::Basename::basename($_[0]->{fullpath}) }
sub perl {
local $Data::Dumper::Terse = 1;
local $Data::Dumper::Useqq = 1;
local $Data::Dumper::Purity = 1;
local $Data::Dumper::Indent = 0;
Data::Dumper::Dumper($_[0]->{fullpath});
}
sub gist { goto &perl }
sub volume {
my $self = shift;
(my $volume, ) = $self->_file_spec->splitpath($self->{fullpath});
$volume;
}
sub directory {
my $self = shift;
(undef, my $volume, ) = $self->_file_spec->splitpath($self->{fullpath});
$volume =~ s!/\z!!r;
}
sub parent {
require Path::Tiny;
IO::Path->new(Path::Tiny->new($_[0])->parent->stringify);
}
{
no strict 'refs';
*{"isーabsolute"} = sub {
substr( $_[0]->directory, 0, 1 ) eq '/' ? Bool::True() : Bool::False()
};
*{"isーrelative"} = sub {
substr( $_[0]->directory, 0, 1 ) ne '/' ? Bool::True() : Bool::False()
};
}
sub path { $_[0] }
sub IO {
Seis::IO::Handle->_new($_[0]->{fullpath});
}
sub cleanup {
my $self = shift;
$self->_file_spec->canonpath($self->{fullpath});
}
sub isa {
my ($self, $stuff) = @_;
return UNIVERSAL::isa($self, $stuff->{name}) if UNIVERSAL::isa($stuff, 'Seis::Class');
return UNIVERSAL::isa($self, $stuff);
}
sub Str { $_[0]->{fullpath} }
sub absolute {
my $self = shift;
(ref $self)->new($self->_file_spec->rel2abs($self->{fullpath}, @_));
}
sub relative {
my $self = shift;
(ref $self)->new($self->_file_spec->rel2abs($self->{fullpath}, @_));
}
package IO::Path::Unix;
BEGIN { our @ISA = qw(IO::Path); }
use File::Spec::Unix;
sub _file_spec { 'File::Spec::Unix' }
package IO::Path::Win32;
BEGIN { our @ISA = qw(IO::Path); }
sub _file_spec {
require File::Spec::Win32;
'File::Spec::Win32'
}
sub resolve {
... # NYI
}
package IO::Path::Cygwin;
BEGIN { our @ISA = qw(IO::Path); }
sub _file_spec {
require File::Spec::Cygwin;
'File::Spec::Cygwin'
}
sub resolve {
... # NYI
}
package IO::Spec::Win32;
sub canonpath {
require File::Spec::Win32;
File::Spec::Win32->canonpath($_[1]);
}
package IO::Spec::Cygwin;
sub canonpath {
require File::Spec::Cygwin;
File::Spec::Cygwin->canonpath($_[1]);
}
package IO::Spec::Unix;
sub canonpath {
File::Spec::Unix->canonpath($_[1]);
}
1;