public function &createComponentSpec($tag_name)
 {
     $return_value = null;
     $tag_name = strtolower($tag_name);
     if (key_exists($tag_name, $this->_component_tags)) {
         $component_tag = $this->_component_tags[$tag_name];
         $component_class = $component_tag->getComponentClass();
         $component_writer_class = $component_tag->getComponentWriterClass($this->_client);
         $component_writer_decorators_classes = $component_tag->getComponentWriterDecoratorClasses($this->_client);
         $return_value = new __ComponentSpec($tag_name, $component_class);
         if ($component_writer_class != null) {
             $component_writer = new $component_writer_class();
             foreach ($component_writer_decorators_classes as $component_writer_decorators_class) {
                 $component_decorator = new $component_writer_decorators_class($component_writer);
                 $component_writer = $component_decorator;
                 unset($component_decorator);
             }
             $view_definition = $component_tag->getViewDefinition($this->_client);
             if ($view_definition != null) {
                 if ($component_writer instanceof __ICompositeWriter) {
                     $component_writer->setViewDefinition($view_definition);
                 } else {
                     throw __ExceptionFactory::getInstance()->createException('Class ' . $component_writer_class . ' must implement __ICompositeWriter in order to have a view assigned to.');
                 }
             }
             $return_value->setWriter($component_writer);
         }
         $component_interface_spec = $component_tag->getComponentInterfaceSpec();
         if ($component_interface_spec != null) {
             $return_value->setComponentInterfaceSpec($component_interface_spec);
         }
     } else {
         throw __ExceptionFactory::getInstance()->createException('ERR_UNKNOW_UI_COMPONENT_TAG', array($tag_name));
     }
     return $return_value;
 }