Sidef

 view release on metacpan or  search on metacpan

lib/Sidef/Types/Glob/Dir.pm  view on Meta::CPAN

package Sidef::Types::Glob::Dir;

use utf8;
use 5.016;

use parent qw(
  Sidef::Types::Glob::File
);

require Encode;
require File::Spec;

sub new {
    my (undef, $dir) = @_;
    if (@_ > 2) {
        shift(@_);
        $dir = File::Spec->catdir(map { "$_" } @_);
    }
    elsif (ref($dir)) {
        return $dir->to_dir;
    }
    bless \$dir, __PACKAGE__;
}

*call = \&new;

sub get_value { ${$_[0]} }
sub to_dir    { $_[0] }

sub root {
    __PACKAGE__->new(File::Spec->rootdir);
}

sub home {
    my ($self) = @_;

    my $home = $ENV{HOME} || $ENV{LOGDIR};

    if (not $home and $^O ne 'MSWin32') {
        $home = (getpwuid($<))[7];
    }

    $home ? __PACKAGE__->new($home) : do {
        state $x = require File::HomeDir;
        __PACKAGE__->new(File::HomeDir->my_home);
    };
}

sub tmp {
    __PACKAGE__->new(File::Spec->tmpdir);
}

*temp = \&tmp;

sub mktemp {
    my ($self, %opts) = @_;
    state $x = require File::Temp;
    __PACKAGE__->new(File::Temp::tempdir(CLEANUP => 1, %opts));
}

*make_tmp  = \&mktemp;
*make_temp = \&mktemp;

sub find {
    my ($self, $arg) = @_;
    state $x = require File::Find;

    my @files;
    my $ref      = ref($arg // '');
    my $is_block = $ref eq 'Sidef::Types::Block::Block';

    File::Find::find(
        {
         no_chdir => 1,
         wanted   => sub {
             my $file = Encode::decode_utf8($File::Find::name);

             if (-d $file) {
                 $file = __PACKAGE__->new($file);
             }
             else {
                 $file = Sidef::Types::Glob::File->new($file);
             }

             $is_block ? $arg->run($file) : push(@files, $file);
         }
        },
        $$self
    );

    $is_block ? $self : Sidef::Types::Array::Array->new(\@files);
}

*browse = \&find;

sub cwd {
    state $x = require Cwd;
    __PACKAGE__->new(Encode::decode_utf8(Cwd::getcwd()));
}



( run in 4.207 seconds using v1.01-cache-2.11-cpan-c221a9de4ec )