catalyst.perl.kmtz.net RSSフィード

 | 

2007-04-10Catalyst::Plugin::DumperとCatalyst::Log::Log4perlの併用 このエントリーを含むブックマーク

Catalyst::Plugin::Dumper$c->log->dumper で Data::Dumper::dumper を呼び出せるだけのシンプルモジュールだけど、使いたいときに毎度 use しなくていいので開発中はだいたい組み込んでる。

でも、Catalyst::Plugin::Dumper は dumper メソッドを Catalyst::Log::dumper とハードコードしているので、Catalyst::Log::Log4perl を併用すると下記のようなエラーをはいてしまう。きっと Catalyst::Plugin::Log::Dispatch とか $c->log を置き換えるプラグインでも同じようなエラーになるはず。

Caught exception in MyApp::Controller::Member->main "Can't locate object method "dumper" via package "Catalyst::Log::Log4perl"

とりあえず、Catalyst::Log::dumper を Catalyst::Log::Log4perl::dumper に書き換えて使うと動作するが、もう少し汎用性を持たせるために 0.02 にパッチを書いてみた。

*** Dumper.pm   2006-01-16 20:46:36.000000000 +0900
--- Dumper.pm.new       2007-04-10 23:54:52.000000000 +0900
***************
*** 10,26 ****
  use Data::Dumper;
  $Data::Dumper::Sortkeys = 1;

! sub Catalyst::Log::dumper {
!   my ($self, $var, $label) = @_;

!   if (defined $label) {
!       # temporarily change the Varname that D::D uses
!       local $Data::Dumper::Varname = $label;
!       $self->debug( Dumper($var) );
!   }
!   else {
!       $self->debug( Dumper($var) );
!   }
  }

  1; # Magic true value required at end of module
--- 10,33 ----
  use Data::Dumper;
  $Data::Dumper::Sortkeys = 1;

! sub setup {
!     my $class = shift;

!     $class->NEXT::setup();
!     eval( sprintf( <<'    EOL', ref $class->log ) );
!         sub %s::dumper {
!             my ( $self, $var, $label ) = @_;
!
!             if ( defined $label ) {
!                 # temporarily change the Varname that D::D uses
!                 local $Data::Dumper::Varname = $label;
!                 $self->debug( Dumper($var) );
!             }
!             else {
!                 $self->debug( Dumper($var) );
!             }
!         }
!     EOL
  }

  1; # Magic true value required at end of module

ついでに、つたない英語bug と patch を報告。

http://rt.cpan.org//Ticket/Display.html?id=26233

Catalyst::Log::Log4perl を使う場合には Catalyst->log() を Catalyst->setup() の前に呼ぶ必要がある。(そうじゃなくてもこの順番だけど)

他に、Catalyst::Plugin::Log::Dispatch を使う場合には use Catalyst qw/Log::Dispatch Dumper/; のように Dumper を後に記述する必要がある。

eval と sprintf なんて綺麗じゃない気もするけど...

JavaScript みたいに $class.prototype.dumper = function() {} ってプロトタイプベースで書く方法ってあるのかな?

ikasam_aikasam_a2007/04/19 00:44使ったこと無いですけど Object::Prototype がそのイメージですかね.

こまつこまつ2007/04/21 10:31おおお、さすがdanさん。情報ありがとうございます。

MitchellMitchell2011/08/02 20:30Hey, that post leaves me feleing foolish. Kudos to you!

owvohwowvohw2011/08/03 21:24SVUtqv , [url=http://fsxigcehrrwm.com/]fsxigcehrrwm[/url], [link=http://wmktfngjrayj.com/]wmktfngjrayj[/link], http://yznqduvxjsgt.com/

khpkitkhpkit2011/08/05 18:02I7JKa9 <a href="http://bzvelfjarswh.com/">bzvelfjarswh</a>

zpxzrirgnyrzpxzrirgnyr2011/08/05 22:48YSjouY , [url=http://dddepywpxmfh.com/]dddepywpxmfh[/url], [link=http://ryvrrkklhmmw.com/]ryvrrkklhmmw[/link], http://ochjlmiicvsp.com/

 |