CSS-Sass
view release on metacpan or search on metacpan
lib/CSS/Sass/Type.pm view on Meta::CPAN
$unit = '' unless defined $unit;
$number = 0 unless defined $number;
bless \ [ $number, $unit ], $class;
}
sub value {
if (scalar(@_) > 1) {
${$_[0]}->[0] = defined $_[1] ? $_[1] : 0;
}
sprintf "%g", ${$_[0]}->[0];
}
sub unit {
if (scalar(@_) > 1) {
${$_[0]}->[1] = defined $_[1] ? $_[1] : "";
}
${$_[0]}->[1];
}
sub stringify {
sprintf "%g%s", @{${$_[0]}};
}
sub equals {
shift->stringify eq $_[0]
}
################################################################################
package CSS::Sass::Type::Color;
################################################################################
use base 'CSS::Sass::Type';
################################################################################
use overload '""' => 'stringify';
use overload 'eq' => 'equals';
################################################################################
sub new {
my ($class, $r, $g, $b, $a) = @_;
$a = 1 unless defined $a;
bless \ { r => $r, g => $g, b => $b, a => $a }, $class;
}
my $accessor = sub {
if (scalar(@_) > 2) {
${$_[1]}->{$_[0]} = $_[2];
}
${$_[1]}->{$_[0]}
};
sub r { $accessor->('r', @_) }
sub g { $accessor->('g', @_) }
sub b { $accessor->('b', @_) }
sub a { $accessor->('a', @_) }
sub stringify {
my $r = ${$_[0]}->{'r'};
my $g = ${$_[0]}->{'g'};
my $b = ${$_[0]}->{'b'};
my $a = ${$_[0]}->{'a'};
unless (defined $a && $a != 0) {
"transparent"
} elsif (defined $a && $a != 1) {
sprintf("rgba(%s, %s, %s, %s)", $r, $g, $b, $a)
} elsif ($r || $g || $b) {
sprintf("rgb(%s, %s, %s)", $r, $g, $b)
} else {
"null"
}
}
sub equals {
shift->stringify eq $_[0]
}
################################################################################
package CSS::Sass::Type::Map;
################################################################################
use base 'CSS::Sass::Type';
################################################################################
use overload '""' => 'stringify';
use overload 'eq' => 'equals';
################################################################################
sub new {
my $class = shift;
my $hash = { @_ };
foreach (values %{$hash}) {
$_ = CSS::Sass::Type->new($_);
}
bless $hash , $class;
}
sub keys { CORE::keys %{$_[0]} }
sub values { CORE::values %{$_[0]} }
sub stringify {
join ', ', map { join ": ", $_, $_[0]->{$_} } CORE::keys %{$_[0]};
}
sub equals {
shift->stringify eq $_[0]
}
################################################################################
package CSS::Sass::Type::List;
################################################################################
use base 'CSS::Sass::Type';
################################################################################
use overload '""' => 'stringify';
use overload 'eq' => 'equals';
################################################################################
sub new {
my $class = shift;
my $list = [ map { CSS::Sass::Type->new($_) } @_ ];
bless $list, $class;
}
sub values { @{$_[0]} }
( run in 3.937 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )