<?php 
/* 
============================================================================================================================================= 
|   This file is part of a project released under the terms of the Xyndravandria PHP License (XyndravandriaPHPLicense.txt).                 | 
|                                                                                                                                           | 
|   You should be given a copy of the Xyndravandria PHP License (XyndravandriaPHPLicense.txt) within the same directory as the README.md;   | 
|   if not, you can get a copy at http://Xyndravandria.ohost.de/XyndravandriaPHPLicense.txt .                                               | 
|                                                                                                                                           | 
|   The copyright (c) of this project is owned by Mauro Di Girolamo <[email protected]>.                                              | 
============================================================================================================================================| 
 
 
 
Xyndravandria Dyverath 
---------------------- 
Alpha 0.0.0 
 
Xyndravandria is the name of a collection of projects designed and developed by Mauro Di Girolamo ([email protected]); he is therefore the copyright (c) owner of Xyndravandria itself and all of its projects. 
 
Xyndravandria Dyverath is released under the terms of the Xyndravandria PHP License (XyndravandriaPHPLicense.txt). You should be given a copy of the Xyndravandria PHP License (XyndravandriaPHPLicense.txt) within the same directory as the README.md; if not, you can get a copy at http://Xyndravandria.ohost.de/XyndravandriaPHPLicense.txt . There might be a release under a freer license for a later, more stable version. 
 
The documentation is either included in ./admin_media/Documentation/ or can be read at http://Xyndravandria.ohost.de/Dyverath/Documentation/. 
 
All projects: 
 
   Xyndravandria Averazain 
   http://github.com/MauroDiGirolamo/Xyndravandria_Averazain 
   PHP 
   Averazain is an Ajax framework supporting also JavaScript disabled clients perfectly - including search engines like Google. 
    
   Xyndravandria Dyverath 
   http://github.com/MauroDiGirolamo/Xyndravandria_Dyverath 
   PHP 
   Dyverath is a database access wrapper. 
    
   Xyndravandria Erozaver 
   http://github.com/MauroDiGirolamo/Xyndravandria_Erozaver 
   PHP 
   Erozaver is a class extending the type hinting given by the PHP engine (additional support for basic type hinting and size constraints). 
    
   Xyndravandria Mondraviel 
   http://github.com/MauroDiGirolamo/Xyndravandria_Mondraviel 
   PHP 
   Mondraviel is a class used to separate HTML from PHP code by firstly register models - files containing place holders embedded in HTML code - and then later fill them dynamically with content by passing values for the place holders. 
*/ 
 
namespace Xyndravandria\Dyverath; 
 
use Xyndravandria\Dyverath\Cache; 
use Xyndravandria\Dyverath\Cacheable; 
use Xyndravandria\Dyverath\RepresentingClass; 
 
/// Baseclass of Server, Database and Table. 
/// @abstract 
abstract class ExtendedRepresentingClass extends RepresentingClass implements Cacheable { 
    
   /// The Cache holding instances of @ref 
   /// ExtendedRepresentingClass 
   /// "ExtendedRepresentingClasses". 
   private static $Cache; 
    
   /// Whether the Cache of this class is enabled. @n 
   /// If the Cache is turned on, any instance of the 
   /// class will be inserted into the Cache and if used 
   /// again, taken from the Cache instead of instancing 
   /// another object. 
   const CacheEnabled = 1; 
    
   /// The @ref ExtendedRepresentingClass 
   /// "ExtendedRepresentingClass's" name. 
   /// <dl class = "type"><dt><b>%Type:</b></dt> 
   /// <dd>string</dd></dl> 
   /// @protected  
   protected $Name = null; 
    
   /// Returns ExtendedRepresentingClass::$Name. 
   /// @public 
   /// @returns string 
   public function Name( ) { 
      return $this->Name; 
   } 
 
   /// Creates a new ExtendedRepresentingClass. 
   /// @public     
   /// @param string $Name: The @ref 
   /// ExtendedRepresentingClass 
   /// "ExtendedRepresentingClass's" 
   /// name. 
   public function __construct( $Name ) { 
      //\settype( $Name, 'string' ); 
      $this->Name = $Name; 
      return; 
   } 
 
