<?php

  
require_once("QuerySet.class.php");
  require_once(
"Expression.class.php");

  abstract class 
Model {

    
/**
     * Manually define SQL table name
     */
    
const table_name "";

    
/**
     * Determines the SQL table name used by this object.
     * It can be manually defined by the table_name constant
     * or be automatically determined by lowercasing and
     * pluralizing the class name.
     *
     * i.e. "User" becomes "users", etc
     *
     * @return string
     */
    
public static function table_name() {

      
$called_class get_called_class();
      
$default = eval("return {$called_class}::table_name;");

      if (
$default) {

        
// use manual table name
        
return $default;

      } else {

        
$table strtolower($called_class);
        if (
substr($table, -1) == "y") {
          
// ends with Y ('bunny' should become 'bunnies')
          
$table substr_replace($table"ies", -1);
        } elseif (
substr($table, -1) == "s") {
          
// ends with S ('class' should become 'classes')
          
$table substr_replace($table"es", -1);
        } else {
          
// just append an s
          
$table .= "s";
        }
        return 
$table;

      }

    }

    
/**
     * Return this object as a string
     *
     * @return string
     */
    
public function __toString() {
      return 
get_called_class();
    }

    
/**
     * Get a QuerySet for this Model
     *
     * @return QuerySet
     */
    
public static function get() {
      
$args func_get_args();
      return new 
QuerySet(get_called_class(), $args);
    }

  }