The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
package CSS::Style;

$VERSION = 1.02;

use strict;
use warnings;
use overload '""' => 'to_string';

# create a new CSS::Style object
sub new {
	my $class = shift;
	my $self = bless {}, $class;

	$self->{options} = shift;
	$self->{selectors} = [];
	$self->{properties} = [];
	$self->{adaptor} = $self->{options}->{adaptor} || 'CSS::Adaptor';

	return $self;
}

sub add_selector {
	my $self = shift;
	my $selector = shift;

	push @{$self->{selectors}}, $selector;
	$selector->set_adaptor($self->{adaptor});
}

sub add_property {
	my $self = shift;
	my $property = shift;

	push @{$self->{properties}}, $property;
	$property->set_adaptor($self->{adaptor});
}

sub set_adaptor {
	my $self = shift;
	my $adaptor = shift;

	# set adaptor
	$self->{adaptor} = $adaptor;

	# recurse adaptor
	$_->set_adaptor($adaptor) for(@{$self->{selectors}});
	$_->set_adaptor($adaptor) for(@{$self->{properties}});
}

sub selectors {
	my $self = shift;
	eval "use $self->{adaptor}";
	my $adaptor_obj = new $self->{adaptor};
	return $adaptor_obj->output_selectors($self->{selectors});
}

sub properties {
	my $self = shift;
	eval "use $self->{adaptor}";
	my $adaptor_obj = new $self->{adaptor};
	return $adaptor_obj->output_properties($self->{properties});
}

sub to_string {
	my $self = shift;
	eval "use $self->{adaptor}";
	my $adaptor_obj = new $self->{adaptor};
	return $adaptor_obj->output_rule($self);
}

sub get_property_by_name {
        my ($self, $prop_name) = @_;

        for my $prop (@{$self->{properties}}){
                if ($prop->{property} eq $prop_name){
                        return $prop;
                }
        }
        return 0;
}

1;

__END__

=head1 NAME

CSS::Style - A ruleset in a CSS object tree

=head1 SYNOPSIS

  use CSS;

=head1 DESCRIPTION

This module represents a ruleset in a CSS object tree.
Read the CSS.pm pod for information about the CSS object tree.

=head1 METHODS

=head2 CONSTRUCTORS

=over 4

=item C<new()> or C<new( { ..options.. } )>

This constructor returns a new C<CSS::Style> object, with
an optional hash of options.

  adaptor       adaptor to use for serialization

=back

=head2 ACCESSORS

=over 4

=item C<add_selector( $selector )>

This method adds a selector to the selector list for the object.
C<$selector> is a reference to a CSS::Selector object.

=item C<add_property( $property )>

This method adds a selector to the property list for the object.
C<$property> is a reference to a CSS::Property object.

=item C<set_adaptor( 'CSS::Adaptor::Foo' )>

This method sets the current adaptor for the object.

=item C<selectors()>

This method is used to serialize the ruleset's selectors, using the current
adaptor. It returns a string which come from the adaptor's C<output_selectors()>
method.

=item C<properties()>

This method is used to serialize the ruleset's properties, using the current
adaptor. It returns a string which come from the adaptor's C<output_properties()>
method.

=item C<to_string()>

This method is used to serialize the ruleset, using the current adaptor. It returns 
a string which comes from the adaptor's output_rules() method.

=item C<get_property_by_name( 'property_name' )>

Returns the first CSS::Property object with the specified name. Returns
zero on failure.

=back

=head1 AUTHOR

Copyright (C) 2003-2004, Cal Henderson <cal@iamcal.com>

=head1 SEE ALSO

L<CSS>, http://www.w3.org/TR/REC-CSS1

=cut