summaryrefslogtreecommitdiff
path: root/lib/Class
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Class')
-rw-r--r--lib/Class/Template.pm258
1 files changed, 0 insertions, 258 deletions
diff --git a/lib/Class/Template.pm b/lib/Class/Template.pm
deleted file mode 100644
index 38c2e98e66..0000000000
--- a/lib/Class/Template.pm
+++ /dev/null
@@ -1,258 +0,0 @@
-package Class::Template;
-require 5.000;
-require Exporter;
-
-@ISA = qw(Exporter);
-@EXPORT = qw(members struct);
-use strict;
-
-# Template.pm --- struct/member template builder
-# 12mar95
-# Dean Roehrich
-#
-# changes/bugs fixed since 28nov94 version:
-# - podified
-# changes/bugs fixed since 21nov94 version:
-# - Fixed examples.
-# changes/bugs fixed since 02sep94 version:
-# - Moved to Class::Template.
-# changes/bugs fixed since 20feb94 version:
-# - Updated to be a more proper module.
-# - Added "use strict".
-# - Bug in build_methods, was using @var when @$var needed.
-# - Now using my() rather than local().
-#
-# Uses perl5 classes to create nested data types.
-# This is offered as one implementation of Tom Christiansen's "structs.pl"
-# idea.
-
-=head1 NAME
-
-Class::Template - struct/member template builder
-
-=head1 SYNOPSIS
-
- use Class::Template;
- struct(name => { key1 => type1, key2 => type2 });
-
- package Myobj;
- use Class::Template;
- members Myobj { key1 => type1, key2 => type2 };
-
-=head1 DESCRIPTION
-
-This module uses perl5 classes to create nested data types.
-
-=head1 EXAMPLES
-
-=over
-
-=item * Example 1
-
- use Class::Template;
-
- struct( rusage => {
- ru_utime => timeval,
- ru_stime => timeval,
- });
-
- struct( timeval => [
- tv_secs => '$',
- tv_usecs => '$',
- ]);
-
- my $s = new rusage;
-
-=item * Example 2
-
- package OBJ;
- use Class::Template;
-
- members OBJ {
- 'a' => '$',
- 'b' => '$',
- };
-
- members OBJ2 {
- 'd' => '@',
- 'c' => '$',
- };
-
- package OBJ2; @ISA = (OBJ);
-
- sub new {
- my $r = InitMembers( &OBJ::InitMembers() );
- bless $r;
- }
-
-=back
-
-=head1 NOTES
-
-Use '%' if the member should point to an anonymous hash. Use '@' if the
-member should point to an anonymous array.
-
-When using % and @ the method requires one argument for the key or index
-into the hash or array.
-
-Prefix the %, @, or $ with '*' to indicate you want to retrieve pointers to
-the values rather than the values themselves.
-
-=cut
-
-Var: {
- $Class::Template::print = 0;
- sub printem { $Class::Template::print++ }
-}
-
-
-sub struct {
- my( $struct, $ref ) = @_;
- my @methods = ();
- my %refs = ();
- my %arrays = ();
- my %hashes = ();
- my $out = '';
-
- $out = "{\n package $struct;\n sub new {\n";
- parse_fields( $ref, \$out, \@methods, \%refs, \%arrays, \%hashes, 0 );
- $out .= " bless \$r;\n }\n";
- build_methods( $ref, \$out, \@methods, \%refs, \%arrays, \%hashes );
- $out .= "}\n1;\n";
-
- ( $Class::Template::print ) ? print( $out ) : eval $out;
-}
-
-sub members {
- my( $pkg, $ref ) = @_;
- my @methods = ();
- my %refs = ();
- my %arrays = ();
- my %hashes = ();
- my $out = '';
-
- $out = "{\n package $pkg;\n sub InitMembers {\n";
- parse_fields( $ref, \$out, \@methods, \%refs, \%arrays, \%hashes, 1 );
- $out .= " bless \$r;\n }\n";
- build_methods( $ref, \$out, \@methods, \%refs, \%arrays, \%hashes );
- $out .= "}\n1;\n";
-
- ( $Class::Template::print ) ? print( $out ) : eval $out;
-}
-
-
-sub parse_fields {
- my( $ref, $out, $methods, $refs, $arrays, $hashes, $member ) = @_;
- my $type = ref $ref;
- my @keys;
- my $val;
- my $cnt = 0;
- my $idx = 0;
- my( $cmt, $n );
-
- if( $type eq 'HASH' ){
- if( $member ){
- $$out .= " my(\$r) = \@_ ? shift : {};\n";
- }
- else{
- $$out .= " my(\$r) = {};\n";
- }
- @keys = keys %$ref;
- foreach (@keys){
- $val = $ref->{$_};
- if( $val =~ /^\*(.)/ ){
- $refs->{$_}++;
- $val = $1;
- }
- if( $val eq '@' ){
- $$out .= " \$r->{'$_'} = [];\n";
- $arrays->{$_}++;
- }
- elsif( $val eq '%' ){
- $$out .= " \$r->{'$_'} = {};\n";
- $hashes->{$_}++;
- }
- elsif( $val ne '$' ){
- $$out .= " \$r->{'$_'} = \&${val}::new();\n";
- }
- else{
- $$out .= " \$r->{'$_'} = undef;\n";
- }
- push( @$methods, $_ );
- }
- }
- elsif( $type eq 'ARRAY' ){
- if( $member ){
- $$out .= " my(\$r) = \@_ ? shift : [];\n";
- }
- else{
- $$out .= " my(\$r) = [];\n";
- }
- while( $idx < @$ref ){
- $n = $ref->[$idx];
- push( @$methods, $n );
- $val = $ref->[$idx+1];
- $cmt = "# $n";
- if( $val =~ /^\*(.)/ ){
- $refs->{$n}++;
- $val = $1;
- }
- if( $val eq '@' ){
- $$out .= " \$r->[$cnt] = []; $cmt\n";
- $arrays->{$n}++;
- }
- elsif( $val eq '%' ){
- $$out .= " \$r->[$cnt] = {}; $cmt\n";
- $hashes->{$n}++;
- }
- elsif( $val ne '$' ){
- $$out .= " \$r->[$cnt] = \&${val}::new();\n";
- }
- else{
- $$out .= " \$r->[$cnt] = undef; $cmt\n";
- }
- ++$cnt;
- $idx += 2;
- }
- }
-}
-
-
-sub build_methods {
- my( $ref, $out, $methods, $refs, $arrays, $hashes ) = @_;
- my $type = ref $ref;
- my $elem = '';
- my $cnt = 0;
- my( $pre, $pst, $cmt, $idx );
-
- foreach (@$methods){
- $pre = $pst = $cmt = $idx = '';
- if( defined $refs->{$_} ){
- $pre = "\\(";
- $pst = ")";
- $cmt = " # returns ref";
- }
- $$out .= " sub $_ {$cmt\n my \$r = shift;\n";
- if( $type eq 'ARRAY' ){
- $elem = "[$cnt]";
- ++$cnt;
- }
- elsif( $type eq 'HASH' ){
- $elem = "{'$_'}";
- }
- if( defined $arrays->{$_} ){
- $$out .= " my \$i;\n";
- $$out .= " \@_ ? (\$i = shift) : return \$r->$elem;\n";
- $idx = "->[\$i]";
- }
- elsif( defined $hashes->{$_} ){
- $$out .= " my \$i;\n";
- $$out .= " \@_ ? (\$i = shift) : return \$r->$elem;\n";
- $idx = "->{\$i}";
- }
- $$out .= " \@_ ? (\$r->$elem$idx = shift) : $pre\$r->$elem$idx$pst;\n";
- $$out .= " }\n";
- }
-}
-
-1;