diff --git a/handle-like.cabal b/handle-like.cabal
--- a/handle-like.cabal
+++ b/handle-like.cabal
@@ -2,7 +2,7 @@
 build-type:	Simple
 
 name:		handle-like
-version:	0.0.0.14
+version:	0.1.0.0
 stability:	Experimental
 author:		Yoshikuni Jujo <PAF01143@nifty.ne.jp>
 maintainer:	Yoshikuni Jujo <PAF01143@nifty.ne.jp>
@@ -38,7 +38,7 @@
 source-repository	this
     type:	git
     location:	git://github.com/YoshikuniJujo/forest
-    tag:	handle-like-0.0.0.14
+    tag:	handle-like-0.1.0.0
 
 library
     hs-source-dirs:	src
diff --git a/src/Data/HandleLike.hs b/src/Data/HandleLike.hs
--- a/src/Data/HandleLike.hs
+++ b/src/Data/HandleLike.hs
@@ -1,6 +1,7 @@
 {-# LANGUAGE OverloadedStrings, TypeFamilies, FlexibleContexts #-}
 
-module Data.HandleLike (HandleLike(..), hlPutStrLn) where
+module Data.HandleLike (
+	HandleLike(..), hlPutStrLn, DebugHandle(..)) where
 
 import Control.Monad
 import Data.Word
@@ -11,7 +12,7 @@
 import System.IO
 
 class (Monad (HandleMonad h),
-	IsString (DebugLevel h), Ord (DebugLevel h)) =>
+	IsString (DebugLevel h), Ord (DebugLevel h), Bounded (DebugLevel h)) =>
 	HandleLike h where
 	type HandleMonad h
 	type DebugLevel h
@@ -41,7 +42,7 @@
 hlPutStrLn h = hlPut h . (`BS.append` "\n")
 
 data Priority = Low | Moderate | High | Critical
-	deriving (Show, Read, Eq, Ord, Enum)
+	deriving (Show, Read, Eq, Ord, Enum, Bounded)
 
 instance IsString Priority where
 	fromString s = case takeWhile (/= ':') s of
@@ -67,3 +68,21 @@
 	| BS.null bs = ""
 	| BSC.last bs == '\r' = BSC.init bs
 	| otherwise = bs
+
+data DebugHandle h = DebugHandle h (Maybe (DebugLevel h))
+
+instance HandleLike h => HandleLike (DebugHandle h) where
+	type HandleMonad (DebugHandle h) = HandleMonad h
+	type DebugLevel (DebugHandle h) = DebugLevel h
+	hlPut (DebugHandle h _) = hlPut h
+	hlGet (DebugHandle h _) = hlGet h
+	hlGetByte (DebugHandle h _) = hlGetByte h
+	hlGetLine (DebugHandle h _) = hlGetLine h
+	hlGetContent (DebugHandle h _) = hlGetContent h
+	hlFlush (DebugHandle h _) = hlFlush h
+	hlClose (DebugHandle h _) = hlClose h
+	hlDebug (DebugHandle _ Nothing) _ = const $ return ()
+	hlDebug (DebugHandle h (Just dl0)) dl
+		| dl >= dl0 = hlDebug h maxBound
+		| otherwise = const $ return ()
+	hlError (DebugHandle h _) = hlError h
