Re: Sub-Classing HTML::Template v2.7

"Mathew Robertson" <[email protected]>
Newsgroups gmane.comp.lang.perl.modules.html-template
Organization RedSheriff
Message-ID <02e401c522a6$c1e1e690$a901000a@mat>
There are some places in H::T where this is done...  and I agree with you -> its wrong if you need to subclass H::T...
However, you should be able to simply change it to:

$self->_new_from_loop(...)

Perl will automatically dereference $self so as to determine the correct package name - in fact ref($self) may return a string which is not appropriate, in certain scenarios (eg: it may return HTML::Template when it should return, say, MyHtmlTemplate).  Then _new_from_loop should implement:

sub _new_from_loop {
        my $proto = shift;
        my $class = ref($proto) || $proto;
        ...
}

at this point $class will contain the correct package name.

The same point could be said about H::T::E::output(), since it does this:

sub output {
        ....
        HTML::Template::output(...)
        ...
}

which again is incorrect if H::T::E is to be subclass'able.


FWIW, the version of H::T that I have modified (available at: http://members.optusnet.com.au/~mathew ) also makes this mistake in some of the code that I have extended... ie we are all fallable...

regards,
Mathew


----- Original Message ----- 
From: "Cory Trese" <[email protected]>
To: "Cory Trese" <[email protected]>; <[email protected]>
Sent: Saturday, March 05, 2005 4:59 AM
Subject: RE: [htmltmpl] Sub-Classing HTML::Template v2.7


> Hello,
> 
> I have found the root of my problem!  All the code below was centered
> around trying, and failing, to fully replace all instances of the
> HTML::Template 'param( )' method within our code-base.  I thought that
> by building a sub-class and overriding param, I would be able to
> accomplish this.  However, I was unable to override all calls to 'param(
> )' -- some within HTML::Template remained using the SUPER::param( ).
> 
> I attempted to overwrite the package method, as seen below.  This,
> however, doesn't actually work.  So again, no dice.  Until I found the
> following code in HTML::Template around Line #2112:
> 
> $loop->[HTML::Template::LOOP::TEMPLATE_HASH]{$starts_at}
> 
>   = HTML::Template->_new_from_loop(
> 
> This does not seem friendly to sub-classes ... I didn't see any
> references to this type of issue in Damian Conway's Object Oriented Perl
> book, but I found a solution that works great for my sub-classes.
> 
> $loop->[HTML::Template::LOOP::TEMPLATE_HASH]{$starts_at}
> 
>   = ref( $self )->_new_from_loop(
> 
> This way, the "_new_from_loop" call always occurs against the correct
> class -- HTML::Template or otherwise.  I have no production code to test
> compatibility with HTML::Template::Expr so I cannot state if this type
> of change will work for everyone trying to sub-class HTML::Template.
> 
> However, I do know that making this change caused my sub-classes to
> completely work and I am very happy about that.
> 
> Sincerely,
> Cory Trese
> Lead Web Application Developer
>  
> O'NEIL & ASSOCIATES, INC.
> 495 Byers Rd.
> Miamisburg, Ohio 45342-3662
> Phone: (937) 865-0846 ext. 3038
> Fax: (937) 865-5858
> E-mail: [[email protected]]
> 
> 
> |> -----Original Message-----
> |> From: [email protected] 
> |> [mailto:[email protected]] On 
> |> Behalf Of Cory Trese
> |> Sent: Thursday, March 03, 2005 11:32 AM
> |> To: [email protected]
> |> Subject: [htmltmpl] Sub-Classing HTML::Template v2.7
> |> 
> |> Hello,
> |> 
> |> From some previous traffic on this list, Sam Tregar said:
> |> 
> |> |> Ultimately HTML::Template v2 doesn't offer much in terms 
> |> of official 
> |> |> support for sub-classes and extensions.  That's a 
> |> deficiency I intend 
> |> |> to address in the perpetually-delayed v3.
> |>  
> |> I am trying to create a sub-class of HTML::Template that 
> |> over-rides the 'param( )' method.  The code below "works" -- 
> |> mostly -- but I have a feeling that I'm doing this all 
> |> wrong.  Does anyone have some advice or a link on 
> |> HTML::Template v2 sub-classing?  I looked at 
> |> "HTML::Template::Expr" -- my code below is based, roughly, 
> |> on this module.
> |> 
> |> My major questions are:
> |> 
> |> 1. How does a sub-class of HTML::Template construct itself?  
> |> Should I over-ride 'new( )' or use something like 'make_new( 
> |> )' to wrap 'new( )'
> |> or 'SUPER::new( )'.
> |> 
> |> 2. What packages should my 'param( )' method be overridden 
> |> in?  More than HTML::Template?
> |> 
> |> The thing that doesn't work right:
> |> 
> |> 1. calls to 'param( )' seem to loose my 'i18n_strings' 
> |> object -- it isn't ALWAYS present in 'options' when I call 
> |> 'param( )', just most of the time.  
> |> 
> |> I _think_ that this is somehow related to some of the 
> |> 'param( )' methods I'm using being in the class 'make_new( 
> |> )' returns, and others, constructed somewhere else, but 
> |> still using my 'param( )' method.  I know that's confusing I 
> |> haven't slept much in the past few days, sorry.
> |> 
> |> >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
> |> package Service::Template;
> |> 
> |> use strict;
> |> use vars qw($VERSION);
> |> 
> |> $VERSION = '0.01';
> |> 
> |> use HTML::Template;
> |> 
> |> use base 'HTML::Template';
> |> 
> |> sub make_new {
> |>   my $pkg = shift;
> |>   my $self;
> |> 
> |>   # check hashworthyness
> |>   croak("Service::Template->new() called with odd number of 
> |> option parameters - should be of the form option => value")
> |>     if (@_ % 2);
> |>   my %options = @_;
> |> 
> |> 
> |>   # create an HTML::Template object, catch the results to keep error
> |>   # message line-numbers helpful.
> |>   eval {
> |>     $self = $pkg->new(%options );
> |>   };
> |>   croak("Service::Template->new() : Error creating 
> |> HTML::Template object
> |> : $@") if $@;
> |> 
> |>     $self->{options}->{i18n_strings} = $options{'i18n_strings'};
> |> 
> |> 
> |>   return $self;
> |> }
> |> 
> |> 1;
> |> 
> |> package HTML::Template;
> |> 
> |> sub param {
> |>  ...
> |> }
> |> 
> |> 1;
> |> 
> |> >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
> |> 
> |> *************************************************************
> |> *********
> |> Confidentiality Notice
> |> The information contained in this e-mail is confidential and 
> |> intended for use only by the person(s) or organization 
> |> listed in the address. If you have received this 
> |> communication in error, please contact the sender at O'Neil 
> |> & Associates, Inc., immediately. Any copying, dissemination, 
> |> or distribution of this communication, other than by the 
> |> intended recipient, is strictly prohibited.
> |> *************************************************************
> |> *********
> |> 
> |> 
> |> 
> |> -------------------------------------------------------
> |> SF email is sponsored by - The IT Product Guide Read honest 
> |> & candid reviews on hundreds of IT Products from real users.
> |> Discover which products truly live up to the hype. Start reading now.
> |> http://ads.osdn.com/?ad_id=6595&alloc_id=14396&op=click
> |> _______________________________________________
> |> Html-template-users mailing list
> |> [email protected]
> |> https://lists.sourceforge.net/lists/listinfo/html-template-users
> |> 
> 
> **********************************************************************
> Confidentiality Notice
> The information contained in this e-mail is confidential and intended for
> use only by the person(s) or organization listed in the address. If you have
> received this communication in error, please contact the sender at O'Neil &
> Associates, Inc., immediately. Any copying, dissemination, or distribution
> of this communication, other than by the intended recipient, is strictly
> prohibited.
> **********************************************************************
> 
> 
> 
> -------------------------------------------------------
> SF email is sponsored by - The IT Product Guide
> Read honest & candid reviews on hundreds of IT Products from real users.
> Discover which products truly live up to the hype. Start reading now.
> http://ads.osdn.com/?ad_id=6595&alloc_id=14396&op=click
> _______________________________________________
> Html-template-users mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/html-template-users
> 


-------------------------------------------------------
SF email is sponsored by - The IT Product Guide
Read honest & candid reviews on hundreds of IT Products from real users.
Discover which products truly live up to the hype. Start reading now.
http://ads.osdn.com/?ad_ide95&alloc_id396&op=click
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.