Otto Hirr wrote:
> Greetings,
>
> What are the implications of trying to define
> subs in a component.
Massive headaches.
> Example: the <%once> and <%init>
> sections may want to do part of the same thing, so
> you define a sub in <%once> call it, and also call it
> in <%init>.
>
> Should this work correctly? Or is it that the closure
> of <%once> and <%init> are not containing the name of
> sub, but in the package, hence there would be name collision?
>
>
You're on the right track in thinking about name collisions. When you
define a sub in a component it actually goes into the
HTML::Mason::Commands package. The implications of this depend on the
way you have Mason configured. If you're running it within mod_perl on
a standard Apache setup you have a persistent Perl machine that
maintains state from one web request to the next. On top of that you
have multiple apache processes that can serve requests. Using
subroutines in such a situation can lead to name space collisions and
intermittent race conditions.
An example of a race condition is when you build component A that
defines sub foo. Noticing that this function is available to all
components and you use foo in component B. In testing this may work
fine as long as component A is always called at least once IN EVERY
APACHE process before component B is ever called. However, if you call
component B in an apache process that has yet to run component A you'll
end up with an error saying that foo is not defined. The same thing can
happen when you restart the server.
If "foo" is something that should be called by more than one component
it should be moved to its own component, defined as a <%method> of
component A, or as a function/method in an external Perl module. If it
shouldn't be shared outside of comp A you can define it as a
subcomponent of A using <%def> or if you don't want to deal with the
long mason calling syntax you can define it as a localized scalar
holding a subroutine reference in the <%once> or <%shared> block of
component A. So instead of this:
<%once>
sub foo { stuff() }
...
</%once>
<% foo() %>
You can do this:
<%once>
my $foo = sub { stuff() };
...
</%once>
<% &$foo() %>
Good luck,
-- Ben
-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Mason-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mason-users