diff --git a/.hg_archival.txt b/.hg_archival.txt
--- a/.hg_archival.txt
+++ b/.hg_archival.txt
@@ -1,2 +1,2 @@
 repo: 73f9f23123106e581edbcf74b725d9a23e2eb1f4
-node: d6720590f1abaf37f58578d9aa71302681440f8c
+node: bd4d9234cf7e7a1fa4b8c5a47f711348d0192a7c
diff --git a/.hgtags b/.hgtags
--- a/.hgtags
+++ b/.hgtags
@@ -1,1 +1,3 @@
 9e2bed8ab08ad6f310093bec0c339ae8f6ddb142 0.0.2
+6ad8883193562cd2d520d765028713a689fe43b1 0.1
+8a3c94fd99a61ca2a002f71edaa0594fa8d54e27 0.1
diff --git a/examples/example1.hs b/examples/example1.hs
--- a/examples/example1.hs
+++ b/examples/example1.hs
@@ -13,48 +13,44 @@
 main = do
     initGUI
 
-    -- Create a new operator ('line') that takes a label
-    -- ('cLBL') and a button ('cBTNL') and pack then ('pBPED')
-    -- in a horizontal box ('cHBX').
+    -- Create a new operator  that takes a label
+    -- and a button  and pack then 
+    -- in a horizontal box .
 
     let line s = mconcat [
-         cLBL (Just $ s ++ ":"),
-         cBTNL s,
-         cHBX True 0,
-         pBPED,
-         pBPED]
+         rLABEL s,
+         rRIGHT,
+         rBUTTON s $ return (),
+         rCENTER,
+         rHBOX [PackGrow,PackGrow]
+         ]
 
-    -- Create a new operator ('column') that packs many 'line'
-    -- in a vertical box ('cVBX').
+    -- Create a new operator  that packs many 'line'
+    -- in a vertical box .
 
     let column = mconcat $ [
          line "One Button",
          line "Another Button",
          line "Yet Another Button",
          line "Last Button",
-         cVBX True 0] ++ replicate 4 pBPED
+         rVBOX $ replicate 4 PackGrow
+         ]
 
-    -- Take two copies of 'column' and add ('pNAP') then
-    -- to a notebook ('cNBK'). Then create a stock button
-    -- ('cBTNSTK') and attach a action to an event ('tON'). Then
+    -- Take two copies of 'column' and add  then
+    -- to a notebook . Then create a stock button
+    --  and attach a action to an event . Then
     -- join the notebook and that button in a vertical box.
-    -- Insert everything in a main window ('cWND, pCA'), and
-    -- finally make everything into widgets ('widgetsFromRpn').
+    -- Insert everything in a main window , and
+    -- finally make everything into widgets .
 
-    [mainWindow] <- widgetsFromRpn $ mconcat $ [
+    [mainWindow] <- widgetsFromRpn [
          column,
          column,
-         cNBK,
-         pNAP "First Page",
-         pNAP "Second Page",
-         cBTNSTK stockQuit,
-         tON pressed (liftIO mainQuit >> return True),
-         cVBX False 0,
-         pBPE PackNatural 0,
-         pBPED,
-         cWND,
-         pCA,
-         tSET (title "Layout.RPN Example")]
+         rNOTEBOOK ["First Page","Second Page"],
+         rBUTTON stockQuit mainQuit,
+         rVBOX [PackGrow,PackNatural],
+         rMAIN "Layout.Rpn Example"
+         ]
 
     widgetShowAll mainWindow
     mainGUI
diff --git a/gtk2hs-rpn.cabal b/gtk2hs-rpn.cabal
--- a/gtk2hs-rpn.cabal
+++ b/gtk2hs-rpn.cabal
@@ -1,27 +1,28 @@
 cabal-Version: >= 1.2
 name: gtk2hs-rpn
-version: 0.0.2
+version: 0.1
 synopsis:
-  Adds a module to gtk2hs allowing layouts to
-  be defined using reverse polish notation.
+  Adds a module to gtk2hs allowing layouts to be defined using
+  reverse polish notation.
 description:
-  Adds a module 'Graphics.UI.Gtk.Layout.Rpn' to gtk2hs. This
-  module defines a type 'RPN' for operators, and is an instance
-  of Monoid class.  You can combine those operators using reverse
-  polish notation, as made popular by, say, HP calculators. There
-  are operators for layout elements, like expanders, panes,
-  boxes and notebooks, and for a few other widgets, like buttons
-  and labels. You can include any gtk2hs widget in the stack.
+  Adds a module "Graphics.UI.Gtk.Layout.Rpn" to @gtk2hs@. This
+  module defines a type @RPN@ for operators, which is an
+  instance of 'Data.Monoid.Monoid' class.  You can combine those
+  operators using reverse polish notation, as made popular by,
+  say, HP calculators. There are operators for layout elements,
+  like expanders, panes, boxes and notebooks, and for a few
+  other widgets, like buttons and labels. You can also insert
+  any existing @gtk2hs@ widget in the stack.
 build-type: Simple
 license: LGPL
 license-file: LICENSE
 maintainer: Maurício CA <mauricio.antunes@gmail.com>
 category: GUI
 Library
-  build-depends: base, gtk >= 0.10, cairo, mtl
+  build-depends: base, gtk >= 0.10, cairo, mtl, glib
   hs-source-dirs: src
   extensions:
     NoMonomorphismRestriction
   exposed-modules:
     Graphics.UI.Gtk.Layout.Rpn
