add plugins filtering plugins and implement RemovePlugin PagePlugin
Matt S Trout [Sat, 20 Jul 2013 17:43:26 +0000 (17:43 +0000)]
lib/App/SCS/Page.pm
lib/App/SCS/Plugin/Core.pm
lib/App/SCS/Plugin/Core/PagePlugin/RemovePlugin.pm [new file with mode: 0644]
lib/App/SCS/Role/PagePlugin.pm

index 8cc33d9..355f129 100644 (file)
@@ -45,9 +45,7 @@ sub with_plugin_config {
   return $self->with(plugins => pond_write_datum(\@new));
 }
 
-has _page_plugins => (is => 'lazy');
-
-sub _build__page_plugins {
+has _raw_page_plugins => (is => 'lazy', builder => sub {
   my ($self) = @_;
   my $plugin_config = $self->plugin_config;
   my ($plugin_map, $defaults) = @{$self->_page_set->plugin_config}
@@ -58,11 +56,18 @@ sub _build__page_plugins {
     my $info = $plugin_map->{$name};
     push @plugins,
       use_module($info->{class})->new(
-        ($info->{config}||sub{})->(), %$config, page => $self
+        ($info->{config}||sub{})->(), %$config, page => $self,
+        plugin_map => $plugin_map, # some things will need this
       );
   }
   return \@plugins;
-}
+});
+
+has _page_plugins => (is => 'lazy', builder => sub {
+  my ($self) = @_;
+  my $raw = $self->_raw_page_plugins;
+  reduce { $b->filter_plugins($a) } $raw, @$raw;
+});
 
 sub published_at {
   $_[0]->created
index dba9001..7d9dfc6 100644 (file)
@@ -32,6 +32,7 @@ sub _build_includes {
 sub page_plugins {
   my ($self) = @_;
   PageList => 'App::SCS::Plugin::Core::PagePlugin::PageList',
+  RemovePlugin => 'App::SCS::Plugin::Core::PagePlugin::RemovePlugin',
   Template => {
     class => 'App::SCS::Plugin::Core::PagePlugin::Template',
     config => sub { templates => $self->templates },
diff --git a/lib/App/SCS/Plugin/Core/PagePlugin/RemovePlugin.pm b/lib/App/SCS/Plugin/Core/PagePlugin/RemovePlugin.pm
new file mode 100644 (file)
index 0000000..6348623
--- /dev/null
@@ -0,0 +1,21 @@
+package App::SCS::Plugin::Core::PagePlugin::RemovePlugin;
+
+use Moo;
+
+with 'App::SCS::Role::PagePlugin';
+
+has name => (is => 'ro', required => 1);
+
+has plugin_map => (is => 'ro', required => 1);
+
+has class => (is => 'lazy', builder => sub {
+  my ($self) = @_;
+  $self->plugin_map->{$self->name}{class}
+});
+
+sub filter_plugins {
+  my ($self, $plugins) = @_;
+  [ grep !$_->isa($self->class), @$plugins ];
+}
+
+1;
index ceee4cb..bfb1fbf 100644 (file)
@@ -6,6 +6,8 @@ has 'page' => (is => 'ro', weak_ref => 1, required => 1);
 
 sub extra_pages { () }
 
+sub filter_plugins { $_[1] }
+
 sub filter_html_zoom { $_[1] }
 
 sub filter_content_zoom { $_[1] }