You can't so much override a function as replace it.

use Module; # Execute module first so it doesn't replace you! BEGIN { package Module; no warnings 'override'; sub func { ... } }

Alternate syntax:

use Module; # Execute module first so it doesn't replace you! BEGIN { package Module; no warnings 'override'; *func = sub { ... }; }

You can wrap the original function:

use Module; # Execute module first so it doesn't replace you! BEGIN { package Module; no warnings 'override'; my $orig_func = \&func; sub func { ... $orig_func->(...) ... }; }

You can even do so temporarily:

use Module; # Execute module first so it doesn't replace you! { package Module; no warnings 'override'; my $orig_func = \&func; local *func = sub { ... $orig_func->(...) ... }; # Replaced from here. ... # Replaced until here. }

In all cases, it's replaced for everyone. You could use caller to emulate other behaviours, perhaps.

The only weirdness I can find in this module is that the absUrl subroutine is only called in MIME::Lite::HTML itself in private subroutines of the, "parse" method, like this:

There's no such thing as a private subroutine. The inner sub is just as public as the outer one. Whoever wrote that code was fooling himself. And he's asking for trouble. The following warning is an understated indicator of the problem of nesting named subs:

>perl -c -we"sub foo { my $x; sub bar { $x } }" Variable "$x" will not stay shared at -e line 1. -e syntax OK

I don't know if I've answered your question since I really don't know what you're asking, but I hope I helped.

Note: The BEGIN is not necessarily needed in any of the examples. Plain curlies would likely work too.


In reply to Re: Overridding subroutines called in private subroutines by ikegami
in thread Overridding subroutines called in private subroutines by skazat

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.