X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDevel%2FDeclare%2FMethodInstaller%2FSimple.pm;h=96fa88ce6371c3559eee15b7fee93753e19f9e65;hb=b0a896321dc9c1d61dc59c4c1b32cb8f920123ca;hp=416711655a71665e485babb7c1dd46bfd3e871d8;hpb=5b27c9b27fb76cf9174e86a3ad98db42504023b2;p=p5sagit%2FDevel-Declare.git diff --git a/lib/Devel/Declare/MethodInstaller/Simple.pm b/lib/Devel/Declare/MethodInstaller/Simple.pm index 4167116..96fa88c 100644 --- a/lib/Devel/Declare/MethodInstaller/Simple.pm +++ b/lib/Devel/Declare/MethodInstaller/Simple.pm @@ -22,6 +22,53 @@ sub install_methodhandler { ); } +sub strip_attrs { + my $self = shift; + $self->skipspace; + + my $Offset = $self->offset; + my $linestr = Devel::Declare::get_linestr; + my $attrs = ''; + + if (substr($linestr, $Offset, 1) eq ':') { + while (substr($linestr, $Offset, 1) ne '{') { + if (substr($linestr, $Offset, 1) eq ':') { + substr($linestr, $Offset, 1) = ''; + Devel::Declare::set_linestr($linestr); + + $attrs .= ':'; + } + + $self->skipspace; + $Offset = $self->offset; + $linestr = Devel::Declare::get_linestr(); + + if (my $len = Devel::Declare::toke_scan_word($Offset, 0)) { + my $name = substr($linestr, $Offset, $len); + substr($linestr, $Offset, $len) = ''; + Devel::Declare::set_linestr($linestr); + + $attrs .= " ${name}"; + + if (substr($linestr, $Offset, 1) eq '(') { + my $length = Devel::Declare::toke_scan_str($Offset); + my $arg = Devel::Declare::get_lex_stuff(); + Devel::Declare::clear_lex_stuff(); + $linestr = Devel::Declare::get_linestr(); + substr($linestr, $Offset, $length) = ''; + Devel::Declare::set_linestr($linestr); + + $attrs .= "(${arg})"; + } + } + } + + $linestr = Devel::Declare::get_linestr(); + } + + return $attrs; +} + sub parser { my $self = shift; $self->init(@_); @@ -29,12 +76,13 @@ sub parser { $self->skip_declarator; my $name = $self->strip_name; my $proto = $self->strip_proto; + my $attrs = $self->strip_attrs; my @decl = $self->parse_proto($proto); my $inject = $self->inject_parsed_proto(@decl); if (defined $name) { $inject = $self->scope_injector_call() . $inject; } - $self->inject_if_block($inject); + $self->inject_if_block($inject, $attrs ? "sub ${attrs} " : ''); if (defined $name) { my $pkg = $self->get_curstash_name; $name = join( '::', $pkg, $name )