public function bindModel($alias, $options = array()) {
        if ($alias instanceof Garp_Model_Db) {
            $alias = get_class($alias);
        }

        if (!is_array($options) && !$options instanceof Garp_Util_Configuration) {
            throw new Exception('$options must be an array or Garp_Util_Configuration');
        }

        if (empty($options['modelClass'])
            && empty($options['rule'])
            && substr($alias, 0, 6) !== 'Model_'
        ) {
            // Assume $alias is actually a rule and fetch the required info from
            // the reference.
            $referenceMap = $this->_getReferenceMapNormalized();
            if (empty($referenceMap[$alias])) {
                throw new Exception(
                    'Not enough options given. Alias ' . $alias . ' is not usable as a rule.'
                );
            }
            $reference = $referenceMap[$alias];
            $options['modelClass'] = $reference['refTableClass'];
            $options['rule'] = $alias;
        }

        if (is_array($options)) {
            $options = new Garp_Util_Configuration($options);
        }
        $this->notifyObservers('beforeBindModel', array($this, $alias, &$options));
        Garp_Model_Db_BindingManager::storeBinding(get_class($this), $alias, $options);
        return $this;
    }