X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/blobdiff_plain/506bcbac0420a46997ad531961d543e62c011513..93930176422d27cb3f18de9e8569545e228da192:/plugins/externaldemo?ds=sidebyside

diff --git a/plugins/externaldemo b/plugins/externaldemo
index 6bbced30e..24861dcc9 100755
--- a/plugins/externaldemo
+++ b/plugins/externaldemo
@@ -8,7 +8,6 @@ use strict;
 print STDERR "externaldemo plugin running as pid $$\n";
 
 use RPC::XML;
-use RPC::XML::Parser;
 use IO::Handle;
 
 # autoflush stdout
@@ -23,14 +22,27 @@ sub rpc_read {
 	while (<>) {
 		$accum.=$_;
 
-		# Kinda hackish approch to parse a single XML RPC out of the
-		# accumulated input. Relies on calls always ending with a
-		# newline, which ikiwiki's protocol requires be true.
+		# Kinda hackish approach to parse a single XML RPC out of the
+		# accumulated input. Perl's RPC::XML library doesn't
+		# provide a better way to do it. Relies on calls always ending
+		# with a newline, which ikiwiki's protocol requires be true.
 		if ($accum =~ /^\s*(<\?xml\s.*?<\/(?:methodCall|methodResponse)>)\n(.*)/s) {
 			$accum=$2; # the rest
 	
 			# Now parse the XML RPC.
-			my $r = RPC::XML::Parser->new->parse($1);
+			my $parser;
+			eval q{
+				use RPC::XML::ParserFactory;
+				$parser = RPC::XML::ParserFactory->new;
+			};
+			if ($@) {
+				# old interface
+				eval q{
+					use RPC::XML::Parser;
+					$parser = RPC::XML::Parser->new;
+				};
+			}
+			my $r=$parser->parse($1);
 			if (! ref $r) {
 				die "error: XML RPC parse failure $r";
 			}
@@ -100,15 +112,15 @@ sub import {
 	# stage of ikiwiki.
 	rpc_call("hook", type => "preprocess", id => "externaldemo", call => "preprocess");
 
-	# 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");
-
 	# Here's an exmaple of how to access values in %IkiWiki::config.
 	print STDERR "url is set to: ".
 		rpc_call("getvar", "config", "url")."\n";
 
+	# Here's an example of how to inject an arbitrary function into
+	# ikiwiki. Note use of automatic memoization.
+	rpc_call("inject", name => "IkiWiki::bob",
+		call => "formattime", memoize => 1);
+
 	print STDERR "externaldemo plugin successfully imported\n";
 }