/// <summary>
        /// Create an aggregate from the list of properties in aggrSpec and fill
        /// with values from values array.  This is not publically visible because
        /// it conflicts semantically with setAttribute("foo",new Object[] {...});
        /// </summary>
        public virtual void setAttribute(String aggrSpec, params Object[] values)
        {
            IList properties = new ArrayList();
            String aggrName = null;

            try {
                aggrName = parseAggregateAttributeSpec(aggrSpec, properties);
            }
            catch (ArgumentException) {
                //hmm, maybe they just want to set an attribute to an array value?
                setAttribute(aggrSpec, (Object) values);
                return;
            }

            if (values == null || properties.Count == 0) {
                throw new ArgumentException("missing properties or values for '" + aggrSpec + "'");
            }

            if (values.Length != properties.Count) {
                throw new ArgumentException("number of properties in '" + aggrSpec + "' != number of values");
            }

            Aggregate aggr = new Aggregate();

            for (int i = 0; i < values.Length; i++) {
                Object value = values[i];
                aggr.put((String) properties[i], value);
            }

            setAttribute(aggrName, aggr);
        }