| 15 | | $testers = array( |
|---|
| 16 | | 'null' => 'LimeTesterScalar', |
|---|
| 17 | | 'integer' => 'LimeTesterInteger', |
|---|
| 18 | | 'boolean' => 'LimeTesterScalar', |
|---|
| 19 | | 'string' => 'LimeTesterString', |
|---|
| 20 | | 'double' => 'LimeTesterDouble', |
|---|
| 21 | | 'array' => 'LimeTesterArray', |
|---|
| 22 | | 'object' => 'LimeTesterObject', |
|---|
| 23 | | 'resource' => 'LimeTesterResource', |
|---|
| 24 | | ); |
|---|
| | 15 | $factory = null; |
|---|
| 32 | | $type = null; |
|---|
| 33 | | |
|---|
| 34 | | if (is_null($value)) |
|---|
| 35 | | { |
|---|
| 36 | | $type = 'null'; |
|---|
| 37 | | } |
|---|
| 38 | | else if (is_object($value) && array_key_exists(get_class($value), self::$testers)) |
|---|
| 39 | | { |
|---|
| 40 | | $type = get_class($value); |
|---|
| 41 | | } |
|---|
| 42 | | else if (is_object($value)) |
|---|
| 43 | | { |
|---|
| 44 | | $class = new ReflectionClass($value); |
|---|
| 45 | | |
|---|
| 46 | | foreach ($class->getInterfaces() as $interface) |
|---|
| 47 | | { |
|---|
| 48 | | if (array_key_exists($interface->getName(), self::$testers)) |
|---|
| 49 | | { |
|---|
| 50 | | $type = $interface->getName(); |
|---|
| 51 | | break; |
|---|
| 52 | | } |
|---|
| 53 | | } |
|---|
| 54 | | |
|---|
| 55 | | $parentClass = $class; |
|---|
| 56 | | |
|---|
| 57 | | while ($parentClass = $parentClass->getParentClass()) |
|---|
| 58 | | { |
|---|
| 59 | | if (array_key_exists($parentClass->getName(), self::$testers)) |
|---|
| 60 | | { |
|---|
| 61 | | $type = $parentClass->getName(); |
|---|
| 62 | | break; |
|---|
| 63 | | } |
|---|
| 64 | | } |
|---|
| 65 | | |
|---|
| 66 | | if (!empty($type)) |
|---|
| 67 | | { |
|---|
| 68 | | // cache the tester |
|---|
| 69 | | self::$testers[$class->getName()] = self::$testers[$type]; |
|---|
| 70 | | } |
|---|
| 71 | | } |
|---|
| 72 | | |
|---|
| 73 | | if (empty($type)) |
|---|
| 74 | | { |
|---|
| 75 | | if (array_key_exists(gettype($value), self::$testers)) |
|---|
| 76 | | { |
|---|
| 77 | | $type = gettype($value); |
|---|
| 78 | | } |
|---|
| 79 | | else |
|---|
| 80 | | { |
|---|
| 81 | | throw new InvalidArgumentException(sprintf('No tester is registered for type "%s"', gettype($value))); |
|---|
| 82 | | } |
|---|
| 83 | | } |
|---|
| 84 | | |
|---|
| 85 | | $class = self::$testers[$type]; |
|---|
| 86 | | |
|---|
| 87 | | return new $class($value); |
|---|
| | 23 | return self::getFactory()->create($value); |
|---|