     # use this feature, make sure to emit the "DataCollected" event with any
     # data that you want aggregated (that you want to be able to access from
     # the "PaymentConfirmed" listeners).
-    { @productForm } = @getOptions()
+    { productForm } = @getOptions()
 
-    if @productForm?
-      @addSubView @productForm
-      @productForm.on 'DataCollected', (productData) =>
+    if productForm?
+      @addForm 'product', productForm
+      productForm.on 'DataCollected', (productData) =>
         @addAggregateData { productData }
         @preparePaymentMethods()
 
     # "choice form" is for choosing from existing payment methods on-file.
-    @choiceForm = @createChoiceForm()
-    @addSubView @choiceForm
+    @addForm 'choice', @createChoiceForm()
 
     # "entry form" is for entering a new payment method for us to file.
-    @entryForm = @createEntryForm()
-    @addSubView @entryForm
+    @addForm 'entry', @createEntryForm()
 
     # "confirm form" is required.  This form should render a summary, and emit
     # a "PaymentConfirmed" after user approval.
-    { @confirmForm } = @getOptions()
-    @addSubView @confirmForm
+    { confirmForm } = @getOptions()
+    @addForm 'confirm', confirmForm
 
-    @confirmForm.on 'PaymentConfirmed', =>
+    confirmForm.on 'PaymentConfirmed', =>
       # You should listen to the "PaymentConfirmed" event from outside the
       # workflow.  We'll forward a result like:
       #   { paymentMethodId, productData* }


          defaultMethod = methodsByPaymentMethodId[defaultPaymentMethod]

          @choiceForm.addCustomData 'paymentMethod', defaultMethod

          select = new KDSelectBox
            defaultValue  : defaultPaymentMethod

  selectPaymentMethod: (method) ->
    { paymentMethodId } = method
    @addAggregateData { paymentMethodId }
    (@getForm 'confirm').setPaymentMethod? method
    @setState 'confirm'

  createChoiceForm: ->
