2010-10-22 4 views
8

Secondo il Moose migliori pratiche doc, le mie classi Moose dovrebbe essere simile a questo:Tutte le mie classi Moose devono contenere 'namespace :: autoclean' e 'make_immutable' o c'è un modo per ottenerle di default?

package Person; 

use Moose; 
use namespace::autoclean; 

# extends, roles, attributes, etc. 

# methods 

__PACKAGE__->meta->make_immutable; 

1; 

Vedi Moose::Manual::BestPractices.

E il 99% delle volte questo è quello che voglio, quindi c'è un modo per avere il mio spazio dei nomi automatizzato e le mie classi rese immutabili per impostazione predefinita, quindi non devo avere questo ammasso di codice?

Forse c'è un motivo tecnico per cui non è possibile o perché non dovrebbe essere fatto?

Grazie

risposta

8

Credo che l'unica Un modo per evitare questo è quello di utilizzare MooseX::Declare.

MooseX::Declare è un macro che trasforma basso nella esempio:

use MooseX::Declare; 

class Person { 

    # attributes 

    # methods 
} 

inserisce automaticamente namespace::autoclean e rende la classe immutabile.

Per estendere le classi che fate:

class Person extends Human { ... } 

E per l'aggiunta di ruoli che fate:

class Person with BlueEyeRole { ... } 

E si può facilmente combinare questi:

class Person extends Human with BlueEyeRole { ... } 

si ottiene anche qualche altro parole chiave definite, ad es. method:

class Person { 
    has 'name' => (is => 'rw', isa => 'Str'); 

    method hello { "Hello " . $self->name } 
} 

Se avete voglia di rendere la vostra classe mutevole allora la sua:

class Person is mutable { ... } 


Forse c'è una ragione tecnica per cui non è possibile o perché non dovrebbe essere fatto?

Tecnicamente sarebbe difficile riunire tutto questo. MooseX::Declare utilizza Devel::Declare per creare necessariamente la sintassi da interpretare da Perl.

Quindi, se la piastra della caldaia è un problema per voi quindi considerare l'utilizzo di MooseX::Declare. L'ho usato su molti progetti senza problemi e lo trovo ideale quando disegno velocemente un'app basata sulla classe. Tuttavia, per la maggior parte del tempo sono soddisfatto del boilerplate e mi atteno allo standard Moose.

+0

Perché il voto negativo? – draegtun

+1

Perché è sbagliato. MX :: D non è affatto l'unico modo per ottenere questo. – rafl

+1

@rafl: Ho detto che era l'unico modo che conoscevo.Quindi non credo che meriti un voto negativo :( – draegtun

Problemi correlati