You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@juneau.apache.org by ja...@apache.org on 2017/03/10 16:51:13 UTC

[17/34] incubator-juneau git commit: Add builder classes for all serializers and parsers.

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/95e832e1/juneau-core/src/main/java/org/apache/juneau/parser/ParserGroupBuilder.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/parser/ParserGroupBuilder.java b/juneau-core/src/main/java/org/apache/juneau/parser/ParserGroupBuilder.java
new file mode 100644
index 0000000..64f9253
--- /dev/null
+++ b/juneau-core/src/main/java/org/apache/juneau/parser/ParserGroupBuilder.java
@@ -0,0 +1,864 @@
+// ***************************************************************************************************************************
+// * 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 org.apache.juneau.parser;
+
+import static org.apache.juneau.BeanContext.*;
+import static org.apache.juneau.parser.ParserContext.*;
+
+import java.util.*;
+
+import org.apache.juneau.*;
+
+/**
+ * Builder class for creating instances of {@link ParserGroup}.
+ */
+public class ParserGroupBuilder {
+
+	private final List<Object> parsers;
+	private final PropertyStore propertyStore;
+
+	/**
+	 * Create an empty parser group builder.
+	 */
+	public ParserGroupBuilder() {
+		this.parsers = new ArrayList<Object>();
+		this.propertyStore = PropertyStore.create();
+	}
+
+	/**
+	 * Clone an existing parser group builder.
+	 * @param copyFrom The parser group that we're copying settings and parsers from.
+	 */
+	public ParserGroupBuilder(ParserGroup copyFrom) {
+		this.parsers = new ArrayList<Object>(Arrays.asList(copyFrom.parsers));
+		this.propertyStore = copyFrom.createPropertyStore();
+	}
+
+	/**
+	 * Registers the specified parsers with this group.
+	 *
+	 * @param p The parsers to append to this group.
+	 * @return This object (for method chaining).
+	 */
+	public ParserGroupBuilder append(Class<?>...p) {
+		parsers.addAll(Arrays.asList(p));
+		return this;
+	}
+
+	/**
+	 * Registers the specified parsers with this group.
+	 *
+	 * @param p The parsers to append to this group.
+	 * @return This object (for method chaining).
+	 */
+	public ParserGroupBuilder append(Parser...p) {
+		parsers.addAll(Arrays.asList(p));
+		return this;
+	}
+
+	/**
+	 * Registers the specified parsers with this group.
+	 *
+	 * @param p The parsers to append to this group.
+	 * @return This object (for method chaining).
+	 */
+	public ParserGroupBuilder append(List<Parser> p) {
+		parsers.addAll(p);
+		return this;
+	}
+
+	/**
+	 * Creates a new {@link ParserGroup} object using a snapshot of the settings defined in this builder.
+	 * <p>
+	 * This method can be called multiple times to produce multiple parser groups.
+	 *
+	 * @return A new {@link ParserGroup} object.
+	 */
+	@SuppressWarnings("unchecked")
+	public ParserGroup build() {
+		List<Parser> l = new ArrayList<Parser>();
+		for (Object p : parsers) {
+			Class<? extends Parser> c = null;
+			PropertyStore ps = propertyStore;
+			if (p instanceof Class) {
+				c = (Class<? extends Parser>)p;
+			} else {
+				// Note that if we added a serializer instance, we want a new instance with this builder's properties
+				// on top of the previous serializer's properties.
+				Parser p2 = (Parser)p;
+				ps = p2.createPropertyStore().copyFrom(propertyStore);
+				c = p2.getClass();
+			}
+			try {
+				l.add(c.getConstructor(PropertyStore.class).newInstance(ps));
+			} catch (Exception e) {
+				throw new RuntimeException("Could not instantiate parser " + c.getName(), e);
+			}
+		}
+		return new ParserGroup(propertyStore, l.toArray(new Parser[l.size()]));
+	}
+
+
+	//--------------------------------------------------------------------------------
+	// Properties
+	//--------------------------------------------------------------------------------
+
+	/**
+	 * Sets a property on all parsers in this group.
+	 *
+	 * @param name The property name.
+	 * @param value The property value.
+	 * @return This object (for method chaining).
+	 * @see PropertyStore#setProperty(String, Object)
+	 */
+	public ParserGroupBuilder property(String name, Object value) {
+		propertyStore.setProperty(name, value);
+		return this;
+	}
+
+	/**
+	 * Sets a set of properties on all parsers in this group.
+	 *
+	 * @param properties The properties to set on this class.
+	 * @return This object (for method chaining).
+	 * @see PropertyStore#setProperties(java.util.Map)
+	 */
+	public ParserGroupBuilder properties(ObjectMap properties) {
+		propertyStore.setProperties(properties);
+		return this;
+	}
+
+	/**
+	 * Adds a value to a SET property on all parsers in this group.
+	 *
+	 * @param name The property name.
+	 * @param value The new value to add to the SET property.
+	 * @return This object (for method chaining).
+	 * @throws ConfigException If property is not a SET property.
+	 */
+	public ParserGroupBuilder addToProperty(String name, Object value) {
+		propertyStore.addToProperty(name, value);
+		return this;
+	}
+
+	/**
+	 * Adds or overwrites a value to a MAP property on all parsers in this group.
+	 *
+	 * @param name The property name.
+	 * @param key The property value map key.
+	 * @param value The property value map value.
+	 * @return This object (for method chaining).
+	 * @throws ConfigException If property is not a MAP property.
+	 */
+	public ParserGroupBuilder putToProperty(String name, Object key, Object value) {
+		propertyStore.putToProperty(name, key, value);
+		return this;
+	}
+
+	/**
+	 * Adds or overwrites a value to a MAP property on all parsers in this group.
+	 *
+	 * @param name The property value.
+	 * @param value The property value map value.
+	 * @return This object (for method chaining).
+	 * @throws ConfigException If property is not a MAP property.
+	 */
+	public ParserGroupBuilder putToProperty(String name, Object value) {
+		propertyStore.putToProperty(name, value);
+		return this;
+	}
+
+	/**
+	 * Removes a value from a SET property on all parsers in this group.
+	 *
+	 * @param name The property name.
+	 * @param value The property value in the SET property.
+	 * @return This object (for method chaining).
+	 * @throws ConfigException If property is not a SET property.
+	 */
+	public ParserGroupBuilder removeFromProperty(String name, Object value) {
+		propertyStore.removeFromProperty(name, value);
+		return this;
+	}
+
+	/**
+	 * Sets the {@link ParserContext#PARSER_trimStrings} property on all parsers in this group.
+	 *
+	 * @param value The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see ParserContext#PARSER_trimStrings
+	 */
+	public ParserGroupBuilder trimStrings(boolean value) {
+		return property(PARSER_trimStrings, value);
+	}
+
+	/**
+	 * Sets the {@link ParserContext#PARSER_strict} property on all parsers in this group.
+	 *
+	 * @param value The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see ParserContext#PARSER_strict
+	 */
+	public ParserGroupBuilder strict(boolean value) {
+		return property(PARSER_strict, value);
+	}
+
+	/**
+	 * Sets the {@link ParserContext#PARSER_inputStreamCharset} property on all parsers in this group.
+	 *
+	 * @param value The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see ParserContext#PARSER_inputStreamCharset
+	 */
+	public ParserGroupBuilder inputStreamCharset(String value) {
+		return property(PARSER_inputStreamCharset, value);
+	}
+
+	/**
+	 * Sets the {@link ParserContext#PARSER_fileCharset} property on all parsers in this group.
+	 *
+	 * @param value The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see ParserContext#PARSER_fileCharset
+	 */
+	public ParserGroupBuilder fileCharset(String value) {
+		return property(PARSER_fileCharset, value);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_beansRequireDefaultConstructor} property on all parsers in this group.
+	 *
+	 * @param value The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_beansRequireDefaultConstructor
+	 */
+	public ParserGroupBuilder beansRequireDefaultConstructor(boolean value) {
+		return property(BEAN_beansRequireDefaultConstructor, value);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_beansRequireSerializable} property on all parsers in this group.
+	 *
+	 * @param value The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_beansRequireSerializable
+	 */
+	public ParserGroupBuilder beansRequireSerializable(boolean value) {
+		return property(BEAN_beansRequireSerializable, value);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_beansRequireSettersForGetters} property on all parsers in this group.
+	 *
+	 * @param value The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_beansRequireSettersForGetters
+	 */
+	public ParserGroupBuilder beansRequireSettersForGetters(boolean value) {
+		return property(BEAN_beansRequireSettersForGetters, value);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_beansRequireSomeProperties} property on all parsers in this group.
+	 *
+	 * @param value The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_beansRequireSomeProperties
+	 */
+	public ParserGroupBuilder beansRequireSomeProperties(boolean value) {
+		return property(BEAN_beansRequireSomeProperties, value);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_beanMapPutReturnsOldValue} property on all parsers in this group.
+	 *
+	 * @param value The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_beanMapPutReturnsOldValue
+	 */
+	public ParserGroupBuilder beanMapPutReturnsOldValue(boolean value) {
+		return property(BEAN_beanMapPutReturnsOldValue, value);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_beanConstructorVisibility} property on all parsers in this group.
+	 *
+	 * @param value The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_beanConstructorVisibility
+	 */
+	public ParserGroupBuilder beanConstructorVisibility(Visibility value) {
+		return property(BEAN_beanConstructorVisibility, value);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_beanClassVisibility} property on all parsers in this group.
+	 *
+	 * @param value The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_beanClassVisibility
+	 */
+	public ParserGroupBuilder beanClassVisibility(Visibility value) {
+		return property(BEAN_beanClassVisibility, value);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_beanFieldVisibility} property on all parsers in this group.
+	 *
+	 * @param value The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_beanFieldVisibility
+	 */
+	public ParserGroupBuilder beanFieldVisibility(Visibility value) {
+		return property(BEAN_beanFieldVisibility, value);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_methodVisibility} property on all parsers in this group.
+	 *
+	 * @param value The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_methodVisibility
+	 */
+	public ParserGroupBuilder methodVisibility(Visibility value) {
+		return property(BEAN_methodVisibility, value);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_useJavaBeanIntrospector} property on all parsers in this group.
+	 *
+	 * @param value The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_useJavaBeanIntrospector
+	 */
+	public ParserGroupBuilder useJavaBeanIntrospector(boolean value) {
+		return property(BEAN_useJavaBeanIntrospector, value);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_useInterfaceProxies} property on all parsers in this group.
+	 *
+	 * @param value The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_useInterfaceProxies
+	 */
+	public ParserGroupBuilder useInterfaceProxies(boolean value) {
+		return property(BEAN_useInterfaceProxies, value);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_ignoreUnknownBeanProperties} property on all parsers in this group.
+	 *
+	 * @param value The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_ignoreUnknownBeanProperties
+	 */
+	public ParserGroupBuilder ignoreUnknownBeanProperties(boolean value) {
+		return property(BEAN_ignoreUnknownBeanProperties, value);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_ignoreUnknownNullBeanProperties} property on all parsers in this group.
+	 *
+	 * @param value The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_ignoreUnknownNullBeanProperties
+	 */
+	public ParserGroupBuilder ignoreUnknownNullBeanProperties(boolean value) {
+		return property(BEAN_ignoreUnknownNullBeanProperties, value);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_ignorePropertiesWithoutSetters} property on all parsers in this group.
+	 *
+	 * @param value The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_ignorePropertiesWithoutSetters
+	 */
+	public ParserGroupBuilder ignorePropertiesWithoutSetters(boolean value) {
+		return property(BEAN_ignorePropertiesWithoutSetters, value);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_ignoreInvocationExceptionsOnGetters} property on all parsers in this group.
+	 *
+	 * @param value The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_ignoreInvocationExceptionsOnGetters
+	 */
+	public ParserGroupBuilder ignoreInvocationExceptionsOnGetters(boolean value) {
+		return property(BEAN_ignoreInvocationExceptionsOnGetters, value);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_ignoreInvocationExceptionsOnSetters} property on all parsers in this group.
+	 *
+	 * @param value The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_ignoreInvocationExceptionsOnSetters
+	 */
+	public ParserGroupBuilder ignoreInvocationExceptionsOnSetters(boolean value) {
+		return property(BEAN_ignoreInvocationExceptionsOnSetters, value);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_sortProperties} property on all parsers in this group.
+	 *
+	 * @param value The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_sortProperties
+	 */
+	public ParserGroupBuilder sortProperties(boolean value) {
+		return property(BEAN_sortProperties, value);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_notBeanPackages_add} property on all parsers in this group.
+	 *
+	 * @param values The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_notBeanPackages_add
+	 */
+	public ParserGroupBuilder notBeanPackages(String...values) {
+		return property(BEAN_notBeanPackages_add, values);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_notBeanPackages_add} property on all parsers in this group.
+	 *
+	 * @param value The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_notBeanPackages_add
+	 */
+	public ParserGroupBuilder notBeanPackages(Collection<String> value) {
+		return property(BEAN_notBeanPackages_add, value);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_notBeanPackages} property on all parsers in this group.
+	 *
+	 * @param values The values to remove from this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_notBeanPackages
+	 */
+	public ParserGroupBuilder setNotBeanPackages(String...values) {
+		return property(BEAN_notBeanPackages, values);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_notBeanPackages} property on all parsers in this group.
+	 *
+	 * @param values The values to remove from this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_notBeanPackages
+	 */
+	public ParserGroupBuilder setNotBeanPackages(Collection<String> values) {
+		return property(BEAN_notBeanPackages, values);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_notBeanPackages_remove} property on all parsers in this group.
+	 *
+	 * @param values The values to remove from this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_notBeanPackages
+	 * @see BeanContext#BEAN_notBeanPackages_remove
+	 */
+	public ParserGroupBuilder removeNotBeanPackages(String...values) {
+		return property(BEAN_notBeanPackages_remove, values);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_notBeanPackages_remove} property on all parsers in this group.
+	 *
+	 * @param values The values to remove from this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_notBeanPackages
+	 * @see BeanContext#BEAN_notBeanPackages_remove
+	 */
+	public ParserGroupBuilder removeNotBeanPackages(Collection<String> values) {
+		return property(BEAN_notBeanPackages_remove, values);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_notBeanClasses_add} property on all parsers in this group.
+	 *
+	 * @param values The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_notBeanClasses_add
+	 */
+	public ParserGroupBuilder notBeanClasses(Class<?>...values) {
+		return property(BEAN_notBeanClasses_add, values);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_notBeanClasses_add} property on all parsers in this group.
+	 *
+	 * @param values The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_notBeanPackages_add
+	 */
+	public ParserGroupBuilder notBeanClasses(Collection<Class<?>> values) {
+		return property(BEAN_notBeanClasses_add, values);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_notBeanClasses} property on all parsers in this group.
+	 *
+	 * @param values The values to add to this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_notBeanClasses
+	 */
+	public ParserGroupBuilder setNotBeanClasses(Class<?>...values) {
+		return property(BEAN_notBeanClasses, values);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_notBeanClasses} property on all parsers in this group.
+	 *
+	 * @param values The values to add to this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_notBeanClasses
+	 */
+	public ParserGroupBuilder setNotBeanClasses(Collection<Class<?>> values) {
+		return property(BEAN_notBeanClasses, values);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_notBeanClasses_remove} property on all parsers in this group.
+	 *
+	 * @param values The values to remove from this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_notBeanClasses_remove
+	 */
+	public ParserGroupBuilder removeNotBeanClasses(Class<?>...values) {
+		return property(BEAN_notBeanClasses_remove, values);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_notBeanClasses_remove} property on all parsers in this group.
+	 *
+	 * @param values The values to remove from this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_notBeanClasses_remove
+	 */
+	public ParserGroupBuilder removeNotBeanClasses(Collection<Class<?>> values) {
+		return property(BEAN_notBeanClasses_remove, values);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_beanFilters_add} property on all parsers in this group.
+	 *
+	 * @param values The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_beanFilters_add
+	 */
+	public ParserGroupBuilder beanFilters(Class<?>...values) {
+		return property(BEAN_beanFilters_add, values);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_beanFilters_add} property on all parsers in this group.
+	 *
+	 * @param values The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_beanFilters_add
+	 */
+	public ParserGroupBuilder beanFilters(Collection<Class<?>> values) {
+		return property(BEAN_beanFilters_add, values);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_beanFilters} property on all parsers in this group.
+	 *
+	 * @param values The values to add to this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_beanFilters
+	 */
+	public ParserGroupBuilder setBeanFilters(Class<?>...values) {
+		return property(BEAN_beanFilters, values);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_beanFilters} property on all parsers in this group.
+	 *
+	 * @param values The values to add to this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_beanFilters
+	 */
+	public ParserGroupBuilder setBeanFilters(Collection<Class<?>> values) {
+		return property(BEAN_beanFilters, values);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_beanFilters_remove} property on all parsers in this group.
+	 *
+	 * @param values The values to remove from this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_beanFilters_remove
+	 */
+	public ParserGroupBuilder removeBeanFilters(Class<?>...values) {
+		return property(BEAN_beanFilters_remove, values);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_beanFilters_remove} property on all parsers in this group.
+	 *
+	 * @param values The values to remove from this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_beanFilters_remove
+	 */
+	public ParserGroupBuilder removeBeanFilters(Collection<Class<?>> values) {
+		return property(BEAN_beanFilters_remove, values);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_pojoSwaps_add} property on all parsers in this group.
+	 *
+	 * @param values The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_pojoSwaps_add
+	 */
+	public ParserGroupBuilder pojoSwaps(Class<?>...values) {
+		return property(BEAN_pojoSwaps_add, values);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_pojoSwaps_add} property on all parsers in this group.
+	 *
+	 * @param values The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_pojoSwaps_add
+	 */
+	public ParserGroupBuilder pojoSwaps(Collection<Class<?>> values) {
+		return property(BEAN_pojoSwaps_add, values);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_pojoSwaps} property on all parsers in this group.
+	 *
+	 * @param values The values to add to this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_pojoSwaps
+	 */
+	public ParserGroupBuilder setPojoSwaps(Class<?>...values) {
+		return property(BEAN_pojoSwaps, values);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_pojoSwaps} property on all parsers in this group.
+	 *
+	 * @param values The values to add to this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_pojoSwaps
+	 */
+	public ParserGroupBuilder setPojoSwaps(Collection<Class<?>> values) {
+		return property(BEAN_pojoSwaps, values);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_pojoSwaps_remove} property on all parsers in this group.
+	 *
+	 * @param values The values to remove from this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_pojoSwaps_remove
+	 */
+	public ParserGroupBuilder removePojoSwaps(Class<?>...values) {
+		return property(BEAN_pojoSwaps_remove, values);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_pojoSwaps_remove} property on all parsers in this group.
+	 *
+	 * @param values The values to remove from this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_pojoSwaps_remove
+	 */
+	public ParserGroupBuilder removePojoSwaps(Collection<Class<?>> values) {
+		return property(BEAN_pojoSwaps_remove, values);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_implClasses} property on all parsers in this group.
+	 *
+	 * @param values The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_implClasses
+	 */
+	public ParserGroupBuilder implClasses(Map<Class<?>,Class<?>> values) {
+		return property(BEAN_implClasses, values);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_implClasses_put} property on all parsers in this group.
+	 *
+	 * @param interfaceClass The interface class.
+	 * @param implClass The implementation class.
+	 * @param <T> The class type of the interface.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_implClasses
+	 * @see BeanContext#BEAN_implClasses_put
+	 */
+	public <T> ParserGroupBuilder implClass(Class<T> interfaceClass, Class<? extends T> implClass) {
+		return putToProperty(BEAN_implClasses, interfaceClass, implClass);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_beanDictionary_add} property on all parsers in this group.
+	 *
+	 * @param values The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_beanDictionary_add
+	 */
+	public ParserGroupBuilder beanDictionary(Class<?>...values) {
+		return property(BEAN_beanDictionary_add, values);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_beanDictionary_add} property on all parsers in this group.
+	 *
+	 * @param values The values to add to this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_beanDictionary_add
+	 */
+	public ParserGroupBuilder beanDictionary(Collection<Class<?>> values) {
+		return property(BEAN_beanDictionary_add, values);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_beanDictionary} property on all parsers in this group.
+	 *
+	 * @param values The values to add to this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_beanDictionary
+	 */
+	public ParserGroupBuilder setBeanDictionary(Class<?>...values) {
+		return property(BEAN_beanDictionary, values);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_beanDictionary} property on all parsers in this group.
+	 *
+	 * @param values The values to add to this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_beanDictionary
+	 */
+	public ParserGroupBuilder setBeanDictionary(Collection<Class<?>> values) {
+		return property(BEAN_beanDictionary, values);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_beanDictionary_remove} property on all parsers in this group.
+	 *
+	 * @param values The values to remove from this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_beanDictionary_remove
+	 */
+	public ParserGroupBuilder removeFromBeanDictionary(Class<?>...values) {
+		return property(BEAN_beanDictionary_remove, values);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_beanDictionary_remove} property on all parsers in this group.
+	 *
+	 * @param values The values to remove from this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_beanDictionary_remove
+	 */
+	public ParserGroupBuilder removeFromBeanDictionary(Collection<Class<?>> values) {
+		return property(BEAN_beanDictionary_remove, values);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_beanTypePropertyName} property on all parsers in this group.
+	 *
+	 * @param value The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_beanTypePropertyName
+	 */
+	public ParserGroupBuilder beanTypePropertyName(String value) {
+		return property(BEAN_beanTypePropertyName, value);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_defaultParser} property on all parsers in this group.
+	 *
+	 * @param value The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_defaultParser
+	 */
+	public ParserGroupBuilder defaultParser(Class<?> value) {
+		return property(BEAN_defaultParser, value);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_locale} property on all parsers in this group.
+	 *
+	 * @param value The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_locale
+	 */
+	public ParserGroupBuilder locale(Locale value) {
+		return property(BEAN_locale, value);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_timeZone} property on all parsers in this group.
+	 *
+	 * @param value The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_timeZone
+	 */
+	public ParserGroupBuilder timeZone(TimeZone value) {
+		return property(BEAN_timeZone, value);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_mediaType} property on all parsers in this group.
+	 *
+	 * @param value The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_mediaType
+	 */
+	public ParserGroupBuilder mediaType(MediaType value) {
+		return property(BEAN_mediaType, value);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_debug} property on all parsers in this group.
+	 *
+	 * @param value The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_debug
+	 */
+	public ParserGroupBuilder debug(boolean value) {
+		return property(BEAN_debug, value);
+	}
+
+	/**
+	 * Specifies the classloader to use when resolving classes from strings for all parsers in this group.
+	 * <p>
+	 * Can be used for resolving class names when the classes being created are in a different
+	 * 	classloader from the Juneau code.
+	 * <p>
+	 * If <jk>null</jk>, the system classloader will be used to resolve classes.
+	 *
+	 * @param classLoader The new classloader.
+	 * @return This object (for method chaining).
+	 * @see PropertyStore#setClassLoader(ClassLoader)
+	 */
+	public ParserGroupBuilder classLoader(ClassLoader classLoader) {
+		propertyStore.setClassLoader(classLoader);
+		return this;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/95e832e1/juneau-core/src/main/java/org/apache/juneau/parser/ParserListener.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/parser/ParserListener.java b/juneau-core/src/main/java/org/apache/juneau/parser/ParserListener.java
index e675f5c..9c01704 100644
--- a/juneau-core/src/main/java/org/apache/juneau/parser/ParserListener.java
+++ b/juneau-core/src/main/java/org/apache/juneau/parser/ParserListener.java
@@ -19,7 +19,7 @@ import org.apache.juneau.*;
  * <p>
  * Listeners can be registered with parsers through the {@link Parser#addListener(ParserListener)} method.
  * <p>
- * It should be noted that listeners are not automatically copied over to new parsers when a parser is cloned.
+ * It should be noted that listeners are not automatically copied over to new parsers when a parser is cloned using the {@link Parser#builder()} method.
  */
 public class ParserListener {
 

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/95e832e1/juneau-core/src/main/java/org/apache/juneau/parser/ReaderParser.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/parser/ReaderParser.java b/juneau-core/src/main/java/org/apache/juneau/parser/ReaderParser.java
index 044038d..12d8677 100644
--- a/juneau-core/src/main/java/org/apache/juneau/parser/ReaderParser.java
+++ b/juneau-core/src/main/java/org/apache/juneau/parser/ReaderParser.java
@@ -12,6 +12,7 @@
 // ***************************************************************************************************************************
 package org.apache.juneau.parser;
 
+import org.apache.juneau.*;
 import org.apache.juneau.annotation.*;
 
 /**
@@ -33,6 +34,14 @@ import org.apache.juneau.annotation.*;
  */
 public abstract class ReaderParser extends Parser {
 
+	/**
+	 * Constructor.
+	 * @param propertyStore The property store containing all the settings for this object.
+	 */
+	protected ReaderParser(PropertyStore propertyStore) {
+		super(propertyStore);
+	}
+
 	@Override /* Parser */
 	public boolean isReaderParser() {
 		return true;

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/95e832e1/juneau-core/src/main/java/org/apache/juneau/parser/package.html
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/parser/package.html b/juneau-core/src/main/java/org/apache/juneau/parser/package.html
index 3c38ac3..ea6b20d 100644
--- a/juneau-core/src/main/java/org/apache/juneau/parser/package.html
+++ b/juneau-core/src/main/java/org/apache/juneau/parser/package.html
@@ -123,7 +123,7 @@
 	}
 	</p>
 	<p>
-		Parsers that take advantage of the entire {@link org.apache.juneau.CoreApi} interface to be able to parse arbitrary beans and POJOs is
+		Parsers that take advantage of the entire {@link org.apache.juneau.CoreObject} interface to be able to parse arbitrary beans and POJOs is
 			considerably more complex and outside the scope of this document.  
 		If developing such a parser, the best course of action would be to replicate what occurs in the {@link org.apache.juneau.json.JsonParser} class.
 	</p>

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/95e832e1/juneau-core/src/main/java/org/apache/juneau/plaintext/PlainTextParser.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/plaintext/PlainTextParser.java b/juneau-core/src/main/java/org/apache/juneau/plaintext/PlainTextParser.java
index 86340c7..1006307 100644
--- a/juneau-core/src/main/java/org/apache/juneau/plaintext/PlainTextParser.java
+++ b/juneau-core/src/main/java/org/apache/juneau/plaintext/PlainTextParser.java
@@ -44,6 +44,24 @@ import org.apache.juneau.transform.*;
 @Consumes("text/plain")
 public final class PlainTextParser extends ReaderParser {
 
+	/** Default parser, all default settings.*/
+	public static final PlainTextParser DEFAULT = new PlainTextParser(PropertyStore.create());
+
+
+	/**
+	 * Constructor.
+	 * @param propertyStore The property store containing all the settings for this object.
+	 */
+	public PlainTextParser(PropertyStore propertyStore) {
+		super(propertyStore);
+	}
+
+	@Override /* CoreObject */
+	public PlainTextParserBuilder builder() {
+		return new PlainTextParserBuilder(propertyStore);
+	}
+
+
 	//--------------------------------------------------------------------------------
 	// Overridden methods
 	//--------------------------------------------------------------------------------
@@ -52,13 +70,4 @@ public final class PlainTextParser extends ReaderParser {
 	protected <T> T doParse(ParserSession session, ClassMeta<T> type) throws Exception {
 		return session.convertToType(IOUtils.read(session.getReader()), type);
 	}
-
-	@Override /* Lockable */
-	public PlainTextParser clone() {
-		try {
-			return (PlainTextParser)super.clone();
-		} catch (CloneNotSupportedException e) {
-			throw new RuntimeException(e); // Shouldn't happen.
-		}
-	}
 }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/95e832e1/juneau-core/src/main/java/org/apache/juneau/plaintext/PlainTextParserBuilder.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/plaintext/PlainTextParserBuilder.java b/juneau-core/src/main/java/org/apache/juneau/plaintext/PlainTextParserBuilder.java
new file mode 100644
index 0000000..febd91f
--- /dev/null
+++ b/juneau-core/src/main/java/org/apache/juneau/plaintext/PlainTextParserBuilder.java
@@ -0,0 +1,457 @@
+// ***************************************************************************************************************************
+// * 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 org.apache.juneau.plaintext;
+
+import java.util.*;
+
+import org.apache.juneau.*;
+import org.apache.juneau.parser.*;
+
+/**
+ * Builder class for building instances of plain-text parsers.
+ */
+public class PlainTextParserBuilder extends ParserBuilder {
+
+	/**
+	 * Constructor, default settings.
+	 */
+	public PlainTextParserBuilder() {
+		super();
+	}
+
+	/**
+	 * Constructor.
+	 * @param propertyStore The initial configuration settings for this builder.
+	 */
+	public PlainTextParserBuilder(PropertyStore propertyStore) {
+		super(propertyStore);
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextParser build() {
+		return new PlainTextParser(propertyStore);
+	}
+
+
+	//--------------------------------------------------------------------------------
+	// Properties
+	//--------------------------------------------------------------------------------
+
+	@Override /* ParserBuilder */
+	public PlainTextParserBuilder trimStrings(boolean value) {
+		super.trimStrings(value);
+		return this;
+	}
+
+	@Override /* ParserBuilder */
+	public PlainTextParserBuilder strict(boolean value) {
+		super.strict(value);
+		return this;
+	}
+
+	@Override /* ParserBuilder */
+	public PlainTextParserBuilder strict() {
+		super.strict();
+		return this;
+	}
+
+	@Override /* ParserBuilder */
+	public PlainTextParserBuilder inputStreamCharset(String value) {
+		super.inputStreamCharset(value);
+		return this;
+	}
+
+	@Override /* ParserBuilder */
+	public PlainTextParserBuilder fileCharset(String value) {
+		super.fileCharset(value);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextParserBuilder beansRequireDefaultConstructor(boolean value) {
+		super.beansRequireDefaultConstructor(value);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextParserBuilder beansRequireSerializable(boolean value) {
+		super.beansRequireSerializable(value);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextParserBuilder beansRequireSettersForGetters(boolean value) {
+		super.beansRequireSettersForGetters(value);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextParserBuilder beansRequireSomeProperties(boolean value) {
+		super.beansRequireSomeProperties(value);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextParserBuilder beanMapPutReturnsOldValue(boolean value) {
+		super.beanMapPutReturnsOldValue(value);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextParserBuilder beanConstructorVisibility(Visibility value) {
+		super.beanConstructorVisibility(value);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextParserBuilder beanClassVisibility(Visibility value) {
+		super.beanClassVisibility(value);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextParserBuilder beanFieldVisibility(Visibility value) {
+		super.beanFieldVisibility(value);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextParserBuilder methodVisibility(Visibility value) {
+		super.methodVisibility(value);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextParserBuilder useJavaBeanIntrospector(boolean value) {
+		super.useJavaBeanIntrospector(value);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextParserBuilder useInterfaceProxies(boolean value) {
+		super.useInterfaceProxies(value);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextParserBuilder ignoreUnknownBeanProperties(boolean value) {
+		super.ignoreUnknownBeanProperties(value);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextParserBuilder ignoreUnknownNullBeanProperties(boolean value) {
+		super.ignoreUnknownNullBeanProperties(value);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextParserBuilder ignorePropertiesWithoutSetters(boolean value) {
+		super.ignorePropertiesWithoutSetters(value);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextParserBuilder ignoreInvocationExceptionsOnGetters(boolean value) {
+		super.ignoreInvocationExceptionsOnGetters(value);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextParserBuilder ignoreInvocationExceptionsOnSetters(boolean value) {
+		super.ignoreInvocationExceptionsOnSetters(value);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextParserBuilder sortProperties(boolean value) {
+		super.sortProperties(value);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextParserBuilder notBeanPackages(String...values) {
+		super.notBeanPackages(values);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextParserBuilder notBeanPackages(Collection<String> values) {
+		super.notBeanPackages(values);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextParserBuilder setNotBeanPackages(String...values) {
+		super.setNotBeanPackages(values);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextParserBuilder setNotBeanPackages(Collection<String> values) {
+		super.setNotBeanPackages(values);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextParserBuilder removeNotBeanPackages(String...values) {
+		super.removeNotBeanPackages(values);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextParserBuilder removeNotBeanPackages(Collection<String> values) {
+		super.removeNotBeanPackages(values);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextParserBuilder notBeanClasses(Class<?>...values) {
+		super.notBeanClasses(values);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextParserBuilder notBeanClasses(Collection<Class<?>> values) {
+		super.notBeanClasses(values);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextParserBuilder setNotBeanClasses(Class<?>...values) {
+		super.setNotBeanClasses(values);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextParserBuilder setNotBeanClasses(Collection<Class<?>> values) {
+		super.setNotBeanClasses(values);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextParserBuilder removeNotBeanClasses(Class<?>...values) {
+		super.removeNotBeanClasses(values);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextParserBuilder removeNotBeanClasses(Collection<Class<?>> values) {
+		super.removeNotBeanClasses(values);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextParserBuilder beanFilters(Class<?>...values) {
+		super.beanFilters(values);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextParserBuilder beanFilters(Collection<Class<?>> values) {
+		super.beanFilters(values);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextParserBuilder setBeanFilters(Class<?>...values) {
+		super.setBeanFilters(values);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextParserBuilder setBeanFilters(Collection<Class<?>> values) {
+		super.setBeanFilters(values);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextParserBuilder removeBeanFilters(Class<?>...values) {
+		super.removeBeanFilters(values);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextParserBuilder removeBeanFilters(Collection<Class<?>> values) {
+		super.removeBeanFilters(values);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextParserBuilder pojoSwaps(Class<?>...values) {
+		super.pojoSwaps(values);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextParserBuilder pojoSwaps(Collection<Class<?>> values) {
+		super.pojoSwaps(values);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextParserBuilder setPojoSwaps(Class<?>...values) {
+		super.setPojoSwaps(values);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextParserBuilder setPojoSwaps(Collection<Class<?>> values) {
+		super.setPojoSwaps(values);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextParserBuilder removePojoSwaps(Class<?>...values) {
+		super.removePojoSwaps(values);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextParserBuilder removePojoSwaps(Collection<Class<?>> values) {
+		super.removePojoSwaps(values);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextParserBuilder implClasses(Map<Class<?>,Class<?>> values) {
+		super.implClasses(values);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public <T> PlainTextParserBuilder implClass(Class<T> interfaceClass, Class<? extends T> implClass) {
+		super.implClass(interfaceClass, implClass);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextParserBuilder beanDictionary(Class<?>...values) {
+		super.beanDictionary(values);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextParserBuilder beanDictionary(Collection<Class<?>> values) {
+		super.beanDictionary(values);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextParserBuilder setBeanDictionary(Class<?>...values) {
+		super.setBeanDictionary(values);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextParserBuilder setBeanDictionary(Collection<Class<?>> values) {
+		super.setBeanDictionary(values);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextParserBuilder removeFromBeanDictionary(Class<?>...values) {
+		super.removeFromBeanDictionary(values);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextParserBuilder removeFromBeanDictionary(Collection<Class<?>> values) {
+		super.removeFromBeanDictionary(values);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextParserBuilder beanTypePropertyName(String value) {
+		super.beanTypePropertyName(value);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextParserBuilder defaultParser(Class<?> value) {
+		super.defaultParser(value);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextParserBuilder locale(Locale value) {
+		super.locale(value);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextParserBuilder timeZone(TimeZone value) {
+		super.timeZone(value);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextParserBuilder mediaType(MediaType value) {
+		super.mediaType(value);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextParserBuilder debug(boolean value) {
+		super.debug(value);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextParserBuilder property(String name, Object value) {
+		super.property(name, value);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextParserBuilder properties(Map<String,Object> properties) {
+		super.properties(properties);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextParserBuilder addToProperty(String name, Object value) {
+		super.addToProperty(name, value);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextParserBuilder putToProperty(String name, Object key, Object value) {
+		super.putToProperty(name, key, value);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextParserBuilder putToProperty(String name, Object value) {
+		super.putToProperty(name, value);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextParserBuilder removeFromProperty(String name, Object value) {
+		super.removeFromProperty(name, value);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextParserBuilder classLoader(ClassLoader classLoader) {
+		super.classLoader(classLoader);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextParserBuilder apply(PropertyStore copyFrom) {
+		super.apply(copyFrom);
+		return this;
+	}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/95e832e1/juneau-core/src/main/java/org/apache/juneau/plaintext/PlainTextSerializer.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/plaintext/PlainTextSerializer.java b/juneau-core/src/main/java/org/apache/juneau/plaintext/PlainTextSerializer.java
index 0cc9dcf..b49380f 100644
--- a/juneau-core/src/main/java/org/apache/juneau/plaintext/PlainTextSerializer.java
+++ b/juneau-core/src/main/java/org/apache/juneau/plaintext/PlainTextSerializer.java
@@ -43,6 +43,24 @@ import org.apache.juneau.transform.*;
 @Produces("text/plain")
 public final class PlainTextSerializer extends WriterSerializer {
 
+	/** Default serializer, all default settings.*/
+	public static final PlainTextSerializer DEFAULT = new PlainTextSerializer(PropertyStore.create());
+
+
+	/**
+	 * Constructor.
+	 * @param propertyStore The property store containing all the settings for this object.
+	 */
+	public PlainTextSerializer(PropertyStore propertyStore) {
+		super(propertyStore);
+	}
+
+	@Override /* CoreObject */
+	public PlainTextSerializerBuilder builder() {
+		return new PlainTextSerializerBuilder(propertyStore);
+	}
+
+
 	//--------------------------------------------------------------------------------
 	// Overridden methods
 	//--------------------------------------------------------------------------------
@@ -51,13 +69,4 @@ public final class PlainTextSerializer extends WriterSerializer {
 	protected void doSerialize(SerializerSession session, Object o) throws Exception {
 		session.getWriter().write(o == null ? "null" : session.convertToType(o, String.class));
 	}
-
-	@Override /* Serializer */
-	public PlainTextSerializer clone() {
-		try {
-			return (PlainTextSerializer)super.clone();
-		} catch (CloneNotSupportedException e) {
-			throw new RuntimeException(e); // Shouldn't happen.
-		}
-	}
 }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/95e832e1/juneau-core/src/main/java/org/apache/juneau/plaintext/PlainTextSerializerBuilder.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/plaintext/PlainTextSerializerBuilder.java b/juneau-core/src/main/java/org/apache/juneau/plaintext/PlainTextSerializerBuilder.java
new file mode 100644
index 0000000..8ab1255
--- /dev/null
+++ b/juneau-core/src/main/java/org/apache/juneau/plaintext/PlainTextSerializerBuilder.java
@@ -0,0 +1,528 @@
+// ***************************************************************************************************************************
+// * 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 org.apache.juneau.plaintext;
+
+import java.util.*;
+
+import org.apache.juneau.*;
+import org.apache.juneau.serializer.*;
+
+/**
+ * Builder class for building instances of plain-text serializers.
+ */
+public class PlainTextSerializerBuilder extends SerializerBuilder {
+
+	/**
+	 * Constructor, default settings.
+	 */
+	public PlainTextSerializerBuilder() {
+		super();
+	}
+
+	/**
+	 * Constructor.
+	 * @param propertyStore The initial configuration settings for this builder.
+	 */
+	public PlainTextSerializerBuilder(PropertyStore propertyStore) {
+		super(propertyStore);
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextSerializer build() {
+		return new PlainTextSerializer(propertyStore);
+	}
+
+
+	//--------------------------------------------------------------------------------
+	// Properties
+	//--------------------------------------------------------------------------------
+
+	@Override /* SerializerBuilder */
+	public PlainTextSerializerBuilder maxDepth(int value) {
+		super.maxDepth(value);
+		return this;
+	}
+
+	@Override /* SerializerBuilder */
+	public PlainTextSerializerBuilder initialDepth(int value) {
+		super.initialDepth(value);
+		return this;
+	}
+
+	@Override /* SerializerBuilder */
+	public PlainTextSerializerBuilder detectRecursions(boolean value) {
+		super.detectRecursions(value);
+		return this;
+	}
+
+	@Override /* SerializerBuilder */
+	public PlainTextSerializerBuilder ignoreRecursions(boolean value) {
+		super.ignoreRecursions(value);
+		return this;
+	}
+
+	@Override /* SerializerBuilder */
+	public PlainTextSerializerBuilder useWhitespace(boolean value) {
+		super.useWhitespace(value);
+		return this;
+	}
+
+	@Override /* SerializerBuilder */
+	public PlainTextSerializerBuilder ws() {
+		super.ws();
+		return this;
+	}
+
+	@Override /* SerializerBuilder */
+	public PlainTextSerializerBuilder addBeanTypeProperties(boolean value) {
+		super.addBeanTypeProperties(value);
+		return this;
+	}
+
+	@Override /* SerializerBuilder */
+	public PlainTextSerializerBuilder quoteChar(char value) {
+		super.quoteChar(value);
+		return this;
+	}
+
+	@Override /* SerializerBuilder */
+	public PlainTextSerializerBuilder sq() {
+		super.sq();
+		return this;
+	}
+
+	@Override /* SerializerBuilder */
+	public PlainTextSerializerBuilder trimNullProperties(boolean value) {
+		super.trimNullProperties(value);
+		return this;
+	}
+
+	@Override /* SerializerBuilder */
+	public PlainTextSerializerBuilder trimEmptyCollections(boolean value) {
+		super.trimEmptyCollections(value);
+		return this;
+	}
+
+	@Override /* SerializerBuilder */
+	public PlainTextSerializerBuilder trimEmptyMaps(boolean value) {
+		super.trimEmptyMaps(value);
+		return this;
+	}
+
+	@Override /* SerializerBuilder */
+	public PlainTextSerializerBuilder trimStrings(boolean value) {
+		super.trimStrings(value);
+		return this;
+	}
+
+	@Override /* SerializerBuilder */
+	public PlainTextSerializerBuilder relativeUriBase(String value) {
+		super.relativeUriBase(value);
+		return this;
+	}
+
+	@Override /* SerializerBuilder */
+	public PlainTextSerializerBuilder absolutePathUriBase(String value) {
+		super.absolutePathUriBase(value);
+		return this;
+	}
+
+	@Override /* SerializerBuilder */
+	public PlainTextSerializerBuilder sortCollections(boolean value) {
+		super.sortCollections(value);
+		return this;
+	}
+
+	@Override /* SerializerBuilder */
+	public PlainTextSerializerBuilder sortMaps(boolean value) {
+		super.sortMaps(value);
+		return this;
+	}
+	@Override /* CoreObjectBuilder */
+	public PlainTextSerializerBuilder beansRequireDefaultConstructor(boolean value) {
+		super.beansRequireDefaultConstructor(value);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextSerializerBuilder beansRequireSerializable(boolean value) {
+		super.beansRequireSerializable(value);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextSerializerBuilder beansRequireSettersForGetters(boolean value) {
+		super.beansRequireSettersForGetters(value);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextSerializerBuilder beansRequireSomeProperties(boolean value) {
+		super.beansRequireSomeProperties(value);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextSerializerBuilder beanMapPutReturnsOldValue(boolean value) {
+		super.beanMapPutReturnsOldValue(value);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextSerializerBuilder beanConstructorVisibility(Visibility value) {
+		super.beanConstructorVisibility(value);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextSerializerBuilder beanClassVisibility(Visibility value) {
+		super.beanClassVisibility(value);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextSerializerBuilder beanFieldVisibility(Visibility value) {
+		super.beanFieldVisibility(value);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextSerializerBuilder methodVisibility(Visibility value) {
+		super.methodVisibility(value);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextSerializerBuilder useJavaBeanIntrospector(boolean value) {
+		super.useJavaBeanIntrospector(value);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextSerializerBuilder useInterfaceProxies(boolean value) {
+		super.useInterfaceProxies(value);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextSerializerBuilder ignoreUnknownBeanProperties(boolean value) {
+		super.ignoreUnknownBeanProperties(value);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextSerializerBuilder ignoreUnknownNullBeanProperties(boolean value) {
+		super.ignoreUnknownNullBeanProperties(value);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextSerializerBuilder ignorePropertiesWithoutSetters(boolean value) {
+		super.ignorePropertiesWithoutSetters(value);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextSerializerBuilder ignoreInvocationExceptionsOnGetters(boolean value) {
+		super.ignoreInvocationExceptionsOnGetters(value);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextSerializerBuilder ignoreInvocationExceptionsOnSetters(boolean value) {
+		super.ignoreInvocationExceptionsOnSetters(value);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextSerializerBuilder sortProperties(boolean value) {
+		super.sortProperties(value);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextSerializerBuilder notBeanPackages(String...values) {
+		super.notBeanPackages(values);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextSerializerBuilder notBeanPackages(Collection<String> values) {
+		super.notBeanPackages(values);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextSerializerBuilder setNotBeanPackages(String...values) {
+		super.setNotBeanPackages(values);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextSerializerBuilder setNotBeanPackages(Collection<String> values) {
+		super.setNotBeanPackages(values);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextSerializerBuilder removeNotBeanPackages(String...values) {
+		super.removeNotBeanPackages(values);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextSerializerBuilder removeNotBeanPackages(Collection<String> values) {
+		super.removeNotBeanPackages(values);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextSerializerBuilder notBeanClasses(Class<?>...values) {
+		super.notBeanClasses(values);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextSerializerBuilder notBeanClasses(Collection<Class<?>> values) {
+		super.notBeanClasses(values);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextSerializerBuilder setNotBeanClasses(Class<?>...values) {
+		super.setNotBeanClasses(values);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextSerializerBuilder setNotBeanClasses(Collection<Class<?>> values) {
+		super.setNotBeanClasses(values);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextSerializerBuilder removeNotBeanClasses(Class<?>...values) {
+		super.removeNotBeanClasses(values);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextSerializerBuilder removeNotBeanClasses(Collection<Class<?>> values) {
+		super.removeNotBeanClasses(values);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextSerializerBuilder beanFilters(Class<?>...values) {
+		super.beanFilters(values);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextSerializerBuilder beanFilters(Collection<Class<?>> values) {
+		super.beanFilters(values);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextSerializerBuilder setBeanFilters(Class<?>...values) {
+		super.setBeanFilters(values);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextSerializerBuilder setBeanFilters(Collection<Class<?>> values) {
+		super.setBeanFilters(values);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextSerializerBuilder removeBeanFilters(Class<?>...values) {
+		super.removeBeanFilters(values);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextSerializerBuilder removeBeanFilters(Collection<Class<?>> values) {
+		super.removeBeanFilters(values);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextSerializerBuilder pojoSwaps(Class<?>...values) {
+		super.pojoSwaps(values);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextSerializerBuilder pojoSwaps(Collection<Class<?>> values) {
+		super.pojoSwaps(values);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextSerializerBuilder setPojoSwaps(Class<?>...values) {
+		super.setPojoSwaps(values);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextSerializerBuilder setPojoSwaps(Collection<Class<?>> values) {
+		super.setPojoSwaps(values);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextSerializerBuilder removePojoSwaps(Class<?>...values) {
+		super.removePojoSwaps(values);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextSerializerBuilder removePojoSwaps(Collection<Class<?>> values) {
+		super.removePojoSwaps(values);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextSerializerBuilder implClasses(Map<Class<?>,Class<?>> values) {
+		super.implClasses(values);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public <T> PlainTextSerializerBuilder implClass(Class<T> interfaceClass, Class<? extends T> implClass) {
+		super.implClass(interfaceClass, implClass);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextSerializerBuilder beanDictionary(Class<?>...values) {
+		super.beanDictionary(values);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextSerializerBuilder beanDictionary(Collection<Class<?>> values) {
+		super.beanDictionary(values);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextSerializerBuilder setBeanDictionary(Class<?>...values) {
+		super.setBeanDictionary(values);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextSerializerBuilder setBeanDictionary(Collection<Class<?>> values) {
+		super.setBeanDictionary(values);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextSerializerBuilder removeFromBeanDictionary(Class<?>...values) {
+		super.removeFromBeanDictionary(values);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextSerializerBuilder removeFromBeanDictionary(Collection<Class<?>> values) {
+		super.removeFromBeanDictionary(values);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextSerializerBuilder beanTypePropertyName(String value) {
+		super.beanTypePropertyName(value);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextSerializerBuilder defaultParser(Class<?> value) {
+		super.defaultParser(value);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextSerializerBuilder locale(Locale value) {
+		super.locale(value);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextSerializerBuilder timeZone(TimeZone value) {
+		super.timeZone(value);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextSerializerBuilder mediaType(MediaType value) {
+		super.mediaType(value);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextSerializerBuilder debug(boolean value) {
+		super.debug(value);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextSerializerBuilder property(String name, Object value) {
+		super.property(name, value);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextSerializerBuilder properties(Map<String,Object> properties) {
+		super.properties(properties);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextSerializerBuilder addToProperty(String name, Object value) {
+		super.addToProperty(name, value);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextSerializerBuilder putToProperty(String name, Object key, Object value) {
+		super.putToProperty(name, key, value);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextSerializerBuilder putToProperty(String name, Object value) {
+		super.putToProperty(name, value);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextSerializerBuilder removeFromProperty(String name, Object value) {
+		super.removeFromProperty(name, value);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextSerializerBuilder classLoader(ClassLoader classLoader) {
+		super.classLoader(classLoader);
+		return this;
+	}
+
+	@Override /* CoreObjectBuilder */
+	public PlainTextSerializerBuilder apply(PropertyStore copyFrom) {
+		super.apply(copyFrom);
+		return this;
+	}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/95e832e1/juneau-core/src/main/java/org/apache/juneau/serializer/OutputStreamSerializer.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/serializer/OutputStreamSerializer.java b/juneau-core/src/main/java/org/apache/juneau/serializer/OutputStreamSerializer.java
index 1c2a2d2..bbfcfb2 100644
--- a/juneau-core/src/main/java/org/apache/juneau/serializer/OutputStreamSerializer.java
+++ b/juneau-core/src/main/java/org/apache/juneau/serializer/OutputStreamSerializer.java
@@ -14,6 +14,7 @@ package org.apache.juneau.serializer;
 
 import java.io.*;
 
+import org.apache.juneau.*;
 import org.apache.juneau.annotation.*;
 import org.apache.juneau.internal.*;
 
@@ -37,7 +38,15 @@ import org.apache.juneau.internal.*;
  */
 public abstract class OutputStreamSerializer extends Serializer {
 
-	@Override /* Serializer */
+	/**
+	 * Constructor.
+	 * @param propertyStore The property store containing all the settings for this object.
+	 */
+	protected OutputStreamSerializer(PropertyStore propertyStore) {
+		super(propertyStore);
+	}
+
+		@Override /* Serializer */
 	public boolean isWriterSerializer() {
 		return false;
 	}