рдореВрд╕ рдкрд░реНрд▓ 5 рдХрд╛ рдПрдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╣реИ рдЬреЛ рдУрдУрдкреА рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИред
рдПрдХ рдХреНрд▓рд╛рд╕ рдмрдирд╛рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ:
package MyClass; use Moose;
рд╕рдм рдХреБрдЫ, рдПрдХ рдЦрд╛рд▓реА рд╡рд░реНрдЧ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдореЗрдВ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ, рд╡рд┐рдзрд┐рдпреЛрдВ, рд╕реБрдкрд░рдХреНрд▓реЗрд╕реЗрд╕, рд╡рд┐рдзрд┐ рд╕рдВрд╢реЛрдзрдХ, рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ (1pc), рдбрд┐рд╕реНрдЯреНрд░рдХреНрдЯрд░ (1pc) рдФрд░ рдореЗрдЯрд╛-рдХреНрд▓рд╛рд╕ (1pc) рдХреА рдПрдХ рдордирдорд╛рдиреА рд╕рдВрдЦреНрдпрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рднреА рдореЗрдЯрд╛-рдЬрд╛рдирдХрд╛рд░реА рд╢рд╛рдорд┐рд▓ рд╣реИрдВред
рдЕрдм рдЗрди рдШрдЯрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА:
рд╡рд░реНрдЧ
рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдЧ рдореВрд╕ :: рд╡рд╕реНрддреБ рдХрд╛ рдЙрдкрд╡рд░реНрдЧ рд╣реИред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдпрд╣ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреА рдЙрдкрдпреЛрдЧреА рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдмрдирд╛рддрд╛ рд╣реИ, рдореЗрдЯрд╛рдХреНрд▓рд╛рдЬрд╝ рдФрд░ рд╕реБрдкрд░рдХреНрд▓рд╛рд╕ рдореЗрдВ рдирд┐рд╣рд┐рдд рдЕрдиреНрдп рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ, рдЬреЛ рдирд┐рд░реНрдорд╛рдг рдХреЗ рдмрд╛рдж рдкрд╣реБрдБрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЙрдкрд╡рд░реНрдЧ
рдЗрдирд╣реЗрд░рд┐рдЯреЗрдВрд╕
рдлреИрд▓реА рд╣реБрдИ рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣реЛрддрд╛ рд╣реИ
package User; use Moose; extends 'Person'; has 'username' => ( is => 'rw' );
рдПрдХрд╛рдзрд┐рдХ рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо, рдЕрд▓реНрдкрд╡рд┐рд░рд╛рдо рджреНрд╡рд╛рд░рд╛ рдЕрд▓рдЧ рдХрд┐рдП рдЧрдП рд╡рд░реНрдЧреЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ: 'рдлреВ', 'рдмрд╛рд░' рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддрд╛ рд╣реИ;
рдЧреБрдг
рд╡рд┐рд╢реЗрд╖рддрд╛ рдореЗрдВ рдПрдХ рдирд╛рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдЧреБрдг рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ: рдЭрдВрдбрд╛, рдкреНрд░рдХрд╛рд░, рдПрдХреНрд╕реЗрд╕рд░ рд╡рд┐рдзрд┐, рдкреНрд░рддрд┐рдирд┐рдзрд┐рдордВрдбрд▓, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкрд╛рда, рдЖрджрд┐ рдкрдврд╝реЗрдВ / рд▓рд┐рдЦреЗрдВред
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, Moose рдХреНрд▓рд╛рд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╣реИрд╢ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред рдПрдХреНрд╕реЗрд╕рд░реНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрди рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рд╛рдкреНрдд рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред
рд╣реИ - рд╡рд┐рд╢реЗрд╖рддрд╛ рдШреЛрд╖рд┐рдд рдХрд░реЗрдВ
has 'first_name' => ( is => 'rw' );
рдЗрд╕ рд╡рд┐рдХрд▓реНрдк рдореЗрдВ рдорд╛рди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ [ro | rw | bare | read-only рдпрд╛ read-write рдпрд╛ bare - рдЗрд╕ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рдПрдХреНрд╕реЗрд╕рд░реНрд╕ рдХреЗ рдмрд┐рдирд╛ред
рдЧреЗрдЯрд░реНрд╕ рдФрд░ рд╕реЗрдЯрд░реНрд╕ рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
has 'weight' => ( is => 'rw', reader => 'get_weight', writer => 'set_weight', );
рд╡рд┐рдзреЗрдп - рдпрджрд┐ рд╡рд┐рд╢реЗрд╖рддрд╛ "рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд" рдпрд╛ рдХреЛрдИ рдЕрдиреНрдп рдЧрд▓рдд рдорд╛рди рд╣реИ, рддреЛ рдпрд╣ рд╕рд╣реА рд▓реМрдЯреЗрдЧрд╛ред
рдХреНрд▓реАрдпрд░ - рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ
рдХреНрд▓реАрдпрд░ - рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ
has 'ssn' => ( is => 'rw', clearer => 'clear_ssn', predicate => 'has_ssn', );
$person->has_ssn;
рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛
рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: рдЖрд╡рд╢реНрдпрдХ => 1
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рд╕рднреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИрдВред
рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рджреЛ рддрд░реАрдХреЛрдВ рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВред
has 'size' => ( is => 'ro', default => 'medium', predicate => 'has_size', );
рдФрд░ рдпрджрд┐ рдирд┐рд░реНрдорд╛рддрд╛ рдореЗрдВ рд╕реЗрдЯ рдирд╣реАрдВ рд╣реИ, рддреЛ:
my $person = Person->new(); $person->size;
рдФрд░ рдЖрдк рд╡рд┐рдзрд┐ рдХрд╛ рд▓рд┐рдВрдХ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
has 'size' => ( is => 'ro', default => sub { ( 'small', 'medium', 'large' )[ int( rand 3 ) ] }, predicate => 'has_size', );
рд╡реИрдХрд▓реНрдкрд┐рдХ рд╡рд┐рдзрд┐:
has 'size' => ( is => 'ro', builder => '_build_size', predicate => 'has_size', ); sub _build_size { return ( 'small', 'medium', 'large' )[ int( rand 3 ) ]; }
рдмрд┐рд▓реНрдбрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЗ рдмрдЬрд╛рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реИред
рд╣рдо рдЕрдВрддрд┐рдо рдмрд╛рд░реА рдореЗрдВ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреА рд╕реНрдерд╛рдкрдирд╛ рдХреЛ рд╕реНрдердЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ
рдпрд╣ рд╕рдВрдкрддреНрддрд┐ рд╕реЗрдЯ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: рдЖрд▓рд╕реА => 1
рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдЬрдм рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдореВрд▓реНрдп рдЕрдиреНрдп рдХрд╛рд░рдХреЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред
рдЗрд╕ рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рдПрдХ рдФрд░ рдкреНрд▓рд╕ рдпрд╣ рд╣реИ рдХрд┐ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреА рдЧрдгрдирд╛ рдХреЗрд╡рд▓ рддрднреА рдХреА рдЬрд╛рдПрдЧреА рдпрджрд┐ рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдФрд░ рдпрджрд┐ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рд╣рдо рд╕реАрдкреАрдпреВ рд╕рдордп рдмрдЪрд╛рдПрдВрдЧреЗред
рдЧреБрдг рдЯрд╛рдЗрдк рдХрд░реЗрдВ
рдХрд┐рд╕реА рднреА рдореЛрддреА рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╕рдорд╛рди рдкреНрд░рдХрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ: isa => 'Str'
рдпрд╛ рд╡реЗ рдПрдХ рд╡рд╕реНрддреБ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ: => 'MyApp :: Object'
рдХрдИ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреА рд╕реНрдерд╛рдкрдирд╛
has [ 'x', 'y' ] => ( is => 'ro', isa => 'Int' );
рдпрд╛ рддреЛ:
for my $name ( qw( xy ) ) { my $builder = '_build_' . $name; has $name => ( is => 'ro', isa => 'Int', builder => $builder ); }
рддрд░реАрдХреЛрдВ
рдХрд┐рд╕реА рд╡рд░реНрдЧ рдореЗрдВ рдШреЛрд╖рд┐рдд рдХреЛрдИ рднреА рдХрд╛рд░реНрдп рдПрдХ рд╡рд░реНрдЧ рд╡рд┐рдзрд┐ рд╣реИред
рд╡рд┐рдзрд┐ рд╕рдВрд╢реЛрдзрдХ
рдПрдХ рд╡рд┐рдзрд┐ рдХреЙрд▓ рд╕реЗ рдкрд╣рд▓реЗ (рдпрд╛ "рдкрд╣рд▓реЗ, рдмрд╛рдж, рдЪрд╛рд░реЛрдВ рдУрд░, рд╡реГрджреНрдзрд┐") рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ:
before 'atribute' => sub { my $self = shift; my $a = shift; print $a; };
рднреВрдорд┐рдХрд╛
рд╡рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдпрд╛ рд╕реНрдерд┐рддрд┐ рдЬрд┐рд╕реЗ рдЗрд╕ рд╡рд░реНрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрдиреНрдп OO рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдПрдХ рдПрдирд╛рд▓реЙрдЧред
Moose :: рднреВрдорд┐рдХрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛;
package Eq; use Moose::Role; requires 'equal_to'; sub not_equal_to { my ( $self, $other ) = @_; not $self->equal_to($other); }
рд╣рд╛рд▓рд╛рдБрдХрд┐ рдпрд╣ рднреВрдорд┐рдХрд╛ рдПрдХ рд╡рд░реНрдЧ рдХреА рддрд░рд╣ рд▓рдЧрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рд╡рд░реНрдЧ рдирд╣реАрдВ рд╣реИ, рдЖрдк рдХрд┐рд╕реА рднреВрдорд┐рдХрд╛ рдХреЛ рддреБрд░рдВрдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рд╢рдмреНрдж
рдХреЛ рд╣рдореЗрдВ рдпрд╣ рдмрддрд╛рдиреЗ рдХреА
рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рднреВрдорд┐рдХрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рд╡рд░реНрдЧ рдХреЛ 'рдмрд░рд╛рдмрд░_рддреЛ' рдкрджреНрдзрддрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
package Comparable; use Moose; with 'Eq'; sub equal_to { my ( $self, $other ) = @_; $self->compare($other) == 0; } sub compare { my ( $self, $other ) = @_; $self->amount <=> $other->amount; }
рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ / рдбрд┐рд╕реНрдЯреНрд░рдХреНрдЯрд░
рдЙрдиреНрд╣реЗрдВ рдХрднреА рднреА рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкреБрдирд░реНрдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдРрд╕реА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИ, рддреЛ рдЖрдк рдХреНрд░рдорд╢рдГ рдирд┐рд░реНрдорд╛рддрд╛ рдФрд░ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдХреЗ рд▓рд┐рдП BUILD () рдФрд░ DEMOLISH () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
Metaclass
рдореЗрдЯрд╛рдХреНрд▓рд╛рд╕ рд╡рд░реНрдЧ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред Moose рдХреЗ рд╕рд╛рде, рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдЧ рдПрдХ "рдореЗрдЯрд╛ ()" рджреЗрддрд╛ рд╣реИ, рдЬреЛ Moose :: Meta :: Class рдСрдмреНрдЬреЗрдХреНрдЯ рджреЗрддрд╛ рд╣реИред рд╡рд╣ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд░реНрдЧ рдХреНрдпрд╛ рд╣реИред
my $meta = User->meta(); for my $attribute ( $meta->get_all_attributes ) { print $attribute->name(), "\n"; if ( $attribute->has_type_constraint ) { print " type: ", $attribute->type_constraint->name, "\n"; } } for my $method ( $meta->get_all_methods ) { print $method->name, "\n"; }
рдХрдЪрд░рд╛ рд╕рд╛рдл рдХрд░рдирд╛
рдпрджрд┐ рдХрдХреНрд╖рд╛ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╕реЗрдЯ рд╣реЛрддрд╛ рд╣реИ: рдирд╛рдо рд╕реНрдерд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ :: рдЖрдЯреЛрдХреНрд▓реЗрди;
рдпрд╛ рдХрдХреНрд╖рд╛ рдХреЗ рдЕрдВрдд рдореЗрдВ: рдХреЛрдИ рдореВрд╕ рдирд╣реАрдВ;
рд╡рд░реНрдЧ рддреНрд╡рд░рдг
рдпрджрд┐ рдХрд╛рд░реНрдп рдХреЗ рджреМрд░рд╛рди рдХрдХреНрд╖рд╛ рдирд╣реАрдВ рдмрджрд▓рддреА рд╣реИ, рддреЛ рдЗрд╕рдХреЗ рдХрд╛рд░реНрдп рдХреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рддреНрд╡рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
__PACKAGE__->meta->make_immutable;
рдпрд╣ рд╕рдм, рдпрд╣ рдЬреНрдЮрд╛рди рдкрд░реНрд▓ рдореЗрдВ рдУрдУрдкреА рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдПрдХ рдЧрд╣рд░реА рд╕рдордЭ рдХреЗ рд▓рд┐рдП, рдмреЗрд╢рдХ рдпрд╣ рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдмреЗрд╣рддрд░ рд╣реИ рдФрд░ ... рд╣рд╛рдБ рд╣рд╛рдБ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ (рдареАрдХ рд╣реИ, рдпрд╣ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕рдореЗрдВ рд╣реИ: рдорд╛рдорд▓рд╛, рдЬрд┐рдЬреНрдЮрд╛рд╕рд╛ рдХрд┐рд╕реА рдХреЛ рдЪреЛрдЯ рдирд╣реАрдВ рдкрд╣реБрдВрдЪрд╛рдПрдЧреА)ред