   /// Returns the default configuration of this 
   /// ExtendedRepresentingClass. 
   /// @private 
   /// @static 
   /// @returns integer 
   /// @note Overrode 
   /// RepresentingClass::DefaultConfiguration( ). 
   public static function DefaultConfiguration( ) { 
      return self::CacheEnabled; 
   } 
 
   /// Instances of @ref ExtendedRepresentingClass 
   /// "ExtendedRepresentingClasss" selected by 
   /// ExtendedRepresentingClass::Select( ) to be later 
   /// used in ExtendedRepresentingClass::__callStatic. @n 
   /// <dl class = "type"><dt><b>%Type:</b></dt> 
   /// <dd>array of ExtendedRepresentingClass</dd></dl> 
   /// @private  
   /// @static       
   private static $Instance = array( ); 
 
   /// Returns the instance of an 
   /// ExtendedRepresentingClass selected or directly 
   /// calls a method of the instance. 
   /// @public 
   /// @static 
   /// @param string $Method: The method to be called. 
   /// @param array $Argument: An optional array 
   /// containing arguments to be passed to the method. 
   /// @returns ExtendedRepresentingClass or mixed 
   /// @note Both $Method and $Argument are optional 
   /// parameters. @n 
   /// Having said that, @n 
   /// @verbatim Table::Instance( )->Method( 1, 'String' ) == Table::Instance( 'Method', array( 1, 'String' ) ) @endverbatim 
   public static function Instance( $Method = '', array $Argument = array( ) ) { 
      //\settype( $Method, 'string' ); 
      if( ! isset( self::$Instance[ \basename( static::ClassName( ) ) ] ) ) 
         throw new XyndravandriaDyverathException( 'Demanded instance of ExtendedRepresentingClass called "' . $ExtendedRepresentingClass . '" has not been selected yet.' ); 
      else { 
         $Instance = self::$Instance[ \basename( static::ClassName( ) ) ]; 
         if( $Method == '' ) 
            return $Instance; 
         else { 
            $ReflectionMethod = new \ReflectionMethod( $Instance, $Method ); 
            $RequiredParameters = $ReflectionMethod->getNumberOfRequiredParameters( ); 
            if( $RequiredParameters > 0 && $RequiredParameters != \count( $Argument ) ) 
               throw new XyndravandriaDyverathException( 'Argument mismatch: The number of arguments passed to ExtendedRepresentingClass::__callStatic( ) within $Argument[ 1 ] (' . \count( $Argument ) . ') does not match the number of required parameters of to be called method ' . $ExtendedRepresentingClass . '->' . $Method . '( ) (' . $RequiredParameters . ').' ); 
            else 
               return \call_user_func_array( array( $Instance, $Method ), $Argument ); 
         } 
      } 
      return; 
   } 
    
   /// Saves the instance of a class to be later used 
   /// again by calling 
   /// ExtendedRepresentingClass::Instance( ). 
   /// @public 
   /// @returns ExtendedRepresentingClass 
   public function SaveInstance( ) { 
      return self::$Instance[ \basename( static::ClassName( ) ) ] = $this; 
   } 
    
   /// Returns the @ref ExtendedRepresentingClass 
   /// "ExtendedRepresentingClass's" unique 
   /// identifier. 
   /// @public  
   /// @returns string 
   /// @note Required by the CacheAble interface. 
   public function UniqueIdentifier( ) { 
      return $this->Name;   
   } 
 
   /// Returns this @ref ExtendedRepresentingClass 
   /// "ExtendedRepresentingClass's" Cache. 
   /// @public 
   /// @static     
   /// @returns Cache 
   /// @note Required by the Cacheable interface. 
   public static function Cache( ) { 
      isset( self::$Cache[ static::ClassName( ) ] ) || self::$Cache[ static::ClassName( ) ] = new Cache( static::ClassName( ) ); 
      return self::$Cache[ static::ClassName( ) ]; 
   } 
    
} 
?> 
 
 |