<?php
/**
 * File containing ezcDocumentBBCodeOptions class.
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
 * @package Document
 * @version //autogen//
 * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
 */

/**
 * Class containing the basic options for the ezcDocumentBBCode.
 *
 * @package Document
 * @version //autogen//
 */
class ezcDocumentBBCodeOptions extends ezcDocumentOptions
{
    /**
     * Constructs an object with the specified values.
     *
     * @throws ezcBasePropertyNotFoundException
     *         if $options contains a property not defined
     * @throws ezcBaseValueException
     *         if $options contains a property with a value not allowed
     * @param array(string=>mixed) $options
     */
    public function __construct( array $options = array() )
    {
        $this->properties['tags'] = new ArrayObject();
        $this->properties['tags']['b']     = new ezcDocumentBBCodeEmphasisPlugin();
        $this->properties['tags']['i']     = new ezcDocumentBBCodeEmphasisPlugin();
        $this->properties['tags']['u']     = new ezcDocumentBBCodeEmphasisPlugin();
        $this->properties['tags']['size']  = new ezcDocumentBBCodeNoMarkupPlugin();
        $this->properties['tags']['color'] = new ezcDocumentBBCodeNoMarkupPlugin();
        $this->properties['tags']['quote'] = new ezcDocumentBBCodeQuotePlugin();
        $this->properties['tags']['url']   = new ezcDocumentBBCodeUrlPlugin();
        $this->properties['tags']['email'] = new ezcDocumentBBCodeEmailPlugin();
        $this->properties['tags']['img']   = new ezcDocumentBBCodeImagePlugin();

        parent::__construct( $options );
    }

    /**
     * Sets the option $name to $value.
     *
     * @throws ezcBasePropertyNotFoundException
     *         if the property $name is not defined
     * @throws ezcBaseValueException
     *         if $value is not correct for the property $name
     * @param string $name
     * @param mixed $value
     * @ignore
     */
    public function __set( $name, $value )
    {
        switch ( $name )
        {
            /*
            case 'tokenizer':
                if ( !is_object( $value ) ||
                     !( $value instanceof ezcDocumentBBCodeTokenizer ) )
                {
                    throw new ezcBaseValueException( $name, $value, 'instanceof ezcDocumentBBCodeTokenizer' );
                }

                $this->properties[$name] = $value;
                break;
            */

            default:
                parent::__set( $name, $value );
        }
    }
}

?>
