/**
  * classic factory method for loading a table class
  * usage: $do = DB_DataObject2::factory('person')
  * WARNING - this may emit a include error if the file does not exist..
  * use @ to silence it (if you are sure it is acceptable)
  * eg. $do = @DB_DataObject2::factory('person')
  *
  * table name will eventually be databasename/table
  * - and allow modular dataobjects to be written..
  * (this also helps proxy creation)
  *
  *
  * @param  string  $1  tablename/databasename/query 
  * @param  string  $2  tablename/query 
  * @param  string  $3  bool
  * @access protected
  * @return DataObject|PEAR_Error|Array
  */
 public static function factory()
 {
     if (empty(DB_DataObject2::$CONFIG)) {
         DB_DataObject2::_loadConfig();
     }
     $args = func_get_args();
     switch (count($args)) {
         case 1:
             if (DB_DataObject2::$CONFIG['default_database']) {
                 $database = DB_DataObject2::$CONFIG['default_database'];
             } else {
                 throw new Exception('no default database set');
             }
             if (strpos($args[0], ' ') !== false) {
                 $query = $args[0];
             } else {
                 $table = $args[0];
             }
             break;
         case 2:
         case 3:
             $database = $args[0];
             if (strpos($args[1], ' ') !== false) {
                 $query = $args[1];
                 if (isset($args[2]) && $args[2]) {
                     $array = true;
                 } else {
                     $array = false;
                 }
             } else {
                 $table = $args[1];
             }
             break;
     }
     /* if ($database === '') {
            throw new Exception('no support for default database right now');
        } */
     if (!isset($table) && !isset($query)) {
         if (is_a($this, 'DB_DataObject2') && strlen($this->__table)) {
             $table = $this->__table;
         } else {
             throw new Exception("factory did not receive a table name", DB_DATAOBJECT_ERROR_INVALIDARGS);
         }
     }
     if (isset($table)) {
         $p = isset(DB_DataObject2::$CONFIG['class_prefix']) ? DB_DataObject2::$CONFIG['class_prefix'] : '';
         $class = $p . preg_replace('/[^A-Z0-9]/i', '_', ucfirst(trim($database . '_' . $table)));
         $classname = $class;
         $ce = class_exists($class, false);
         $class = $ce ? $class : DB_DataObject2::_autoloadClass($table, $database);
         // proxy = full|light
         if (!$class && isset(DB_DataObject2::$CONFIG['proxy'])) {
             $proxyMethod = 'getProxy' . DB_DataObject2::$CONFIG['proxy'];
             class_exists('DB_DataObject2_Generator', false) ? '' : (require_once DATAOBJECT2_PATH . '/Generator.php');
             if (isset(DB_DataObject2::$CONFIG['extends'])) {
                 $d = new DB_DataObject2::$CONFIG['extends']();
             } else {
                 $d = new DB_DataObject2();
             }
             $d->__table = $table;
             $d->setDatabase($database);
             if (is_a($ret = $d->_connect(), 'PEAR_Error')) {
                 return $ret;
             }
             $x = new DB_DataObject2_Generator();
             return $x->{$proxyMethod}($d->_database, $table);
         }
         if (!$class) {
             throw new Exception("DB_DataObject2: factory could not find class {$classname} from {$table}", DB_DATAOBJECT_ERROR_INVALIDCONFIG);
         }
         return new $class();
     } elseif (isset($query)) {
         if (isset(DB_DataObject2::$CONFIG['extends'])) {
             $d = new DB_DataObject2::$CONFIG['extends']();
         } else {
             $d = new DB_DataObject2();
         }
         $d->setDatabase($database);
         $d->query($query);
         if ($array) {
             return $d->fetchAllArray();
         } else {
             return $d;
         }
     } else {
         throw new Exception('DB_DataObject2: dont know how to handle no $table and no $query in factory', DB_DATAOBJECT_ERROR_INVALIDARGS);
     }
 }