Extract some common functionality into an abstract class

Also test the duplicate placeholder name error condition.
Add more error checking against duplicate/shadowing routes
Add credits and link blog post