public function set($property, $value)
        {
            if (!is_string($property) || empty($property)) {
                throw new Exception(
                        'Invalid argument: $property must be a non-empty string');
            }

            $method = 'set' . self::_normalizePropertyName($property);

            if ($method != 'setOptions' && $method != 'setConfig' &&
                method_exists($this, $method)) {
                $this->$method($value);
            } else {
                $this->_properties[$property] = $value;
            }

            return $this;
        }