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
_______________________________________________
Html-template-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/html-template-users