On May 17, 2012, at 8:28 AM, Eddie Rowe wrote:

> The memory leaks in HTML::Mason (1.35) have finally annoyed my ISP to the 
> point that I had to promise them I would upgrade to Mason2.  That said, I'm 
> really having a hard time juggling all the moving parts that seem to be 
> documented as having been changed in the new version.  

Wasn't aware of the memory leaks - did you try updating to the latest 
HTML::Mason 1.49? That said, I'm happy to offer guidance for the upgrade. :) I 
think you'll be happy in the long run.

I'd highly recommend using Poet+Mason. Poet is a web framework designed 
specifically as a complement to Mason 2; it has all of the "web stuff" that 
used to be in Mason. I'll assume you are doing that from now on.

> I looked through most of the archive and couldn't find what I needed.
> 
> I'm hoping that in getting my own questions answered we can all then have a 
> suitable migration document.  I will outline the individual pieces that 
> construct my Mason 1.35 website and then ask what about each piece needs to 
> change.
> 
> /* httpd.conf */
> PerlModule /path/to/HTML::Mason::ApacheHandler
> PerlSetVar MasonDataDir /var/www/mason
> PerlSetVar MasonCompRoot /var/www/html
> <LocationMatch "/.*\.html$">
>     SetHandler perl-script
>     PerlHandler HTML::Mason::ApacheHandler
> </LocationMatch>
> 
> Is there a one-to-one translation in httpd.conf for the above directives?

First, you'll use the 'poet' command to create your environment:

    % poet new MyApp
    my_app/.poet_root
    my_app/bin/app.psgi
    my_app/bin/get.pl

then move your components into my_app/comps, your scripts into my_app/bin, etc.

For mod_perl you can use this configuration:

   <Location />
     SetHandler perl-script
     PerlResponseHandler Plack::Handler::Apache2
     PerlSetVar psgi_app /path/to/my_app/bin/app.psgi
     DefaultType text/html
   </Location>

Mason configuration (comp_root, data_dir, etc.) will now be automatically 
determined by poet, but you can put overrides in my_app/lib/MyApp/Mason.pm or 
in configuration.

> In the autohandler, I use HTML::Mason to create sessions as follows.
> /* autohandler */

You'll need to rename your autohandler to Base.mc

> <%init>
> { package HTML::Mason::Commands;
>    use vars qw(%session);
>    use CGI::Cookie;
>    use Apache::DBI;
>    use Apache::Session::DBI;
>    use Apache::Session::MySQL;
> }
> 
> # Get the incoming cookies
> my %cookies = parse CGI::Cookie($r->headers_in->{Cookie});
> 
> # Try to re-establish an existing session
> eval {
>     tie %HTML::Mason::Commands::session, 'Apache::Session::MySQL',
>     ($cookies{$cookie_name} ? $cookies{$cookie_name}->value() : undef),
>     {
>          Handle => $dbh,
>          LockHandle => $dbh
>     }
>     ;
> };
> ...
> </%init>
> 
> Is the <%init> block still used the same way?  

Yes, but since this is an autobase component and you're going to wrap the main 
component, do this instead:
   
   <%class>
   around 'render' => sub {
       # Put your init code here
   };
   </%class>

This says, "when the render method gets called on the main page component, let 
me do stuff first, then I'll call inner() to call the main page component".

> Could I just change HTML::Mason to Mason2.12 and everything work wrt sessions?

It should work, but I recommend getting rid of all that and just using the 
built-in session. By default it will be stored in the filesystem, but you can 
change it to use MySQL, e.g. by putting this in bin/app.psgi with this:

    enable "Plack::Middleware::Session",
      store => Plack::Session::Store::Cache->new(
        cache => CHI->new(driver => 'DBI', dbh => $dbh, create_table => 1 )
      );

Then you just use $m->session to get the session hash:

    $m->session->{foo} = 'bar';

> 
> /* general component calls */
> $m -> call_next(dbh => $dbh)
> I saw a note to use Moose inner, but without elaboration.  How do I translate 
> this?

Just call inner().

> 
> $m -> comp('/path/to/component.mas:methodname');
> Does this change at all in Mason 2?

$m->construct('/path/to/component.mas')->methodname()

That is, $m->construct('/path/to/component.mas') creates a new instance of the 
component class. If you were calling that component like normal (as with 
$m->comp or <& &>), you'd call main() on it. But instead you are calling 
methodname() on it.

> 
> <& /path/to/component.mas, dbh=>$dbh &>
> Does this change at all in Mason 2?

Nope, amazingly, that will still work. :)

> 
> Just to confirm, $ARGS{name} is now $.args->{name} ?

Yes.

> "<%args> and <%shared> are gone. Use Moose attributes instead."  What does 
> this mean practically?  What would
> <%args>
>  $dbh
> </%args>
> look like in Moose?

    <%class>
    has $dbh => (required => 1);
    </%class>

And now, you'll have to refer to $.dbh instead of $dbh. This is annoying, I 
realize as I write this - probably the single biggest labor of migrating. :/

> 
> Thanks for everything. I have loved using Mason to build my site which is for 
> a animal rescue organization.  The dogs and I thank you!

Aww! No surer way to get help than to tell me that. :p

Hope this helped. Let me know how things work or don't work as you proceed, and 
if you have any additional questions.

Jon


------------------------------------------------------------------------------
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and 
threat landscape has changed and how IT managers can respond. Discussions 
will include endpoint security, mobile security and the latest in malware 
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
_______________________________________________
Mason-users mailing list
Mason-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/mason-users

Reply via email to