package JavaScript::Code::Type; use strict; use vars qw[ $VERSION ]; use base qw[ JavaScript::Code::Accessor JavaScript::Code::Value ]; use overload '""' => sub { shift->output }; __PACKAGE__->mk_accessors(qw[ type value ]); use JavaScript::Code::String (); use JavaScript::Code::Number (); use JavaScript::Code::Array (); use JavaScript::Code::Hash (); $VERSION = '0.08'; =head1 NAME JavaScript::Code::Type - A JavaScript Type =head1 SYNOPSIS #!/usr/bin/perl use strict; use warnings; use JavaScript::Code::Type; my $type = JavaScript::Code::Type->new({ type => 'String' })->value("Go for it!"); print $type->output; =head1 METHODS =head2 JavaScript::Code::Type->new( ) =cut sub new { my $this = shift; my $class = ref($this) || $this; return $class->SUPER::new(@_) unless $class eq __PACKAGE__; my $args = shift; my $via = lc( delete $args->{type} || '' ) or die "No type provided."; $via = ucfirst $via; $via = "JavaScript::Code::$via"; eval "require $via"; # make sure, it is loaded die $@ if $@; return $via->new( $args, @_ ); } =head2 $self->type( ) Returns a string that represents the underlaying type. =cut =head2 $self->value( $value ) Gets or sets the associated value. =head2 $self->build( ) =cut sub build { my $this = shift; my $class = ref($this) || $this; my $ref = @_ ? Scalar::Util::reftype( $_[0] ) || '' : ''; my %args = $ref eq 'HASH' ? %{ shift() } : @_; my $value = $args{value}; my $object; if ( defined $value ) { my $reftype = ref $value; if ( $reftype eq 'ARRAY' ) { $object = JavaScript::Code::Array->new( { value => $value } ); } elsif ( $reftype eq 'HASH' ) { $object = JavaScript::Code::Hash->new( { value => $value } ); } elsif ( $reftype eq 'SCALAR' or $reftype eq '' ) { $value = $reftype eq 'SCALAR' ? ${$value} : $value; $object = Scalar::Util::looks_like_number($value) ? JavaScript::Code::Number->new( { value => $value } ) : JavaScript::Code::String->new( { value => $value } ); } elsif ( $value->isa('JavaScript::Code::Value') ) { $object = $value; } die "Unexpected type '$reftype'." unless defined $object; } return $object; } =head2 $self->output( ) Returns the javascript-code for that type. =cut =head1 SEE ALSO L =head1 AUTHOR Sascha Kiefer, C =head1 LICENSE This library is free software, you can redistribute it and/or modify it under the same terms as Perl itself. =cut 1;