PPI::Token::Attribute - A token for a subroutine attribute


PPI documentation Contained in the PPI distribution.

Index


Code Index:

NAME

Top

PPI::Token::Attribute - A token for a subroutine attribute

INHERITANCE

Top

  PPI::Token::Attribute
  isa PPI::Token
      isa PPI::Element

DESCRIPTION

Top

In Perl, attributes are a relatively recent addition to the language.

Given the code sub foo : bar(something) {} , the bar(something) part is the attribute.

A PPI::Token::Attribute token represents the entire of the attribute, as the braces and its contents are not parsed into the tree, and are treated by Perl (and thus by us) as a single string.

METHODS

Top

This class provides some additional methods beyond those provided by its PPI::Token and PPI::Element parent classes.

Got any ideas for methods? Submit a report to rt.cpan.org!

identifier

The identifier attribute returns the identifier part of the attribute.

That is, for the attribute foo(bar), the identifier method would return "foo".

parameters

The parameters method returns the parameter strong for the attribute.

That is, for the attribute foo(bar), the parameters method would return "bar".

Returns the parameters as a string (including the null string '' for the case of an attribute such as foo().

Returns undef if the attribute does not have parameters.

SUPPORT

Top

See the support section in the main module.

AUTHOR

Top

Adam Kennedy <adamk@cpan.org>

COPYRIGHT

Top


PPI documentation Contained in the PPI distribution.
package PPI::Token::Attribute;

use strict;
use PPI::Token ();

use vars qw{$VERSION @ISA};
BEGIN {
	$VERSION = '1.215';
	@ISA     = 'PPI::Token';
}




#####################################################################
# PPI::Token::Attribute Methods

sub identifier {
	my $self = shift;
	$self->{content} =~ /^(.+?)\(/ ? $1 : $self->{content};
}

sub parameters {
	my $self = shift;
	$self->{content} =~ /\((.+)\)$/ ? $1 : undef;
}





#####################################################################
# Tokenizer Methods

sub __TOKENIZER__on_char {
	my $class = shift;
	my $t     = shift;
	my $char  = substr( $t->{line}, $t->{line_cursor}, 1 );

	# Unless this is a '(', we are finished.
	unless ( $char eq '(' ) {
		# Finalise and recheck
		return $t->_finalize_token->__TOKENIZER__on_char( $t );
	}

	# This is a bar(...) style attribute.
	# We are currently on the ( so scan in until the end.
	# We finish on the character AFTER our end
	my $string = $class->__TOKENIZER__scan_for_end( $t );
	if ( ref $string ) {
		# EOF
		$t->{token}->{content} .= $$string;
		$t->_finalize_token;
		return 0;
	}

	# Found the end of the attribute
	$t->{token}->{content} .= $string;
	$t->_finalize_token->__TOKENIZER__on_char( $t );
}

# Scan for a close braced, and take into account both escaping,
# and open close bracket pairs in the string. When complete, the
# method leaves the line cursor on the LAST character found.
sub __TOKENIZER__scan_for_end {
	my $t = $_[1];

	# Loop as long as we can get new lines
	my $string = '';
	my $depth = 0;
	while ( exists $t->{line} ) {
		# Get the search area
		my $search = $t->{line_cursor}
			? substr( $t->{line}, $t->{line_cursor} )
			: $t->{line};

		# Look for a match
		unless ( $search =~ /^((?:\\.|[^()])*?[()])/ ) {
			# Load in the next line and push to first character
			$string .= $search;
			$t->_fill_line(1) or return \$string;
			$t->{line_cursor} = 0;
			next;
		}

		# Add to the string
		$string .= $1;
		$t->{line_cursor} += length $1;

		# Alter the depth and continue if we arn't at the end
		$depth += ($1 =~ /\($/) ? 1 : -1 and next;

		# Found the end
		return $string;
	}

	# Returning the string as a reference indicates EOF
	\$string;
}

1;