1 package Promulger::List;
10 use File::Slurp qw/read_file write_file/;
14 $Data::Dumper::Purity = 1;
16 use Promulger::Config;
20 isa => sub { $_[0] =~ /^\w+$/ or die "listname must be a string" },
26 isa => sub { ($_[0] == 0 || $_[0] == 1) or die "active must be 0 or 1" },
33 isa => sub { ref $_[0] eq 'HASH' or die "subscribers must be a hashref" },
35 default => sub { {} },
39 my ($self, $proto) = @_;
40 $proto =~ s/-request$//;
41 $proto =~ s/^owner-//;
42 my $path = find_path_for($proto);
45 $maybe_list = __PACKAGE__->load($path->stringify);
53 my ($self, $new) = @_;
54 return if $self->subscribers->{$new};
55 $self->subscribers->{$new} = 1;
56 $self->store(find_path_for($self->listname)->stringify);
62 return unless exists $self->subscribers->{$ex};
63 delete $self->subscribers->{$ex};
64 $self->store(find_path_for($self->listname)->stringify);
68 # XXX implement ACLs and other shinies -- apeiron, 2010-03-13
69 sub accept_posts_from {
70 my ($self, $sender) = @_;
71 return grep { $sender eq $_ } keys %{$self->subscribers};
76 my $config = Promulger::Config->config;
77 my $name = $self->listname;
78 croak "${name} already a known list" if $self->resolve($name);
79 my $path = find_path_for($name);
81 my $tie = tie my @aliases, 'Tie::File', $config->{aliases}
82 or die "cannot tie " . $config->{aliases} . ": $!";
84 my @list_aliases = ($name, "${name}-request");
86 # XXX add a flag to determine whether to write the aliases file or no
87 # -- apeiron, 2012-07-18
88 for my $list_alias (@list_aliases) {
89 if(grep { /^${list_alias}:/ } @aliases) {
90 croak "${list_alias} already in $config->{aliases}";
93 qq(${list_alias}: "|$Bin msg -c $config->{config_file}"\n),
94 qq(${list_alias}-owner: "|$Bin msgbounce -c $config->{config_file}"\n);
97 $self->store($path->stringify);
102 my $config = Promulger::Config->config;
103 my $name = $self->listname;
105 my $tie = tie my @aliases, 'Tie::File', $config->{aliases};
108 my @list_aliases = ($name, "${name}-request");
110 $_ !~ /^$list_aliases[0]:/ &&
111 $_ !~ /^$list_aliases[1]:/
114 unlink find_path_for($self->listname)->stringify;
119 my $path = file(Promulger::Config->config->{list_home}, $proto . ".list");
124 my ($self, $path) = @_;
125 my $dumped = 'do { my '. Dumper($self) . '; $VAR1; }';
126 write_file($path, $dumped);
130 my ($class, $path) = @_;
136 my $config = Promulger::Config->config;
137 my @lists = map { $_->basename}
138 grep { -f } dir($config->{list_home})->children;
139 s/\.list//g for @lists;
143 'http://mitpress.mit.edu/sicp/';