From: Aaron Schulz Date: Mon, 18 Mar 2013 23:16:51 +0000 (-0700) Subject: Added a PoolCounterWorkViaCallback convenience class. X-Git-Tag: 1.31.0-rc.0~20271^2 X-Git-Url: http://git.cyclocoop.org/%22%20.%20generer_url_aide%28?a=commitdiff_plain;h=1575b24f5912df8131789e390e6f16cae739c1d0;p=lhc%2Fweb%2Fwiklou.git Added a PoolCounterWorkViaCallback convenience class. Change-Id: I1cbb2cc8a43eea2d28f38cfd2d3a4908dc7d0da9 --- diff --git a/includes/AutoLoader.php b/includes/AutoLoader.php index 713623223c..42cea7a7b5 100644 --- a/includes/AutoLoader.php +++ b/includes/AutoLoader.php @@ -194,6 +194,7 @@ $wgAutoloadLocalClasses = array( 'PoolCounter' => 'includes/PoolCounter.php', 'PoolCounter_Stub' => 'includes/PoolCounter.php', 'PoolCounterWork' => 'includes/PoolCounter.php', + 'PoolCounterWorkViaCallback' => 'includes/PoolCounter.php', 'PoolWorkArticleView' => 'includes/WikiPage.php', 'Preferences' => 'includes/Preferences.php', 'PreferencesForm' => 'includes/Preferences.php', diff --git a/includes/PoolCounter.php b/includes/PoolCounter.php index 2ebef04e3e..01a2047064 100644 --- a/includes/PoolCounter.php +++ b/includes/PoolCounter.php @@ -142,7 +142,7 @@ class PoolCounter_Stub extends PoolCounter { } /** - * Handy class for dealing with PoolCounters using class members instead of callbacks. + * Class for dealing with PoolCounters using class members */ abstract class PoolCounterWork { protected $cacheable = false; //Does this override getCachedWork() ? @@ -244,3 +244,73 @@ abstract class PoolCounterWork { $this->poolCounter = PoolCounter::factory( $type, $key ); } } + +/** + * Convenience class for dealing with PoolCounters using callbacks + * @since 1.22 + */ +class PoolCounterWorkViaCallback extends PoolCounterWork { + /** @var callable */ + protected $doWork; + /** @var callable|null */ + protected $doCachedWork; + /** @var callable|null */ + protected $fallback; + /** @var callable|null */ + protected $error; + + /** + * Build a PoolCounterWork class from a type, key, and callback map. + * + * The callback map must at least have a callback for the 'doWork' method. + * Additionally, callbacks can be provided for the 'doCachedWork', 'fallback', + * and 'error' methods. Methods without callbacks will be no-ops that return false. + * If a 'doCachedWork' callback is provided, then execute() may wait for any prior + * process in the pool to finish and reuse its cached result. + * + * @param string $type + * @param string $key + * @param array $callbacks Map of callbacks + * @throws MWException + */ + public function __construct( $type, $key, array $callbacks ) { + parent::__construct( $type, $key ); + foreach ( array( 'doWork', 'doCachedWork', 'fallback', 'error' ) as $name ) { + if ( isset( $callbacks[$name] ) ) { + if ( !is_callable( $callbacks[$name] ) ) { + throw new MWException( "Invalid callback provided for '$name' function." ); + } + $this->$name = $callbacks[$name]; + } + } + if ( !isset( $this->doWork ) ) { + throw new MWException( "No callback provided for 'doWork' function." ); + } + $this->cacheable = isset( $this->doCachedWork ); + } + + public function doWork() { + return call_user_func_array( $this->doWork, array() ); + } + + public function getCachedWork() { + if ( $this->doCachedWork ) { + return call_user_func_array( $this->doCachedWork, array() ); + } + return false; + } + + function fallback() { + if ( $this->fallback ) { + return call_user_func_array( $this->fallback, array() ); + } + return false; + } + + function error( $status ) { + if ( $this->error ) { + return call_user_func_array( $this->error, array( $status ) ); + } + return false; + } +}