c595525c5a9121acf497906252cc9eb995bfd233
[p5sagit/Promulger.git] / lib / Promulger / List.pm
1 package Promulger::List;
2 use Moose;
3 use MooseX::Storage;
4
5 use autodie ':all';
6 use Carp;
7 use Path::Class;
8 use Fcntl ':flock';
9
10 has listname => (
11   is       => 'ro',
12   isa      => 'Str',
13   required => 1,
14 );
15
16 has active => (
17   is       => 'rw',
18   isa      => 'Bool',
19   required => 1,
20   default  => 1,
21 );
22
23 with Storage (
24   format => 'JSON',
25   io     => 'File',
26 );
27
28 sub resolve {}
29
30 sub subscribe {}
31
32 sub unsubscribe {}
33
34 sub accept_posts_from {}
35
36 sub setup {
37   my($self, $config) = @_;
38   my $name = $self->listname;
39   my $path = file($config->{list_home}, $name . ".list");
40   eval {
41     __PACKAGE__->load($path->stringify);
42   };
43   croak "${name} already a known list" unless $@;
44
45   open my $fh, '+<', $config->{aliases};
46   flock $fh, LOCK_EX;
47   my @current_contents = <$fh>;
48   my @aliases = ($name, "${name}-request");
49   for my $alias (@aliases) {
50     if(grep { /^${alias}:/ } @current_contents) {
51       croak "${alias} already in $config->{aliases}";
52     }
53     push @current_contents, 
54       qq(${alias}: "|$config->{bin_root}/pmg msg -c $config->{config_file}"\n);
55   }
56   $self->store($path->stringify);
57   print $fh @current_contents;
58   flock $fh, LOCK_UN;
59 }
60
61 1;