/**
  * Will get the desired objects as long as they're configured correctly
  *
  * i.e. var $hasMany = array('Class Name' => 'fieldName in that table');
  * e.g. var $hasMany = array('Expense' => 'categoryID'); // would go in the ExpenseCategory object
  *
  * Has And Belongs To Many - $habtm - objects we're joined to via record_record or a join table
  *
  *				Special option keys for $additionalFinderOpts:
  *					'associations' - 	BOOL default false - if you only want the association objects and not the actual objects themselves pass this in
  *										*NOTE* applies only to record_record
  */
 public function get($getKey, $additionalFinderOpts = NULL)
 {
     $className = ucfirst($getKey);
     $internalVarName = self::INTERNAL_VAR_PREFIX . $className;
     if (!$this->{$internalVarName} || !is_null($additionalFinderOpts)) {
         // has many
         if (array_key_exists($className, $this->hasMany)) {
             if (!$this->id) {
                 return array();
             }
             $classNameToFind = $this->hasMany[$className]['className'] ? $this->hasMany[$className]['className'] : $className;
             $opts = array('where' => $this->hasMany[$className]['field'] . " = '" . $this->id . "'");
             if ($this->hasMany[$className]['condition']) {
                 $opts['where'] .= ' AND ' . $this->hasMany[$className]['condition'];
             }
             if (is_null($additionalFinderOpts)) {
                 $opts['order'] = $this->hasMany[$className]['order'];
                 if ($this->hasMany[$className]['finderOpts']) {
                     $opts = Finder::optionMerge($opts, $this->hasMany[$className]['finderOpts']);
                 }
                 $this->{$internalVarName} = Finder::factory($classNameToFind)->findAll($opts);
                 // cache this object in the found object
                 foreach ($this->{$internalVarName} as $foundObj) {
                     if (array_key_exists($this->getClass(), $foundObj->belongsTo)) {
                         $foundObj->set($this->getClass(), $this);
                     }
                 }
             } else {
                 $opts = Finder::optionMerge($opts, $additionalFinderOpts);
                 return Finder::factory($classNameToFind)->findAll($opts);
             }
             // belongs to
         } elseif (array_key_exists($className, $this->belongsTo)) {
             // this is a special keyword for tables with: className and recordID
             if ($className == 'Object') {
                 $this->{$internalVarName} = Finder::factory($this->className)->find($this->recordID);
             } else {
                 $foreignKey = $this->belongsTo[$className]['field'];
                 $classNameToFind = $this->belongsTo[$className]['className'] ? $this->belongsTo[$className]['className'] : $className;
                 $this->{$internalVarName} = Finder::factory($classNameToFind)->find($this->{$foreignKey});
             }
             // has and belongs to many
         } elseif (array_key_exists($className, $this->habtm)) {
             if (!$this->id()) {
                 return array();
             }
             // via the Associator
             if ($this->habtm[$className]['table'] == 'record_record') {
                 $classNameToFind = $this->habtm[$className]['className'] ? $this->habtm[$className]['className'] : $className;
                 $associator = new Associator();
                 $objectFinderOpts = array();
                 if ($this->habtm[$className]['condition']) {
                     $opts['where'] = $this->habtm[$className]['condition'];
                 }
                 if ($this->habtm[$className]['objectFinderOpts']) {
                     $objectFinderOpts = Finder::optionMerge($opts, $this->habtm[$className]['objectFinderOpts']);
                 }
                 // return only the associations, not the objects themselves
                 if ($additionalFinderOpts['associations']) {
                     $refObj = new ReflectionClass(ucfirst($className));
                     return $associator->findAssociations($refObj->getStaticPropertyValue('tableName'), $this->getTableName(), $this->id());
                 }
                 if ($additionalFinderOpts) {
                     $objectFinderOpts = Finder::optionMerge($additionalFinderOpts, $objectFinderOpts);
                 }
                 $this->{$internalVarName} = $associator->findAllObjectsForClassWithTableAndRecord($classNameToFind, $this->getTableName(), $this->id(), $opts, $objectFinderOpts);
                 // TODO: any join table
             } else {
                 $joinTable = $this->habtm[$className]['table'];
                 $associationForeignKey = $this->habtm[$className]['associationForeignKey'];
                 $foreignKey = $this->habtm[$className]['foreignKey'];
                 $ro = new ReflectionClass($className);
                 $instance = $ro->newInstance();
                 $tableName = $instance->getTableName();
                 $finder = new Finder($instance);
                 // more generic join tables
                 if (isset($this->habtm[$className]['typeKey']) && isset($this->habtm[$className]['typeValue'])) {
                     $typeKey = $this->habtm[$className]['typeKey'];
                     $typeValue = $this->habtm[$className]['typeValue'];
                     $additionalAnd = " AND jt." . $typeKey . "='{$typeValue}' ";
                 }
                 $sql = "SELECT activeRecord.* FROM {$joinTable} AS jt, {$tableName} as activeRecord\n\t\t\t\t\t\t\t\tWHERE jt." . $associationForeignKey . "=activeRecord.id\n\t\t\t\t\t\t\t\tAND activeRecord.siteID='" . $this->siteID . "'\n\t\t\t\t\t\t\t\tAND jt." . $foreignKey . "='" . $this->id . "'\n\t\t\t\t\t\t\t\t{$additionalAnd}";
                 $this->{$internalVarName} = $finder->findAllWithSql($sql, $additionalFinderOpts);
             }
             // try extras for ease
         } elseif ($this->hasExtra($getKey)) {
             return $this->getExtras($getKey);
             // error
         } else {
             //dump( $this->habtm );
             throw new Exception("<br/><br/>-----oh crap you haven't configured your objects correctly for CLASSNAME: " . $className . "---------<br/><br/>");
         }
     }
     return $this->{$internalVarName};
 }