Re: [Webtek-devel] Session methods
Status: Alpha
Brought to you by:
prozessor13
|
From: max d. <pro...@gm...> - 2008-09-04 20:05:23
|
hmm.... yes, you are right, this is really tricky. i also spent one
hour on this problem, and now i understand, there is no clean
solution, because:
* the session is loaded explizit via the loader, and all Modules in
the app-dir via WebTek::Module->load
* the session is a model
- a model use the init mehtod to analyze the table and set its
properties
* the session has the init method which inits the session (read
request->cookie, and so on...)
- there is a clash with the model->init method
- so there is a hack, and this is to rename the model->init mehod to
init_model ( i have fixed this now, but its not already checked in )
* if you want to subclass a model, the subclass is automatically some
thing like a 'single-table-inheritance', which additionally has some
other magic to work
-> so you can not simply subclass a model (as in traditionally OO
programming)
=> but there is a solution (because we live in perl ;) ... dirty, but
a common perl way ;)
so in the file Model/Session.pm say:
my $session_init = *WebTek::Session::init{'CODE'};
*WebTek::Session::init = sub {
my $class = shift;
#... do something here
log_info('foofoo');
#... call the super mehtod
$class->$session_init();
}
so what is this:
* first we copy the coderef into a variable
* then we create a anonymous subroutine with the new session-init code
-> it has to be a anonymous subroutine to dont overwrite the
original init method of WebTek::Session, something like:
package WebTek::Session; sub init { ... }
will overwrite the original init mehtod
* this new coderef will now be called via WebTek::Session->init
-> and within this we can call the SUPER mehtod
* tricky isnt it ;)
-> and this is the common way in javascript to subclass classes
(ups... sorry instances, or still classes, who will know this in
javascript, mr. crockford maybe?? ;)
* simply you can use Hook::LexWrap to simplify things
hmm... i see there is a problem with webtek and OO thinking. i never
run into such pitfalls, because i more think the webtek way (in rails
they say, you have to think the rails way, otherwhise you get a lot of
troubles)
the early releases was really stricktly OO, and more than that, you
could use every webtek module in your app dir as a stand alone module,
but this is no longer possible, because i added so much magic, which
will simplyfy things if you know the magic, but webtek gets much more
complex with this.. hmmm...
i think it is the time to meet you and make a refactoring of some
parts, to dont run into such pitfalls (i remember this is not your
first one, sorry for that...).
max.
On Sep 4, 2008, at 5:48 PM, Adrian Smith wrote:
> I thought it would be nice to be able to define my own methods on
> the Session class. In other frameworks, it's possible to subclass
> the Session class, add extra attributes (not necessary in the case
> of WebTek) and add extra methods.
>
> I thought it might be nice if this happened automatically. So I
> added code in the Session class to check for the existance of an
> AppName::Session. If it's there, it's used, otherwise the standard
> WebTek::Session is used.
>
> However, i didn't get on very well. Firstly the AppName::Session is
> not automatically loaded (AppName::Classname is not loaded;
> AppName::Package::Classname is, which I didn't expect), and then I
> had a problem where the compiler went into an infinite loop when I
> tried to automatically load the class from somewhere else (I've no
> idea why) and so I gave up on automatic loading and put "use
> AppName::Session" in the Handler.pm. The module is loaded, but now I
> get the error:
>
> You have an error in your SQL syntax; check the manual that
> corresponds to your MySQL server version for the right syntax to use
> near '' at line 1' in delete from session where
>
> I.e. it tries to execute the statement "delete from session where"
> with no where condition, as far as I can see.
>
> Well, I shall continue trying tomorrow. Currently I have spent about
> 2 hours on this feature. It is just to display a different text if a
> certain condition is true, if certain attributes are set on the
> session at the same time, i.e. all I need is one utility method
> actually! Maybe I can give up on this approach if it is not
> possible, and e.g. put the utility method somewhere else e.g. global
> function somewhere.
>
> Do you have any advice on this matter?
>
> Thanks, Adrian
> -------------------------------------------------------------------------
> This SF.Net email is sponsored by the Moblin Your Move Developer's
> challenge
> Build the coolest Linux based applications with Moblin SDK & win
> great prizes
> Grand prize is a trip for two to an Open Source event anywhere in
> the world
> http://moblin-contest.org/redirect.php?banner_id=100&url=/_______________________________________________
> Webtek-devel mailing list
> Web...@li...
> https://lists.sourceforge.net/lists/listinfo/webtek-devel
|