Passenger 팀에서 보내 온 EnumFu 패치 적용
몇 일전에 Passenger(mod_rails) 팀의 Hongli Lai 라는 개발자가 EnumFu의 패치를 메일로 보내주었다. 패치도 물론 고마웠지만 자신들이 EnumFu를 여러 곳에서 사용하고 있다는 내용이 있어 더 반가웠다.
Thank you for the excellent enum_fu plugin. We use it in many of our applications.....
Passenger 의 명성에 걸맞게 패치의 내용도 알차다.
먼저, car.status = :broken 대신에 car.status = 3 또는 car.status = '3' 등이 가능해졌다.
이 기능은 전에 다른 사람도 요청한 적이 있었지만, 심볼을 입력 값으로 사용하려는 원래 취지에 맞지 않을까 하여 미루고 있었던 거다. 하지만 나 역시 정수 값을 직접 쓰고 싶은 경우를 가끔 경험했기 때문에 그대로 반영했다.
두번째, :broken 이라는 심볼이 DB에 저장될 때의 실제 값을 알고 싶으면 Car.status(:broken) 를 사용한다. 이렇게 심볼의 값을 조회하는 메소드를 정의하는 부분에 있던 중대한 오류를 수정했다.
수정 전 후의 코드는 아래와 같다.
기존 코드
- self.class.send(:define_method, name, p1)
새로운 코드
- metaclass = class << self
- self
- end
- metaclass.send(:define_method, name, p1)
이해하기 쉽게 Car.status 예를 가지고 계속 설명하면,
기존 코드에서는 싱글턴 메소드 'status'를 Car.class 에 정의했다. 그런데 Car.class 는 'Class' 이므로, 이렇게 하면 Car뿐만 아닌 모든 클래스에 status 메소드가 생겨 버린다. (Aw Snap!)
새로운 코드에서는, 이를 바로잡기 위해서 Car의 메타클래스를 구한 뒤, 이 메타클래스에 status를 정의한다. 역시 메타프로그래밍은 헷갈린다.^^
끝으로, EnumFu에 대한 테스트 코드들이 추가되었다.
이번 패치 덕분에 EnumFu가 많이 진화했다. 아주 간단한 플러그인이지만 내가 만든 소스를 남들이 유용하게 사용해 준다는 것은 참 고마운일이다.
PS.
이 참에 EnumFu의 소스 코드 관리를 GitHub에서 하기로 했다. 위치는 http://github.com/ikspres/enum_fu
Comments
-
(ikspres) 우와, 자신이 만든 플러그인을 많은 사람들 (게다가, Passenger팀~!)이 유용하게 쓰고 있으면 정말 뿌듯할거 같아요. :) by 프리버즈
-
네. 정말 그래요.^^
-
Enum 처리는 항상 골칫거리인데 EnumFu 덕에 훨씬 수월해 졌습니다. 게다가 버전업까지 되었으니.. 우와~.. 잘 쓰겠습니다. 그리고 GitHub로 이사한 것 축하드립니다. by thinkr
-
와우, 이렇게 좋은게 있는지 몰랐네요. 저두 잘 쓸께요~ by chang
-
다시한번 말씀드리지만, 스프링노트팀에서도 아주 유용하게 잘 사용하고 있다는거 ^^
-
I know some <a href=http://www.wowgoldshopping.com>wow gold</a> in wow,i love wow,love <a href=http://www.wowgold-shopping.com>wow gold</a>,love wowgoldshopping.com,too. by wow gold
-
只需10元,就能让你的广告遍布各个网站! 支持图片/超链发送!支持分类/地域网站发送! 10元,就可能换来意想不到的效果,为什么不尝试下呢! QQ:224549200(注明“广告”) by Tandy
-
1 by test