memoization for injected RPC functions is a very, very good thing
authorjoey <joey@0fa5a96a-9a0e-0410-b3b2-a0fd24251071>
Mon, 13 Aug 2007 07:00:53 +0000 (07:00 +0000)
committerjoey <joey@0fa5a96a-9a0e-0410-b3b2-a0fd24251071>
Mon, 13 Aug 2007 07:00:53 +0000 (07:00 +0000)
IkiWiki/Plugin/external.pm
doc/plugins/write/external.mdwn
plugins/externaldemo

index e3504a30d510b83124516171a307b0a5656488cb..9c31a70eba89edd5e4f5ba9ad2ef6ccc72e29c8d 100644 (file)
@@ -107,6 +107,7 @@ sub rpc_call ($$;@) { #{{{
 } #}}}
 
 package IkiWiki::RPC::XML;
+use Memoize;
 
 sub getvar ($$$) { #{{{
        my $plugin=shift;
@@ -142,6 +143,7 @@ sub inject ($@) { #{{{
                IkiWiki::Plugin::external::rpc_call($plugin, $params{call}, @_)
        };
        eval qq{*$params{name}=\$sub};
+       memoize($params{name}) if $params{memoize};
        return 1;
 } #}}}
 
index ca30dd229b74392c7f184e89381883ba2a5fdffa..3612dd9c3f09517f6e97f338653b33c2508ee0db 100644 (file)
@@ -78,6 +78,9 @@ example, make an RPC call to `inject`. Pass it named parameters "name" and
 "Ikiwiki::rcs_update" and "call" is the RPC call ikiwiki will make whenever
 that function is run.
 
+If the RPC call is memoizable, you can also pass a "memoize" parameter, set
+to 1.
+
 ## Limitations of XML RPC
 
 Since XML RPC can't pass around references to objects, it can't be used
@@ -112,7 +115,8 @@ number of calls.
 Injecting a replacement for a commonly called ikiwiki function
 could result in a lot more RPC calls than expected and slow
 eveything down. `pagetitle`, for instance, is called about 100 times
-per page build.
+per page build. Memoizing injected functions whenever possible is a very
+good idea.
 
 In general, use common sense, and your external plugin will probably
 perform ok.
index 6bbced30ee70cc697e7745a8c478df40ccf81733..1321a4bc52e22c48f317182cc2449a97e522c31d 100755 (executable)
@@ -102,8 +102,9 @@ sub import {
 
        # Here's an example of how to inject an arbitrary function into
        # ikiwiki. Ikiwiki will be able to call bob() just like any other
-       # function.
-       rpc_call("inject", name => "IkiWiki::bob", call => "bob");
+       # function. Note use of automatic memoization.
+       rpc_call("inject", name => "IkiWiki::bob", call => "bob",
+               memoize => 1);
 
        # Here's an exmaple of how to access values in %IkiWiki::config.
        print STDERR "url is set to: ".