diff --git a/cake/libs/inflector.php b/cake/libs/inflector.php index de50a82306a..4d18c2effe0 100644 --- a/cake/libs/inflector.php +++ b/cake/libs/inflector.php @@ -273,24 +273,30 @@ function _cache($type, $key, $value = false) { * * @param string $type The type of inflection, either 'singular' or 'plural' * @param array $rules Array of rules to be added. Example usage: - * Inflector::rules('plural', array('/^(inflect)or$/i' => '\1ables')); - * Inflector::rules('plural', array( - * 'rules' => array('/^(inflect)ors$/i' => '\1ables'), - * 'uninflected' => array('dontinflectme'), - * 'irregular' => array('red' => 'redlings') - * )); + * Inflector::rules('plural', array('/^(inflect)or$/i' => '\1ables')); + * Inflector::rules('plural', array( + * 'rules' => array('/^(inflect)ors$/i' => '\1ables'), + * 'uninflected' => array('dontinflectme'), + * 'irregular' => array('red' => 'redlings') + * )); + * @param boolean $reset If true, will unset default inflections for all + * new rules that are being defined in $rules. * @access public * @return void * @static */ - function rules($type, $rules = array()) { + function rules($type, $rules, $reset = false) { $_this =& Inflector::getInstance(); $type = '_'.$type; foreach ($rules as $rule => $pattern) { if (is_array($pattern)) { - $_this->{$type}[$rule] = array_merge($pattern, $_this->{$type}[$rule]); - unset($rules[$rule], $_this->{$type}['cache' . ucfirst($rule)], $_this->{$type}['merged'][$rule]); + if ($reset) { + $_this->{$type}[$rule] = $pattern; + } else { + $_this->{$type}[$rule] = array_merge($pattern, $_this->{$type}[$rule]); + } + unset($rules[$rule], $_this->{$type}['cache' . ucfirst($rule)], $_this->{$type}['merged'][$rule]); } } $_this->{$type}['rules'] = array_merge($rules, $_this->{$type}['rules']); diff --git a/cake/tests/cases/libs/inflector.test.php b/cake/tests/cases/libs/inflector.test.php index 585133eec78..ac32d3385b3 100644 --- a/cake/tests/cases/libs/inflector.test.php +++ b/cake/tests/cases/libs/inflector.test.php @@ -381,6 +381,29 @@ function testCustomSingularRule() { $this->assertEqual(Inflector::singularize('singulars'), 'singulars'); } + function testCustomRuleWithReset() { + $uninflected = array('atlas', 'lapis', 'onibus', 'pires', 'virus', '.*x'); + $pluralIrregular = array('as' => 'ases'); + + Inflector::rules('singular', array( + 'rules' => array('/^(.*)(a|e|o|u)is$/i' => '\1\2l'), + 'uninflected' => $uninflected, + ), true); + + Inflector::rules('plural', array( + 'rules' => array( + '/^(.*)(a|e|o|u)l$/i' => '\1\2is', + ), + 'uninflected' => $uninflected, + 'irregular' => $pluralIrregular + ), true); + + $this->assertEqual(Inflector::pluralize('Alcool'), 'Alcoois'); + $this->assertEqual(Inflector::pluralize('Atlas'), 'Atlas'); + $this->assertEqual(Inflector::singularize('Alcoois'), 'Alcool'); + $this->assertEqual(Inflector::singularize('Atlas'), 'Atlas'); + } + /** * tearDown method *