-    Graphics.UI.Gtk.Layout.Rpn.CanBeCasted
+  other-modules: RPN, Basic, CanBeCasted
diff --git a/src/Basic.hs b/src/Basic.hs
new file mode 100644
--- /dev/null
+++ b/src/Basic.hs
@@ -0,0 +1,100 @@
+{-# OPTIONS_HADDOCK hide #-}
+
+-- | Here we provide several low level operators that we are
+-- going to use to build others, user friendly, operators.
+-- Operators in this module are all simple capsules over existing
+-- @gtk2hs@ functions.
+
+module Basic where
+import Control.Monad.State
+import Graphics.UI.Gtk
+import CanBeCasted
+import RPN
+
+-- * Operators with prefix @c@
+
+-- | These are maps of @gtk2hs@ widget creation functions.
+-- See 'io2rpn'.
+
+cWID = RPN . pushWidget
+cALN = io2rpn . \x -> alignmentNew x 0.5 0 0
+cARW = io2rpn . \t -> arrowNew t ShadowNone
+cAFR = io2rpn (aspectFrameNew 0.5 0.5 Nothing)
+cBTNSTK = io2rpn . buttonNewFromStock
+cBTNCLRCL = io2rpn . colorButtonNewWithColor
+cEXN = io2rpn . expanderNew
+cBTNFLE = io2rpn . fileChooserButtonNew ""
+cBTNFONFN = io2rpn . fontButtonNewWithFont
+cFRM = io2rpn frameNew
+cHBX = io2rpn (hBoxNew False 0)
+cVBX = io2rpn (vBoxNew False 0)
+cHBXBTN = io2rpn hButtonBoxNew
+cVBXBTN = io2rpn vButtonBoxNew
+cHPD = io2rpn hPanedNew
+cVPD = io2rpn vPanedNew
+cHSCRNG = (io2rpn .). \mi ma -> hScaleNewWithRange mi ma ((mi+ma)/2)
+cVSCRNG = (io2rpn .). \mi ma -> vScaleNewWithRange mi ma ((mi+ma)/2)
+cHSP = io2rpn hSeparatorNew
+cVSP = io2rpn vSeparatorNew
+cIMGFLE = io2rpn . imageNewFromFile
+cLBL = io2rpn . labelNew . Just
+cNBK = io2rpn notebookNew
+cSRL = io2rpn $ scrolledWindowNew Nothing Nothing
+cLAY = io2rpn $ layoutNew Nothing Nothing
+cSKT = io2rpn socketNew
+cBTNSPIRNG = (io2rpn .). \mi ma -> spinButtonNewWithRange mi ma ((mi+ma)/2)
+cTVWBF = io2rpn . textViewNewWithBuffer
+cWND = io2rpn windowNew
+
+-- * Operators with prefix @t@
+
+-- | These operators act on a widget. 'tON' and its derivatives
+-- connect callbacks to events. 'tSET' and derivatives set
+-- attributes. 'tCBK' and derivatives allows callbacks to
+-- be called at realize time with the corresponding widget
+-- as parameters, we use them to connect to events for those
+-- widgets @gtk2hs@ doesn't yet define event names for.
+
+tON s c = RPN $ touchWidget $ \w -> on w s c >> return ()
+tONBUTTON = tON :: Signal Button c -> c -> RPN
+
+tSET a = RPN $ touchWidget $ ( $ a ) . set
+tSETFRAME = tSET :: [AttrOp Frame] -> RPN
+tSETLABEL = tSET :: [AttrOp Label] -> RPN
+tSETWINDOW = tSET :: [AttrOp Window] -> RPN
+
+tCBK f = RPN $ touchWidget cb
+ where cb w = (after w realize $ f w) >> return ()
+tCBKCOLOR = tCBK :: (ColorButton -> IO ()) -> RPN
+tCBKFONT = tCBK :: (FontButton -> IO ()) -> RPN
+tCBKRANGE = tCBK :: (Range -> IO ()) -> RPN
+tCBKSOCKET = tCBK :: (Socket -> IO ()) -> RPN
+tCBKSPIN = tCBK :: (SpinButton -> IO ()) -> RPN
+
+-- * Operators with prefix @p@
+
+-- | These are packing operators. They pack a widget into a
+-- container, and the widget is removed from the stack.
+
+pCA = RPN $
+    let { ca :: Container -> Widget -> IO () ; ca = containerAdd }
+        in pullWidget ca
+pBPE p = RPN $
+    let { bpe :: Box -> Widget -> IO () ; bpe b w = boxPackEnd b w p 0 }
+        in pullWidget bpe
+pPP1 r = RPN $
+    let { pp1 :: Paned -> Widget -> IO () ; pp1 p w = panedPack1 p w r False }
+        in pullWidget pp1
+pPP2 r = RPN $
+    let { pp2 :: Paned -> Widget -> IO () ; pp2 p w = panedPack2 p w r False }
+        in pullWidget pp2
+pNPP s = RPN $
+    let
+        npp :: Notebook -> Widget -> IO ()
+        npp l w = notebookPrependPage l w s >> return ()
+        in pullWidget npp
+pLAY = RPN $
+    let
+        lay :: Layout -> Widget -> IO ()
+        lay la w = layoutPut la w 0 0
+        in pullWidget lay
diff --git a/src/CanBeCasted.hs b/src/CanBeCasted.hs
new file mode 100644
--- /dev/null
+++ b/src/CanBeCasted.hs
@@ -0,0 +1,212 @@
+{-# OPTIONS_HADDOCK hide #-}
+
+module CanBeCasted (
+    CanBeCasted (glibCast)
+ ) where
+import Graphics.UI.Gtk
+import Graphics.UI.Gtk.Types
+
+-- | 'CanBeCasted' class allows casting between some
+-- 'System.Glib.GObject.GObjectClass' instances.
+
+class (GObjectClass g) => CanBeCasted g where
+
+    -- | 'glibCast' casts between types,if possible.
+
+    glibCast :: (GObjectClass o) => o -> Maybe g
+    glibCast a = if isA a t then Just (c a) else Nothing
+        where { (t,c) = castData }
+
+    -- | 'castData' provides data for casting,using @gtk2hs@
+    -- map of similar @gtk+@ data.  This is the only class
+    -- member that instances shall redefine.
+
+    castData :: (GObjectClass g1) => (GType,g1 -> g)
+
+instance CanBeCasted Adjustment where
+    castData = (gTypeAdjustment,castToAdjustment)
+instance CanBeCasted Alignment where
+    castData = (gTypeAlignment,castToAlignment)
+instance CanBeCasted Arrow where
+    castData = (gTypeArrow,castToArrow)
+instance CanBeCasted AspectFrame where
+    castData = (gTypeAspectFrame,castToAspectFrame)
+instance CanBeCasted Bin where
+    castData = (gTypeBin,castToBin)
+instance CanBeCasted Box where
+    castData = (gTypeBox,castToBox)
+instance CanBeCasted Button where
+    castData = (gTypeButton,castToButton)
+instance CanBeCasted ButtonBox where
+    castData = (gTypeButtonBox,castToButtonBox)
+instance CanBeCasted Calendar where
+    castData = (gTypeCalendar,castToCalendar)
+instance CanBeCasted CheckButton where
+    castData = (gTypeCheckButton,castToCheckButton)
+instance CanBeCasted CheckMenuItem where
+    castData = (gTypeCheckMenuItem,castToCheckMenuItem)
+instance CanBeCasted Clipboard where
+    castData = (gTypeClipboard,castToClipboard)
+instance CanBeCasted ColorButton where
+    castData = (gTypeColorButton,castToColorButton)
+instance CanBeCasted ColorSelection where
+    castData = (gTypeColorSelection,castToColorSelection)
+instance CanBeCasted ColorSelectionDialog where
+    castData = (gTypeColorSelectionDialog,castToColorSelectionDialog)
+instance CanBeCasted Container where
+    castData = (gTypeContainer,castToContainer)
+instance CanBeCasted Dialog where
+    castData = (gTypeDialog,castToDialog)
+instance CanBeCasted DragContext where
+    castData = (gTypeDragContext,castToDragContext)
+instance CanBeCasted DrawWindow where
+    castData = (gTypeDrawWindow,castToDrawWindow)
+instance CanBeCasted Drawable where
+    castData = (gTypeDrawable,castToDrawable)
+instance CanBeCasted DrawingArea where
+    castData = (gTypeDrawingArea,castToDrawingArea)
+instance CanBeCasted Editable where
+    castData = (gTypeEditable,castToEditable)
+instance CanBeCasted Entry where
+    castData = (gTypeEntry,castToEntry)
+instance CanBeCasted EntryCompletion where
+    castData = (gTypeEntryCompletion,castToEntryCompletion)
+instance CanBeCasted EventBox where
+    castData = (gTypeEventBox,castToEventBox)
+instance CanBeCasted Expander where
+    castData = (gTypeExpander,castToExpander)
+instance CanBeCasted FileChooser where
+    castData = (gTypeFileChooser,castToFileChooser)
+instance CanBeCasted FileChooserButton where
+    castData = (gTypeFileChooserButton,castToFileChooserButton)
+instance CanBeCasted FileChooserDialog where
+    castData = (gTypeFileChooserDialog,castToFileChooserDialog)
+instance CanBeCasted FileChooserWidget where
+    castData = (gTypeFileChooserWidget,castToFileChooserWidget)
+instance CanBeCasted FileFilter where
+    castData = (gTypeFileFilter,castToFileFilter)
+instance CanBeCasted FileSelection where
+    castData = (gTypeFileSelection,castToFileSelection)
+instance CanBeCasted Fixed where
+    castData = (gTypeFixed,castToFixed)
+instance CanBeCasted FontButton where
+    castData = (gTypeFontButton,castToFontButton)
+instance CanBeCasted FontSelection where
+    castData = (gTypeFontSelection,castToFontSelection)
+instance CanBeCasted FontSelectionDialog where
+    castData = (gTypeFontSelectionDialog,castToFontSelectionDialog)
+instance CanBeCasted Frame where
+    castData = (gTypeFrame,castToFrame)
+instance CanBeCasted HBox where
+    castData = (gTypeHBox,castToHBox)
+instance CanBeCasted HButtonBox where
+    castData = (gTypeHButtonBox,castToHButtonBox)
+instance CanBeCasted HPaned where
+    castData = (gTypeHPaned,castToHPaned)
+instance CanBeCasted HScale where
+    castData = (gTypeHScale,castToHScale)
+instance CanBeCasted HScrollbar where
+    castData = (gTypeHScrollbar,castToHScrollbar)
+instance CanBeCasted HSeparator where
+    castData = (gTypeHSeparator,castToHSeparator)
+instance CanBeCasted HandleBox where
+    castData = (gTypeHandleBox,castToHandleBox)
+instance CanBeCasted IconView where
+    castData = (gTypeIconView,castToIconView)
+instance CanBeCasted Image where
+    castData = (gTypeImage,castToImage)
+instance CanBeCasted ImageMenuItem where
+    castData = (gTypeImageMenuItem,castToImageMenuItem)
+instance CanBeCasted Label where
+    castData = (gTypeLabel,castToLabel)
+instance CanBeCasted Layout where
+    castData = (gTypeLayout,castToLayout)
+instance CanBeCasted Misc where
+    castData = (gTypeMisc,castToMisc)
+instance CanBeCasted Notebook where
+    castData = (gTypeNotebook,castToNotebook)
+instance CanBeCasted Object where
+    castData = (gTypeObject,castToObject)
+instance CanBeCasted OptionMenu where
+    castData = (gTypeOptionMenu,castToOptionMenu)
+instance CanBeCasted Paned where
+    castData = (gTypePaned,castToPaned)
+instance CanBeCasted Pixbuf where
+    castData = (gTypePixbuf,castToPixbuf)
+instance CanBeCasted Range where
+    castData = (gTypeRange,castToRange)
+instance CanBeCasted Scale where
+    castData = (gTypeScale,castToScale)
+instance CanBeCasted Screen where
+    castData = (gTypeScreen,castToScreen)
+instance CanBeCasted Scrollbar where
+    castData = (gTypeScrollbar,castToScrollbar)
+instance CanBeCasted ScrolledWindow where
+    castData = (gTypeScrolledWindow,castToScrolledWindow)
+instance CanBeCasted Separator where
+    castData = (gTypeSeparator,castToSeparator)
+instance CanBeCasted Socket where
+    castData = (gTypeSocket,castToSocket)
+instance CanBeCasted SpinButton where
+    castData = (gTypeSpinButton,castToSpinButton)
+instance CanBeCasted Table where
+    castData = (gTypeTable,castToTable)
+instance CanBeCasted TearoffMenuItem where
+    castData = (gTypeTearoffMenuItem,castToTearoffMenuItem)
+instance CanBeCasted TextBuffer where
+    castData = (gTypeTextBuffer,castToTextBuffer)
+instance CanBeCasted TextMark where
+    castData = (gTypeTextMark,castToTextMark)
+instance CanBeCasted TextTag where
+    castData = (gTypeTextTag,castToTextTag)
+instance CanBeCasted TextTagTable where
+    castData = (gTypeTextTagTable,castToTextTagTable)
+instance CanBeCasted TextView where
+    castData = (gTypeTextView,castToTextView)
+instance CanBeCasted ToggleButton where
+    castData = (gTypeToggleButton,castToToggleButton)
+instance CanBeCasted ToggleToolButton where
+    castData = (gTypeToggleToolButton,castToToggleToolButton)
+instance CanBeCasted ToolButton where
+    castData = (gTypeToolButton,castToToolButton)
+instance CanBeCasted ToolItem where
+    castData = (gTypeToolItem,castToToolItem)
+instance CanBeCasted Toolbar where
+    castData = (gTypeToolbar,castToToolbar)
+instance CanBeCasted Tooltips where
+    castData = (gTypeTooltips,castToTooltips)
+instance CanBeCasted TreeModel where
+    castData = (gTypeTreeModel,castToTreeModel)
+instance CanBeCasted TreeModelSort where
+    castData = (gTypeTreeModelSort,castToTreeModelSort)
+instance CanBeCasted TreeSelection where
+    castData = (gTypeTreeSelection,castToTreeSelection)
+instance CanBeCasted TreeSortable where
+    castData = (gTypeTreeSortable,castToTreeSortable)
+instance CanBeCasted TreeView where
+    castData = (gTypeTreeView,castToTreeView)
+instance CanBeCasted TreeViewColumn where
+    castData = (gTypeTreeViewColumn,castToTreeViewColumn)
+instance CanBeCasted UIManager where
+    castData = (gTypeUIManager,castToUIManager)
+instance CanBeCasted VBox where
+    castData = (gTypeVBox,castToVBox)
+instance CanBeCasted VButtonBox where
+    castData = (gTypeVButtonBox,castToVButtonBox)
+instance CanBeCasted VPaned where
+    castData = (gTypeVPaned,castToVPaned)
+instance CanBeCasted VScale where
+    castData = (gTypeVScale,castToVScale)
+instance CanBeCasted VScrollbar where
+    castData = (gTypeVScrollbar,castToVScrollbar)
+instance CanBeCasted VSeparator where
+    castData = (gTypeVSeparator,castToVSeparator)
+instance CanBeCasted Viewport where
+    castData = (gTypeViewport,castToViewport)
+instance CanBeCasted Widget where
+    castData = (gTypeWidget,castToWidget)
+instance CanBeCasted Window where
+    castData = (gTypeWindow,castToWindow)
+instance CanBeCasted WindowGroup where
+    castData = (gTypeWindowGroup,castToWindowGroup)
+
diff --git a/src/Graphics/UI/Gtk/Layout/Rpn.hs b/src/Graphics/UI/Gtk/Layout/Rpn.hs
--- a/src/Graphics/UI/Gtk/Layout/Rpn.hs
+++ b/src/Graphics/UI/Gtk/Layout/Rpn.hs
@@ -1,374 +1,218 @@
-module Graphics.UI.Gtk.Layout.Rpn where { import Graphics.UI.Gtk hiding
-( get ) ; import qualified Data.Word ; import Data.Monoid ; import
-Control.Monad.State ;
-import Graphics.UI.Gtk.Types ;
-import Graphics.Rendering.Cairo ;
-import Graphics.UI.Gtk.Gdk.EventM ;
-import Data.IORef ;
-import Data.Maybe ;
-import Data.List ;
-import Graphics.UI.Gtk.Layout.Rpn.CanBeCasted ;
+module Graphics.UI.Gtk.Layout.Rpn (
 
- doNothing :: (Monad m) => m () ;
- doNothing = return () ;
+    RPN(), widgetsFromRpn, rWID, rCENTER, rLEFT, rRIGHT, rARROW,
+    rASPECT, rBUTTON, rEXPANDER, rCOLOR, rFILE, rFONT, rFRAME,
+    rHBOX,rVBOX, rHBBOX,rVBBOX, rHPANE,rVPANE, rHSCALE,rVSCALE,
+    rHSEPARATOR,rVSEPARATOR, rIMAGE, rLABEL, rNOTEBOOK, rSCROLL,
+    rSOCKET, rSPIN, rTEXT, rMAIN
 
- maybeDoNothing :: (Monad m) => Maybe a -> ( a -> m b ) -> m () ;
- maybeDoNothing a f = maybe doNothing f' a
-     where { f' a = f a >> doNothing } ;
+ ) where
+import Graphics.UI.Gtk
+import System.Glib.Attributes as A (get)
+import Control.Monad.State
+import Data.Monoid
+import Data.List
+import RPN
+import Basic
 
- type ActionType a = StateT [ Widget ] IO a ;
+-- | Inserts your widget in the stack.  Your widget needs to
+-- pass through Gtk.toWidget before applying 'rWID'.
 
- pushWidget :: ( WidgetClass w ) => w -> ActionType () ;
- pushWidget w = modify ( toWidget w : ) ;
+rWID :: Widget -> RPN
+rWID = cWID
 
- touchWidget :: ( CanBeCasted a ) => ( a -> IO b ) -> ActionType () ;
- touchWidget f = do {
-     w <- ( liftM $ take 1 ) get ;
-     case mapMaybe glibCast w of {
-         [ w' ] -> liftIO $ f w' >> doNothing ;
-         _ -> doNothing
-     }
- } ;
+-- | Insert the last widget inside a container.  When that
+-- container grows, the widget keeps its natural size, aligned
+-- in the center of the container.
 
- reachWidget :: ( CanBeCasted a ) => Int -> ActionType ( Maybe a ) ;
- reachWidget n = do {
-     s <- get ;
-     return $ if length s > n
-         then glibCast ( s !! n )
-         else Nothing
- } ;
+rCENTER :: RPN
+rCENTER = mconcat [cALN 0.5, pCA]
 
- pullWidget :: ( CanBeCasted a , CanBeCasted b ) =>
- ( a -> b -> IO c ) -> ActionType () ;
- pullWidget f = do {
-     w0 <- reachWidget 0 ;
-     w1 <- reachWidget 1 ;
-     case ( w0 , w1 ) of {
-         ( Just w0' , Just w1' ) -> do {
-             liftIO $ f w0' w1' ;
-             ( s : ss ) <- get ;
-             put $ s : drop 1 ss
-         } ;
-         _ -> doNothing
-     }
- } ;
+-- | Same as 'rCENTER', but aligns to the left.
 
- pullWidget3 :: ( CanBeCasted a , CanBeCasted b , CanBeCasted c ,
- CanBeCasted d ) => ( a -> b -> c -> d -> IO e ) -> ActionType () ;
- pullWidget3 f = do {
-     w0 <- reachWidget 0 ;
-     w1 <- reachWidget 1 ;
-     w2 <- reachWidget 2 ;
-     w3 <- reachWidget 3 ;
-     case ( w0 , w1 , w2 , w3 ) of {
-         ( Just w0 , Just w1 , Just w2 , Just w3 ) -> do {
-             liftIO $ f w0 w1 w2 w3 ;
-             ( s : ss ) <- get ;
-             put $ s : drop 3 ss
-         } ;
-         _ -> doNothing
-     }
- } ;
+rLEFT :: RPN
+rLEFT = mconcat [cALN 0, pCA]
 
- newtype RPN = RPN ( ActionType () ) ;
+-- | Same as 'rCENTER', but aligns to the right.
 
- instance Monoid RPN where { mempty = RPN doNothing ; mappend ( RPN
- rpn1 ) ( RPN rpn2 ) = RPN $ rpn1 >> rpn2 } ;
+rRIGHT :: RPN
+rRIGHT = mconcat [cALN 1, pCA]
 
- widgetsFromRpn :: RPN -> IO [ Widget ] ;
- widgetsFromRpn ( RPN rpn ) = ( liftM $ reverse )  ( execStateT rpn [] ) ;
+-- | Inserts an 'Graphics.UI.Gtk.Misc.Arrow.Arrow' in the stack.
 
- io2rpn :: ( WidgetClass w ) => IO w -> RPN ;
- io2rpn = RPN . ( >>= pushWidget ) . liftIO ;
+rARROW :: ArrowType -> RPN
+rARROW t = cARW t
 
- cWID = RPN . pushWidget ;
- cACL = io2rpn . accelLabelNew ;
- cALN = ((( io2rpn .).).). alignmentNew ;
- cARW = ( io2rpn .). arrowNew ;
- cAFR = (( io2rpn .).). aspectFrameNew ;
- cBTN = io2rpn buttonNew ;
- cBTNSTK = io2rpn . buttonNewFromStock ;
- cBTNL = io2rpn . buttonNewWithLabel ;
- cBTNMNM = io2rpn . buttonNewWithMnemonic ;
- cCLD = io2rpn calendarNew ;
- cCVW = io2rpn cellViewNew ;
- cCVWPIX = io2rpn . cellViewNewWithPixbuf ;
- cCVWMRK = io2rpn . cellViewNewWithMarkup ;
- cCVWTXT = io2rpn . cellViewNewWithText ;
- cBTNCHK = io2rpn checkButtonNew ;
- cBTNCHKL = io2rpn . checkButtonNewWithLabel ;
- cBTNCHKMNM = io2rpn . checkButtonNewWithMnemonic ;
- cMENCHKIT = io2rpn checkMenuItemNew ;
- cMENCHKITL = io2rpn . checkMenuItemNewWithLabel ;
- cMENCHKITMNM = io2rpn . checkMenuItemNewWithMnemonic ;
- cBTNCLR = io2rpn colorButtonNew ;
- cBTNCLRCL = io2rpn . colorButtonNewWithColor ;
- cCLRSEL = io2rpn colorSelectionNew ;
- cCMBENY = io2rpn comboBoxEntryNew ;
- cCMBENYTXT = io2rpn comboBoxEntryNewText ;
- cCMBENYMDL = io2rpn . comboBoxEntryNewWithModel ;
- cCMB = io2rpn comboBoxNew ;
- cCMBTXT = io2rpn comboBoxNewText ;
- cCMBMDL = io2rpn . comboBoxNewWithModel ;
- cDRW = io2rpn drawingAreaNew ;
- cENY = io2rpn entryNew ;
- cEVN = io2rpn eventBoxNew ;
- cEXN = io2rpn . expanderNew ;
- cEXNMNM = io2rpn . expanderNewWithMnemonic ;
- cBTNFLE = ( io2rpn .). fileChooserButtonNew ;
- cFLESEL = io2rpn . fileChooserWidgetNew ;
- cFXD = io2rpn fixedNew ;
- cBTNFON = io2rpn fontButtonNew ;
- cBTNFONFN = io2rpn . fontButtonNewWithFont ;
- cFONSEL = io2rpn fontSelectionNew ;
- cFRM = io2rpn frameNew ;
- cHBX = ( io2rpn .). hBoxNew ;
- cHBXBTN = io2rpn hButtonBoxNew ;
- cHPD = io2rpn hPanedNew ;
- cHSC = io2rpn . hScaleNew ;
- cHSCRNG = (( io2rpn .).). hScaleNewWithRange ;
- cHSB = io2rpn . hScrollbarNew ;
- cHSBDF = io2rpn hScrollbarNewDefaults ;
- cHSP = io2rpn hSeparatorNew ;
- cHNB = io2rpn handleBoxNew ;
- cIVW = io2rpn iconViewNew ;
- cIVWMDL = io2rpn . iconViewNewWithModel ;
- cMENIMGIT = io2rpn imageMenuItemNew ;
- cMENIMGITSTK = io2rpn . imageMenuItemNewFromStock ;
- cMENIMGITL = io2rpn . imageMenuItemNewWithLabel ;
- cMENIMGITMNM = io2rpn . imageMenuItemNewWithMnemonic ;
- cIMG = io2rpn imageNew ;
- cIMGFLE = io2rpn . imageNewFromFile ;
- cIMGICN = ( io2rpn .). imageNewFromIconName ;
- cIMGPIX = io2rpn . imageNewFromPixbuf ;
- cIMGSTK = ( io2rpn .). imageNewFromStock ;
- cLBL = io2rpn . labelNew ;
- cLBLMNM = io2rpn . labelNewWithMnemonic ;
- cLAY = ( io2rpn .). layoutNew ;
- cMENBAR = io2rpn menuBarNew ;
- cMENIT = io2rpn menuItemNew ;
- cMENITL = io2rpn . menuItemNewWithLabel ;
- cMENITMNM = io2rpn . menuItemNewWithMnemonic ;
- cMEN = io2rpn menuNew ;
- cMENTBN = ( io2rpn .). menuToolButtonNew ;
- cMENTBNSTK = io2rpn . menuToolButtonNewFromStock ;
- cNBK = io2rpn notebookNew ;
- cPRB = io2rpn progressBarNew ;
- cBTNRDI = io2rpn radioButtonNew ;
- cBTNRDIWID = io2rpn . radioButtonNewFromWidget ;
- cBTNRDIL = io2rpn . radioButtonNewWithLabel ;
- cBTNRDILWID = ( io2rpn .). radioButtonNewWithLabelFromWidget ;
- cBTNRDIMNM = io2rpn . radioButtonNewWithMnemonic ;
- cBTNRDIMNMWID = ( io2rpn .). radioButtonNewWithMnemonicFromWidget ;
- cMENRDIIT = io2rpn radioMenuItemNew ;
- cMENRDIITWID = io2rpn . radioMenuItemNewFromWidget ;
- cMENRDIITL = io2rpn . radioMenuItemNewWithLabel ;
- cMENRDIITLWID = ( io2rpn .). radioMenuItemNewWithLabelFromWidget ;
- cMENRDIMNM = io2rpn . radioMenuItemNewWithMnemonic ;
- cMENRDIMNMWID = ( io2rpn .). radioMenuItemNewWithMnemonicFromWidget ;
- cTBNRDI = io2rpn radioToolButtonNew ;
- cTBNRDISTK = io2rpn . radioToolButtonNewFromStock ;
- cTBNRDIWID = io2rpn . radioToolButtonNewFromWidget ;
- cTBNRDISTKWID = ( io2rpn .). radioToolButtonNewWithStockFromWidget ;
- cSRL = ( io2rpn .). scrolledWindowNew ;
- cMENITSP = io2rpn separatorMenuItemNew ;
- cTLBITSP = io2rpn separatorToolItemNew ;
- cSKT = io2rpn socketNew ;
- cBTNSPI = (( io2rpn .).). spinButtonNew ;
- cBTNSPIRNG = (( io2rpn .).). spinButtonNewWithRange ;
- cSTU = io2rpn statusbarNew ;
- cTBL = (( io2rpn .).). tableNew ;
- cMENITTF = io2rpn tearoffMenuItemNew ;
- cXVW = io2rpn textViewNew ;
- cTVWBF = io2rpn . textViewNewWithBuffer ;
- cBTNTGL = io2rpn toggleButtonNew ;
- cBTNTGLL = io2rpn . toggleButtonNewWithLabel ;
- cBTNTGLMNM = io2rpn . toggleButtonNewWithMnemonic ;
- cTLBITTLG = io2rpn toggleToolButtonNew ;
- cTLBITTLGSTK = io2rpn . toggleToolButtonNewFromStock ;
- cTLBITBTN = ( io2rpn .). toolButtonNew ;
- cTLBITBTNSTK = io2rpn . toolButtonNewFromStock ;
- cTLBIT = io2rpn toolItemNew ;
- cTLB = io2rpn toolbarNew ;
- cRVW = io2rpn treeViewNew ;
- cRVWMDL = io2rpn . treeViewNewWithModel ;
- cVBX = ( io2rpn .). vBoxNew ;
- cVBXBTN = io2rpn vButtonBoxNew ;
- cVPD = io2rpn vPanedNew ;
- cVSC = io2rpn . vScaleNew ;
- cVSCRNG = (( io2rpn .).). vScaleNewWithRange ;
- cVSB = io2rpn . vScrollbarNew ;
- cVSBDF = io2rpn vScrollbarNewDefaults ;
- cVSP = io2rpn vSeparatorNew ;
- cVWP = ( io2rpn .). viewportNew ;
- cWND = io2rpn windowNew ;
- cWNDPU = io2rpn windowNewPopup ;
+-- | Sets the last widget to always keep the aspect ratio of
+-- its original size requisition.
 
- tSET :: ( CanBeCasted w ) => [ AttrOp w ] -> RPN ;
- tSET a = RPN $ touchWidget $ ( $ a ) . set ;
+rASPECT :: RPN
+rASPECT = mconcat [cAFR, pCA]
 
- tON :: ( CanBeCasted w ) => Signal w c -> c -> RPN ;
- tON s c = RPN $ touchWidget $ ($ c) . ($ s) . on ;
+-- | Inserts a button into the stack, after a
+-- 'Graphics.UI.Gtk.General.StockItems.StockId' and an @IO ()@
+-- to be called when it is clicked.
 
- tAF :: ( CanBeCasted w ) => Signal w c -> c -> RPN ;
- tAF s c = RPN $ touchWidget $ ($ c) . ($ s) . after ;
+rBUTTON :: StockId -> IO () -> RPN
+rBUTTON id io = mconcat [cBTNSTK id, tONBUTTON buttonPressEvent io']
+ where io' = liftIO io >> return True
 
- tSKT :: NativeWindowId -> RPN ;
- tSKT n = RPN $ touchWidget $ ($ n) . sai
-     where { sai :: Socket -> NativeWindowId -> IO () ;
-     sai = socketAddId } ;
+-- | Packs the last widget in an
+-- 'Graphics.UI.Gtk.Layout.Expander.Expander', allowing the
+-- user to hide or show that widget under a label.
 
- pCA = RPN $
-     let { ca :: Container -> Widget -> IO () ; ca = containerAdd }
-         in pullWidget ca ;
+rEXPANDER :: String -> RPN
+rEXPANDER s = mconcat [cEXN s, pCA]
 
- pBSI = RPN $
-     let { bsi :: Button -> Widget -> IO () ; bsi = buttonSetImage }
-         in pullWidget bsi ;
+-- | Inserts a color chooser button, after an initial
+-- 'Graphics.UI.Gtk.Gdk.GC.Color' and a @Color -> IO ()@ to be
+-- called when a new color is choosen.
 
- pBPS p i = RPN $
-     let { bps :: Box -> Widget -> IO () ; bps b w = boxPackStart b w p i }
-         in pullWidget bps ;
+rCOLOR :: Color -> (Color -> IO ()) -> RPN
+rCOLOR c cb = mconcat [cBTNCLRCL c, tCBKCOLOR callback]
+ where callback w = onColorSet w (colorButtonGetColor w >>= cb)
+        >> return ()
 
- pBPE p i = RPN $
-     let { bpe :: Box -> Widget -> IO () ; bpe b w = boxPackEnd b w p i }
-         in pullWidget bpe ;
+-- | Inserts a
+-- 'Graphics.UI.Gtk.Selectors.FileChooserButton.FileChooserButton'
+-- after a @'System.IO.FilePath' -> IO ()@ to be called when
+-- a file is choosen by the user. (This is not working since
+-- @gtk2hs@ do not yet support the @"file-set"@ signal for
+-- this widget.)
 
- pBPSD = RPN $
-     let { bpsd :: Box -> Widget -> IO () ; bpsd = boxPackStartDefaults }
-         in pullWidget bpsd ;
+rFILE :: FileChooserAction -> RPN
+rFILE = cBTNFLE
 
- pBPED = RPN $
-     let { bped :: Box -> Widget -> IO () ; bped = boxPackEndDefaults }
-         in pullWidget bped ;
+-- | Inserts a font chooser button after a @String -> IO ()@
+-- to be called when a new font is choosen.
 
- pFP p = RPN $
-     let { fp :: Fixed -> Widget -> IO () ; fp f w = fixedPut f w p }
-         in pullWidget fp ;
+rFONT :: String -> (String -> IO ()) -> RPN
+rFONT c cb = mconcat [cBTNFONFN c, tCBKFONT callback]
+ where callback w = onFontSet w (fontButtonGetFontName w >>= cb)
+        >> return ()
 
- pPA1 = RPN $
-     let { pa1 :: Paned -> Widget -> IO () ; pa1 = panedAdd1 }
-         in pullWidget pa1 ;
+-- | Frames the last widget, adding a label.
 
- pPA2 = RPN $
-     let { pa2 :: Paned -> Widget -> IO () ; pa2 = panedAdd2 }
-         in pullWidget pa2 ;
+rFRAME :: String -> RPN
+rFRAME s = mconcat [cFRM, tSETFRAME [frameLabel := s], pCA]
 
- pPP1 r s = RPN $
-     let { pp1 :: Paned -> Widget -> IO () ; pp1 p w = panedPack1 p w r s }
-         in pullWidget pp1 ;
+-- | After a list of 'Graphics.UI.Gtk.Abstract.Box.Packing'
+-- styles, 'rHBOX' and 'rVBOX' pack the last widgets respectively
+-- in an horizontal or vertical box, as many as there are styles
+-- in that list. Do not use them to pack buttons, instead use
+-- 'rHBBOX' and 'rVBBOX'.
 
- pPP2 r s = RPN $
-     let { pp2 :: Paned -> Widget -> IO () ; pp2 p w = panedPack2 p w r s }
-         in pullWidget pp2 ;
+rHBOX,rVBOX :: [Packing] -> RPN
+rHBOX p = mconcat $ cHBX : map pBPE (reverse p)
+rVBOX p = mconcat $ cVBX : map pBPE (reverse p)
 
- pLP x y = RPN $
-     let { lp :: Layout -> Widget -> IO () ; lp l w = layoutPut l w x y }
-         in pullWidget lp ;
+-- | After a number @n@, 'rHBBOX' and 'rVBBOX' pack the last @n@
+-- widgets respectively in an horizontal or vertical box. Widgets
+-- are supposed to be buttons.
 
- pNAP s = RPN $
-     let { nap :: Notebook -> Widget -> IO Int ;
-     nap l w = notebookAppendPage l w s }
-         in pullWidget nap ;
+rHBBOX,rVBBOX :: (Integral n) => n -> RPN
+rHBBOX n = mconcat $ cHBXBTN : genericReplicate n (pBPE PackNatural)
+rVBBOX n = mconcat $ cVBXBTN : genericReplicate n (pBPE PackNatural)
 
- pNAPM = RPN $
-     let { napm :: Notebook -> Widget -> Widget -> Widget -> IO Int ;
-     napm = notebookAppendPageMenu }
-         in pullWidget3 napm ;
+-- | 'rHPANE' and 'rVPANE' create, respectively, horizontal
+-- and vertical 'Graphics.UI.Gtk.Abstract.Paned.Paned's.
+-- @Bool@ parameters says whether left and right panes are
+-- allowed to expand when the containing @Paned@ widget
+-- grows.
 
- pNPP s = RPN $
-     let { npp :: Notebook -> Widget -> IO Int ;
-     npp l w = notebookPrependPage l w s }
-         in pullWidget npp ;
+rHPANE,rVPANE :: (Bool,Bool) -> RPN
+rHPANE (r1,r2) = mconcat [cHPD, pPP2 r2, pPP1 r1]
+rVPANE (r1,r2) = mconcat [cVPD, pPP2 r2, pPP1 r1]
 
- pNPPM = RPN $
-     let { nppm :: Notebook -> Widget -> Widget -> Widget -> IO Int ;
-     nppm = notebookPrependPageMenu }
-         in pullWidget3 nppm ;
+-- | 'rHSCALE' and 'rVSCALE' create, respectively, horizontal
+-- and vertical 'Graphics.UI.Gtk.Abstract.Scale.Scale's, after
+-- a @(Double,Double)@ interval and a @Double -> IO ()@ to be
+-- called when the value in the @Scale@ changes.
 
- pTA l r t b xo yo xp yp = RPN $
-     let { ta :: Table -> Widget -> IO () ; ta tab wid =
-     tableAttach tab wid l r t b xo yo xp yp }
-         in pullWidget ta ;
+rHSCALE,rVSCALE :: (Double,Double) -> (Double -> IO ()) -> RPN
+rHSCALE (v1,v2) io = mconcat [cHSCRNG v1 v2,
+ tCBKRANGE $ configScale io]
+rVSCALE (v1,v2) io = mconcat [cVSCRNG v1 v2,
+ tCBKRANGE $ configScale io]
 
- pTAD l r t b = RPN $
-     let { tad :: Table -> Widget -> IO () ;
-     tad ta wi = tableAttachDefaults ta wi l r t b }
-         in pullWidget tad ;
+configScale io w = do
+  set w [rangeUpdatePolicy := UpdateDelayed]
+  adj <- A.get w rangeAdjustment
+  v1 <- A.get adj adjustmentLower
+  v2 <- A.get adj adjustmentUpper
+  set w [rangeValue := (v2+v1)/2]
+  onRangeValueChanged w $ A.get w rangeValue >>= io
+  return ()
 
- pTVACAA a = RPN $
-     let { tvacaa :: TextView -> Widget -> IO () ; tvacaa t w =
-     textViewAddChildAtAnchor t w a }
-         in pullWidget tvacaa ;
+-- | 'rHSEPARATOR' and 'rVSEPARATOR' insert, respectively,
+-- horizontal and vertical 'Graphics.UI.Gtk.Abstract.Separator's
+-- in the stack.
 
- pTVACIW t x y = RPN $
-     let { tvaciw :: TextView -> Widget -> IO () ; tvaciw te wi =
-     textViewAddChildInWindow te wi t x y }
-         in pullWidget tvaciw ;
+rHSEPARATOR,rVSEPARATOR :: RPN
+rHSEPARATOR = cHSP
+rVSEPARATOR = cVSP
 
- pTI i = RPN $
-     let { ti :: Toolbar -> ToolItem -> IO () ; ti tc tic =
-     toolbarInsert tc tic i }
-         in pullWidget ti ;
+-- | 'rIMAGE' takes a 'System.IO.FilePath' to
+-- an image and inserts a widget showing that
+-- image in the stack.
 
- rCBK :: ( Widget -> IO () ) -> RPN ;
- rCBK f = RPN $ touchWidget cb
-  where {
-      cb w = after w realize $ f w
-  } ;
+rIMAGE :: FilePath -> RPN
+rIMAGE = cIMGFLE
 
- rTME :: ( Widget -> IO () ) -> Int -> RPN ;
- rTME f dt = rCBK i
-  where {
-      i w = do {
-           id <- timeoutAdd ( f w >> return True ) dt ;
-           on w unrealize $ timeoutRemove id
-      } >> return ()
-  } ;
+-- | 'rLABEL' inserts a 'Graphics.UI.Gtk.Display.Label.Label'
+-- in the stack, after a @String@. This @String@
+-- is supposed to be @Pango@ "Graphics.UI.Gtk.Pango.Markup".
 
- rSHPE :: ( ( Double , Double ) -> Render () ) -> RPN ;
- rSHPE c = mconcat [ cDRW , tON e s ]
-  where {
-      e :: Signal Widget ( EventM EExpose Bool ) ;
-      e = exposeEvent ;
-      s = do {
-           w <- eventWindow ;
-           liftIO $ do {
-               ( ww , wh ) <- liftIO $ drawableGetSize w ;
-               let { ch = c ( fromIntegral ww , fromIntegral wh ) } ;
-               liftIO $ renderWithDrawable w ch ;
-           } ;
-           return True
-      }
-  } ;
+rLABEL :: String -> RPN
+rLABEL s = mconcat [cLBL s, tSETLABEL [labelUseMarkup := True]]
 
- rANIM :: Int -> IO a -> ( a -> ( Double , Double ) -> Render () ) -> RPN ;
- rANIM dt readData toRender = mconcat [ cDRW , tON e ef , tON m mf ]
-  where {
-      e :: Signal Widget ( EventM EExpose Bool ) ;
-      e = exposeEvent ;
-      ef = do {
-          dw <- eventWindow ;
-          liftIO $ do {
-              (sx,sy) <- drawableGetSize dw ;
-              let { (sx',sy') = (fromIntegral sx , fromIntegral sy) } ;
-              d <- readData ;
-              let { render = toRender d (sx',sy') } ;
-              renderWithDrawable dw render ;
-          } ;
-          return True
-      } ;
-      m :: Signal Widget ( EventM EAny Bool ) ;
-      m = mapEvent ;
-      mf = do {
-          dw <- eventWindow ;
-          liftIO $ do {
-              (sx,sy) <- drawableGetSize dw ;
-              let { area = Rectangle 0 0 sx sy } ;
-              let { f = drawWindowInvalidateRect dw area False } ;
-              timeoutAdd ( f >> return True ) dt
-          } ;
-          return True
-      }
-  } ;
-}
+-- | 'rNOTEBOOK' takes a list of @String@
+-- labels and add widgets from the stack to a
+-- 'Graphics.UI.Gtk.Layout.Notebook.Notebook', as many as the
+-- labels provided.
+
+rNOTEBOOK :: [String] -> RPN
+rNOTEBOOK lb = mconcat $ cNBK : map pNPP (reverse lb)
+
+-- | 'rSCROLL' packs the last widget in a container
+-- with horizontal and vertical scroll bars.
+
+rSCROLL :: RPN
+rSCROLL = mconcat [cLAY, pLAY, cSRL, pCA]
+
+-- | 'rSOCKET' allows inserting a foreign (from
+-- other program) widget inside the stack, given its
+-- 'Graphics.UI.Gtk.Embedding.Socket.NativeWindowId'.
+
+rSOCKET :: NativeWindowId -> RPN
+rSOCKET id = mconcat [cSKT, tCBKSOCKET (flip socketAddId id)]
+
+-- | 'rSPIN' creates a
+-- 'Graphics.UI.Gtk.Entry.SpinButton.SpinButton' after a
+-- @(Double,Double)@ interval and a @Double -> IO ()@ to be
+-- called when the value in the @SpinButton@ changes.
+
+rSPIN :: (Double,Double) -> (Double -> IO ()) -> RPN
+rSPIN (v1,v2) io = mconcat [cBTNSPIRNG v1 v2,
+ tCBKSPIN $ configSpin io]
+
+configSpin io w = do
+  adj <- A.get w spinButtonAdjustment
+  v1 <- A.get adj adjustmentLower
+  v2 <- A.get adj adjustmentUpper
+  set w [spinButtonValue := (v2+v1)/2]
+  onValueSpinned w $ A.get w spinButtonValue >>= io
+  return ()
+
+-- | 'rTEXT' creates a text view after a
+-- given buffer, which shall be an instance of
+-- 'Graphics.UI.Gtk.Multiline.TextBuffer.TextBufferClass'.
+
+rTEXT :: (TextBufferClass b) => b -> RPN
+rTEXT = cTVWBF
+
+-- | 'rMAIN' packs the last widget in a main window, given
+-- its title.
+
+rMAIN :: String -> RPN
+rMAIN t = mconcat [cWND, tSETWINDOW [windowTitle := t], pCA]
diff --git a/src/Graphics/UI/Gtk/Layout/Rpn/CanBeCasted.hs b/src/Graphics/UI/Gtk/Layout/Rpn/CanBeCasted.hs
deleted file mode 100644
--- a/src/Graphics/UI/Gtk/Layout/Rpn/CanBeCasted.hs
+++ /dev/null
@@ -1,508 +0,0 @@
-module Graphics.UI.Gtk.Layout.Rpn.CanBeCasted where {
-import Graphics.UI.Gtk ;
-import Graphics.UI.Gtk.Types ;
-
- class ( GObjectClass g ) => CanBeCasted g where {
-     glibCast :: ( GObjectClass o ) => o -> Maybe g ;
-     glibCast a = if isA a t then Just ( c a ) else Nothing
-         where { ( t , c ) = castData } ;
-     castData :: ( GObjectClass g1 ) => ( GType , g1 -> g )
- } ;
-
- instance CanBeCasted AboutDialog where {
-     castData = ( gTypeAboutDialog , castToAboutDialog )
- } ;
- instance CanBeCasted AccelLabel where {
-     castData = ( gTypeAccelLabel , castToAccelLabel )
- } ;
- instance CanBeCasted Action where {
-     castData = ( gTypeAction , castToAction )
- } ;
- instance CanBeCasted ActionGroup where {
-     castData = ( gTypeActionGroup , castToActionGroup )
- } ;
--- instance CanBeCasted Adapter where {
---     castData = ( gTypeAdapter , castToAdapter )
--- } ;
- instance CanBeCasted Adjustment where {
-     castData = ( gTypeAdjustment , castToAdjustment )
- } ;
- instance CanBeCasted Alignment where {
-     castData = ( gTypeAlignment , castToAlignment )
- } ;
- instance CanBeCasted Arrow where {
-     castData = ( gTypeArrow , castToArrow )
- } ;
- instance CanBeCasted AspectFrame where {
-     castData = ( gTypeAspectFrame , castToAspectFrame )
- } ;
--- instance CanBeCasted BaseSink where {
---     castData = ( gTypeBaseSink , castToBaseSink )
--- } ;
--- instance CanBeCasted BaseSrc where {
---     castData = ( gTypeBaseSrc , castToBaseSrc )
--- } ;
--- instance CanBeCasted BaseTransform where {
---     castData = ( gTypeBaseTransform , castToBaseTransform )
--- } ;
- instance CanBeCasted Bin where {
-     castData = ( gTypeBin , castToBin )
- } ;
- instance CanBeCasted Box where {
-     castData = ( gTypeBox , castToBox )
- } ;
--- instance CanBeCasted Buffer where {
---     castData = ( gTypeBuffer , castToBuffer )
--- } ;
--- instance CanBeCasted Bus where {
---     castData = ( gTypeBus , castToBus )
--- } ;
- instance CanBeCasted Button where {
-     castData = ( gTypeButton , castToButton )
- } ;
- instance CanBeCasted ButtonBox where {
-     castData = ( gTypeButtonBox , castToButtonBox )
- } ;
- instance CanBeCasted Calendar where {
-     castData = ( gTypeCalendar , castToCalendar )
- } ;
- instance CanBeCasted CellRenderer where {
-     castData = ( gTypeCellRenderer , castToCellRenderer )
- } ;
- instance CanBeCasted CellRendererCombo where {
-     castData = ( gTypeCellRendererCombo , castToCellRendererCombo )
- } ;
- instance CanBeCasted CellRendererPixbuf where {
-     castData = ( gTypeCellRendererPixbuf , castToCellRendererPixbuf )
- } ;
- instance CanBeCasted CellRendererProgress where {
-     castData = ( gTypeCellRendererProgress , castToCellRendererProgress )
- } ;
- instance CanBeCasted CellRendererText where {
-     castData = ( gTypeCellRendererText , castToCellRendererText )
- } ;
- instance CanBeCasted CellRendererToggle where {
-     castData = ( gTypeCellRendererToggle , castToCellRendererToggle )
- } ;
- instance CanBeCasted CellView where {
-     castData = ( gTypeCellView , castToCellView )
- } ;
- instance CanBeCasted CheckButton where {
-     castData = ( gTypeCheckButton , castToCheckButton )
- } ;
- instance CanBeCasted CheckMenuItem where {
-     castData = ( gTypeCheckMenuItem , castToCheckMenuItem )
- } ;
- instance CanBeCasted Clipboard where {
-     castData = ( gTypeClipboard , castToClipboard )
- } ;
--- instance CanBeCasted Clock where {
---     castData = ( gTypeClock , castToClock )
--- } ;
- instance CanBeCasted ColorButton where {
-     castData = ( gTypeColorButton , castToColorButton )
- } ;
- instance CanBeCasted ColorSelection where {
-     castData = ( gTypeColorSelection , castToColorSelection )
- } ;
- instance CanBeCasted ColorSelectionDialog where {
-     castData = ( gTypeColorSelectionDialog , castToColorSelectionDialog )
- } ;
- instance CanBeCasted Combo where {
-     castData = ( gTypeCombo , castToCombo )
- } ;
- instance CanBeCasted ComboBox where {
-     castData = ( gTypeComboBox , castToComboBox )
- } ;
- instance CanBeCasted ComboBoxEntry where {
-     castData = ( gTypeComboBoxEntry , castToComboBoxEntry )
- } ;
- instance CanBeCasted Container where {
-     castData = ( gTypeContainer , castToContainer )
- } ;
- instance CanBeCasted Dialog where {
-     castData = ( gTypeDialog , castToDialog )
- } ;
- instance CanBeCasted DragContext where {
-     castData = ( gTypeDragContext , castToDragContext )
- } ;
- instance CanBeCasted DrawWindow where {
-     castData = ( gTypeDrawWindow , castToDrawWindow )
- } ;
- instance CanBeCasted Drawable where {
-     castData = ( gTypeDrawable , castToDrawable )
- } ;
- instance CanBeCasted DrawingArea where {
-     castData = ( gTypeDrawingArea , castToDrawingArea )
- } ;
--- instance CanBeCasted Drive where {
---     castData = ( gTypeDrive , castToDrive )
--- } ;
- instance CanBeCasted Editable where {
-     castData = ( gTypeEditable , castToEditable )
- } ;
--- instance CanBeCasted Element where {
---     castData = ( gTypeElement , castToElement )
--- } ;
--- instance CanBeCasted ElementFactory where {
---     castData = ( gTypeElementFactory , castToElementFactory )
--- } ;
- instance CanBeCasted Entry where {
-     castData = ( gTypeEntry , castToEntry )
- } ;
- instance CanBeCasted EntryCompletion where {
-     castData = ( gTypeEntryCompletion , castToEntryCompletion )
- } ;
- instance CanBeCasted EventBox where {
-     castData = ( gTypeEventBox , castToEventBox )
- } ;
- instance CanBeCasted Expander where {
-     castData = ( gTypeExpander , castToExpander )
- } ;
- instance CanBeCasted FileChooser where {
-     castData = ( gTypeFileChooser , castToFileChooser )
- } ;
- instance CanBeCasted FileChooserButton where {
-     castData = ( gTypeFileChooserButton , castToFileChooserButton )
- } ;
- instance CanBeCasted FileChooserDialog where {
-     castData = ( gTypeFileChooserDialog , castToFileChooserDialog )
- } ;
- instance CanBeCasted FileChooserWidget where {
-     castData = ( gTypeFileChooserWidget , castToFileChooserWidget )
- } ;
- instance CanBeCasted FileFilter where {
-     castData = ( gTypeFileFilter , castToFileFilter )
- } ;
- instance CanBeCasted FileSelection where {
-     castData = ( gTypeFileSelection , castToFileSelection )
- } ;
- instance CanBeCasted Fixed where {
-     castData = ( gTypeFixed , castToFixed )
- } ;
- instance CanBeCasted FontButton where {
-     castData = ( gTypeFontButton , castToFontButton )
- } ;
- instance CanBeCasted FontSelection where {
-     castData = ( gTypeFontSelection , castToFontSelection )
- } ;
- instance CanBeCasted FontSelectionDialog where {
-     castData = ( gTypeFontSelectionDialog , castToFontSelectionDialog )
- } ;
- instance CanBeCasted Frame where {
-     castData = ( gTypeFrame , castToFrame )
- } ;
- instance CanBeCasted GC where {
-     castData = ( gTypeGC , castToGC )
- } ;
--- instance CanBeCasted GLConfig where {
---     castData = ( gTypeGLConfig , castToGLConfig )
--- } ;
--- instance CanBeCasted GLContext where {
---     castData = ( gTypeGLContext , castToGLContext )
--- } ;
--- instance CanBeCasted GLDrawable where {
---     castData = ( gTypeGLDrawable , castToGLDrawable )
--- } ;
--- instance CanBeCasted GLPixmap where {
---     castData = ( gTypeGLPixmap , castToGLPixmap )
--- } ;
--- instance CanBeCasted GLWindow where {
---     castData = ( gTypeGLWindow , castToGLWindow )
--- } ;
--- instance CanBeCasted GhostPad where {
---     castData = ( gTypeGhostPad , castToGhostPad )
--- } ;
- instance CanBeCasted HBox where {
-     castData = ( gTypeHBox , castToHBox )
- } ;
- instance CanBeCasted HButtonBox where {
-     castData = ( gTypeHButtonBox , castToHButtonBox )
- } ;
- instance CanBeCasted HPaned where {
-     castData = ( gTypeHPaned , castToHPaned )
- } ;
- instance CanBeCasted HScale where {
-     castData = ( gTypeHScale , castToHScale )
- } ;
- instance CanBeCasted HScrollbar where {
-     castData = ( gTypeHScrollbar , castToHScrollbar )
- } ;
- instance CanBeCasted HSeparator where {
-     castData = ( gTypeHSeparator , castToHSeparator )
- } ;
- instance CanBeCasted HandleBox where {
-     castData = ( gTypeHandleBox , castToHandleBox )
- } ;
- instance CanBeCasted IconFactory where {
-     castData = ( gTypeIconFactory , castToIconFactory )
- } ;
- instance CanBeCasted IconView where {
-     castData = ( gTypeIconView , castToIconView )
- } ;
- instance CanBeCasted Image where {
-     castData = ( gTypeImage , castToImage )
- } ;
- instance CanBeCasted ImageMenuItem where {
-     castData = ( gTypeImageMenuItem , castToImageMenuItem )
- } ;
--- instance CanBeCasted ImplementsInterface where {
---     castData = ( gTypeImplementsInterface , castToImplementsInterface )
--- } ;
--- instance CanBeCasted Index where {
---     castData = ( gTypeIndex , castToIndex )
--- } ;
--- instance CanBeCasted IndexFactory where {
---     castData = ( gTypeIndexFactory , castToIndexFactory )
--- } ;
- instance CanBeCasted Label where {
-     castData = ( gTypeLabel , castToLabel )
- } ;
- instance CanBeCasted Layout where {
-     castData = ( gTypeLayout , castToLayout )
- } ;
- instance CanBeCasted Menu where {
-     castData = ( gTypeMenu , castToMenu )
- } ;
- instance CanBeCasted MenuBar where {
-     castData = ( gTypeMenuBar , castToMenuBar )
- } ;
- instance CanBeCasted MenuItem where {
-     castData = ( gTypeMenuItem , castToMenuItem )
- } ;
- instance CanBeCasted MenuShell where {
-     castData = ( gTypeMenuShell , castToMenuShell )
- } ;
- instance CanBeCasted MenuToolButton where {
-     castData = ( gTypeMenuToolButton , castToMenuToolButton )
- } ;
--- instance CanBeCasted Message where {
---     castData = ( gTypeMessage , castToMessage )
--- } ;
- instance CanBeCasted MessageDialog where {
-     castData = ( gTypeMessageDialog , castToMessageDialog )
- } ;
--- instance CanBeCasted MiniObject where {
---     castData = ( gTypeMiniObject , castToMiniObject )
--- } ;
- instance CanBeCasted Misc where {
-     castData = ( gTypeMisc , castToMisc )
- } ;
- instance CanBeCasted Notebook where {
-     castData = ( gTypeNotebook , castToNotebook )
- } ;
- instance CanBeCasted Object where {
-     castData = ( gTypeObject , castToObject )
- } ;
- instance CanBeCasted OptionMenu where {
-     castData = ( gTypeOptionMenu , castToOptionMenu )
- } ;
--- instance CanBeCasted Pad where {
---     castData = ( gTypePad , castToPad )
--- } ;
--- instance CanBeCasted PadTemplate where {
---     castData = ( gTypePadTemplate , castToPadTemplate )
--- } ;
- instance CanBeCasted Paned where {
-     castData = ( gTypePaned , castToPaned )
- } ;
--- instance CanBeCasted Pipeline where {
---     castData = ( gTypePipeline , castToPipeline )
--- } ;
- instance CanBeCasted Pixbuf where {
-     castData = ( gTypePixbuf , castToPixbuf )
- } ;
- instance CanBeCasted Plug where {
-     castData = ( gTypePlug , castToPlug )
- } ;
--- instance CanBeCasted Plugin where {
---     castData = ( gTypePlugin , castToPlugin )
--- } ;
--- instance CanBeCasted PluginFeature where {
---     castData = ( gTypePluginFeature , castToPluginFeature )
--- } ;
- instance CanBeCasted ProgressBar where {
-     castData = ( gTypeProgressBar , castToProgressBar )
- } ;
--- instance CanBeCasted PushSrc where {
---     castData = ( gTypePushSrc , castToPushSrc )
--- } ;
--- instance CanBeCasted Query where {
---     castData = ( gTypeQuery , castToQuery )
--- } ;
- instance CanBeCasted RadioAction where {
-     castData = ( gTypeRadioAction , castToRadioAction )
- } ;
- instance CanBeCasted RadioButton where {
-     castData = ( gTypeRadioButton , castToRadioButton )
- } ;
- instance CanBeCasted RadioMenuItem where {
-     castData = ( gTypeRadioMenuItem , castToRadioMenuItem )
- } ;
- instance CanBeCasted RadioToolButton where {
-     castData = ( gTypeRadioToolButton , castToRadioToolButton )
- } ;
- instance CanBeCasted Range where {
-     castData = ( gTypeRange , castToRange )
- } ;
--- instance CanBeCasted Registry where {
---     castData = ( gTypeRegistry , castToRegistry )
--- } ;
- instance CanBeCasted Scale where {
-     castData = ( gTypeScale , castToScale )
- } ;
- instance CanBeCasted Screen where {
-     castData = ( gTypeScreen , castToScreen )
- } ;
- instance CanBeCasted Scrollbar where {
-     castData = ( gTypeScrollbar , castToScrollbar )
- } ;
- instance CanBeCasted ScrolledWindow where {
-     castData = ( gTypeScrolledWindow , castToScrolledWindow )
- } ;
- instance CanBeCasted Separator where {
-     castData = ( gTypeSeparator , castToSeparator )
- } ;
- instance CanBeCasted SeparatorMenuItem where {
-     castData = ( gTypeSeparatorMenuItem , castToSeparatorMenuItem )
- } ;
- instance CanBeCasted SeparatorToolItem where {
-     castData = ( gTypeSeparatorToolItem , castToSeparatorToolItem )
- } ;
- instance CanBeCasted SizeGroup where {
-     castData = ( gTypeSizeGroup , castToSizeGroup )
- } ;
- instance CanBeCasted Socket where {
-     castData = ( gTypeSocket , castToSocket )
- } ;
--- instance CanBeCasted SourceBuffer where {
---     castData = ( gTypeSourceBuffer , castToSourceBuffer )
--- } ;
--- instance CanBeCasted SourceLanguage where {
---     castData = ( gTypeSourceLanguage , castToSourceLanguage )
--- } ;
--- instance CanBeCasted SourceLanguageManager where {
---     castData = ( gTypeSourceLanguageManager , castToSourceLanguageManager )
--- } ;
--- instance CanBeCasted SourceMark where {
---     castData = ( gTypeSourceMark , castToSourceMark )
--- } ;
--- instance CanBeCasted SourceStyleScheme where {
---     castData = ( gTypeSourceStyleScheme , castToSourceStyleScheme )
--- } ;
--- instance CanBeCasted SourceView where {
---     castData = ( gTypeSourceView , castToSourceView )
--- } ;
- instance CanBeCasted SpinButton where {
-     castData = ( gTypeSpinButton , castToSpinButton )
- } ;
- instance CanBeCasted StatusIcon where {
-     castData = ( gTypeStatusIcon , castToStatusIcon )
- } ;
- instance CanBeCasted Statusbar where {
-     castData = ( gTypeStatusbar , castToStatusbar )
- } ;
- instance CanBeCasted Style where {
-     castData = ( gTypeStyle , castToStyle )
- } ;
--- instance CanBeCasted SystemClock where {
---     castData = ( gTypeSystemClock , castToSystemClock )
--- } ;
- instance CanBeCasted Table where {
-     castData = ( gTypeTable , castToTable )
- } ;
- instance CanBeCasted TearoffMenuItem where {
-     castData = ( gTypeTearoffMenuItem , castToTearoffMenuItem )
- } ;
- instance CanBeCasted TextBuffer where {
-     castData = ( gTypeTextBuffer , castToTextBuffer )
- } ;
- instance CanBeCasted TextMark where {
-     castData = ( gTypeTextMark , castToTextMark )
- } ;
- instance CanBeCasted TextTag where {
-     castData = ( gTypeTextTag , castToTextTag )
- } ;
- instance CanBeCasted TextTagTable where {
-     castData = ( gTypeTextTagTable , castToTextTagTable )
- } ;
- instance CanBeCasted TextView where {
-     castData = ( gTypeTextView , castToTextView )
- } ;
- instance CanBeCasted ToggleAction where {
-     castData = ( gTypeToggleAction , castToToggleAction )
- } ;
- instance CanBeCasted ToggleButton where {
-     castData = ( gTypeToggleButton , castToToggleButton )
- } ;
- instance CanBeCasted ToggleToolButton where {
-     castData = ( gTypeToggleToolButton , castToToggleToolButton )
- } ;
- instance CanBeCasted ToolButton where {
-     castData = ( gTypeToolButton , castToToolButton )
- } ;
- instance CanBeCasted ToolItem where {
-     castData = ( gTypeToolItem , castToToolItem )
- } ;
- instance CanBeCasted Toolbar where {
-     castData = ( gTypeToolbar , castToToolbar )
- } ;
- instance CanBeCasted Tooltips where {
-     castData = ( gTypeTooltips , castToTooltips )
- } ;
- instance CanBeCasted TreeModel where {
-     castData = ( gTypeTreeModel , castToTreeModel )
- } ;
- instance CanBeCasted TreeModelSort where {
-     castData = ( gTypeTreeModelSort , castToTreeModelSort )
- } ;
- instance CanBeCasted TreeSelection where {
-     castData = ( gTypeTreeSelection , castToTreeSelection )
- } ;
- instance CanBeCasted TreeSortable where {
-     castData = ( gTypeTreeSortable , castToTreeSortable )
- } ;
- instance CanBeCasted TreeView where {
-     castData = ( gTypeTreeView , castToTreeView )
- } ;
- instance CanBeCasted TreeViewColumn where {
-     castData = ( gTypeTreeViewColumn , castToTreeViewColumn )
- } ;
- instance CanBeCasted UIManager where {
-     castData = ( gTypeUIManager , castToUIManager )
- } ;
- instance CanBeCasted VBox where {
-     castData = ( gTypeVBox , castToVBox )
- } ;
- instance CanBeCasted VButtonBox where {
-     castData = ( gTypeVButtonBox , castToVButtonBox )
- } ;
- instance CanBeCasted VPaned where {
-     castData = ( gTypeVPaned , castToVPaned )
- } ;
- instance CanBeCasted VScale where {
-     castData = ( gTypeVScale , castToVScale )
- } ;
- instance CanBeCasted VScrollbar where {
-     castData = ( gTypeVScrollbar , castToVScrollbar )
- } ;
- instance CanBeCasted VSeparator where {
-     castData = ( gTypeVSeparator , castToVSeparator )
- } ;
- instance CanBeCasted Viewport where {
-     castData = ( gTypeViewport , castToViewport )
- } ;
--- instance CanBeCasted Volume where {
---     castData = ( gTypeVolume , castToVolume )
--- } ;
- instance CanBeCasted Widget where {
-     castData = ( gTypeWidget , castToWidget )
- } ;
- instance CanBeCasted Window where {
-     castData = ( gTypeWindow , castToWindow )
- } ;
- instance CanBeCasted WindowGroup where {
-     castData = ( gTypeWindowGroup , castToWindowGroup )
- }
-
-}
diff --git a/src/RPN.hs b/src/RPN.hs
new file mode 100644
--- /dev/null
+++ b/src/RPN.hs
@@ -0,0 +1,80 @@
+{-# OPTIONS_HADDOCK hide #-}
+
+module RPN (
+    pushWidget, touchWidget, pullWidget, RPN (RPN), io2rpn,
+    widgetsFromRpn
+ ) where
+import Graphics.UI.Gtk (Widget,ContainerClass)
+import Data.Monoid
+import Control.Monad.State
+import Data.Maybe
+import Data.List
+import CanBeCasted
+
+-- | All operators in our reverse polish notation implementation
+-- are going to operate on a stack, represented by a
+-- @['Graphics.UI.Gtk.Widget']@. 'ActionType' is the type
+-- of such operations.  A few functions are also defined to
+-- manipulate that stack.
+
+type ActionType a = StateT [Widget] IO a
+
+-- | 'pushWidget' inserts a widget in the stack, casting it
+-- to Widget.
+
+pushWidget :: ( CanBeCasted w ) => w -> ActionType ()
+pushWidget w = case (glibCast w) of
+    Just w' -> modify (w':)
+    _ -> return ()
+
+-- | 'touchWidget' applies a @(a -> IO ())@ to the last
+-- inserted widget in the stack that can be casted to @a@,
+-- if there is one.  The widget remains in the stack.
+
+touchWidget :: (CanBeCasted a) => (a -> IO ()) -> ActionType ()
+touchWidget f = liftM (listToMaybe . mapMaybe glibCast) get >>=
+    maybe (return ()) (liftIO . f)
+
+-- | 'pullWidget' will apply a packing function (like, say,
+-- 'Graphics.UI.Gtk.containerAdd') to the last container
+-- inserted in the widget list that can be casted to type @a@
+-- and the last inserted widget that is not such container.
+-- The container remains in the list.
+
+pullWidget :: (CanBeCasted a, ContainerClass a) =>
+ (a -> Widget -> IO ()) -> ActionType ()
+pullWidget f = do
+    casted <- liftM (map glibCast) get
+    let iC = take 1 $ findIndices isJust casted
+    let iW = [0..length casted - 1] \\ iC
+    case (listToMaybe iC,listToMaybe iW) of
+        (Just ic, Just iw) -> do
+            let Just c = casted !! ic
+            w <- liftM (!! iw) get
+            liftIO $ f c w
+            modify $ (\(a,b) -> a ++ drop 1 b) . splitAt iw
+        _ -> return ()
+
+-- | 'RPN' is the type of all operators, and encapsulates the
+-- underline machinery.  It instantiates 'Data.Monoid.Monoid',
+-- therefore we can sequence operators in a list, and also
+-- create new operators by 'Data.Monoid.mconcat'ing others.
+
+newtype RPN = RPN ( ActionType () )
+
+instance Monoid RPN where
+    mempty = RPN $ return ()
+    mappend (RPN a) (RPN b) = RPN (a >> b)
+
+-- | Using 'io2rpn' we can make an @IO widget@ into an operator
+-- that inserts a widget in the stack.
+
+io2rpn :: (CanBeCasted w) => IO w -> RPN
+io2rpn = RPN . (>>= pushWidget) . liftIO
+
+-- | After we describe our widgets using a list of 'RPN's,
+-- we use 'widgetsFromRpn' to get them.
+
+widgetsFromRpn :: [RPN] -> IO [Widget]
+widgetsFromRpn list = liftM reverse $ execStateT unified []
+ where RPN unified = mconcat list
