package JE::Object::Boolean; our $VERSION = '0.066'; use strict; use warnings; our @ISA = 'JE::Object'; use Scalar::Util 'blessed'; require JE::Code; require JE::Boolean; require JE::Object::Error::TypeError; require JE::Object::Function; require JE::String; import JE::Code 'add_line_number'; sub add_line_number; =head1 NAME JE::Object::Boolean - JavaScript Boolean object class =head1 SYNOPSIS use JE; $j = new JE; $js_bool_obj = new JE::Object::Boolean $j, 1; $perl_bool = $js_bool_obj->value; "$js_bool_obj"; # true =head1 DESCRIPTION This class implements JavaScript Boolean objects for JE. The difference between this and JE::Boolean is that that module implements I boolean values, while this module implements the I =head1 METHODS See L for descriptions of most of the methods. Only what is specific to JE::Object::Boolean is explained here. =over =cut sub new { my($class, $global, $val) = @_; my $self = $class->SUPER::new($global, { prototype => $global->prototype_for('Boolean') || $global->prop('Boolean')->prop('prototype') }); $$$self{value} = defined $val ? defined blessed $val && $val->can('to_boolean') ? $val->to_boolean->[0] : !!$val : !1; $self; } =item value Returns a Perl scalar, either 1 or the empty string (well, actually !1). =cut sub value { $${$_[0]}{value} } sub class { 'Boolean' } sub _new_constructor { my $global = shift; my $f = JE::Object::Function->new({ name => 'Boolean', scope => $global, argnames => [qw/value/], function => sub { defined $_[0] ? $_[0]->to_boolean : JE::Boolean->new($global, 0); }, function_args => ['args'], constructor => sub { unshift @_, __PACKAGE__; goto &new; }, constructor_args => ['scope','args'], }); my $proto = bless $f->prop({ name => 'prototype', dontenum => 1, readonly => 1, }), __PACKAGE__; $global->prototype_for('Boolean',$proto); $$$proto{value} = !1; $proto->prop({ name => 'toString', value => JE::Object::Function->new({ scope => $global, name => 'valueOf', no_proto => 1, function_args => ['this'], function => sub { my $self = shift; die JE::Object::Error::TypeError->new( $global, add_line_number "Argument to " . "Boolean.prototype.toString is not" . " a " . "Boolean object" ) unless $self->class eq 'Boolean'; return JE::String->_new($global, qw/false true/[$self->value]); }, }), dontenum => 1, }); $proto->prop({ name => 'valueOf', value => JE::Object::Function->new({ scope => $global, name => 'valueOf', no_proto => 1, function_args => ['this'], function => sub { my $self = shift; die JE::Object::Error::TypeError->new( $global, add_line_number "Argument to " . "Boolean.prototype.valueOf is not" . " a " . "Boolean object" ) unless $self->class eq 'Boolean'; return JE::Boolean->new($global, $$$self{value}); }, }), dontenum => 1, }); $f; } return "a true value"; =back =head1 SEE ALSO =over 4 =item JE =item JE::Types =item JE::Object =item JE::Boolean =back =cut