Guest User

Untitled

a guest
Jul 22nd, 2018
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.19 KB | None | 0 0
  1. package SugarMaker;
  2.  
  3. use Moose ();
  4. use Moose::Exporter;
  5. use Moose::Util;
  6.  
  7. Moose::Exporter->setup_import_methods(
  8. with_meta => ['attributes']
  9. );
  10.  
  11. sub attributes {
  12. my($meta, %opt) = @_;
  13. $meta->attributes(\%opt);
  14. }
  15.  
  16. after import => sub {
  17. my($class) = @_;
  18. my $sugar_class = caller();
  19. Moose::Exporter->setup_import_methods(
  20. as_is => 'attributes',
  21. also => 'Moose',
  22. exporter_package => $sugar_class,
  23. );
  24. $sugar_class->add_before_method_modifier(import => sub {
  25. my($class) = @_;
  26. my $target_class = caller();
  27. $target_class->Moose::init_meta(metaclass => 'SugarMaker::Meta::Class');
  28. });
  29. };
  30.  
  31. package SugarMaker::Meta::Class;
  32. use Moose;
  33. extends 'Moose::Meta::Class';
  34.  
  35. has sugar_for_attributes => (isa => 'HashRef', is => 'ro');
  36.  
  37. before add_attribute => sub {
  38. my($self, $opt) = @_;
  39. %$opt = (%$opt, %{$self->sugar_for_attibutes});
  40. };
  41.  
  42. package Sugar;
  43. use SugarMaker;
  44.  
  45. attributes is => 'ro';
  46.  
  47. package UserClass; # final class using sugar
  48. use Sugar;
  49.  
  50. has 'foo' => (isa => 'Bar'); # implied is => 'ro' from Sugar
  51.  
  52. package MooseClass; # UserClass is equivalent to this, if done with pure Moose
  53. use Moose;
  54.  
  55. has foo => (isa => 'Bar', is => 'ro');
Add Comment
Please, Sign In to add comment