diff --git a/firefly.cabal b/firefly.cabal
--- a/firefly.cabal
+++ b/firefly.cabal
@@ -1,5 +1,5 @@
 name:                firefly
-version:             0.1.0.1
+version:             0.1.1.0
 synopsis:            A simple HTTP server framework
 -- description:
 homepage:            https://github.com/ChrisPenner/firefly#readme
diff --git a/src/Web/Firefly.hs b/src/Web/Firefly.hs
--- a/src/Web/Firefly.hs
+++ b/src/Web/Firefly.hs
@@ -29,6 +29,7 @@
   , getCookie
   , isSecure
   , waiRequest
+  , pathMatches
 
   -- * Responses
   , ToResponse(..)
diff --git a/src/Web/Firefly/Handler.hs b/src/Web/Firefly/Handler.hs
--- a/src/Web/Firefly/Handler.hs
+++ b/src/Web/Firefly/Handler.hs
@@ -10,11 +10,7 @@
 import Web.Firefly.Request
 import Web.Firefly.Response
 import Control.Monad
-import Control.Monad.Trans
-import qualified Data.Text as T
 
-import Text.Regex.PCRE
-
 -- | Run a handler on a matching route.
 -- The handler may return any type which implements 'ToResponse'
 --
@@ -34,9 +30,5 @@
 -- >   route "/helloHarry" helloHarryHandler
 route :: (ToResponse r) => Pattern -> Handler r -> App ()
 route routePath handler = do
-  path <- getPath
-  when (routePath `matches` path) (handler >>= respond . toResponse)
-
--- | Determine whether a route matches a pattern
-matches :: Route -> Pattern -> Bool
-matches (T.unpack -> rt) (T.unpack -> pat) = ("^" ++ pat ++ "$") =~ rt
+  doesPathMatch <- pathMatches routePath
+  when doesPathMatch (handler >>= respond . toResponse)
diff --git a/src/Web/Firefly/Request.hs b/src/Web/Firefly/Request.hs
--- a/src/Web/Firefly/Request.hs
+++ b/src/Web/Firefly/Request.hs
@@ -2,6 +2,7 @@
 {-# language FlexibleContexts #-}
 {-# language ConstraintKinds #-}
 {-# language RankNTypes #-}
+{-# language ViewPatterns #-}
 module Web.Firefly.Request
   ( getPath
   , getPathInfo
@@ -20,6 +21,7 @@
   , getCookie
   , isSecure
   , waiRequest
+  , pathMatches
   ) where
 
 import Control.Monad.Reader
@@ -28,6 +30,7 @@
 import qualified Data.Text as T
 import qualified Data.Map as M
 import qualified Data.CaseInsensitive as CI
+import Text.Regex.PCRE
 
 import Web.Cookie
 import qualified Network.Wai as W
@@ -118,3 +121,10 @@
 -- | Exposes the underlying 'W.Request'.
 waiRequest :: ReqReader m =>  m W.Request
 waiRequest = asks request
+
+-- | Determine whether a route matches a pattern
+pathMatches :: ReqReader m => Pattern -> m Bool
+pathMatches pattern = checkMatch pattern <$> getPath 
+  where
+    checkMatch :: Pattern -> Route -> Bool
+    checkMatch (T.unpack -> pat) (T.unpack -> rt) = ("^" ++ pat ++ "$") =~ rt
