This has been sitting in my development area for a while now. Finally generalizing it and checking it into Github