diff --git a/basic-lens.cabal b/basic-lens.cabal
--- a/basic-lens.cabal
+++ b/basic-lens.cabal
@@ -1,6 +1,6 @@
 name:                basic-lens
-version:             0.0.0
-synopsis:            Basic Lens type and functions
+version:             0.0.1
+synopsis:            Basic lens type and functions
 description:         Necessary type and functions for basic lens work.
                      .
                      Handy to depend on for libraries and general
@@ -20,4 +20,4 @@
   hs-source-dirs:    src/
   ghc-options:       -Wall -O2
   exposed-modules:   Control.Lens.Basic
-  build-depends:     base >= 4 && <5
+  build-depends:     base >= 4 && <5, template-haskell
diff --git a/src/Control/Lens/Basic.hs b/src/Control/Lens/Basic.hs
--- a/src/Control/Lens/Basic.hs
+++ b/src/Control/Lens/Basic.hs
@@ -1,4 +1,5 @@
 {-# LANGUAGE RankNTypes #-}
+{-# LANGUAGE TemplateHaskell #-}
 
 -- | Basic lens type and functions.
 --
@@ -15,6 +16,7 @@
   where
 
 import Control.Applicative
+import Language.Haskell.TH
 
 -- |
 --
@@ -29,7 +31,7 @@
 --
 -- Operations may do something more interesting inside the `f`
 -- functor. For the purpose of this module and package, all the
--- functions below ('view', 'over', 'set') use the identity functor
+-- functions below ('view', 'over', 'set') use a no-op functor
 -- and therefore the above type is equivalent to:
 --
 -- @type Lens s t a b = (a -> b) -> (s -> t)@
@@ -86,3 +88,15 @@
 -- and @t@.
 set :: Lens s t a b -> b -> s -> t
 set l a = runId . l (Id . const a)
+
+-- | Make a lens from a field name.
+--
+-- Example: @over $(field 'foo) (*2)@
+field :: Name -> Q Exp
+field name = do
+  [|\f r ->
+      fmap
+        $(lamE
+            [varP (mkName "a")]
+            (recUpdE (varE (mkName "r")) [return (name, VarE (mkName "a"))]))
+        (f ($(varE name) r))|]
