diff --git a/Text/Email/Validate.hs b/Text/Email/Validate.hs
--- a/Text/Email/Validate.hs
+++ b/Text/Email/Validate.hs
@@ -1,4 +1,4 @@
-module Text.Email.Validate (isValid,validate)
+module Text.Email.Validate (isValid,validate,EmailAddress(..))
 where
 
 import Control.Arrow ((***))
@@ -7,6 +7,16 @@
 import Text.Parsec.Char
 import Data.Char (chr)
 
+-- | Constructor does no checking for invalid emails, so use at own risk.
+data EmailAddress = EmailAddress
+	{
+		localPart :: String,
+		domainPart :: String
+	}
+
+instance Show EmailAddress where
+	show (EmailAddress l d) = l ++ ('@' : d)
+
 -- | Validates whether a particular string is an email address
 --   according to RFC5322.
 isValid :: String -> Bool
@@ -17,12 +27,22 @@
 
 -- | If you want to find out why a particular string is not
 --   an email address, use this!
-validate :: String -> Either ParseError ()
-validate = parse addrSpec ""
-
-addrSpec = localPart >> char '@' >> domain >> eof
+validate :: String -> Either ParseError EmailAddress
+validate x = case parse addrSpec "" x of
+	Right n -> Right $ EmailAddress local domain
+		where (local,at:domain) = splitAt (length x - n) x
+	Left e -> Left e
+			
+addrSpec :: Parsec String () Int
+addrSpec = do
+	localPartParser
+	s1 <- getInput
+	char '@'
+	domain
+	eof
+	return (length s1)
 
-localPart = dottedAtoms
+localPartParser = dottedAtoms
 domain = dottedAtoms <|> domainLiteral 
 
 dottedAtoms = simply $ (optional cfws >> (atom <|> quotedString) >> optional cfws)
diff --git a/email-validate.cabal b/email-validate.cabal
--- a/email-validate.cabal
+++ b/email-validate.cabal
@@ -1,5 +1,5 @@
 name:           email-validate
-version:        0.2.1
+version:        0.2.3
 license:        BSD3
 license-file:   LICENSE
 author:         George Pollard
