Skip to content

Commit

Permalink
small optimizations
Browse files Browse the repository at this point in the history
  • Loading branch information
kraih committed Sep 10, 2012
1 parent fef76ab commit 73c3e89
Showing 1 changed file with 39 additions and 39 deletions.
78 changes: 39 additions & 39 deletions lib/Mojo/Parameters.pm
Expand Up @@ -32,8 +32,7 @@ sub append {

sub clone {
my $self = shift;
my $clone = Mojo::Parameters->new;
$clone->pair_separator($self->pair_separator);
my $clone = Mojo::Parameters->new->pair_separator($self->pair_separator);
if (defined $self->{string}) { $clone->{string} = $self->{string} }
else { $clone->params([@{$self->params}]) }
return $clone;
Expand Down Expand Up @@ -66,9 +65,44 @@ sub param {
}

sub params {
my ($self, $params) = @_;
if ($params) { $self->{params} = $params and return $self }
elsif (defined $self->{string}) { $self->_parse }
my $self = shift;

# Replace parameters
if (@_) {
$self->{params} = shift;
return $self;
}

# Parse string
if (defined(my $string = delete $self->{string})) {
my $params = $self->{params} = [];

# Detect pair separator for reconstruction
return $params unless length($string // '');
$self->pair_separator(';') if $string =~ /;/ && $string !~ /\&/;

# W3C suggests to also accept ";" as a separator
my $charset = $self->charset;
for my $pair (split /[\&\;]+/, $string) {

# Parse
$pair =~ /^([^=]*)(?:=(.*))?$/;
my $name = $1 // '';
my $value = $2 // '';

# Replace "+" with whitespace
s/\+/ /g for $name, $value;

# Unescape
$name = url_unescape $name;
$name = decode($charset, $name) // $name if $charset;
$value = url_unescape $value;
$value = decode($charset, $value) // $value if $charset;

push @$params, $name, $value;
}
}

return $self->{params} ||= [];
}

Expand Down Expand Up @@ -154,40 +188,6 @@ sub to_string {
return join $self->pair_separator, @pairs;
}

sub _parse {
my $self = shift;

# Clear
my $string = delete $self->params([])->{string};

# Detect pair separator for reconstruction
return $self unless length($string // '');
$self->pair_separator(';') if $string =~ /;/ && $string !~ /\&/;

# W3C suggests to also accept ";" as a separator
my $charset = $self->charset;
for my $pair (split /[\&\;]+/, $string) {

# Parse
$pair =~ /^([^=]*)(?:=(.*))?$/;
my $name = $1 // '';
my $value = $2 // '';

# Replace "+" with whitespace
s/\+/ /g for $name, $value;

# Unescape
$name = url_unescape $name;
$name = decode($charset, $name) // $name if $charset;
$value = url_unescape $value;
$value = decode($charset, $value) // $value if $charset;

push @{$self->params}, $name, $value;
}

return $self;
}

1;

=head1 NAME
Expand Down

0 comments on commit 73c3e89

Please sign in to comment.