The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Minilla::Gitignore;
use strict;
use warnings;
use utf8;

use Moo;

has lines => (
    is => 'rw',
    default => sub { +[ ] },
);

no Moo;

sub load {
    my ($class, $filename) = @_;

    open my $fh, '<', $filename 
        or die "Cannot open $filename: $!";
    my @lines;
    while (defined($_ = <$fh>)) {
        chomp;
        push @lines, $_;
    }

    return $class->new(
        lines => [@lines],
    );
}

sub remove {
    my ($self, $pattern) = @_;
    if (ref $pattern) {
        $self->lines([grep { $_ !~ $pattern } @{$self->lines}]);
    } else {
        $self->lines([grep { $_ ne $pattern } @{$self->lines}]);
    }
}

sub add {
    my ($self, $pattern) = @_;

    unless (grep { $pattern eq $_ } @{$self->lines}) {
        push @{$self->lines}, $pattern;
    }
}

sub as_string {
    my $self = shift;
    return join('', map { "$_\n" } @{$self->lines});
}

sub save {
    my ($self, $filename) = @_;
    open my $fh, '>', $filename
        or die "Cannot open $filename: $!";
    for (@{$self->lines}) {
        print {$fh} $_, "\n";
    }
    close $fh;
}

1;