src/PHPixie/ORM/Configs/Inflector.php

Summary

Maintainability
A
0 mins
Test Coverage
<?php

namespace PHPixie\ORM\Configs;

class Inflector
{
    protected $pluralRules = array(
        '/^(.*?[sxz])$/i'           => '\\1es',
        '/^(.*?[^aeioudgkprt]h)$/i' => '\\1es',
        '/^(.*?[^aeiou])y$/i'       => '\\1ies',
        '/$/i'                      => 's',
    );

    protected $singularRules = array(
        '/^(.*?us)$/i' => '\\1',
        '/^(.*?[sxz])es$/i' => '\\1',
        '/^(.*?[^aeioudgkprt]h)es$/i' => '\\1',
        '/^(.*?[^aeiou])ies$/i' => '\\1y',
        '/^(.*?)s$/' => '\\1',
    );

    protected $pluralCache = array();
    protected $singularCache = array();

    public function plural($singular)
    {
        if(!isset($this->pluralCache[$singular])) {
            $plural = $this->applySingleRule($singular, $this->pluralRules);
            $this->cachePair($singular, $plural);
        }

        return $this->pluralCache[$singular];
    }

    public function singular($plural)
    {
        if(!isset($this->singularCache[$plural])) {
            $singular = $this->applySingleRule($plural, $this->singularRules);
            $this->cachePair($singular, $plural);
        }
        return $this->singularCache[$plural];
    }

    protected function cachePair($singular, $plural)
    {
        $this->pluralCache[$singular] = $plural;
        $this->singularCache[$plural] = $singular;
    }
    
    protected function applySingleRule($word, $rules)
    {
        foreach ($rules as $pattern => $replacement) {
            $word = preg_replace($pattern, $replacement, $word, -1, $count);
            if ($count > 0)
                break;
        }

        return $word;
    }
}