Config-Writer

 view release on metacpan or  search on metacpan

lib/Config/Writer.pm  view on Meta::CPAN


Default is 0600.

=back

=back

=cut #}}}

    my $self = bless { 'error' => boolean::false }, __PACKAGE__;
    my @filename = File::Basename::fileparse $filename, qw(.cfg .conf .json .yaml), '';
    $self->{'filename'} = $filename[0];
    $self->{'retain'} = (defined $options->{'retain'} and $options->{'retain'} =~ /^\d+$/)
        ? $options->{'retain'} + 0
        : 0;
    $self->{'overwrite'} = (defined $options->{'overwrite'} and $options->{'overwrite'} =~ /^1$/)
        ? boolean::true
        : boolean::false;
    $self->{'extension'} = (defined $options->{'extension'} and $options->{'extension'} !~ m|/|)
        ? $options->{'extension'}
        : '-%Y-%m-%d';
    $self->{'owner'} = defined $options->{'owner'}
        ? (getpwnam $options->{'owner'})[2]
        : $>;
    $self->{'group'} = defined $options->{'group'}
        ? (getpwnam $options->{'group'})[3]
        : (getpwuid $self->{'owner'})[3];
    $self->{'permissions'} = (defined $options->{'permissions'} and $options->{'permissions'} =~ /^\d+$/)
        ? $options->{'permissions'}
        : 0600;
    if ($filename =~ m|^/|) {
        $self->{'workdir'} = Cwd::realpath((File::Basename::fileparse $filename)[1]);
    } else {
        $self->{'workdir'} = (defined $options->{'workdir'} and -d $options->{'workdir'})
            ? $options->{'workdir'}
            : Cwd::getcwd;
        $self->{'workdir'} = Cwd::realpath($self->{'workdir'} . '/' . $filename[1]);
    }
    unless (defined $self->{'workdir'}) {
        $self->{'error'} = boolean::true;
        return $self;
    }
    $self->{'fullname'} = $self->{'workdir'} . '/' . $self->{'filename'} . $filename[2];
    untaint $self->{'filename'} if tainted $self->{'filename'};
    untaint $self->{'fullname'} if tainted $self->{'fullname'};
    untaint $self->{'workdir'} if tainted $self->{'workdir'};
    $self->{'fh'} = File::Temp->new(
        'TEMPLATE' => $self->{'filename'} . '.XXXXXX',
        'DIR'      => $self->{'workdir'},
        'PERMS'    => $self->{'permissions'},
        'UNLINK'   => 0,
        'EXLOCK'   => 1
    );
    unless (defined $self->{'fh'}) {
        $self->{'error'} = boolean::true;
        return $self;
    }
    $self->{'fh'}->autoflush(1);
    $self->{'tmpfile'} = $self->{'fh'}->filename;
    untaint $self->{'tmpfile'} if tainted $self->{'tmpfile'};
    chown($self->{'owner'}, $self->{'group'}, $self->{'tmpfile'}) or $self->{'error'} = boolean::true;
    return $self;

} #}}}

sub error :prototype($) ($self = undef) {
    #{{{

=pod #{{{ error() method description

=over 4

=item B<error()>

Takes no arguments. Returns `false` if B<Config::Writer> object is
defined and `error` flag is not set and `true` otherwise.

=back

=cut #}}}

    return (defined $self and isFalse $self->{'error'})
        ? boolean::false
        : boolean::true;

} #}}}

sub say :prototype($$) ($self, $string) {
    #{{{

=pod #{{{ say() method description

=over 4

=item B<say(STRING)>

Is equivalent to B<print()> method except that $/ is added to the end of the line.

=back

=cut #}}}

    $self->print($string . $/);

} #}}}

sub sayf :prototype($$@) ($self, $format, @list) {
    #{{{

=pod #{{{ sayf() method description

=over 4

=item B<sayf(STRING, ARRAY)>

Is equivalent to B<printf()> method except that $/ is added to the end of the format line.

=back

=cut #}}}



( run in 1.895 second using v1.01-cache-2.11-cpan-71847e10f99 )