a77c3e17d88ef60ea09b32733facf07e23bf04fe
[core.git] / inc / main / classes / factories / objects / class_ObjectFactory.php
1 <?php
2 // Own namespace
3 namespace CoreFramework\Factory;
4
5 // Import framework stuff
6 use CoreFramework\Configuration\FrameworkConfiguration;
7
8 /**
9  * An general object factory
10  *
11  * @author              Roland Haeder <webmaster@shipsimu.org>
12  * @version             0.0.0
13  * @copyright   Copyright (c) 2007, 2008 Roland Haeder, 2009 - 2017 Core Developer Team
14  * @license             GNU GPL 3.0 or any newer version
15  * @link                http://www.shipsimu.org
16  *
17  * This program is free software: you can redistribute it and/or modify
18  * it under the terms of the GNU General Public License as published by
19  * the Free Software Foundation, either version 3 of the License, or
20  * (at your option) any later version.
21  *
22  * This program is distributed in the hope that it will be useful,
23  * but WITHOUT ANY WARRANTY; without even the implied warranty of
24  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
25  * GNU General Public License for more details.
26  *
27  * You should have received a copy of the GNU General Public License
28  * along with this program. If not, see <http://www.gnu.org/licenses/>.
29  */
30 class ObjectFactory extends BaseFactory {
31         /**
32          * Protected constructor
33          *
34          * @param       $className      Name of this class
35          * @return      void
36          */
37         protected function __construct ($className = __CLASS__) {
38                 // Call parent constructor
39                 parent::__construct($className);
40         }
41
42         /**
43          * Creates a new object given by the name or throws an exception if
44          * the class was not found. No parameters for the object are currently
45          * supported.
46          *
47          * @param       $className                      Name of the class we shall construct
48          * @param       $args                           Arguments in an indexed array
49          * @return      $objectInstance         An instance of the requested object
50          * @throws      NoClassException        If the requested class was not found
51          * @throws      EmptyVariableException  If a variable is empty unexpectly
52          */
53         public static final function createObjectByName ($className, array $args=array()) {
54                 // First get an instance of this factory
55                 $factoryInstance = new ObjectFactory();
56
57                 // Is the class name valid and is the class there?
58                 if (empty($className)) {
59                         // Throw an exception here
60                         throw new EmptyVariableException(array($factoryInstance, 'className'), self::EXCEPTION_UNEXPECTED_EMPTY_STRING);
61                 } elseif (!class_exists($className)) {
62                         // Then throw an exception
63                         throw new NoClassException(array($factoryInstance, $className), self::EXCEPTION_CLASS_NOT_FOUND);
64                 }
65
66                 // Create method name
67                 $methodName = sprintf('create%s', self::stripNamespaceFromClassName($className));
68
69                 // Run the user function
70                 $objectInstance = call_user_func_array(array($className, $methodName), $args);
71
72                 // Count this one up
73                 self::countObject($className);
74
75                 // Return the prepared instance
76                 return $objectInstance;
77         }
78
79         /**
80          * Creates an object by it's configured name
81          *
82          * @param       $configEnttry           Configuration entry to read
83          * @param       $args                           Arguments in an indexed array
84          * @return      $objectInstance         An instance of the requested object
85          */
86         public static final function createObjectByConfiguredName ($configEntry, array $args=array()) {
87                 // Read the configuration entry
88                 $className = FrameworkConfiguration::getSelfInstance()->getConfigEntry($configEntry);
89
90                 // Send this to the other factory...
91                 $objectInstance = self::createObjectByName($className, $args);
92
93                 // Return the instance
94                 return $objectInstance;
95         }
96
97         /**
98          * Strips of namespace from given class name. An exception is thrown when
99          * there is no namespace found as this is the now the norm for any objects
100          * being created with this object factory.
101          *
102          * @param       $fullClassName  Class name with namespace
103          * @return      $shortClassName Stripped class name (no namespace)
104          * @throws      InvalidClassNameException       If the class name does not follow naming convention
105          */
106         private static function stripNamespaceFromClassName ($fullClassName) {
107                 // The class name should contain at least 2 back-slashes, so split at them
108                 $classNameParts = explode("\\", $fullClassName);
109
110                 // At least 3 parts should be there
111                 if (count($classNameParts) < 3) {
112                         // Namespace scheme is: Project\Package[\SubPackage...]
113                         throw new InvalidClassNameException($fullClassName, self::EXCEPTION_INVALID_CLASS_NAME);
114                 } // END - if
115
116                 // Get last element
117                 $shortClassName = array_pop($classNameParts);
118
119                 // Return it
120                 return $shortClassName;
121         }
122
123 }