+use Class::Method::Modifiers qw/after/;
+
+after qw/insert update delete/ => sub {
+ my ($self) = @_;
+ Gruntmaster::Data::purge '/pb/';
+ Gruntmaster::Data::purge '/pb/' . $self->id;
+ Gruntmaster::Data::purge '/sol/' . $self->id;
+};
+
+sub is_private {
+ my ($self, $time) = @_;
+ return 0 if grep { !$_->contest->is_pending($time) } $self->contest_problems;
+ return 1 if $self->private;
+ grep { $_->contest->is_pending($time) } $self->contest_problems;
+}
+
+sub is_in_archive {
+ my ($self, $time) = @_;
+ 0 == grep { $_->contest->is_running($time) } $self->contest_problems;
+}
+
+sub rerun {
+ $_->rerun for shift->jobs
+}