use strict; use warnings; use Devel::Declare; BEGIN { Devel::Declare->install_declarator( 'DeclareTest', 'method', DECLARE_PACKAGE | DECLARE_PROTO, sub { my ($name, $proto) = @_; return 'my $self = shift;' unless defined $proto && $proto ne '@_'; return 'my ($self'.(length $proto ? ", ${proto}" : "").') = @_;'; }, sub { my ($name, $proto, $sub, @rest) = @_; if (defined $name && length $name) { unless ($name =~ /::/) { $name = "DeclareTest::${name}"; } no strict 'refs'; *{$name} = $sub; } return wantarray ? ($sub, @rest) : $sub; } ); } my ($test_method1, $test_method2, @test_list); { package DeclareTest; method new { }; } { no strict; no warnings 'uninitialized'; print @{"_