Plugin Interface für Config::General
Meistens sind Bugreports eher lästig. Zum einen verursachen sie Arbeit und zum anderen erinnern sie den Entwickler mit zuverlässiger Regelmäßigkeit daran, dass niemand perfekt ist, auch man selbst nicht. Und dass die besten Unittests niemals alle Anwendungsfälle abdecken können.
Aktuell habe ich für das Perl Modul Config::General einen Bugreport, der eigentlich ein Featurerequest ist: rt.cpan.org#79694. Aber die Idee an sich finde ich überaus charmant: Plugins. Immer wieder kommen nämlich Leute daher, die gerne dieses Spezialverhalten brauchen oder jenes Spezialverhalten. Sofern ich das als sinnvoll erachte und es machbar ist, implementiere ich dann einen entsprechenden Parameter, der das Verhalten einschaltet und programmiere es in das Modul ein.
Das ist schön für den OP, aber es bläht mit der Zeit den Code auf. Tatsächlich bestehen sicher über 80% des Moduls nur aus solchen implementieren Feature-Requests. Entsprechend viele Parameter hat das Modul, die sich zu allem Unglück auch gerne mal in die Quere kommen, weshalb es weitere Parameter und Code gibt, um das zu verhindern oder umgehen zu können.
Man ahnt schon, wo das hinführen wird: ins Chaos.
Aber mit Plugins kann ich mir das "Problem" immer abgedrehterer Spezialwünsche elegant vom Hals halten. Der jenige kann sich dann sein Spezialverhalten einfach selber bauen. Womöglich kann ich auch sowas wie eine "Rezeptesammlung" der besten Plugins anlegen oder so.
Hier also mein Kommentar dazu im erwähnten Bugreport.
Well. Now I started to add some kind of plugin interface to the module. This way one could change the modules behavior in any way. This would solve your problem as well, I think.
Here's some first shot at it:
#!/usr/bin/perl use lib qw(blib/lib); use Config::General qw(ParseConfig); use Data::Dumper;sub ck { my($file, $base) = @_; print “open() tries $file … “; if($file =~ /blah/) { print “ignored\n”; return (0); } else { print “allowed\n”; return (1, @); } }
my %c = ParseConfig( -IncludeGlob => 1, -UseApacheInclude => 1, -ConfigFile => shift, -Plug => { pre_open => *ck } );
print Dumper(%c);
Output:
_open() tries cfg ... allowed _open() tries x/*.conf ... allowed _open() tries x/1.conf ... allowed _open() tries x/2.conf ... allowed _open() tries x/blah.conf ... ignored $VAR1 = { 'niemand' => '2', 'hallo' => '1' };However, I'll need some time to figure out which are the best places for hooks to add. But you'll get the picture.