package JavaScript::MochiKit; use strict; use vars qw[ $VERSION $LOADJAVASCRIPT $DEBUG ]; use base qw[ JavaScript::MochiKit::Accessor ]; $VERSION = '0.04'; $LOADJAVASCRIPT = 1; $DEBUG = 0; use JavaScript::MochiKit::Module; my %JavaScriptModules = (); =head1 NAME JavaScript::MochiKit - JavaScript::MochiKit makes Perl suck less =head1 SYNOPSIS #!/usr/bin/perl use strict; use warnings; use JavaScript::MochiKit; JavaScript::MochiKit::require('Base', 'Async'); print JavaScript::MochiKit::javascript_definitions; =head1 DESCRIPTION =head1 FUNCTIONS =head2 JavaScript::MochiKit::require( @classes ) Loades the given MochiKit classes and also their javascript-code (unless C<$JavaScript-Mochikit::LOADJAVASCRIPT> is 0). Returns 1 on success, dies on error. =cut sub require { my (@classes) = @_; my $this = __PACKAGE__; die("$this\::require() takes at least one argument") if @classes < 1; my $load_javascript = $LOADJAVASCRIPT; if ( ref $classes[0] eq 'ARRAY' ) { $load_javascript = $classes[1] if @classes > 1; @classes = @{ $classes[0] }; } foreach my $class (@classes) { die("$this\::require() can only be run as a class method") if ref $class; my $module; unless ( $module = $JavaScriptModules{ uc $class } ) { $module = JavaScript::MochiKit::Module->new(); $module->name($class); $JavaScriptModules{ uc $class } = $module; print STDERR "Module '$class' just created.\n" if $DEBUG; } my $core_namespace = "$this\::$class"; my $pack_namespace = "$this\::JS::$class"; unless ( $module->required ) { eval "CORE::require $core_namespace"; die $@ if $@; print STDERR "Package '$core_namespace' just loaded.\n" if $DEBUG; my $dependencies = &_get_variable( $core_namespace, 'Dependencies', 'ARRAY' ); if ( defined $dependencies ) { foreach my $dep ( @{$dependencies} ) { &require( [$dep], $load_javascript ) unless &is_required($dep); } } else { print STDERR "No Dependencies found in '$core_namespace'.\n" if $DEBUG; } $module->required(1); } if ( $load_javascript != 0 and not $module->javascript_loaded ) { eval "CORE::require $pack_namespace"; die $@ if $@; print STDERR "Package '$pack_namespace' just loaded.\n" if $DEBUG; my $data; { no strict 'refs'; $data = *{"${pack_namespace}::DATA"}; } { local $/; $module->javascript_definition(<$data>); print STDERR "Javascript just loaded from '$pack_namespace'.\n" if $DEBUG; close $data; } } } return 1; } sub _get_variable { my ( $namespace, $variable, $type ) = @_; { no strict 'refs'; if ( my $glob = ${"$namespace\::"}{$variable} ) { if ( my $ref = *{$glob}{$type} ) { return $ref; } } } return undef; } =head2 JavaScript::MochiKit::require_all( ) Loades all MochiKit classes and also their javascript-code (unless C<$JavaScript-Mochikit::LOADJAVASCRIPT> is 0). Returns 1 on success, dies on error. =cut sub require_all { my @classes = qw[ Core Base Iter Logging DateTime Format Async DOM LoggingPane Color Visual ]; &require(@classes); } =head2 JavaScript::MochiKit::is_required( $class ) Returns 1 if class has already been loaded, 0 otherwise. =cut sub is_required { my ($class) = @_; return defined $JavaScriptModules{ uc $class }; } =head2 JavaScript::MochiKit::javascript_definitions( @classes ) Returns the Javascript code as one big string for all wanted classes. Calls JavaScript::MochiKit::require( ) for all classes that are not loaded yet. Returns the Javascript code for all loaded classes if @classes is empty. Returns an empty string if no class is loaded. May die if a unloaded class does not exist. =cut sub javascript_definitions { my (@classes) = @_; @classes = sort keys %JavaScriptModules if @classes < 1; my $retval = ''; foreach my $class (@classes) { &require( [$class], 1 ); # make sure javascript gets loaded $retval .= $JavaScriptModules{ uc $class }->javascript_definition; $retval .= "\n"; } return $retval; } =head1 METHODS =head1 GLOBAL VARIABLES =head2 $JavaScript::Mochikit::DEBUG Enables debug-information-output to STDERR. Default 0 =cut =head2 $JavaScript::Mochikit::LOADJAVASCRIPT If value is 0, C will not load the javascript-code into memory. Useful if javascript-code is available as external files. (NOTE: C will always load the javascript-code into memory.) Default 1 =cut =head2 $JavaScript::Mochikit::VERSION Returns the current JavaScript-Mochikit version number. =cut =head1 SEE ALSO L, L L, L, 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;