सिनान के विचार एक अच्छी शुरुआत है।
लेकिन एक थोड़ा अतिरिक्त ट्वीक के साथ, आप सिर्फ एक सामान्य विधि का उपयोग कर की तरह अपने विधि एक्सेसर का उपयोग कर बना सकते हैं।
#!/usr/bin/perl
use strict;
use warnings;
use Carp;
my $f = Frob->new;
$f->frob(
sub {
my $self = shift;
print "$self was frobbed\n";
print Carp::longmess('frob')
}
);
print "\nCall frob as normal sub\n";
$f->frobit;
print "\nGoto frob\n";
$f->goto_frob;
BEGIN {
package Frob;
use Moose;
has 'frob' => (
is => 'rw',
isa => 'CodeRef',
);
sub frobit {
&{$_[0]->frob};
}
sub goto_frob {
goto $_[0]->frob;
}
}
Frob
में दो विधियां बहुत समान हैं।
frobit
कोड रेफरी के आक्रमणकारी समेत सभी तर्कों को पास करता है।
goto_frob
कोड रेफरी के आक्रमणकारी समेत सभी तर्कों को पास करता है, और कोड रेफरी के साथ goto_frob
के स्टैक फ्रेम को प्रतिस्थापित करता है।
जो उपयोग करना है उस पर निर्भर करता है कि आप ढेर में क्या चाहते हैं।
, एक Class::MOP::Method
वस्तु के शरीर भंडारण munging तो $method->{body} = sub { 'foo' }
तरह के बारे में:
यह एक अच्छा विचार है जब आप OOP कर रहे हैं कैप्सूलीकरण उल्लंघन करने के लिए कभी नहीं है। खासकर जब आप मूस और क्लास :: एमओपी जैसे जटिल ऑब्जेक्ट सिस्टम के साथ काम नहीं कर रहे हैं। यह परेशानी के लिए पूछ रहा है। कभी-कभी, आप जो चाहते हैं उसे प्राप्त करने का कोई और तरीका नहीं है, लेकिन फिर भी, encapsulation का उल्लंघन अभी भी एक बुरा विचार है।
सीनान बहुत अच्छा विचार :) धन्यवाद – xxxxxxx