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 )