1: <?php
2:
3: /**
4: * Picon Framework
5: * http://code.google.com/p/picon-framework/
6: *
7: * Copyright (C) 2011-2012 Martin Cassidy <martin.cassidy@webquub.com>
8:
9: * Picon Framework is free software: you can redistribute it and/or modify
10: * it under the terms of the GNU General Public License as published by
11: * the Free Software Foundation, either version 3 of the License, or
12: * (at your option) any later version.
13:
14: * Picon Framework is distributed in the hope that it will be useful,
15: * but WITHOUT ANY WARRANTY; without even the implied warranty of
16: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17: * General Public License for more details.
18:
19: * You should have received a copy of the GNU General Public License
20: * along with Picon Framework. If not, see <http://www.gnu.org/licenses/>.
21: * */
22:
23: namespace picon;
24:
25: /**
26: * Represents the identity of a class, the class name and the namespace
27: *
28: * @author Martin Cassidy
29: * @package domain
30: */
31: class Identifier extends ComonDomainBase
32: {
33: private $namespace;
34: private $className;
35:
36: private function __construct($namespace, $className)
37: {
38: $this->namespace = $namespace;
39: $this->className = $className;
40: }
41:
42: /**
43: *
44: * @return string the full name, including namespace, for the Identifier
45: */
46: public function getFullyQualifiedName()
47: {
48: return $this->namespace."\\".$this->className;
49: }
50:
51: /**
52: * Create a new Identifier for the class of which the given object is an instance of
53: * @param object $object
54: * @return Identifier
55: */
56: public static function forObject($object)
57: {
58: if(!is_object($object))
59: {
60: throw new \InvalidArgumentException(sprintf("Expected argument 1 to be an object not %s", gettype($object)));
61: }
62: $reflection = new \ReflectionClass($object);
63: return new self($reflection->getNamespaceName(), $reflection->getShortName());
64: }
65:
66: /**
67: * Create a new Identifier for a class of given name
68: * @param string $name The name of the class, including the namespace if it has one
69: * @return Identifier
70: */
71: public static function forName($name)
72: {
73: if(!class_exists($name) && !interface_exists($name))
74: {
75: throw new \InvalidArgumentException(sprintf("The class %s is not declared.", $name));
76: }
77: $reflection = new \ReflectionClass($name);
78: return new self($reflection->getNamespaceName(), $reflection->getShortName());
79: }
80:
81: /**
82: *
83: * @param object $object
84: */
85: public function equals($object)
86: {
87: if(!($object instanceof Identifier))
88: {
89: return false;
90: }
91:
92: if($object->className==$this->className && $object->namespace==$this->namespace)
93: {
94: return true;
95: }
96: return false;
97: }
98:
99: /**
100: * Checks whether this identifier is the same or is a child of the given
101: * identifier. Checks for equality, sub class or interface implementation
102: * @param Identifier $object The identifier to check against
103: * @return boolean
104: */
105: public function of($object)
106: {
107: if(!($object instanceof Identifier))
108: {
109: return false;
110: }
111:
112: return in_array($this->getFullyQualifiedName(), class_implements($object->getFullyQualifiedName())) || is_subclass_of($this->getFullyQualifiedName(), $object->getFullyQualifiedName()) || $object->getFullyQualifiedName()==$this->getFullyQualifiedName();
113: }
114: }
115:
116: ?>
117: