1 package DX::Lib::FS::Action::CreateFile;
3 use aliased 'DX::Lib::FS::Fact::FileContent';
4 use aliased 'DX::Lib::FS::Fact::PathStatus';
5 use aliased 'DX::Lib::FS::Fact::PathStatusInfo';
6 use Fcntl qw(O_CREAT O_WRONLY);
9 with 'DX::Role::Action';
11 has path => (is => 'ro', required => 1);
13 has mode => (is => 'ro', predicate => 1);
15 has data => (is => 'ro', default => sub { '' });
19 return +(path_status => PathStatus->new(
21 info => PathStatusInfo->new(
23 mode => ($self->has_mode ? $self->mode : '')
25 ), file_content => FileContent->new(
34 if ($self->has_mode) {
35 my $umask = umask(0000);
37 $fh, $self->path, O_CREAT | O_WRONLY, oct($self->mode)
38 ) or do { umask($umask); die "Couldn't create ${\$self->path}: $!" };
41 sysopen($fh, $self->path, O_CREAT | O_WRONLY)
42 or die "Couldn't create ${\$self->path}: $!";
44 print $fh $self->data if length($self->data);
45 +(path_status => PathStatus->new(path => $self->path));