CGI::Widget - Base class for CGI::Widget::...


CGI-Widget documentation Contained in the CGI-Widget distribution.

Index


Code Index:

NAME

Top

CGI::Widget - Base class for CGI::Widget::...

SYNOPSIS

Top

  use CGI::Widget qw(:standard);
  #prints 1,2,3,4,
  print Series(-length=>4,-render=>sub{return shift.','});

DESCRIPTION

Top

The CGI::Widget module's purpose is to allow authors of CGI or other dynamically generated HTML documents an easy way to create common, and possibly complex, page elements.

Widgets can be accessed either by explicitly creating Widget objects, as:

  use CGI::Widget::Series;
  my $series_widget = CGI::Widget::Series->new();
  print $series_widget,"\n";

or by using a CGI::Widget import tag, as: use CGI::Widget qw(:standard); print Series(),"\n"; #constructs CGI::Widget::Series print HList__Node,"\n"; #constructs CGI::Widget::HList::Node

you can construct CGI::Widget subclasses by name. Deeper subclasses can be constructed by replacing double-colon (::) with double-underscore (__).

EXPORT

 A modified AUTOLOADer is exported.  How the autoloader functions depends
 on what import tags with which CGI::Widget was brought into the namespace.
 The first import tag is used, while additional tags are silently ignored.

 Tag             Returns
 --------------------------
 :standard       HTML
 :html           HTML
 :wml            WML
 :javascript     javascript

ACKNOWLEDGMENTS

Top

 Thanks to Slaven Rezic for valuable ideas.

AUTHOR

Top

 Allen Day E<allenday@ucla.edu>
 Copyright (c) 2001.

SEE ALSO

Top

Perl. CGI::Widget::Series


CGI-Widget documentation Contained in the CGI-Widget distribution.

package CGI::Widget;

use strict;
use vars qw(@ISA @EXPORT_OK %EXPORT_TAGS $VERSION $AUTOLOAD);
#use vars qw($VERSION $AUTOLOAD);

$VERSION = '0.15';

require Exporter;
@ISA = 'Exporter';
@EXPORT_OK   = qw(AUTOLOAD);
%EXPORT_TAGS = ( 'standard' => [qw(AUTOLOAD)] );

use overload
 '""'     => \&asString,
 fallback => 1;

sub new {
  my $class = shift;
  my $self = bless {}, $class;
  $self->_init(@_);
  return $self;
}

sub import {
  my $exportset = $_[1];
  my $to_package = ((caller)[0]);
  my $code = '';

  return unless $exportset;

  if ($exportset eq ':html' or $exportset eq ':standard') {
    $code = "*".$to_package."::AUTOLOAD = \\&AUTOLOAD_html";
  } elsif ($exportset eq ':wml') {
    $code = "*".$to_package."::AUTOLOAD = \\&AUTOLOAD_wml";
  } elsif ($exportset eq ':javascript') {
    $code = "*".$to_package."::AUTOLOAD = \\&AUTOLOAD_javascript";
  }

  eval $code;
  die $@ if $@;
}

sub AUTOLOAD_html {
  my ($pack,$func) = $AUTOLOAD =~ /(.+)::([^:]+)$/;
  $func =~ s/__/::/g;

  my $req = "CGI::Widget::$func";
  eval "require $req" || die "couldn't find $req : $!";

  return CGI::Widget::html($func) unless $req->can('html');
  return $req->html(@_);
}

sub AUTOLOAD_wml {
  my ($pack,$func) = $AUTOLOAD =~ /(.+)::([^:]+)$/;
  $func =~ s/__/::/g;
    
  my $req = "CGI::Widget::$func";
  eval "require $req" || die "couldn't find $req : $!";

  return CGI::Widget::wml($func) unless $req->can('wml');
  return $req->wml(@_);
}

sub AUTOLOAD_javascript {
  my ($pack,$func) = $AUTOLOAD =~ /(.+)::([^:]+)$/;
  $func =~ s/__/::/g;

  my $req = "CGI::Widget::$func";
  eval "require $req" || die "couldn't find $req : $!";

  return CGI::Widget::javascript($func) unless $req->can('javascript');
  return $req->javascript(@_);
}

sub AUTOLOAD {
  my ($pack,$func) = $AUTOLOAD =~ /(.+)::([^:]+)$/;

  $func =~ s/__/::/g;

  my $req = "CGI::Widget::$func";
  eval "require $req" || die "couldn't find $req : $!";
  return $req->new(@_);
}

sub DESTROY {}

sub _init {
  my $self = shift;
  return 1;
}

sub html       { die "Looks like html() isn't defined in package ".shift;       }
sub wml        { die "Looks like wml() isn't defined in package ".shift;        }
sub javascript { die "Looks like javascript() isn't defined in package ".shift; }

sub asString {
  my $self = shift;
  return $self;  #what did you expect from the base class?
}

1;
__END__
# Below is stub documentation for your module. You better edit it!