         push: (record) -> @inner.push record
         format: formatter
         value: -> @inner.value() / data.getAggregator(@selector...).inner.value()
+        numInputs: wrapped(x...)().numInputs
 
 #default aggregators & renderers use US naming and number formatting
 aggregators = do (tpl = aggregatorTemplates) -> 

            @find(".pvtCols").append @find(".axis_#{shownAttributes.indexOf(x)}")
        for x in opts.rows
            @find(".pvtRows").append @find(".axis_#{shownAttributes.indexOf(x)}")
        for x in opts.vals
            @find(".pvtVals").append @find(".axis_#{shownAttributes.indexOf(x)}")
        if opts.aggregatorName?
            @find(".pvtAggregator").val opts.aggregatorName
        if opts.rendererName?
            @find(".pvtRenderer").val opts.rendererName

        #set up for refreshing
        refreshDelayed = =>

        push:  -> @count++
        value: -> @count
        format: formatter
        numInputs: 0

    countUnique: (formatter=usFmtInt) -> ([attr]) -> (data, rowKey, colKey) ->
        uniq: []
        push: (record) -> @uniq.push(record[attr]) if record[attr] not in @uniq
        value: -> @uniq.length
        format: formatter
        numInputs: 1

    listUnique: (sep) -> ([attr]) -> (data, rowKey, colKey)  ->
        uniq: []
        push: (record) -> @uniq.push(record[attr]) if record[attr] not in @uniq
        value: -> @uniq.join sep
        format: (x) -> x
        numInputs: 1

    sum: (formatter=usFmt) -> ([attr]) -> (data, rowKey, colKey) ->
        sum: 0
        push: (record) -> @sum += parseFloat(record[attr]) if not isNaN parseFloat(record[attr])
        value: -> @sum
        format: formatter
        numInputs: 1

    average:  (formatter=usFmt) -> ([attr]) -> (data, rowKey, colKey) ->
        sum: 0
