Devel::Declare is a source filter
Devel::Declareのフロントエンドモジュールでは「これはソースフィルタではない」と書いてあったりするので誤解があるようですが,Devel::Declareはソースフィルタです。
たとえば以下のコード:
#!perl use strict; use MooseX::Declare; class Foo{ method hello(Str $s){ print "Hello, $s world!\n"; } } Foo->new->hello("MooseX::Declare"); __END__
これをB::Deparseを使ってソースを復元すると以下のようになります。
use MooseX::Declare; package Foo; sub BEGIN { use warnings; use strict 'refs'; require MooseX::Declare; do { 'MooseX::Declare'->import('outer_package', 'Foo', 'file', 'decl.pl', 'stack', ['MooseX::Declare::StackItem'->new('identifier', 'class', 'handler', 'MooseX::Declare::Syntax::Keyword::Class', 'is_dirty', '0', 'namespace', 'Foo')]) }; } use Moose ('confess', 'blessed', 'extends', 'has', 'inner', 'super'); use namespace::autoclean; sub BEGIN { use warnings; use strict 'refs'; 'Devel::Declare::Context::Simple'->inject_scope('Foo->meta->make_immutable; BEGIN { MooseX::Declare::Util::outer_stack_pop __FILE__ }'); } sub BEGIN { use warnings; use strict 'refs'; 'Devel::Declare::Context::Simple'->inject_scope(''); } package main; use warnings; use strict 'refs'; &class(sub { package Foo; &method(sub { my($self, $s) = @_; print "Hello, $s world!\n"; } ); } ); 'Foo'->meta->make_immutable; sub BEGIN { MooseX::Declare::Util::outer_stack_pop('decl.pl'); } 'Foo'->new->hello('MooseX::Declare');
B::DeparseはコンパイルされたPerlコードからソースコードを復元するので,フィルタリング後のソースコードをそのまま出力するのではないのですが,元のコードにさまざまな加工が施されているのは分かると思います。
なお,実際にはPL_checkハックなど,単なるソースフィルタ以上のことをしているので,復元後のソースコードは実行できません。