Mason scope methods - override

Using Mason2 . You have 3 components.

/Base.mc
/tmp/Base.mc
/tmp/index.mc

/tmp/index.mc with content:

hello from <% $m->request_path %></br>
<% $.Some %>

$.Someis a method defined in /Base.mc:

<%augment wrap><% inner() %></%augment>

<%method Some>
The default "Some" method defined in the <% __PACKAGE__ %>
</%method>

/tmp/Base.mc contains only

<%augment wrap><% inner() %></%augment>

/tmp/indexFingerprint Request :

hello from /tmp/index
The default "Some" method defined in the MC0::Base_mc

Now the method is added Somein/tmp/Base.mc

<%method Some>
Redefined "Some" method in <% __PACKAGE__ %>
</%method>

Asking /tmp/indexagain, he prints:

hello from /tmp/index
Redefined "Some" method in MC0::tmp_Base_mc

He performed an overridden method Somein wrapped/tmp/Base.mc

The question arises:

If Mason allows overriding methods, as indicated above, what is the purpose <%override method>? Is there something different? (when I tested, it prints the same thing).

EDIT Perhaps the question can be summarized in the following perl code.

use 5.014;
use warnings;

package My;
use Moose;
sub some { say "some from " . __PACKAGE__ }

package My2;
use Moose;
extends 'My';
sub some { say "another some from " . __PACKAGE__ }
#the above line is an correct way to refefine a sub "some"?
#so don;t need to use the
#override 'some' => sub { say "another some from " . __PACKAGE__ };

package main;
use My2;
my $m = My2->new();
$m->some();

in both cases (for example, "plain" override and override using "override"):

another some from My2

, super() Some override? , - knowlegde...; (

+4
1

override Mason override Moose; Moose override OO , , . Moose docs override:

override 'display_name' => sub {
    my $self = shift;
    return super() . q{, } . $self->title(); };

super() - , $self->SUPER::display_name. , , , , . super(), , , @_ super().

Moose , some :

package My;
use Moose;
sub some {
    my $self = shift;
    say "   " . __PACKAGE__ . " method 'some' args: " . join " ", @_;
}

My $obj->some('pip', 'pop'):

My method 'some' args: pip pop

My2. some :

package My2;
use Moose;
extends 'My';
sub some {
    my $self = shift;
    say "   # running 'some'";
    say "   " . __PACKAGE__ . " method 'some' args: " . join " ", @_;
    @_ = reverse @_;
    say "   # running \$self->SUPER::some with no args";
    $self->SUPER::some();
    say "   # running \$self->SUPER::some with reversed args";
    $self->SUPER::some( @_ );
    say "   # running super() with no args";
    super();
    say "   # running super() with reversed args";
    super( @_ );
};

My2 $obj->some('pip','pop'). :

# running 'some'
My2 method 'some' args: pip pop
# running $self->SUPER::some with no args
My method 'some' args: 
# running $self->SUPER::some with reversed args
My method 'some' args: pop pip
# running super() with no args
# running super() with reversed args
Arguments passed to super() are ignored at test.pl line 29.

:

  • super() ;
  • super() ;
  • $self->SUPER::some ;
  • $self->SUPER::some .

some, override:

override 'some' => sub {
    my $self = shift;
    say "   # running 'some'";
    say "   " . __PACKAGE__ . " method 'some' args: " . join " ", @_;
    @_ = reverse @_;
    say "   # running \$self->SUPER::some with no args";
    $self->SUPER::some();
    say "   # running \$self->SUPER::some with reversed args";
    $self->SUPER::some( @_ );
    say "   # running super() with no args";
    super();
    say "   # running super() with reversed args";
    super( @_ );
};

:

# running 'some'
My2 method 'some' args: pip pop
# running $self->SUPER::some with no args
My method 'some' args: 
# running $self->SUPER::some with reversed args
My method 'some' args: pop pip
# running super() with no args
My method 'some' args: pip pop
# running super() with reversed args
Arguments passed to super() are ignored at test.pl line 29.
My method 'some' args: pip pop

:

  • super() some;
  • super() ; @_, ;
  • $self->SUPER::some .

, , override .

+4

All Articles