| JavaScript-MochiKit documentation | Contained in the JavaScript-MochiKit distribution. |
JavaScript::MochiKit - JavaScript::MochiKit makes Perl suck less
#!/usr/bin/perl
use strict;
use warnings;
use JavaScript::MochiKit;
JavaScript::MochiKit::require('Base', 'Async');
print JavaScript::MochiKit::javascript_definitions;
Loades the given MochiKit classes and also their
javascript-code (unless $JavaScript-Mochikit::LOADJAVASCRIPT is 0).
Returns 1 on success, dies on error.
Loades all MochiKit classes and also their
javascript-code (unless $JavaScript-Mochikit::LOADJAVASCRIPT is 0).
Returns 1 on success, dies on error.
Returns 1 if class has already been loaded, 0 otherwise.
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.
Enables debug-information-output to STDERR.
Default 0
If value is 0, JavaScript::MochiKit::require will not load the javascript-code into memory.
Useful if javascript-code is available as external files. (NOTE: JavaScript::Mochikit::javascript_definitions
will always load the javascript-code into memory.)
Default 1
Returns the current JavaScript-Mochikit version number.
Sascha Kiefer, esskar@cpan.org
This library is free software, you can redistribute it and/or modify it under the same terms as Perl itself.
| JavaScript-MochiKit documentation | Contained in the JavaScript-MochiKit distribution. |
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 = ();
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; }
sub require_all { my @classes = qw[ Core Base Iter Logging DateTime Format Async DOM LoggingPane Color Visual ]; &require(@classes); }
sub is_required { my ($class) = @_; return defined $JavaScriptModules{ uc $class }; }
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; }
1;