/**
  * The element handler functions for the XML parser
  * 
  * @link  http://www.php.net/manual/en/function.xml-set-element-handler.php
  */
 protected function xmlStartTag($parser, $name, $attribs)
 {
     # convert attributes to phpType
     foreach ($attribs as &$value) {
         $value = self::phpize($value);
     }
     switch ($name) {
         case 'writer':
             if (isset($attribs['format']) === false) {
                 throw new EngineException('Writter Tag Missing Format');
             }
             if (isset($attribs['platform']) === false) {
                 throw new EngineException('Writer Tag Missing Platform');
             }
             $platform = $attribs['platform'];
             $format = $attribs['format'];
             unset($attribs['format']);
             unset($attribs['platform']);
             $this->builder->addWriter($platform, $format, $attribs);
             break;
         case 'schema':
             if (isset($attribs['name']) === false) {
                 throw new EngineException('Schema Tag Missing Name');
             }
             $this->builder->addSchema($attribs['name'], $attribs);
             break;
         case 'table':
             if (isset($attribs['name']) === false) {
                 throw new EngineException('Table Tag Missing Name');
             }
             $this->builder->addTable($attribs['name'], $attribs);
             break;
         case 'column':
             if (isset($attribs['name']) === false) {
                 throw new EngineException('Column Tag Missing Name');
             }
             $this->builder->addColumn($attribs['name'], $attribs);
             break;
         case 'datatype':
             if (isset($attribs['name']) === false) {
                 throw new EngineException('Datatype Tag Missing Name');
             }
             $this->builder->addType($attribs['name'], $attribs);
             break;
         case 'option':
             if (isset($attribs['name']) === false) {
                 throw new EngineException('Have Type Option Tag Missing Name Attribute');
             }
             if (isset($attribs['value']) === false) {
                 throw new EngineException('Have Type Option Tag Missing Value Attribute');
             }
             $this->builder->setTypeOption($attribs['name'], $attribs['value']);
             break;
         case 'foreign-key':
             if (isset($attribs['name']) === false) {
                 throw new EngineException('Foreign-key must have a name unique name try foreignTable.foriegnColumn');
             }
             $this->builder->addForeignKey($attribs['name'], $attribs);
             break;
         case 'alternate':
         case 'pick':
         case 'random':
         case 'when':
         case 'swap':
             $this->builder->addSelector($name, $attribs);
             break;
         default:
             throw new EngineException(sprintf('Tag name %s unknown', $name));
     }
 }