# $Id: TagSet.pm 284 2006-12-01 07:51:49Z chronos $
package BBCode::TagSet;
use BBCode::Util qw(:tag);
use Carp qw(croak);
use strict;
use warnings;
our $VERSION = '0.34';
sub new($@):method {
my $class = shift;
$class = ref($class) || $class;
my $this = bless {}, $class;
$this->add(@_) if @_;
return $this;
}
sub keys($):method {
return keys %{+shift};
}
sub clone($):method {
my $this = shift;
my $that = $this->new();
$that->add($this);
return $that;
}
sub _args {
my($std,$not) = splice @_, 0, 2;
while(@_) {
my $arg = shift;
if(ref $arg) {
if(UNIVERSAL::isa($arg,'BBCode::TagSet')) {
foreach($arg->keys) {
$std->();
}
} elsif(UNIVERSAL::isa($arg,'BBCode::Tag')) {
local $_ = $arg->Tag;
$std->();
} elsif(ref $arg eq 'HASH') {
unshift @_, keys %$arg;
} elsif(ref $arg eq 'ARRAY') {
unshift @_, @$arg;
} elsif(ref $arg eq 'SCALAR' or ref $arg eq 'REF') {
unshift @_, $$arg;
} else {
croak qq(Invalid reference);
}
} else {
if($arg =~ /^(!?)(:\w+)$/) {
local $_ = uc($2);
(($1 eq '') ? $std : $not)->();
} elsif($arg =~ /^(!?)(\w+)$/) {
local $_ = tagCanonical($2);
(($1 eq '') ? $std : $not)->();
} else {
croak qq(Malformed tag [$arg]);
}
}
}
}
sub add($@):method {
my $this = shift;
_args(
sub { $this->{$_} = 1 },
sub { delete $this->{$_} },
@_,
);
return $this;
}
sub remove($@):method {
my $this = shift;
_args(
sub { delete $this->{$_} },
sub { $this->{$_} = 1 },
@_,
);
return $this;
}
sub contains($$):method {
my $this = shift;
my $tag = tagCanonical(shift);
return 1 if exists $this->{$tag};
return 0;
}
sub toString($):method {
my $this = shift;
return join(" ", sort keys %$this);
}
*as_string = *toString;
1;