Re: Thoughts on a CDBI::AsForm::_to_new()

[prev] [thread] [next] [Date index for 2004/11/05]

From: Peter Speltz
Subject: Re: Thoughts on a CDBI::AsForm::_to_new()
Date: 22:58 on 05 Nov 2004
--0-208343704-1099695494=:45662
Content-Type: text/plain; charset=us-ascii
Content-Id: 
Content-Disposition: inline

Here's a first shot at t_new functionality put in AsForm.pm.  It works. Maybe
the argument against AsForm making inputs for your foreign keys is why don't
you call to_cgi yourself with the classes for those columns.  I have a lot of
composite business objects. With  edit and create forms that becomes 2 calls
for every foreign key to to cgi. Most business objects have at least 2 foreign
objects they own. Take a Customer object, It often has address, person, phone,
email.

Here's an example of how to use my AsForm using the Customer object just
mentioned.

# This works only for has_a columns in customer 
Customer->has_a("address" => Address);
. . . 
Customer->has_a("email" => Email);

# Now If you want address, person, phone, email inputs on your Customer form
# say this:
Customer->has_a_new( { "address" => [ qw/street city zip state/],
                       "person"  => [ qw/first_name last_name/],
                       "phone"   => [ qw/area number/],
# Say we don't want email input  "email"   => [ qw/domain email want_ads/ ]
                     } );

#OK. Now if you say, 
my $customer_inputs = Customer->to_cgi;

# you get elements as normal but for the address, person, phone, you get a hash
of elements for the columns you specified.  Being able to specify columns you
want is nice. 

# IN your template you then make a macro to display a hash of elements or just
a foreach loop in every template you want to use it. Here's a for each

[% FOREACH col IN customer;
   element = customer_cgi.$col;
   IF (foreign_cols = element.keys);
      FOREACH fcol IN foreign_cols;
         element.$fcol.as_XML;
      END;
      NEXT;
   END;
   element.as_XML;
%]

YOu can see why you'd want that in a macro.

Changes to as form to make this work 

Added a _to_foreign_inputs method and exported it.
Added if clause that checks the has_a_new sub.

Attached is my version. Changes are well marked.  This also retrieves the
values if there are any for this object as you would expect so it works for
editing as well as creating. 

thanks,


--- Andreas Fromm <Andreas.Fromm@xxxxxx.xxxxxxxxxxxx.xx> wrote:

> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
> 
> looks nice. I'll try it when as soon as I get the time too. It would be
> really usefull to incorporate such a thing in AsForm if the problem of
> the name clashes can be solved.
> 
> Mybe a better solution then prefixing the fields with the table name
> would be to prefix the fields with the fieldname of the referencing
> table. Otherwise you get the same problem if more then one field
> references the same table. (For example if a person-class references two
> phone-numbers, a private and an office number).
> 
> To simplify the formating of the resulting form via css, a class or id
> attribute should be set, probably the plain fieldname as a class
> attribute is a wise decission, so thata css-rule can be defined for all
> the phoen number-fields.
> 
> 
> Peter Speltz wrote:
> | --- Andreas Fromm <Andreas.Fromm@xxxxxx.xxxxxxxxxxxx.xx> wrote:
> |
> |
> |>-----BEGIN PGP SIGNED MESSAGE-----
> |>Hash: SHA1
> |>
> |>Ithink what Peter is trying to do, is what I'm also trying to do. If you
> |>have the following structure:
> |>
> |>table person:
> |>~   id serial
> |>~   name text
> |>~   adress integer references addresses
> |>~   phone integer references phones
> |>
> |>table addresses
> |>~   id serial
> |>~   street text
> |>~   number text
> |>~   city text
> |>~   zip text
> |>
> |>tabel phones
> |>~   id serial
> |>~   area text
> |>~   number text
> |>
> |>- -----------
> |>MyClass::Person
> |>
> |>__PACKAGE__->set-up-everything
> |>__PACKAGE__->has_a ( adress => MyClass::Addresses )
> |>__PACKAGE__->has_a ( phone => MyClass::Phones )
> |>
> |>- -----------
> |>CDBI::AsForm will make a form for person with select-boxes for address
> |>and phone, and what Perter (and I) would like to have is a form
> |>containing input-boxes for the fields from person, addresses and phones.
> |>Peter maybe asked for some extramagic of inserting default values for
> |>the non-referencing fields of person (didn't understand that part
> |>either). This is the reason why I don't use AsForm.
> |>
> |>I have been playing around with something like this a bit, but didn't
> |>found the time to finish it up. It would be nice to include something
> |>like this in AsFrom. My idea was to prefix the field names with the
> |>table name the fields belong to, such as the field 'name' would become
> |>'person.name', 'street' => 'address.street' and so on. Maybe
> |>CDBI::FromCGI could be tweeked to process that kind of requests
> |>properly, but I never looked at FromCGI in more detail then the
> description.
> |>
> |
> |
> | That's exactly it.  With a CDBI system with AsForm, the computer
> already knows
> | how to make these inputs. All it needs is for a class to tell it:
> "HEY, instead
> | of giving me a select box to choose an address, give me inputs to
> create a new
> | address (the result of address->to_cgi or something).  Basically, in
> its rawest
> | form, this functionality comes just by making to_cgi call its self
> with the
> | has_a class when signaled to and put a hashref in the relevant column
> slot
> | instead of a single HTML::whatever object. I tried it but the
> recursive call
> | failed.
> |
> | There are some some issues. As Andreas said, column name clashes become a
> | problem.
> |
> |  I ended up making a system with two parts  that lives in my own classes--
> |
> | 1) "has_a_new_inputs"  -- a part to generate other inputs for columns in a
> | class that are foreign keys , which lives in my base model class.
> |
> | 2)"has_a_new" --  a method to tell "has_a_new_inputs" what foreign
> keys I want
> | other inputs for, and further more what columns from that foreign
> class i want
> | inputs for.  This is specified in each end user class.
> |
> | Attached is the code and a full synopsis. I still haven't figured out
> what to
> | do about field name clashes so I just make sure i don't have any.
> |
> | I hope this is clear enough. I bet  AsForm could incorporate this
> | functionality. I made a feeble attempt at putting the has_a_new_inputs
> code
> | into AsForm::_to_new_inputs (new is a keyword in Template Toolkit and
> won't
> | work as a parameter). Then modifying AsForm::to_field to recognize a
> new_inputs
> | parametr. Then i could say:
> |
> | # get hashref of HTML::whatever objects instead of a single one.
> | my $addr_inputs = Person->to_field("address_id", "new_inputs").
> |
> | I'll try again as a proof of concept.
> |
> |
> | thanks
> |
> |
> |
> | =====
> | pjs
> |
> | __________________________________________________
> | Do You Yahoo!?
> | Tired of spam?  Yahoo! Mail has the best spam protection around
> | http://mail.yahoo.com
> |
> |
> | ------------------------------------------------------------------------
> |
> |
> | # expand foreign keys in a CDBI class to inputs for columns of the
> foreign class
> | # using AsForm methods.
> |
> | # TODO make this more robust
> | sub BaseCDBI::has_a_new_inputs {
> |     my ($self, $r) = @_;
> |     return 0 unless $self->can("has_a_new");
> |     my $has_a_new_cols = $self->has_a_new;  # HAS_A_NEW called here
> |
> |     foreach my $col (keys %$has_a_new_cols)
> |     {
> |         my ($has_a_class, @input_cols) = @{$has_a_new_cols->{$col}};
> |
> |         unless ($has_a_class->can('to_field') ) {
> |             warn "Class: $has_a_class can't to_field. Needs AsForm.";
> | 	    next;                                     	
> |         } # sanity check
> |
> |         my %res = map { $_ => $has_a_class->to_field($_) }  @input_cols;
> |         $result{$col} =  \%res;
> |     }
> |     return  \%result;
> | }
> |
> |
> | sub Person::has_a_new {
> |     { address_id => [ qw/Address street number city state zip/ ] },
> |     { phone_id   => [ qw/Phone area number/]
> | };
> |
> |
> |
> |
> | Synopsis:
> |
> | package Person;
> | Person->has_a(address_id => "Address");
> | Person->has_a(phone_id   => "Phone");
> |
> | # specify class and columns of that class you want inputs for in place
> of an
> | # input for the key column. Class spec won't be necessary in finished
> version
> | sub has_a_new {
> |     { address_id => [ qw/Address street number city state zip/ ] },
> |     { phone_id   => [ qw/Phone area number/]
> | };
> |
> | # then in some near by code
> |
> | $template_args{cgi_inputs} = Person->to_cgi;
> | my $other_inputs = Person->has_a_new_inputs;  #
> | $template_args{other_inputs} = $other_inputs
> |
> | # then in a new_person  TT template
> |
> | [% FOREACH $col IN cgi_inputs.keys;
> |      IF other_inputs.$col; # insert other inputs instead of to_cgi default
> | 	other_cols = other_inputs.$col; # stupid to lookup again
> |         FOREACH mycol IN other_cols.keys;
> |            "<label> $mycol </label>" other_cols.$mycol.as_XML;
> |         END;
> 
=== message truncated ===

=====
pjs


		
__________________________________ 
Do you Yahoo!? 
Check out the new Yahoo! Front Page. 
www.yahoo.com 
 

--0-208343704-1099695494=:45662
Content-Type: application/x-perl-module; name="AsForm.pm"
Content-Transfer-Encoding: base64
Content-Description: AsForm.pm
Content-Disposition: attachment; filename="AsForm.pm"

cGFja2FnZSBDbGFzczo6REJJOjpBc0Zvcm07CnVzZSA1LjAwNjsKdXNlIHN0
cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgQ2xhc3M6OkRCSTo6UGx1Z2luOjpU
eXBlICgpOwpvdXIgJE9MRF9TVFlMRSA9IDA7Cgp1c2UgSFRNTDo6RWxlbWVu
dDsKcmVxdWlyZSBFeHBvcnRlcjsKb3VyIEBJU0EgPSBxdyhFeHBvcnRlcik7
CiMjIyMjIyMjIyMjIyMjIyMjIyAgIFBFVEVSIFNQRUxUWiAgIyMjIyMjIyMj
IyMjIyMjIyMjCiMjIyMjIyMjIyAgQWRkZWQgIl90b19mb3JlaWduX2lucHV0
cyIgdG8gQEVYUE9SVCAjIyMjIyMjIwpvdXIgQEVYUE9SVCA9IHF3KCB0b19j
Z2kgdG9fZmllbGQgX3RvX3RleHRhcmVhIF90b190ZXh0ZmllbGQgX3RvX3Nl
bGVjdAp0eXBlX29mIF90b19mb3JlaWduX2lucHV0cyApOyAKb3VyICRWRVJT
SU9OID0gJzIuMyc7Cgo9aGVhZDEgTkFNRQoKQ2xhc3M6OkRCSTo6QXNGb3Jt
IC0gUHJvZHVjZSBIVE1MIGZvcm0gZWxlbWVudHMgZm9yIGRhdGFiYXNlIGNv
bHVtbnMKCj1oZWFkMSBTWU5PUFNJUwoKICAgIHBhY2thZ2UgTXVzaWM6OkNE
OwogICAgdXNlIENsYXNzOjpEQkk6OkFzRm9ybTsKICAgIHVzZSBiYXNlICdD
bGFzczo6REJJJzsKICAgIHVzZSBDR0k7CiAgICAuLi4KCiAgICBzdWIgY3Jl
YXRlX29yX2VkaXQgewogICAgICAgIG15ICRjbGFzcyA9IHNoaWZ0OwogICAg
ICAgIG15ICVjZ2lfZmllbGQgPSAkY2xhc3MtPnRvX2NnaTsKICAgICAgICBy
ZXR1cm4gc3RhcnRfZm9ybSwKICAgICAgICAgICAgICAgKG1hcCB7ICI8Yj4k
XzwvYj46ICIuICRjZ2lfZmllbGR7JF99LT5hc19IVE1MLiIgPGJyPiIgfSAK
ICAgICAgICAgICAgICAgICAgICAkY2xhc3MtPkNvbHVtbnMpLAogICAgICAg
ICAgICAgICBlbmRfZm9ybTsKICAgIH0KCiAgICAjIDxmb3JtIG1ldGhvZD0i
cG9zdCIuLi4+CiAgICAjIFRpdGxlOiA8aW5wdXQgdHlwZT0idGV4dCIgbmFt
ZT0iVGl0bGUiIC8+IDxicj4KICAgICMgQXJ0aXN0OiA8c2VsZWN0IG5hbWU9
IkFydGlzdCI+IAogICAgIyAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0xPkdy
YXRlZnVsIERlYWQ8L29wdGlvbj4KICAgICMgICAgICAgICAgIC4uLgogICAg
IyAgICAgICAgIDwvc2VsZWN0PgogICAgIyAuLi4KICAgICMgPC9mb3JtPgoK
PWhlYWQxIERFU0NSSVBUSU9OCgpUaGlzIG1vZHVsZSBoZWxwcyB0byBnZW5l
cmF0ZSBIVE1MIGZvcm1zIGZvciBjcmVhdGluZyBuZXcgZGF0YWJhc2Ugcm93
cwpvciBlZGl0aW5nIGV4aXN0aW5nIHJvd3MuIEl0IG1hcHMgY29sdW1uIG5h
bWVzIGluIGEgZGF0YWJhc2UgdGFibGUgdG8KSFRNTCBmb3JtIGVsZW1lbnRz
IHdoaWNoIGZpdCB0aGUgc2NoZW1hLiBMYXJnZSB0ZXh0IGZpZWxkcyBhcmUg
dHVybmVkCmludG8gdGV4dGFyZWFzLCBhbmQgZmllbGRzIHdpdGggYSBoYXMt
YSByZWxhdGlvbnNoaXAgdG8gb3RoZXIKQzxDbGFzczo6REJJPiB0YWJsZXMg
YXJlIHR1cm5lZCBpbnRvIHNlbGVjdCBkcm9wLWRvd25zIHBvcHVsYXRlZCB3
aXRoCm9iamVjdHMgZnJvbSB0aGUgam9pbmVkIGNsYXNzLgoKPWhlYWQxIE1F
VEhPRFMKClRoZSBtb2R1bGUgaXMgYSBtaXgtaW4gd2hpY2ggYWRkcyB0d28g
YWRkaXRpb25hbCBtZXRob2RzIHRvIHlvdXIKQzxDbGFzczo6REJJPi1kZXJp
dmVkIGNsYXNzLiAKCj1oZWFkMiB0b19jZ2kKClRoaXMgcmV0dXJucyBhIGhh
c2ggbWFwcGluZyBhbGwgdGhlIGNvbHVtbiBuYW1lcyBvZiB0aGUgY2xhc3Mg
dG8KSFRNTDo6RWxlbWVudCBvYmplY3RzIHJlcHJlc2VudGluZyBmb3JtIHdp
ZGdldHMuCgo9Y3V0CgpzdWIgdG9fY2dpIHsKICAgIG15ICRjbGFzcyA9IHNo
aWZ0OwogICAgbWFwIHsgJF8gPT4gJGNsYXNzLT50b19maWVsZCgkXykgfSAk
Y2xhc3MtPmNvbHVtbnM7Cn0KCj1oZWFkMiB0b19maWVsZCgkZmllbGQgWywg
JGhvd10pCgpUaGlzIG1hcHMgYW4gaW5kaXZpZHVhbCBjb2x1bW4gdG8gYSBm
b3JtIGVsZW1lbnQuIFRoZSBDPGhvdz4gYXJndW1lbnQKY2FuIGJlIHVzZWQg
dG8gZm9yY2UgdGhlIGZpZWxkIHR5cGUgaW50byBvbmUgb2YgQzx0ZXh0Zmll
bGQ+LCBDPHRleHRhcmVhPgpvciBDPHNlbGVjdD47IHlvdSBjYW4gdXNlIHRo
aXMgaXMgeW91IHdhbnQgdG8gYXZvaWQgdGhlIGF1dG9tYXRpYyBkZXRlY3Rp
b24Kb2YgaGFzLWEgcmVsYXRpb25zaGlwcy4KCj1jdXQKCnN1YiB0b19maWVs
ZCB7CiAgICBteSAoJHNlbGYsICRmaWVsZCwgJGhvdykgPSBAXzsKICAgIG15
ICRjbGFzcyA9IHJlZiAkc2VsZiB8fCAkc2VsZjsKCiMjIyMjIyMjIyMjIyMj
IyMjIyAgIFBFVEVSIFNQRUxUWiAgIyMjIyMjIyMjIyMjIyMjIyMjCiMjIyMj
IyMjICBBZGRlZCBjb21wbGV0ZSBpZiBjbGF1c2UgaGVyZSAjIyMjIyMjIyMj
IyMjCiAgICBpZiAoJGNsYXNzLT5jYW4oImhhc19hX25ldyIpICYmIChteSAk
Zm9yZWlnbl9maWVsZHMgPSAkY2xhc3MtPmhhc19hX25ldy0+eyRmaWVsZH0p
KSAgICB7IAogICAgI2lmICggJGNsYXNzLT5jYW4oImhhc19hX25ldyIpICl7
CgkJbXkgJGhhc19hX25ldyA9ICRjbGFzcy0+aGFzX2FfbmV3OyAKICAgICAg
ICByZXR1cm4gJHNlbGYtPl90b19mb3JlaWduX2lucHV0cygkZmllbGQsICRm
b3JlaWduX2ZpZWxkcyk7CiAgICB9CgogICAgaWYgKCRob3cgYW5kICRob3cg
PX4gL14odGV4dChhcmVhfGZpZWxkKXxzZWxlY3QpJC8pIHsKICAgICAgICBu
byBzdHJpY3QgJ3JlZnMnOwogICAgICAgIG15ICRtZXRoID0gIl90b18kaG93
IjsKCQkjIHBqcyBtYXliZSBjaGFuZ2UgdG8gc2VsZgogICAgICAgIHJldHVy
biAkY2xhc3MtPiRtZXRoKCRmaWVsZCk7CiAgICB9CiAgICBteSAkaGFzYSA9
ICRjbGFzcy0+X19oYXNhX3JlbHMtPnskZmllbGR9OwogICAgcmV0dXJuICRz
ZWxmLT5fdG9fc2VsZWN0KCRmaWVsZCwgJGhhc2EtPlswXSkKICAgICAgICBp
ZiBkZWZpbmVkICRoYXNhIGFuZCAkaGFzYS0+WzBdLT5pc2EoIkNsYXNzOjpE
QkkiKTsKCiAgICAjIFJpZ2h0LCBoYXZlIHNvbWUgb2YgdGhpcyEKICAgIGV2
YWwgInBhY2thZ2UgJGNsYXNzOyBDbGFzczo6REJJOjpQbHVnaW46OlR5cGUt
PmltcG9ydCgpIjsKICAgIG15ICR0eXBlID0gJGNsYXNzLT5jb2x1bW5fdHlw
ZSgkZmllbGQpOwogICAgcmV0dXJuICRzZWxmLT5fdG9fdGV4dGFyZWEoJGZp
ZWxkKQogICAgICAgIGlmICR0eXBlIGFuZCAkdHlwZSA9fiAvXihURVhUfEJM
T0IpJC9pOwogICAgcmV0dXJuICRzZWxmLT5fdG9fdGV4dGZpZWxkKCRmaWVs
ZCk7Cn0KCnN1YiBfdG9fdGV4dGFyZWEgewogICAgbXkgKCRzZWxmLCAkY29s
KSA9IEBfOwogICAgbXkgJGEgPSBIVE1MOjpFbGVtZW50LT5uZXcoInRleHRh
cmVhIiwgbmFtZSA9PiAkY29sKTsKICAgIGlmIChyZWYgJHNlbGYpIHsgJGEt
PnB1c2hfY29udGVudCgkc2VsZi0+JGNvbCkgfQogICAgJE9MRF9TVFlMRSAm
JiByZXR1cm4gJGEtPmFzX0hUTUw7CiAgICAkYTsKfQoKc3ViIF90b190ZXh0
ZmllbGQgewogICAgbXkgKCRzZWxmLCAkY29sKSA9IEBfOwogICAgbXkgJHZh
bHVlID0gcmVmICRzZWxmICYmICRzZWxmLT4kY29sOwogICAgbXkgJGEgPSBI
VE1MOjpFbGVtZW50LT5uZXcoImlucHV0IiwgdHlwZT0+ICJ0ZXh0IiwgbmFt
ZSA9PiAkY29sKTsKICAgICRhLT5hdHRyKCJ2YWx1ZSIgPT4gJHZhbHVlKSBp
ZiAkdmFsdWU7CiAgICAkT0xEX1NUWUxFICYmIHJldHVybiAkYS0+YXNfSFRN
TDsKICAgICRhOwp9CgpzdWIgX3RvX3NlbGVjdCB7CiAgICBteSAoJHNlbGYs
ICRjb2wsICRoaW50KSA9IEBfOwogICAgbXkgJGhhc19hX2NsYXNzID0gJGhp
bnQgfHwgJHNlbGYtPl9faGFzYV9yZWxzLT57JGNvbH0tPlswXTsKICAgIG15
IEBvYmpzID0gJGhhc19hX2NsYXNzLT5yZXRyaWV2ZV9hbGw7CiAgICBteSAk
YSA9IEhUTUw6OkVsZW1lbnQtPm5ldygic2VsZWN0IiwgbmFtZSA9PiAkY29s
KTsKICAgIGZvciAoQG9ianMpIHsgCiAgICAgICAgbXkgJHNlbCA9IEhUTUw6
OkVsZW1lbnQtPm5ldygib3B0aW9uIiwgdmFsdWUgPT4gJF8tPmlkKTsKICAg
ICAgICAkc2VsLT5hdHRyKCJzZWxlY3RlZCIgPT4gInNlbGVjdGVkIikgaWYg
cmVmICRzZWxmIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBhbmQgZXZhbCB7ICRfLT5pZCBlcSAkc2VsZi0+JGNv
bC0+aWQgfTsKICAgICAgICAkc2VsLT5wdXNoX2NvbnRlbnQoJF8tPnN0cmlu
Z2lmeV9zZWxmKTsKICAgICAgICAkYS0+cHVzaF9jb250ZW50KCRzZWwpOwog
ICAgfQogICAgJE9MRF9TVFlMRSAmJiByZXR1cm4gJGEtPmFzX0hUTUw7CiAg
ICAkYTsKfQoKIyMjIyMjIyMjIyMjIyMjIyMjICAgIFBFVEVSIFNQRUxUWiAj
IyMjIyMjIyMjIyMjIyMjIwojIyMjIyMjIyMgIEFkZGVkICJfdG9fZm9yZWln
bl9pbnB1dHMiIHN1YiAjIyMjIyMjIyMjCnN1YiBfdG9fZm9yZWlnbl9pbnB1
dHMgewoJbXkgKCRzZWxmLCAkY29sLCAkZm9yZWlnbl9maWVsZHMpID0gQF87
CiAgICBteSAgJGhhc19hX2NsYXNzID0gICRzZWxmLT5fX2hhc2FfcmVscy0+
eyRjb2x9LT5bMF07CgoJIyBnZXQgdGhlIGZvcmVpZ24gb2JqZWN0IGlmIHdl
IGNhbgoJaWYgKHJlZiAkc2VsZikgewoJCW15ICRpZCA9ICRzZWxmLT4kY29s
LT5pZCA7CgkJI3ByaW50ICJJRCBpcyAiIC4gJHNlbGYtPiRjb2wgLiAiICAk
aWQgXG4iOwoJCW15ICRmb3JlaWduX29iaiA9ICRoYXNfYV9jbGFzcy0+cmV0
cmlldmUoJHNlbGYtPiRjb2wtPmlkKTsKCQkkaGFzX2FfY2xhc3MgPSAkZm9y
ZWlnbl9vYmogaWYgJGZvcmVpZ25fb2JqOwoJfQoKCW15ICVyZXN1bHQgPSBt
YXAgeyAkXyA9PiAkaGFzX2FfY2xhc3MtPnRvX2ZpZWxkKCRfKSB9IEAkZm9y
ZWlnbl9maWVsZHM7CglyZXR1cm4gXCVyZXN1bHQ7Cn0KIyMjIyMjIyMjIyMj
IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKIyBQ
cmVsb2FkZWQgbWV0aG9kcyBnbyBoZXJlLgoKMTsKCj1oZWFkMSBDSEFOR0VT
CgpWZXJzaW9uIDEueCBvZiB0aGlzIG1vZHVsZSByZXR1cm5lZCByYXcgSFRN
TCBpbnN0ZWFkIG9mIEM8SFRNTDo6RWxlbWVudD4Kb2JqZWN0cywgd2hpY2gg
bWFkZSBpdCBoYXJkZXIgdG8gbWFuaXB1bGF0ZSB0aGUgSFRNTCBiZWZvcmUg
c2VuZGluZyBpdApvdXQuIElmIHlvdSBkZXBlbmQgb24gdGhlIG9sZCBiZWhh
dmlvdXIsIHNldCBDPCRDbGFzczo6REJJOjpBc0Zvcm06Ok9MRF9TVFlMRT4K
dG8gYSB0cnVlIHZhbHVlLgoKPWhlYWQxIEFVVEhPUgoKU2ltb24gQ296ZW5z
LCBDPHNpbW9uQGNwYW4ub3JnPgoKPWhlYWQxIFNFRSBBTFNPCgpMPENsYXNz
OjpEQkk+LCBMPENsYXNzOjpEQkk6OkZyb21DR0k+LCBMPEhUTUw6OkVsZW1l
bnQ+LgoKPWN1dAo=

--0-208343704-1099695494=:45662--

Thoughts on a CDBI::AsForm::_to_new()
Peter Speltz 16:07 on 21 Oct 2004

Re: Thoughts on a CDBI::AsForm::_to_new()
Tony Bowden 14:20 on 24 Oct 2004

Re: Thoughts on a CDBI::AsForm::_to_new()
Andreas Fromm 07:14 on 25 Oct 2004

Re: Thoughts on a CDBI::AsForm::_to_new()
Peter Speltz 20:37 on 25 Oct 2004

Re: Thoughts on a CDBI::AsForm::_to_new()
Andreas Fromm 07:51 on 26 Oct 2004

Re: Thoughts on a CDBI::AsForm::_to_new()
Peter Speltz 22:58 on 05 Nov 2004

Re: Thoughts on a CDBI::AsForm::_to_new()
Clayton Scott 05:51 on 03 Nov 2004

Generated at 11:34 on 01 Dec 2004 by mariachi v0.52