X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDevel%2FDeclare%2FContext%2FSimple.pm;h=bc71261b7350f4835d0e80c1d7d3dd0058dcb332;hb=c677b4195a09035d3ec2aa356c8025a356b556db;hp=8d83cdf4f1bdd4ca5eaccf5415c2a20a04a9237b;hpb=01fadf71d4d8248a714b8639f2d661dc17badc80;p=p5sagit%2FDevel-Declare.git diff --git a/lib/Devel/Declare/Context/Simple.pm b/lib/Devel/Declare/Context/Simple.pm index 8d83cdf..bc71261 100644 --- a/lib/Devel/Declare/Context/Simple.pm +++ b/lib/Devel/Declare/Context/Simple.pm @@ -6,6 +6,8 @@ use Devel::Declare (); use B::Hooks::EndOfScope; use Carp qw/confess/; +our $VERSION = '0.006018'; + sub new { my $class = shift; bless {@_}, $class; @@ -13,7 +15,7 @@ sub new { sub init { my $self = shift; - @{$self}{ qw(Declarator Offset) } = @_; + @{$self}{ qw(Declarator Offset WarningOnRedefined) } = @_; return $self; } @@ -32,6 +34,11 @@ sub declarator { return $self->{Declarator} } +sub warning_on_redefine { + my $self = shift; + return $self->{WarningOnRedefined} +} + sub skip_declarator { my $self = shift; my $decl = $self->declarator; @@ -105,7 +112,8 @@ sub strip_proto { Devel::Declare::clear_lex_stuff(); $linestr = $self->get_linestr(); - substr($linestr, $self->offset, $length) = ''; + substr($linestr, $self->offset, + defined($length) ? $length : length($linestr)) = ''; $self->set_linestr($linestr); return $proto; @@ -133,9 +141,9 @@ sub strip_names_and_args { while (1) { # Get the bareword my $thing = $self->strip_name; - # If there's no bareword here, bail the caller can check if - # we returned anything. - return unless defined $thing; + # If there's no bareword here, bail + confess "failed to parse bareword. found ${linestr}" + unless defined $thing; $linestr = $self->get_linestr; if (substr($linestr, $self->offset, 1) eq '(') { @@ -168,14 +176,14 @@ sub strip_names_and_args { } else { # fail if it isn't there - #FIXME + confess "couldn't find closing paren for argument. found ${linestr}" } } else { # No parens, so expect a single arg my $thing = $self->strip_name; - # If there's no bareword here, bail the caller can check if - # we returned anything. - return unless defined $thing; + # If there's no bareword here, bail + confess "failed to parse bareword. found ${linestr}" + unless defined $thing; $linestr = $self->get_linestr; if (substr($linestr, $self->offset, 1) eq '(') { # This one had a proto, pull it out @@ -189,6 +197,52 @@ sub strip_names_and_args { return \@args; } +sub strip_attrs { + my $self = shift; + $self->skipspace; + + my $linestr = Devel::Declare::get_linestr; + my $attrs = ''; + + if (substr($linestr, $self->offset, 1) eq ':') { + while (substr($linestr, $self->offset, 1) ne '{') { + if (substr($linestr, $self->offset, 1) eq ':') { + substr($linestr, $self->offset, 1) = ''; + Devel::Declare::set_linestr($linestr); + + $attrs .= ':'; + } + + $self->skipspace; + $linestr = Devel::Declare::get_linestr(); + + if (my $len = Devel::Declare::toke_scan_word($self->offset, 0)) { + my $name = substr($linestr, $self->offset, $len); + substr($linestr, $self->offset, $len) = ''; + Devel::Declare::set_linestr($linestr); + + $attrs .= " ${name}"; + + if (substr($linestr, $self->offset, 1) eq '(') { + my $length = Devel::Declare::toke_scan_str($self->offset); + my $arg = Devel::Declare::get_lex_stuff(); + Devel::Declare::clear_lex_stuff(); + $linestr = Devel::Declare::get_linestr(); + substr($linestr, $self->offset, $length) = ''; + Devel::Declare::set_linestr($linestr); + + $attrs .= "(${arg})"; + } + } + } + + $linestr = Devel::Declare::get_linestr(); + } + + return $attrs; +} + + sub get_curstash_name { return Devel::Declare::get_curstash_name; }