     //--------------------------------------------------------------------------
     
     //----------------------------------
-    //  horizontalPosition
-    //----------------------------------
-    
-    private var _horizontalPosition:String = CalloutPosition.AUTO;
-    
-    [Inspectable(category="General", enumeration="before,start,middle,end,after,auto", defaultValue="auto")]
-    
-    /**
-     *  @copy spark.components.Callout#horizontalPosition
-     */
-    public function get horizontalPosition():String
-    {
-        // TODO 
-        if (currentDropDown)
-            return currentDropDown.horizontalPosition;
-        
-        return _horizontalPosition;
-    }
-    
-    /**
-     *  @private
-     */
-    public function set horizontalPosition(value:String):void
-    {
-        if (value == _horizontalPosition)
+    //  callout
+    //----------------------------------
+    
+    /**
+     *  @private
+     */
+    private var _callout:Callout;
+    
+    /**
+     *  TODO (jasonsj): PARB
+     */
+    mx_internal function get callout():Callout
+    {
+        return _callout;
+    }
+    
+    /**
+     *  TODO (jasonsj): PARB
+     * 
+     *  Allow users to set their own Callout instead of the one defined by the
+     *  skin. This allows properties and styles to be set in MXML instead of
+     *  either passthrough styles in CalloutButton or CSS styles. 
+     * 
+     *  The getter allows direct access to the callout. Unlike DropDownList,
+     *  CalloutButton's dropDown skin part is a class factory and not the
+     *  Callout instance.
+     */
+    mx_internal function set callout(value:Callout):void
+    {
+        if (_callout == value)
             return;
         
-        _horizontalPosition = value;
-        
-        if (currentDropDown)
-            currentDropDown.horizontalPosition = horizontalPosition;
-    }
-    
-    //----------------------------------
-    //  verticalPosition
-    //----------------------------------
-    
-    private var _verticalPosition:String = CalloutPosition.AUTO;
-    
-    [Inspectable(category="General", enumeration="before,start,middle,end,after,auto", defaultValue="auto")]
-    
-    /**
-     *  @copy spark.components.Callout#verticalPosition
-     */
-    public function get verticalPosition():String
-    {
-        if (currentDropDown)
-            return currentDropDown.verticalPosition;
-        
-        return _verticalPosition;
-    }
-    
-    /**
-     *  @private
-     */
-    public function set verticalPosition(value:String):void
-    {
-        if (value == _verticalPosition)
-            return;
-        
-        _verticalPosition = value;
-        
-        if (currentDropDown)
-            currentDropDown.verticalPosition = verticalPosition;
+        if (_callout && _callout.isOpen)
+        {
+            // TODO (jasonsj): cleanup?
+            _callout.close();
+        }
+        
+        // FIXME (jasonsj): re-init
+        _callout = value;
     }
     
     //----------------------------------

            if (dropDownController)
                dropDownController.openButton = openButton;
        }
    }
    
    /**

     */
    mx_internal function dropDownController_closeHandler(event:DropDownEvent):void
    {
        // TODO (jasonsj): close params?
        // dispatch the close event after the callout's PopUpEvent.CLOSE fires
        callout.close();
        
        // TODO (jasonsj): destroy option?
//        removeDynamicPartInstance("dropDown", callout);
//        callout = null;
    }
    
//    private function callout_creationCompleteHandler(event:FlexEvent):void
//    {
//        // initialize contentGroup skin part
//        contentGroup = callout.contentGroup;
//        partAdded("contentGroup", callout.contentGroup);
//    }
    
    /**
     *  @private
     */
    private function callout_openHandler(event:PopUpEvent):void
    {
        dispatchEvent(new DropDownEvent(DropDownEvent.OPEN));
    }
    
    /**
     *  @private
     */
    private function callout_closeHandler(event:PopUpEvent):void
    {   
        dispatchEvent(new DropDownEvent(DropDownEvent.CLOSE));
    }
}
