Show:
                            var PropertyBuilderFieldSupport,
                            
                                isArrayList = function(val) {
                                    return A.instanceOf(val, A.ArrayList);
                                };
                            
                            /**
                             * A base class for `A.PropertyBuilderFieldSupport`.
                             *
                             * @class A.PropertyBuilderFieldSupport
                             * @constructor
                             */
                            var PropertyBuilderFieldSupport = function() {};
                            
                            /**
                             * Static property used to define the default attribute
                             * configuration for the `A.PropertyBuilderFieldSupport`.
                             *
                             * @property ATTRS
                             * @type Object
                             * @static
                             */
                            PropertyBuilderFieldSupport.ATTRS = {
                            
                                /**
                                 * The collection of fields.
                                 *
                                 * @attribute fields
                                 * @default []
                                 * @type Array
                                 */
                                fields: {
                                    value: [],
                                    setter: '_setFields',
                                    validator: function(val) {
                                        return A.Lang.isArray(val) || isArrayList(val);
                                    }
                                },
                            
                                /**
                                 * Defines the maximum number of fields.
                                 *
                                 * @attribute maxFields
                                 * @default Infinity
                                 * @type Number
                                 */
                                maxFields: {
                                    value: Infinity,
                                    validator: A.Lang.isNumber
                                }
                            };
                            
                            A.mix(PropertyBuilderFieldSupport.prototype, {
                            
                                /**
                                 * Sets the `fields` attribute.
                                 *
                                 * @method _setFields
                                 * @param val
                                 * @protected
                                 */
                                _setFields: function(val) {
                                    var instance = this;
                            
                                    if (isArrayList(val)) {
                                        return val;
                                    }
                                    else {
                                        return instance.createFields(val);
                                    }
                                },
                            
                                /**
                                 * Updates the collection of fields.
                                 *
                                 * @method _updateFields
                                 * @param fields
                                 * @protected
                                 */
                                _updateFields: function(fields) {
                                    var instance = this;
                            
                                    instance.set('fields', fields);
                                },
                            
                                /**
                                 * Adds a single field in the field list.
                                 *
                                 * @method addField
                                 * @param field
                                 * @param index
                                 */
                                addField: function(field, index) {
                                    var instance = this;
                            
                                    if (instance.get('fields').size() < instance.get('maxFields')) {
                                        var newField = instance.createField(field);
                            
                                        if (newField) {
                                            instance._updateFields(
                                                instance.get('fields').add(newField, index)
                                            );
                                        }
                            
                                        return newField;
                                    }
                            
                                    return null;
                                },
                            
                                /**
                                 * Creates a collection of fields.
                                 *
                                 * @method createFields
                                 * @param val
                                 * @return {A.ArrayList}
                                 */
                                createFields: function(val) {
                                    var instance = this;
                                    var fields = [];
                            
                                    A.Array.each(val, function(field, index) {
                                        if (index < instance.get('maxFields')) {
                                            fields.push(instance.createField(field));
                                        }
                                    });
                            
                                    return new A.ArrayList(fields);
                                },
                            
                                /**
                                 * Removes a single field from the field list.
                                 *
                                 * @method removeField
                                 * @param field
                                 */
                                removeField: function(field) {
                                    var instance = this;
                            
                                    instance._updateFields(
                                        instance.get('fields').remove(field)
                                    );
                                }
                            
                                /**
                                 * Creates a single field.
                                 *
                                 * NOTE FOR DEVELOPERS: Yoy must implement this method.
                                 *
                                 * @method createField
                                 * @param val
                                 */
                            });
                            
                            A.PropertyBuilderFieldSupport = PropertyBuilderFieldSupport;