Skip to content

Instantly share code, notes, and snippets.

@k-holy
Created December 8, 2012 23:05
Show Gist options
  • Save k-holy/4242450 to your computer and use it in GitHub Desktop.
Save k-holy/4242450 to your computer and use it in GitHub Desktop.
SmartyFunctionRegistry
<?php
namespace Holy;
/**
* Registry for Smarty plugin/filter functions
*
* @author k.holy74@gmail.com
*/
class SmartyFunctionRegistry
{
/** @var array プラグイン関数の配列 */
private static $functions;
/**
* コンストラクタ
*
* @param array プラグイン関数の配列
*/
public function __construct(array $functions = array())
{
$this->initialize($functions);
}
/**
* オブジェクトを初期化します。
*
* @param array プラグイン関数の配列
*/
public function initialize(array $functions = array())
{
self::$functions = array();
if (!empty($functions)) {
foreach ($functions as $name => $function) {
$this->set($name, $function);
}
}
return $this;
}
/**
* プラグイン関数を登録します。
*
* @param string 登録名
* @param callable 登録する関数
* @return $this
*/
public function set($name, $function)
{
if (!is_callable($function)) {
throw new \InvalidArgumentException(
sprintf('The function "%s" is not callable.', $name));
}
self::$functions[$name] = $function;
return $this;
}
/**
* プラグイン関数を返します。
*
* @param string 登録名
* @return callable プラグイン関数
*/
public static function get($name)
{
if (!isset(self::$functions[$name])) {
throw new \InvalidArgumentException(
sprintf('The callback "%s" is not registered.', $name));
}
return self::$functions[$name];
}
/**
* 引数1の場合は指定された名前のSmartyプラグインを返します。
* 引数2の場合は指定された名前でSmartyプラグインを登録して返します。
*
* Smarty::registerPlugin() ではcallableな配列しか受け付けられないため、
* その他のcallableはこのオブジェクトの __call() 経由で代行させます。
*
* @param string プラグイン名
* @return callable コールバック配列
*/
public function plugin($name)
{
switch (func_num_args()) {
case 1:
$function = self::get($name);
if (!is_string($function) && !is_array($function)) {
return array($this, $name);
}
return $function;
case 2:
$this->set($name, func_get_arg(1));
return $this->plugin($name);
}
throw new \InvalidArgumentException('Invalid argument count.');
}
/**
* 引数1の場合は指定された名前のSmartyフィルタを返します。
* 引数2の場合は指定された名前でSmartyフィルタを登録して返します。
*
* Smarty::registerFilter() では静的callableな配列しか受け付けられないため、
* その他のcallableはこのオブジェクトの __callStatic() 経由で代行させます。
*
* @param string プラグイン名
* @return callable コールバック配列
*/
public function filter($name)
{
switch (func_num_args()) {
case 1:
$function = self::get($name);
if (!is_string($function) &&
(!is_array($function) || !is_string($function[0]))
) {
return array(__CLASS__, $name);
}
return $function;
case 2:
$this->set($name, func_get_arg(1));
return $this->filter($name);
}
throw new \InvalidArgumentException('Invalid argument count.');
}
/**
* 引数3の場合は指定された名前のプラグイン関数を指定された種別のプラグインとしてSmartyに登録します。
* 引数4の場合は指定された名前で、指定されたプラグイン関数を指定された種別のプラグインとしてSmartyに登録します。
*
* @param Smarty
* @param string プラグイン種別
* @param string プラグイン名
* @param callable プラグイン関数 (optional)
*/
public function registerPlugin(\Smarty $smarty, $type, $name)
{
switch (func_num_args()) {
case 3:
$smarty->registerPlugin($type, $name, $this->plugin($name));
return;
case 4:
$smarty->registerPlugin($type, $name, $this->plugin($name, func_get_arg(3)));
return;
}
throw new \InvalidArgumentException('Invalid argument count.');
}
/**
* 引数2の場合は指定された名前のプラグイン関数を修飾子プラグインとしてSmartyに登録します。
* 引数3の場合は指定された名前で、指定されたプラグイン関数を修飾子プラグインとしてSmartyに登録します。
*
* @param Smarty
* @param string プラグイン名
* @param callable プラグイン関数 (optional)
*/
public function registerModifier(\Smarty $smarty, $name)
{
switch (func_num_args()) {
case 2:
$this->registerPlugin($smarty, 'modifier', $name);
return;
case 3:
$this->registerPlugin($smarty, 'modifier', $name, func_get_arg(2));
return;
}
throw new \InvalidArgumentException('Invalid argument count.');
}
/**
* 引数2の場合は指定された名前のプラグインを変数フィルタとしてSmartyに登録します。
* 引数3の場合は指定された名前で、指定されたプラグイン関数を変数フィルタとしてSmartyに登録します。
*
* @param Smarty
* @param string プラグイン名
* @param callable プラグイン関数 (optional)
*/
public function registerVariableFilter(\Smarty $smarty, $name)
{
switch (func_num_args()) {
case 2:
$smarty->registerFilter('variable', $this->filter($name));
return;
case 3:
$smarty->registerFilter('variable', $this->filter($name, func_get_arg(2)));
return;
}
throw new \InvalidArgumentException('Invalid argument count.');
}
/**
* 未定義のスタティックメソッドが呼ばれた際に、メソッド名に該当する
* プラグイン関数名のプラグイン関数が登録されていれば実行します。
*
* @param string メソッド名
* @param array 引数の配列
* @return mixed 実行結果
*/
public static function __callStatic($method, $args)
{
return call_user_func_array(self::get($method), $args);
}
/**
* 未定義のインスタンスメソッドが呼ばれた際に、メソッド名に該当する
* プラグイン関数名のプラグイン関数が登録されていれば実行します。
*
* @param string メソッド名
* @param array 引数の配列
* @return mixed 実行結果
*/
public function __call($method, $args)
{
return static::__callStatic($method, $args);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment