logo
Free, unlimited AI code reviews that run on commit
git-lrc git-lrc GitHub Install Now We'd appreciate a star git-lrc - Free, unlimited AI code reviews that run on commit | Product Hunt git-lrc - Free, unlimited AI code reviews that run on commit | Product Hunt

Mason::Manual::FAQ - Frequently asked questions about Mason

Author

       Jonathan Swartz <swartz@pobox.com>

Components

CanIcreateglobalvariable(s)thatcanbeseenfromallcomponents?
       Mason components each run in their own packages, so if you set a regular global in one you won't be able
       to see it in the others.

       But you can use allow_globals and set_global to create globals accessible from all components.

   Whydoesmyoutputhaveextranewlines/whitespaceandhowcanIgetridofit?
       See Whitespace And Newlines in the syntax manual. To suppress extra newlines you can use a backslash at
       the end of each line, or you can use the NoBlankLines filter.

       To emit binary data without the risk of inserting extra whitespace, surround your code with
       $m->clear_buffer and $m->abort:

           <%init>
           $m->clear_buffer;
           open(my $fh, '<', 'binary-file') or die $!;
           my $buffer;
           while (read $fh, $buffer, 8192) {
               $m->print($buffer);
           }
           $m->abort;
           </%init>

   I'mtryingtogenerateanimageorotherbinaryfile,butitseemstobegettingcorrupted.
       This is almost always caused by unwanted whitespace or other output at the beginning or end of your
       binary data. Use $m->clear_buffer and $m->abort as in previous answer.

   HowdoIputcommentsincomponents?
       See Comments section in the syntax manual for reference.

       •   Put general comments in the "<%doc>" section.

       •   Within code blocks ("<%class>", "<%init>", "<%perl>", etc.), use standard Perl comments ('#').

       •   Use "<% # %>" for single or multi-line comments anywhere outside of Perl sections.

       •   If  you  are producing HTML, you can use standard HTML comments delimited by <!-- -->. The difference
           is that these comments will appear in the final output.

   What'sagoodwaytotemporarilycommentoutcodeinacomponent?
       For HTML, you might be tempted to surround the section with "<!-- -->".  But be careful! Any code  inside
       the section will still execute. Here's a example of commenting out a call to an ad server:

           <!-- temporarily comment out
           <& /shared/fetch_ad.mi &>
           -->

       The ad will still be fetched and counted, but not displayed!

       A better way to block out a section is "if (0)":

           % if (0) {
             ...
           % }

       Code  blocked out in this way will neither be executed nor displayed, and multiple "if (0)" blocks can be
       nested inside each other (unlike HTML comments).

       Another way to block out code is with a "<%doc>" tag, although this not cannot be nested.

   HowcanIcapturetheoutputofacomponent(andmodifyit,etc.)insteadofhavingitautomaticallyoutput?

       Use $m->scomp.

   HowcanIcapturetheoutputfromarbitrarycodethatcallscomponents,etc.?
       Use $m->capture.

   HowcanIgetalistofcomponentsmatchingapathpattern?
       Use $m->glob_paths, e.g.

           my @paths = $m->glob_paths('/some/comp/path/*');

       This  will  work even with multiple component roots; you'll get a combined list of all matching component
       paths in all component roots.

   HowcanIaccess$m(therequestobject)fromoutsideacomponent,e.g.insidearegularclass?
       Use Mason::Request->current_request:

           package Foo;

           sub bar {
               my $m = Mason::Request->current_request;
           }

   Whenusingmultiplecomponentroots,isthereawaytoexplicitlycallacomponentinaspecificroot?
       Multiple component roots were designed to work just like Perl's @INC.  A  given  component  path  matches
       exactly  one  file,  the  first  file  found  in  an ordered search through the roots. There is no way to
       explicitly ask for a file in a specific root.

Http And Html

HowdoIuseMasontoprocesswebrequests?
       You need to use Mason in conjunction with a web framework. Poet is a web framework designed specially for
       Mason.  Catalyst and Dancer can also use Mason for their templating layer. See Mason::Manual::Setup.

   HowcanIHTML-escapetheoutputof"<%%>"tags?
       See the "H" filter in Mason::Plugin::HTMLFilters. If you want to do this automatically for  all  "<%  %>"
       tags, see Mason::Plugin::DefaultFilter.

   WhyisMasonsoslowwithstandardCGI?
       Under  standard CGI you must load all modules and initialize your environment with every request. Mason's
       startup cost (mostly due to Moose) will make this particularly  sub-optimal.  Ask  yourself  whether  you
       absolutely  have  to  use  CGI,  and if not, switch to a persistent solution like mod_perl or Fast CGI or
       Starman.

Name

       Mason::Manual::FAQ - Frequently asked questions about Mason

See Also

       Mason

See Also