Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package SugarMaker;
- use Moose ();
- use Moose::Exporter;
- use Moose::Util;
- Moose::Exporter->setup_import_methods(
- with_meta => ['attributes']
- );
- sub attributes {
- my($meta, %opt) = @_;
- $meta->attributes(\%opt);
- }
- after import => sub {
- my($class) = @_;
- my $sugar_class = caller();
- Moose::Exporter->setup_import_methods(
- as_is => 'attributes',
- also => 'Moose',
- exporter_package => $sugar_class,
- );
- $sugar_class->add_before_method_modifier(import => sub {
- my($class) = @_;
- my $target_class = caller();
- $target_class->Moose::init_meta(metaclass => 'SugarMaker::Meta::Class');
- });
- };
- package SugarMaker::Meta::Class;
- use Moose;
- extends 'Moose::Meta::Class';
- has sugar_for_attributes => (isa => 'HashRef', is => 'ro');
- before add_attribute => sub {
- my($self, $opt) = @_;
- %$opt = (%$opt, %{$self->sugar_for_attibutes});
- };
- package Sugar;
- use SugarMaker;
- attributes is => 'ro';
- package UserClass; # final class using sugar
- use Sugar;
- has 'foo' => (isa => 'Bar'); # implied is => 'ro' from Sugar
- package MooseClass; # UserClass is equivalent to this, if done with pure Moose
- use Moose;
- has foo => (isa => 'Bar', is => 'ro');
Add Comment
Please, Sign In to add comment