<?php function curry($fn) { $args = func_get_args(); $fn = array_shift($args); if (!is_a($fn, 'ReflectionFunction')) $fn = new ReflectionFunction($fn); return function() use ($fn, $args) { $args = array_merge($args, func_get_args()); if (count($args) >= $fn->getNumberOfRequiredParameters()) return $fn->invokeArgs($args); else return call_user_func_array( 'curry', array_merge(array($fn), $args)); }