# $Id: Object.pm,v 1.2 2002/03/25 14:30:41 jwalt Exp $
package AxKit::XSP::Demo::Object;
# Always use strict. Do it. I mean it. And turn on warnings as well.
use strict;
# this single line makes the taglib a Simpletaglib powered one
use Apache::AxKit::Language::XSP::SimpleTaglib;
# providing a version is good style, but not strictly neccessary
$AxKit::XSP::Demo::Object::VERSION = 0.90;
# The namespace associated with this taglib. If it doesn't work, double check
# that you are using the exact same NS uri here and in the XSP.
$AxKit::XSP::Demo::Object::NS = 'http://www.creITve.de/2002/XSP/Demo/Object';
# something to go at the top of the XSP script - this is NOT executed on every
# request, but only once for each httpd process
sub start_document {
# We are using a Time::Piece object as example. Look at it's man page, it is
# very straighforward, and a useful module as well.
return "use Time::Piece;\n".
}
package AxKit::XSP::Demo::Object::Handlers;
# You need this dummy because the existence of a sub alone decides if a tag is
# valid or not, even when the work is done in the opening tag. We tell
# SimpleTaglib that we use 2 attributes as input.
sub new : attrib(name,timestamp) {
return '';
}
# here the work is done
sub new__open {
# here we are using the passed arguments, specifically, the 'name'
# attribute
my ($e, $tag, %attr) = @_;
# if you do not nest this object, you can just ignore the name,
# we provide a default
my $name = $attr{'name'} || 'object';
# make the name 'safe'
$name =~ s/[^a-zA-Z0-9]/_/g;
# provide a default timestamp (use current time)
my $time = defined $attr{'timestamp'}? $attr{'timestamp'} : '';
# We could allow any expression, thus making it more flexible, but
# this would be unusual usage of XSP so I decided to enforce
# numeric literals. The XSPish way for dynamic arguments are child
# tags, but we cannot use them here.
# Note that this is an important limitation: We cannot use any
# content of the tag in the opening tag handler, just attributes.
$time =~ s/[^0-9]//g;
# note the naming convention: all xsp internal variable names start with
# _xsp_, followed by the package name minus AxKit::XSP::, replacing '::'
# with '_'. Oh, and if you are wondering about that 'localtime', read
# the man page of Time::Piece.
return 'my $_xsp_demo_object_'.$name.' = localtime('.$time.');'."\n";
}
sub day : expr attrib(name) {
# this is the same prologue as above, we use it in every tag
my ($e, $tag, %attr) = @_;
my $name = $attr{'name'} || 'object';
$name =~ s/[^a-zA-Z0-9]/_/g;
# and a one-liner for the actual method call
return '$_xsp_demo_object_'.$name.'->day';
}
sub month : expr attrib(name) {
# this is the same prologue as above, we use it in every tag
my ($e, $tag, %attr) = @_;
my $name = $attr{'name'} || 'object';
$name =~ s/[^a-zA-Z0-9]/_/g;
return '$_xsp_demo_object_'.$name.'->month';
}
sub year : expr attrib(name) {
# this is the same prologue as above, we use it in every tag
my ($e, $tag, %attr) = @_;
my $name = $attr{'name'} || 'object';
$name =~ s/[^a-zA-Z0-9]/_/g;
return '$_xsp_demo_object_'.$name.'->year';
}
# ... and so on. For ways of specifying input and output, see the other
# SimpleTaglib demos.
1;
__END__
=head1 NAME
AxKit::XSP::Demo::Object - how to work object oriented with SimpleTaglib
=head1 SYNOPSIS
Add the demo: namespace to your XSP C<<xsp:page>> tag:
<xsp:page
language="Perl"
xmlns:xsp="http://apache.org/xsp/core/v1"
xmlns:object="http://www.creITve.de/2002/XSP/Demo/Object"
>
Add this taglib to AxKit (via httpd.conf or .htaccess):
AxAddXSPTaglib AxKit::XSP::Demo::Object
=head1 DESCRIPTION
This is a demo how to do some OO stuff with SimpleTaglib. It is far from
complete, but gives you an Idea how this would work. See the SimpleTaglib
docs for details.
=head1 AUTHOR
Jörg Walter <jwalt@cpan.org>
=head1 COPYRIGHT
Copyright (c) 2002 Jörg Walter.
All rights reserved. This program is free software; you can redistribute it and/or
modify it under the same terms as AxKit itself.
=head1 SEE ALSO
AxKit, Apache::AxKit::Language::XSP, Apache::AxKit::Language::XSP::SimpleTaglib
=cut