http://www.oschina.net/code/snippet_127872_6370
http://blog.csdn.net/caiknife/article/details/8796505