Create a helper for dealing with nested attribute sets
This commit is contained in:
56
src/lib/Hydra/Helper/AttributeSet.pm
Normal file
56
src/lib/Hydra/Helper/AttributeSet.pm
Normal file
@ -0,0 +1,56 @@
|
||||
package Hydra::Helper::AttributeSet;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
|
||||
sub new {
|
||||
my ($self) = @_;
|
||||
return bless { "paths" => [] }, $self;
|
||||
}
|
||||
|
||||
sub registerValue {
|
||||
my ($self, $attributePath) = @_;
|
||||
|
||||
my @pathParts = splitPath($attributePath);
|
||||
|
||||
pop(@pathParts);
|
||||
if (scalar(@pathParts) == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
my $lineage = "";
|
||||
for my $pathPart (@pathParts) {
|
||||
$lineage = $self->registerChild($lineage, $pathPart);
|
||||
}
|
||||
}
|
||||
|
||||
sub registerChild {
|
||||
my ($self, $parent, $attributePath) = @_;
|
||||
if ($parent ne "") {
|
||||
$parent .= "."
|
||||
}
|
||||
|
||||
my $name = $parent . $attributePath;
|
||||
if (!grep { $_ eq $name} @{$self->{"paths"}}) {
|
||||
push(@{$self->{"paths"}}, $name);
|
||||
}
|
||||
return $name;
|
||||
}
|
||||
|
||||
sub splitPath {
|
||||
my ($s) = @_;
|
||||
|
||||
if ($s eq "") {
|
||||
return ('')
|
||||
}
|
||||
|
||||
return split(/\./, $s, -1);
|
||||
}
|
||||
|
||||
sub enumerate {
|
||||
my ($self) = @_;
|
||||
my @paths = sort { length($a) <=> length($b) } @{$self->{"paths"}};
|
||||
return wantarray ? @paths : \@paths;
|
||||
}
|
||||
|
||||
1;
|
@ -2,8 +2,9 @@ package Hydra::Helper::Escape;
|
||||
|
||||
use strict;
|
||||
use base qw(Exporter);
|
||||
use Hydra::Helper::AttributeSet;
|
||||
|
||||
our @EXPORT = qw(escapeString);
|
||||
our @EXPORT = qw(escapeString escapeAttributePath);
|
||||
|
||||
sub escapeString {
|
||||
my ($s) = @_;
|
||||
@ -12,3 +13,9 @@ sub escapeString {
|
||||
$s =~ s|\$|\\\$|g;
|
||||
return "\"" . $s . "\"";
|
||||
}
|
||||
|
||||
sub escapeAttributePath {
|
||||
my ($s) = @_;
|
||||
|
||||
return join(".", map( { escapeString($_) } Hydra::Helper::AttributeSet::splitPath($s)));
|
||||
}
|
||||
|
Reference in New Issue
Block a user